Bert與GPT的差別
1. 網絡結構上的差別

上圖是Transformer的一個網絡結構圖,Bert的網絡結構類似于Transformer的Encoder部分,而GPT類似于Transformer的Decoder部分。單從網絡的組成部分的結構上來看,其最明顯的在結構上的差異為Multi-Head-Attention和Masked Multi-Head-Attention。
為了解釋清楚這兩個的差別,先來看看self-attention
Self-Attention
Self-Attention的Input,它就是一串的Vector,我們用 a a a來表示它,代表它有可能是前面已經做過一些處理,它是某個隐藏層的輸出,輸入一排a這個向量以後,Self-Attention要輸出另外一排b這個向量。下面來看看如何輸出 b 1 b 2 b 3 b 4 b^1 b^2 b^3 b^4 b1b2b3b4
用最簡單的點積方式來計算q為例子:
把 a 1 a^1 a1乘上$W^q 得 到 得到 得到q1$,然後,把$a1 乘 上 乘上 乘上Wk$,得到$k$這個Vector,把這個$q1 , 跟 這 個 ,跟這個 ,跟這個k^2$相乘就得到α
這邊用 α 1 , 2 α_{1,2} α1,2來代表說,Query是1提供的,Key是2提供的時候,這個α這個關聯性叫做Attention的分數。
接下來也要跟 a 3 a 4 a^3 a^4 a3a4來計算
把 a 3 a_3 a3乘上 W k W^k Wk,得到另外一個Key也就是 k 3 k^3 k3, a 4 a^4 a4乘上 W k W^k Wk得到 k 4 k^4 k4,然後再把 k 3 k^3 k3這個Key,跟 q 1 q^1 q1這個Query做Inner-Product,得到1跟3之間的關聯性,得到1跟3的Attention,把 k 4 k^4 k4跟 q 1 q^1 q1做點積,得到 α 1 , 4 α_{1,4} α1,4(1跟4之間的關聯性)
計算出a1跟每一個向量的關聯性以後,接下來這邊會接入一個SoftMax
通過Soft-Max就得到 α ′ α' α′
- 首先把 a 1 a^1 a1到 a 4 a^4 a4這邊每一個向量,乘上$W^v 得 到 新 的 向 量 , 這 邊 分 别 就 是 用 得到新的向量,這邊分别就是用 得到新的向量,這邊分别就是用v^1 v^2 v^3 v^4$來表示
- 接下來把這邊的 v 1 v^1 v1到 v 4 v^4 v4,每一個向量都去乘上Attention的分數,都去乘上 α ′ α' α′
- 然後再把它加起來,得到 b 1 b^1 b1
b 1 = ∑ i α 1 , i ′ v i b^1=\sum_i\alpha'_{1,i}v^i b1=i∑α1,i′vi
這就是Self-Attention的過程
Multi-Head-Attention
Self-attention 有一個進階的版本,叫做 Multi-head Self-attention, 顧名思義,Multi-head Self-attention,相比較于Self-attention自然是使用了較多的head,需要用多少的 head,這個又是另外一個 超參數也是需要調的
為什麼會需要比較多的 head 呢?
在做這個 Self-attention 的時候,我們就是用 q 去找相關的 k,但是相關這件事情有很多種不同的形式,有很多種不同的定義,是以也許我們不能隻有一個 q,我們應該要有多個 q,不同的 q 負責不同種類的相關性。
其具體操作為(以一個兩個head為例):
- 先把 a 乘上一個矩陣得到 q
- 再把 q 乘上另外兩個矩陣,分别得到 q 1 q^1 q1 跟 q 2 q^2 q2,那這邊還有 這邊是用兩個上标,i 代表的是位置,然後這個 1 跟 2 代表是,這個位置的第幾個 q,是以這邊有 q i , 1 q^{i,1} qi,1 跟 q i , 2 q^{i,2} qi,2,代表說我們有兩個 head
既然 q 有兩個,那 k 也就要有兩個,那 v 也就要有兩個,從 q 得到 q 1 q 2 q^1 q^2 q1q2,從 k 得到 k 1 k 2 k^1 k^2 k1k2,從 v 得到 v 1 v 2 v^1 v^2 v1v2,那其實就是把 q 把 k 把 v,分别乘上兩個矩陣,得到這個不同的 head。
- 是以 q i , 1 q_{i,1} qi,1 就跟 k i , 1 k^{i,1} ki,1 算 attention
- q i , 1 q_{i,1} qi,1 就跟 k j , 1 k^{j,1} kj,1 算 attention,也就是算這個點積,然後得到這個 attention 的分數
- 把 attention 的分數乘 v i , 1 v^{i,1} vi,1,把 attention 的分數乘 v j , 1 v^{j,1} vj,1
- 然後接下來就得到 b i , 1 b^{i,1} bi,1
這邊隻用了其中一個 head,對于另一個 head,也做一模一樣的事情
是以 q 2 q^2 q2 隻對 k 2 k^2 k2 做 attention,它們在做 weighted sum 的時候,隻對 v 2 v^2 v2 做 weighted sum,然後就得到 b i , 2 b^{i,2} bi,2
如果有多個 head,有 8 個 head 有 16 個 head,那也是一樣的操作,那這邊是用兩個 head 來當作例子
然後把 b i , 1 b^{i,1} bi,1 跟 b i , 2 b^{i,2} bi,2,把它接起來,然後再通過一個 transform
也就是再乘上一個矩陣,然後得到 bi,然後再送到下一層去,那這個就是 Multi-head attention
Masked Multi-Head-Attention
使用mask的原因是因為在預測句子的時候,目前時刻是無法擷取到未來時刻的資訊的。也就是Multi-Head-Attention可以看到Input的整個句子,而Masked Multi-Head-Attention隻能看到目前輸入之前的内容,無法看到之後的内容
例如,在本例子中,輸入的時候,不會看到後面的資訊,輸入台的時候,我們也沒法看到“灣大學”的字樣。這就是Masked Multi-Head-Attention和Multi-Head-Attention的主要差別。
2.預訓練任務差別
在Bert與GPT的預訓練任務的選取上,Bert與GPT所用的模型也存在着較大的差異。
Bert——Masking Input
在Bert的預訓練任務中,Bert主要使用“填空題"的方式來完成預訓練:
随機蓋住一些輸入的文字,被mask的部分是随機決定的,當我們輸入一個句子時,其中的一些詞會被随機mask。
mask的具體實作有兩種方法。
- 第一種方法是,用一個特殊的符号替換句子中的一個詞,我們用 "MASK "标記來表示這個特殊符号,可以把它看作一個新字,這個字完全是一個新詞,它不在字典裡,這意味着mask了原文。
- 另外一種方法,随機把某一個字換成另一個字。中文的 "灣"字被放在這裡,然後可以選擇另一個中文字來替換它,它可以變成 "一 "字,變成 "天 "字,變成 "大 "字,或者變成 "小 "字,我們隻是用随機選擇的某個字來替換它
兩種方法都可以使用。使用哪種方法也是随機決定的。是以,當BERT進行訓練時,向BERT輸入一個句子,先随機決定哪一部分的漢字将被mask。
mask後,一樣是輸入一個序列,我們把BERT的相應輸出看作是另一個序列,接下來,我們在輸入序列中尋找mask部分的相應輸出,然後,這個向量将通過一個Linear transform,輸入向量将與一個矩陣相乘,然後做softmax,輸出一個分布。。
這與我們在Seq2Seq模型中提到的使用transformer進行翻譯時的輸出分布相同。輸出是一個很長的向量,包含我們想要處理的每個漢字,每一個字都對應到一個分數。
在訓練過程中。我們知道被mask的字元是什麼,而BERT不知道,我們可以用一個one-hot vector來表示這個字元,并使輸出和one-hot vector之間的交叉熵損失最小。
BERT要做的是,預測什麼被蓋住。被掩蓋的字元,屬于 "灣"類。
在訓練中,我們在BERT之後添加一個線性模型,并将它們一起訓練,嘗試去預測被覆寫的字元是什麼。
GPT——Predict Next Token
GPT要做的任務是,預測接下來,會出現的token是什麼
舉例來說,假設訓練資料裡面,有一個句子是台灣大學,那GPT拿到這一筆訓練資料的時候,選取BOS這個Token所對應的輸出,作為Embedding的結果,用這個embedding去預測下一個應該出現的token是什麼
那在這個句子裡面,根據這筆訓練資料,下一個應該出現的token是"台",要訓練模型,根據第一個token,根據BOS給的embedding,那它要輸出"台"這個token
這個部分,有一個embedding,這邊用h來表示,然後通過一個Linear Transform,再通過一個softmax,得到一個機率分布,我們希望這個輸出的機率分布,跟正确答案的交叉熵越小越好。
接下來要做的事情,就是以此類推了,輸入BOS跟"台",它産生embedding,接下來它會預測,下一個出現的token是什麼,以此類推來訓練模型。
3.使用方法的差別
對于Bert和GPT,其本意是提供一個預訓練模型,使得人們可以友善的将其運用于下流(downstream)任務當中去。當然,這兩種模型最後使用的方法也是有一些差別的。
Bert的使用方法——以情感分類為例
隻要給它一個句子,也就是你想用它來判斷情緒的句子,然後把CLS标記放在這個句子的前面,扔到BERT中,這4個輸入實際上對應着4個輸出。然後,我們隻看CLS的部分。CLS在這裡輸出一個向量,我們對它進行Linear transform,也就是将它乘以一個Linear transform的矩陣,然後進行Softmax,就可以得到情感分類的結果。
Bert的使用大多如此,用CLS對應的Output作為Embedding的結果,然後根據不同的任務進行對應的操作來fine-turing,從某方面而言,更像是利用深度學習對文本進行特征表示的過程。
GPT的使用方法
對于GPT使用,由于GPT的參數是Bert的4倍有餘,使得去fine-turing一個模型需要更長,更大的訓練時間。是以GPT提出了一個更加“瘋狂”的使用方式,一種更接近于人類的使用方式。
沒有進行梯度下降的"Few short leaning",也就GPT論文所提到的“In-context learning”
舉例來說假設要GPT這個模型做翻譯
- 先打Translate English to French,這個句子代表問題的描述
- 然後給它幾個範例
- 最後接下來給一個Cheese的詞,讓他翻譯成法語。
“One-shot” Learning “Zero-shot” Learning
例如我們在考聽力測驗的時候,都隻給一個例子而已,那GPT可不可以隻看一個例子,就知道它要做翻譯,這個叫One-shot Learning
還有更厲害的是Zero-shot Learning,直接給它一個叙述,說現在要做翻譯了,來看GPT能不能夠自己就看得懂,就自動知道說要來做翻譯這件事情。
GPT在沒有微調的情況下,這種使用方法雖然準确率不夠高,但是随着GPT參數量的增加,在一定程度上仍然有着一定的準确率。
PT參數量的增加,在一定程度上仍然有着一定的準确率。
這就是GPT相比較于Bert更加獨特的一種使用方式。