一、Transformer模型
2017年,Google在論文 Attention is All you need 中提出了 Transformer 模型,其使用 Self-Attention 結(jié)構(gòu)取代了在 NLP 任務(wù)中常用的 RNN 網(wǎng)絡(luò)結(jié)構(gòu)。相比 RNN 網(wǎng)絡(luò)結(jié)構(gòu),其最大的優(yōu)點是可以并行計算。Transformer 的整體模型架構(gòu)如下圖所示
0x1:Transformer概覽
首先,讓我們先將Transformer模型視為一個黑盒,如下圖所示。在機器翻譯任務(wù)中,將一種語言的一個句子作為輸入,然后將其翻譯成另一種語言的一個句子作為輸出。
Transformer本質(zhì)上是一個Encoder-Decoder架構(gòu)。因此中間部分的Transformer可以分為兩個部分:
- 編碼組件
- 解碼組件
如下圖所示:?
其中,編碼組件由多層編碼器(Encoder)組成(在論文中作者使用了6層編碼器,在實際使用過程中你可以嘗試其他層數(shù))。解碼組件也是由相同層數(shù)的解碼器(Decoder)組成(在論文也使用了6層)。如下圖所示:?
每個編碼器由兩個子層組成:
- Self-Attention層(自注意力層)
- Position-wise Feed Forward Network(前饋網(wǎng)絡(luò),F(xiàn)FN)
如下圖所示,每個編碼器的結(jié)構(gòu)都是相同的,但是它們使用不同的權(quán)重參數(shù)。?
編碼器的輸入會先流入Self-Attention層,它可以讓編碼器在對特定詞進行編碼時使用輸入句子中的其他詞的信息。然后,Self-Attention層的輸出會流入前饋網(wǎng)絡(luò)。
解碼器也有編碼器中這兩層,但是它們之間還有一個注意力層(即 Encoder-Decoder Attention),其用來幫忙解碼器關(guān)注輸入句子的相關(guān)部分(類似于seq2seq模型中的注意力機制)。
0x2:Transformer結(jié)構(gòu)
現(xiàn)在我們從輸入層開始逐步分析論文中的模型,下圖是Transformer用于中英文翻譯的整體結(jié)構(gòu)。
第一步:輸入數(shù)據(jù)向量化表示
和大部分的NLP任務(wù)一樣,首先,我們使用詞嵌入算法(Embedding)將每個詞轉(zhuǎn)換為一個詞向量。在Transformer論文中,詞嵌入向量的維度是512。
輸入句子的每一個單詞的表示向量X,X由單詞的Embedding和單詞位置的Embedding相加得到。
第二步:計算編碼矩陣
將得到的單詞表示向量矩陣(如上圖所示,每一行是一個單詞的表示x)傳入Encoder中,經(jīng)過6個Encoder block后可以得到句子所有單詞的編碼信息矩陣C,如下圖。
單詞向量矩陣用X(n×d)表示, n是句子中單詞個數(shù),d是表示向量的維度(論文中d=512)。每一個Encoder block輸出的矩陣維度與輸入完全一致。?
第三步:計算解碼矩陣?
將Encoder輸出的編碼信息矩陣C傳遞到Decoder中,Decoder依次會根據(jù)當前翻譯過的單詞 1~ i 翻譯下一個單詞 i+1,如下圖所示。
在使用的過程中,翻譯到單詞 i+1 的時候需要通過Mask(掩蓋)操作遮蓋住 i+1 之后的單詞。
上圖Decoder接收了Encoder的編碼矩陣C,然后首先輸入一個翻譯開始符 "<Begin>",預(yù)測第一個單詞 "I";然后輸入翻譯開始符 "<Begin>" 和單詞 "I",預(yù)測單詞 "have",以此類推。
這是Transformer使用時候的大致流程,接下來是里面各個部分的細節(jié)。
0x3:Transformer結(jié)構(gòu)的內(nèi)部細節(jié)
1、Transformer的輸入
Transformer中單詞的輸入表示x由單詞Embedding和位置Embedding相加得到。
單詞的Embedding有很多種方式可以獲取,例如可以采用Word2Vec、Glove等算法預(yù)訓(xùn)練得到,也可以在Transformer中訓(xùn)練得到。詞Embedding負責捕獲詞與詞之間的相對語義近鄰關(guān)系。
Transformer中除了單詞的Embedding,還需要使用位置Embedding表示單詞出現(xiàn)在句子中的位置。因為Transformer不采用RNN的結(jié)構(gòu),而是使用全局信息,不能利用單詞的順序信息,而這部分信息對于NLP來說非常重要。所以Transformer中使用位置Embedding保存單詞在序列中的相對或絕對位置。
位置和順序?qū)τ谝恍┤蝿?wù)十分重要,例如理解一個句子、一段視頻。位置和順序定義了句子的語法、視頻的構(gòu)成,它們是句子和視頻語義的一部分。循環(huán)神經(jīng)網(wǎng)絡(luò)RNN本質(zhì)上考慮到了句子中單詞的順序。因為RNN以順序的方式逐字逐句地解析一個句子,這將把單詞的順序整合到RNN中。Transformer使用MHSA(Multi-Head Self-Attention),從而避免使用了RNN的遞歸方法,加快了訓(xùn)練時間,同時,它可以捕獲句子中的長依賴關(guān)系,能夠應(yīng)對更長的輸入。
當句子中的每個單詞同時經(jīng)過Transformer的Encoder/Decoder堆棧時,模型本身對于每個單詞沒有任何位置/順序感 (permutation invariance)。 因此,仍然需要一種方法來將單詞的順序信息融入到模型中。
為了使模型能夠感知到輸入的順序,可以給每個單詞添加有關(guān)其在句子中位置的信息,這樣的信息就是位置編碼(positional embedding, PE)。
一般我們可能想到的方案是:
- 給每一個時間步設(shè)定[0,1]范圍的一個值,0表示第一個,1表示最后一個。這樣做的問題是,因為我們不確定句子里有多少個單詞,如果用變長的位置向量來進行編碼,不同單詞數(shù)的句子中相鄰單詞之間的距離就不固定了。
- 給每一個時間步分配一個數(shù)值,例如第一個單詞分配“1”,第二個單詞分配“2”等等。這樣做的問題是,這些值很大,并且實際中遇到的句子可能比訓(xùn)練時見過的句子還要長,這就會導(dǎo)致模型泛化性能變差。
上述的第一個方案,假設(shè)現(xiàn)在我們想用4dim的二進制向量來表示數(shù)字,如下圖所示,[0,15]的16個位置被編碼為了16個4維向量。
我們可以觀察到不同位置之間的變化率,最后一位在0和1上依次交替,第二低位在每兩個數(shù)字上交替,以此類推。
但是用二進制表示數(shù)字在浮點數(shù)空間非常浪費空間,也無法解決[,16]以后的不同長度的位置的編碼問題。用一個遠超過實際所需的向量空間對位置進行編碼也不現(xiàn)實,我們需要找到一個能兼容上述問題的新模型。
理想情況下PE的設(shè)計應(yīng)該遵循這幾個條件:
- 為每個時間步(單詞在句子中的位置)輸出唯一的編碼
- 即便句子長度不一,句子中兩個時間步之間的相對距離應(yīng)該是“恒定”的
- 算法可以輕易泛化到不同長度的句子上
- PE必須是確定的
按照上述限定條件,一個很直接的思考方向就是:需要用一個正弦/余弦曲線函數(shù)來對位置進行編碼。
接下來我們來看看“Attention is all you need”中固定類型的PE為什么是這樣設(shè)計(sin, cos
?)的?作者設(shè)計的這種位置編碼的方式非常巧妙。
- 首先,它不是一個單一的數(shù)值,它是關(guān)于句子中一個特定位置信息的
d
維的向量,本質(zhì)上也是用一個定長的向量空間來對位置信息進行編碼。 - 其次,這種編碼沒有集成到模型本身上。相反,這個向量用于給每個單詞分配一個有關(guān)其在句子中位置的信息。換句話說,PE只和輸入有關(guān),而和模型無關(guān)。
假設(shè) t 是輸入序列的一個位置,是它對應(yīng)的編碼,d 是維度。定義
是產(chǎn)生
的函數(shù),它的形式如下:
這里 i? 是位置向量的index(d維向量的索引),? k?的引入是為了區(qū)分位置向量的奇偶位(2k<<d、2k+1<<d)。其中:?
由函數(shù)定義可以推斷出,PE可以表示為一個向量,其中每個wk都決定了一個維度,每一維都對應(yīng)一個正弦/余弦曲線,wk決定了正弦/余弦曲線的頻率。i從[0,d],wk逐漸減少,因此正弦/余弦函數(shù)的頻率逐漸減少。
因此,PE中的位置向量,本質(zhì)上就是一組頻率逐漸減少的正弦/余弦函數(shù)。
從上式可以看到,
- 每一維都對應(yīng)一個正弦/余弦曲線。
- 正弦/余弦的波長范圍是??[2π,10000·2π] ,每個值的范圍是 [-1,1],這意味著它可以編碼最長為10000的位置,第1和第10001的位置編碼重復(fù)。
- 每一個位置數(shù)值都被映射到一個d維的正弦/余弦值向量空間上。
- 不管處于什么位置,兩個相對位置對應(yīng)的向量距離差值總是相同的,這是由正弦/余弦函數(shù)的頻率計算定理保證的,這保證了位置編碼函數(shù)最基本的要求。
- PE能夠適應(yīng)比訓(xùn)練集里面所有句子更長的句子,假設(shè)訓(xùn)練集里面最長的句子是有20個單詞,突然來了一個長度為21的句子,則使用公式計算的方法可以計算出第21位的Embedding。
現(xiàn)在產(chǎn)生了幾個個新問題:
- 這種sines和cosines的組合為什么能夠表示位置/順序?
- 為什么這種正弦曲線形的位置編碼可以輕松允許模型獲取相對位置relative positioning?
- 為什么sine和cosine都被用到了?
先看第一個問題,下圖展示了一個最多50個單詞的句子中的每個單詞的位置編碼,維度是128。每一行都表示一個位置編碼向量,如下圖所示,
從宏觀來看
- 橫向看,對同一個位置來說,不同維度對應(yīng)的正弦/余弦函數(shù)頻率逐步降低,從紅色的的位變?yōu)槌壬奈弧?/li>
- 縱向來看,左側(cè)上下變化較大,越向右上下變化差越小,其原因還是因為越往右頻率越小,不同位置對應(yīng)的值變化空間就越小。
- 相鄰時間步的位置編碼的距離(點積)是對稱的,并且會隨著時間很好地衰減。
再來看第二個問題,Attention原文是這么寫的:

為什么這句話成立?這篇博客給了一個完整的證明。?
這里簡單可以理解為,對于固定長度的間距 k,PE(pos+k) 可以用PE(pos) 計算得到。因為:
Sin(A+B) = Sin(A)Cos(B) + Cos(A)Sin(B), Cos(A+B) = Cos(A)Cos(B) - Sin(A)Sin(B)
上式也回答了第三個問題,為什么sine和cosine都被用到了?只用它們的組合才能用sin(x)和cos(x)的組合線性表示sin(x+k), cos(x+k)。
隨后,將單詞的詞Embedding和位置Embedding相加,就可以得到單詞的表示向量x,x就是Transformer的輸入。
這里又引出一個新的問題:
- 為什么PE和WE(word embeddings)是相加(add),而不是拼接(concatenate)?
目前這個問題沒有理論證明,但是加法相對于拼接減少了模型的參數(shù)量。
回到上面的位置編碼的可視化圖,我們會發(fā)現(xiàn):相對于整個embedding來說,只有前面少數(shù)dimension是用來存儲位置信息的。由于embedding只有128維,不夠明顯,借用另一個博客的圖:?
這幅圖表示20個單詞的512維的位置編碼,
- 左圖是sine拼接之前的樣子
- 右圖是cosine拼接之前的樣子
大部分的維度(全綠/黃)幾乎只共享常數(shù)1或者-1,換句話說這些維度都用表示word embedding的信息了。
另外,由于Transformer中PE和WE是從頭開始訓(xùn)練的,因此參數(shù)的設(shè)置方式可能是單詞的語義不會存儲在前幾個維度中,以免干擾位置編碼。(這也是這個問題的解:?PE是如何訓(xùn)練的?或者說如何讓模型知道這些embeddings是position信息?)
從這個角度來看,Transformer或許可以分離語義信息和位置信息。這樣的話,考慮分類PE和WE可能就不會是一個優(yōu)點了,可能加法提供了額外的可以學(xué)習(xí)的特征。
上面那幅圖sine和cosine合起來大概是這樣:
完成輸入數(shù)據(jù)的向量化之后,模型結(jié)構(gòu)的下一步就是Self-Attention層。
2、Self-Attention(自注意力)
關(guān)于self-attension的簡單原理解釋可以參閱這篇文章,我們這里繼續(xù)展開分析一下。
假如,我們要翻譯下面這個句子:
The animal didn’t cross the street because it was too tired
這個句子中的 it 指的是什么?是指 animal 還是 street ?對人來說,這是一個簡單的問題,但是算法來說卻不那么簡單。
當模型在處理 it 時,Self-Attention 機制使其能夠?qū)?it 和 animal 關(guān)聯(lián)起來,即將這個詞映射到相近的向量空間位置上,以此來表示兩個詞的相關(guān)性。在深度網(wǎng)絡(luò)中,越相近的兩個詞,在后續(xù)的神經(jīng)元連接中就越容易被同時激活。
當模型處理每個詞(輸入序列中的每個位置)時,Self-Attention機制使得模型不僅能夠關(guān)注當前位置的詞,而且能夠關(guān)注句子中其他位置的詞,從而可以更好地編碼這個詞。
如果你熟悉RNN,想想如何維護隱狀態(tài),使RNN將已處理的先前詞/向量的表示與當前正在處理的詞/向量進行合并。Transformer使用Self-Attention機制將其他詞的理解融入到當前詞中。
當我們在編碼器 #5(堆棧中的頂部編碼器)中對單詞”it“進行編碼時,有一部分注意力集中在”The animal“上,并將它們的部分信息融入到”it“的編碼中。
下面我們來看一下Self-Attention的具體機制。其基本結(jié)構(gòu)如下圖所示:
對于Self Attention來講,Q(Query),K(Key)和 V(Value)三個矩陣均來自同一輸入,并按照以下步驟計算:
- 首先計算 Q 和 K 之間的點積,為了防止其結(jié)果過大,會除以
,其中 dk?為 Key 向量的維度。
- 然后利用Softmax操作將其結(jié)果歸一化為概率分布,再乘以矩陣 V 就得到權(quán)重求和的表示。
整個計算過程可以表示為:
下面通過一個例子,讓我們看一下如何使用向量計算Self-Attention。計算Self-Attention的步驟如下:?
第一步:基于輸入的詞向量,創(chuàng)建QKV向量
對編碼器的每個輸入向量(在本例中,即每個詞的詞向量)創(chuàng)建三個向量:
- Query向量
- Key向量
- Value向量
它們是通過詞向量分別和3個矩陣相乘得到的,這3個矩陣通過訓(xùn)練獲得。Query,Key和Value向量是一種抽象,對于注意力的計算和思考非常有用。
請注意,這些向量的維數(shù)小于詞向量的維數(shù),論文中新向量的維數(shù)為64,而embedding和編碼器輸入/輸出向量的維數(shù)為512。新向量不一定非要更小,這是為了使多頭注意力計算保持一致的結(jié)構(gòu)性選擇。在上圖中,x1乘以權(quán)重矩陣WQ得到q1,即與該單詞關(guān)聯(lián)的Query向量。最終會為輸入句子中的每個詞創(chuàng)建一個Query,一個Key和一個Value向量。
第二步:計算注意力分數(shù)
假設(shè)我們正在計算這個例子中第一個詞“Thinking”的自注意力。我們需要根據(jù)“Thinking”這個詞,對句子中的每個詞都計算一個分數(shù)。這些分數(shù)決定了我們在編碼“Thinking”這個詞時,需要對句子中其他位置的每個詞放置多少的注意力。
這些分數(shù),是通過計算“Thinking”的Query向量和需要評分的詞的Key向量的點積得到的。如果我們計算句子中第一個位置詞的注意力分數(shù),則第一個分數(shù)是q1和k1的點積,第二個分數(shù)是q1和k2的點積。
第三步:基于Key向量維度進行歸一化
將每個分數(shù)除以(
是Key向量的維度)。目的是在反向傳播時,求梯度更加穩(wěn)定。實際上,你也可以除以其他數(shù)。
第四步:對分數(shù)進行Softmax概率歸一化
將這些分數(shù)進行Softmax操作。Softmax將分數(shù)進行歸一化處理,使得它們都為正數(shù)并且和為1。
這些Softmax分數(shù)決定了在編碼當前位置的詞時,對所有位置的詞分別有多少的注意力。很明顯,當前位置的詞匯有最高的分數(shù),但有時注意一下與當前位置的詞相關(guān)的詞是很有用的。
第五步:將每個Softmax分數(shù)分別與每個Value向量相乘
這種做法背后的直覺理解是起一個放大作用:
- 對于分數(shù)高的位置,相乘后的值就越大,我們把更多的注意力放在它們身上。
- 對于分數(shù)低的位置,相乘后的值就越小,這些位置的詞可能是相關(guān)性不大,我們就可以忽略這些位置的詞。?
第六步:將加權(quán)Value向量(即上一步求得的向量)求和
最終得到了自注意力層在這個位置的輸出。?
這樣就完成了自注意力的計算。生成的向量會輸入到前饋網(wǎng)絡(luò)中。但是在實際實現(xiàn)中,此計算是以矩陣形式進行,以便實現(xiàn)更快的處理速度。
3、Multi-head Attention(多頭注意力機制)
在Transformer論文中,通過添加一種多頭注意力機制,進一步完善了自注意力層。具體做法:
- 首先,通過 h 個不同的線性變換對Query、Key? Value進行映射
- 然后,將不同的Attention拼接起來
- 最后,再進行一次線性變換
基本結(jié)構(gòu)如下圖所示:
每一組注意力用于將輸入映射到不同的子表示空間,這使得模型可以在不同子表示空間中關(guān)注不同的位置。整個計算過程可表示為:
其中,。在論文中,指定 h = 8(即使用8個注意力頭)和
。
在多頭注意力下,我們?yōu)槊拷M注意力單獨維護不同的Query、Key和Value權(quán)重矩陣,從而得到不同的Query、Key和Value矩陣。如前所述,我們將 X乘以WQ、WK、和 WV矩陣,得到Query、Key和Value矩陣。
按照上面的方法,使用不同的權(quán)重矩陣進行8次自注意力計算,就可以得到8個不同的Z矩陣。
接下來,因為前饋神經(jīng)網(wǎng)絡(luò)層接收的是1個矩陣(每個詞的詞向量),而不是上面的8個矩陣。因此,我們需要一種方法將這8個矩陣整合為一個矩陣。具體方法如下:
- 把8個矩陣
拼接起來。
- 把拼接后的矩陣和一個權(quán)重矩陣WO相乘。
- 得到最終的矩陣Z,這個矩陣包含了所有注意力頭的信息。這個矩陣會輸入到FFN層。
綜上所有過程,用一張圖歸納一下整個多頭注意力的過程,
現(xiàn)在讓我們重新回顧一下前面的例子,看看在對示例句中的“it”進行編碼時,不同的注意力頭關(guān)注的位置分別在哪:
當我們對“it”進行編碼時,一個注意力頭關(guān)注“The animal”,另一個注意力頭關(guān)注“tired”。從某種意義上來說,模型對“it”的表示,融入了“animal”和“tired”的部分表達。
Multi-head Attention的本質(zhì)是,在參數(shù)總量保持不變的情況下,將同樣的Query,Key,Value映射到原來的高維空間的不同子空間中進行Attention的計算,在最后一步再合并不同子空間中的Attention信息。這樣降低了計算每個head的Attention的向量維度,在某種意義上防止了過擬合;由于Attention在不同子空間中有不同的分布,Multi-head Attention實際上是尋找了序列之間不同角度的關(guān)聯(lián)關(guān)系,并在最后拼接這一步驟中,將不同子空間中捕獲到的關(guān)聯(lián)關(guān)系再綜合起來。
4、Position-wise Feed-Forward Networks(位置前饋網(wǎng)絡(luò))
位置前饋網(wǎng)絡(luò)就是一個全連接前饋網(wǎng)絡(luò),每個位置的詞都單獨經(jīng)過這個完全相同的前饋神經(jīng)網(wǎng)絡(luò)。其由兩個線性變換組成,即兩個全連接層組成,第一個全連接層的激活函數(shù)為ReLU激活函數(shù)??梢员硎緸椋?
在每個編碼器和解碼器中,雖然這個全連接前饋網(wǎng)絡(luò)結(jié)構(gòu)相同,但是不共享參數(shù)。整個前饋網(wǎng)絡(luò)的輸入和輸出維度都是dmodel = 512,第一個全連接層的輸出和第二個全連接層的輸入維度為 dff = 2048。
5、Add & Norm(殘差連接和層歸一化)
編碼器結(jié)構(gòu)中有一個需要注意的細節(jié):每個編碼器的每個子層(Self-Attention層和FFN層)都有一個殘差連接,再執(zhí)行一個層標準化操作,整個計算過程可以表示為:?
其中X表示Multi-Head Attention或者Feed Forward的輸入,MultiHeadAttention(X)和FeedForward(X)表示輸出(輸出與輸入X維度是一樣的,所以可以相加)。
Add指X+MultiHeadAttention(X),是一種殘差連接,通常用于解決多層網(wǎng)絡(luò)訓(xùn)練中權(quán)重矩陣衰退的問題,可以讓網(wǎng)絡(luò)只關(guān)注當前差異的部分,在ResNet中經(jīng)常用到。
Norm指Layer Normalization,通常用于RNN結(jié)構(gòu),Layer Normalization會將每一層神經(jīng)元的輸入都轉(zhuǎn)成均值方差都一樣的,這樣可以加快收斂。
將向量和自注意力層的層標準化操作可視化,如下圖所示:?
上面的操作也適用于解碼器的子層。假設(shè)一個Transformer是由2層編碼器和2層解碼器組成,其如下圖所示:?
為了方便進行殘差連接,編碼器和解碼器中的所有子層和嵌入層的輸出維度需要保持一致,在Transformer論文中dmodel = 512 。??
6、解碼器
前面我們已經(jīng)介紹了編碼器的大部分概念,我們也了解了解碼器的組件的原理?,F(xiàn)在讓我們看下編碼器和解碼器是如何協(xié)同工作的。
上圖紅色部分為Transformer的Decoder block結(jié)構(gòu),與Encoder block相似,但是存在一些區(qū)別:
-
包含兩個Multi-Head Attention層
- 第一個Multi-Head Attention層采用了Masked操作
- 第二個Multi-Head Attention層的?K,?V矩陣使用Encoder的編碼信息矩陣C進行計算,而Q使用上一個Decoder block的輸出計算
- 最后有一個Softmax層計算下一個翻譯單詞的概率。
1)第一個Multi-Head Attention
Decoder block的第一個Multi-Head Attention采用了Masked操作,因為在翻譯的過程中是順序翻譯的,即翻譯完第 i 個單詞,才可以翻譯第 i+1 個單詞。通過Masked操作可以防止第 i 個單詞知道 i+1 個單詞之后的信息。
下面以"我有一只貓"翻譯成"I have a cat"為例,了解一下Masked操作。
下面的描述中使用了類似Teacher Forcing的概念,在Decoder的時候,是需要根據(jù)之前的翻譯,求解當前最有可能的翻譯,如下圖所示。
首先根據(jù)輸入"<Begin>"預(yù)測出第一個單詞為"I",此時得到ouput:"<Begin> I",將output也輸入decoder,decoder根據(jù)之前的翻譯結(jié)果"<Begin> I"以及新的encoder輸入(”有“這個詞向量),然后預(yù)測下一個單詞"have"。
Decoder可以在訓(xùn)練的過程中使用Teacher Forcing并且并行化訓(xùn)練,即將正確的單詞序列 (<Begin> I have a cat) 和對應(yīng)輸出 (I have a cat <end>) 傳遞到 Decoder。那么在預(yù)測第 i 個輸出時,就要將第 i+1 之后的單詞掩蓋住,注意Mask操作是在 Self-Attention的Softmax之前使用的,下面用 0 1 2 3 4 5 分別表示 "<Begin> I have a cat <end>"。
- 第一步
是Decoder的輸入矩陣和Mask矩陣,輸入矩陣包含"<Begin> I have a cat"(0, 1, 2, 3, 4)五個單詞的表示向量,Mask是一個 5×5 的矩陣。在Mask可以發(fā)現(xiàn)單詞 0 只能使用單詞 0 的信息,而單詞 1 可以使用單詞 0, 1 的信息,即只能使用之前的信息。
- 第二步
接下來的操作和之前的Self-Attention一樣,通過輸入矩陣X計算得到Q,?K,?V矩陣。然后計算Q和KT的乘積QKT。
- 第三步
在得到QKT之后需要進行Softmax,計算attention score,我們在Softmax之前需要使用Mask矩陣遮擋住每一個單詞之后的信息,遮擋操作如下:
得到Mask QKT之后在Mask QKT上進行 Softmax,每一行的和都為 1。但是單詞 0 在單詞 1, 2, 3, 4 上的attention score都為 0。
- 第四步
使用Mask QKT與矩陣V相乘,得到輸出Z,則單詞 1 的輸出向量?Z1 是只包含單詞 1 信息的。

- 第五步
通過上述步驟就可以得到一個Mask Self-Attention的輸出矩陣Zi,然后和Encoder類似,通過Multi-Head Attention拼接多個輸出Zi,然后計算得到第一個Multi-Head Attention的輸出Z,Z與輸入X維度一樣。
2)第二個Multi-Head Attention
Decoder block第二個Multi-Head Attention變化不大,主要的區(qū)別在于其中Self-Attention的?K,?V矩陣不是使用上一個Decoder block的輸出計算的,而是使用Encoder的編碼信息矩陣C計算的,這有助于解碼器把注意力集中在輸入序列的合適位置。
根據(jù)Encoder的輸出C計算得到K,?V,根據(jù)上一個Decoder block的輸出Z計算Q(如果是第一個Decoder block則使用輸入矩陣X進行計算),后續(xù)的計算方法與之前描述的一致。
這樣做的好處是在Decoder的時候,每一位單詞都可以利用到Encoder所有單詞的信息(這些信息無需Mask)。
3)Softmax預(yù)測輸出單詞
Decoder block最后的部分是利用Softmax預(yù)測下一個單詞,在之前的網(wǎng)絡(luò)層我們可以得到一個最終的輸出Z,因為Mask的存在,使得單詞 0 的輸出?Z0 只包含單詞 0 的信息,如下。?
Softmax根據(jù)輸出矩陣的每一行預(yù)測下一個單詞,
以上就是Decoder block的定義,與Encoder一樣,Decoder是由多個Decoder block組合而成。
接下來會重復(fù)這個過程,直到輸出一個結(jié)束符,表示Transformer解碼器已完成其輸出。每一步的輸出都會在下一個時間步輸入到下面的第一個解碼器,解碼器像編碼器一樣將解碼結(jié)果顯示出來。就像我們處理編碼器輸入一樣,我們也為解碼器的輸入加上位置編碼,來指示每個詞的位置。
7、Mask(掩碼)
Transformer模型屬于自回歸模型,也就是說后面的token的推斷是基于前面的token的。Decoder端的Mask的功能是為了保證訓(xùn)練階段和推理階段的一致性。
論文原文中關(guān)于這一點的段落如下:
在推理階段,token是按照從左往右的順序推理的。也就是說,在推理timestep=T的token時,decoder只能“看到”timestep < T的T-1 個Token,不能和timestep大于它自身的token做attention(因為根本還不知道后面的token是什么)。為了保證訓(xùn)練時和推理時的一致性,所以,訓(xùn)練時要同樣防止token與它之后的token去做attention。?
Transformer模型里面涉及兩種mask,分別是Padding Mask和Sequence Mask。其中,Padding Mask在所有的scaled dot-product attention里面都需要用到,而Sequence Mask只有在Decoder的Self-Attention里面用到。
1)Padding Mask
什么是Padding mask呢?因為每個批次輸入序列的長度是不一樣的,所以我們要對輸入序列進行對齊。具體來說,就是在較短的序列后面填充0(但是如果輸入的序列太長,則是截斷,把多余的直接舍棄)。因為這些填充的位置,其實是沒有什么意義的,所以我們的Attention機制不應(yīng)該把注意力放在這些位置上,所以我們需要進行一些處理。
具體的做法:把這些位置的值加上一個非常大的負數(shù)(負無窮),這樣的話,經(jīng)過Softmax后,這些位置的概率就會接近0。
2)Sequence Mask
Sequence Mask是為了使得Decoder不能看見未來的信息。也就是對于一個序列,在 t 時刻,我們的解碼輸出應(yīng)該只能依賴于 t 時刻之前的輸出,而不能依賴 t 之后的輸出。因為我們需要想一個辦法,把 t 之后的信息給隱藏起來。
具體的做法:產(chǎn)生一個上三角矩陣,上三角的值全為 0。把這個矩陣作用在每個序列上,就可以達到我們的目的。
3)總結(jié)
對于Decoder的Self-Attention,里面使用到的scaled dot-product attention,同時需要Padding Mask和Sequence Mask,具體實現(xiàn)就是兩個Mask相加。其他情況下,只需要Padding Mask。
8、最后的線性層和Softmax層
解碼器棧的輸出是一個float向量。我們怎么把這個向量轉(zhuǎn)換為一個詞呢?通過一個線性層再加上一個Softmax層實現(xiàn)。
線性層是一個簡單的全連接神經(jīng)網(wǎng)絡(luò),其將解碼器棧的輸出向量映射到一個更長的向量,這個向量被稱為logits向量。
現(xiàn)在假設(shè)我們的模型有10000個英文單詞(模型的輸出詞匯表)。因此logits向量有10000維,每個維度的數(shù)表示一個單詞的分數(shù)。然后,Softmax層會把這些分數(shù)轉(zhuǎn)換為概率(把所有的分數(shù)轉(zhuǎn)換為正數(shù),并且加起來等于1)。最后選擇最高概率所對應(yīng)的單詞,作為這個時間步的輸出。
9、正則化操作
為了提高Transformer模型的性能,在訓(xùn)練過程中,使用了以下的正則化操作:
- Dropout。對編碼器和解碼器的每個子層的輸出使用Dropout操作,是在進行殘差連接和層歸一化之前。詞嵌入向量和位置編碼向量執(zhí)行相加操作后,執(zhí)行Dropout操作。Transformer論文中提供的參數(shù)Pdrop = 0.1
- Label Smoothing(標簽平滑)。Transformer 論文中提供的參數(shù) ?ls = 0.1
0x3:Transformer和RNN的區(qū)別
- Transformer與RNN不同,可以比較好地并行訓(xùn)練。
- Transformer本身是不能利用單詞的順序信息的,因此需要在輸入中添加位置Embedding,否則Transformer就是一個詞袋模型了。
- Transformer的重點是Self-Attention結(jié)構(gòu),其中用到的Q,?K,?V矩陣通過輸出進行線性變換得到。
- Transformer中Multi-Head Attention中有多個Self-Attention,可以捕獲單詞之間多種維度上的相關(guān)系數(shù)attention score。
參考資料:
https://zhuanlan.zhihu.com/p/359366717 https://kazemnejad.com/blog/transformer_architecture_positional_encoding/ https://www.jianshu.com/p/e6b5b463cf7b https://jalammar.github.io/illustrated-transformer/ https://cloud.tencent.com/developer/article/1800935 https://blog.csdn.net/sinat_34072381/article/details/106173365 https://zhuanlan.zhihu.com/p/42833949 https://blog.csdn.net/benzhujie1245com/article/details/117173090 https://baijiahao.baidu.com/s?id=1651219987457222196&wfr=spider&for=pc https://mp.weixin.qq.com/s?__biz=MzI4MDYzNzg4Mw==&mid=2247506890&idx=4&sn=12445fc7d65284d0db385cc316c4e9cb&chksm=ebb7e31edcc06a089746a1c2a3ac192a1f859b2e0f757e94bcd01bd4b64a8025aa8ebf3a3070&scene=27
?文章來源地址http://www.zghlxwxcb.cn/news/detail-413166.html
二、GPT模型的迭代? -?算法思想/目標、使用的數(shù)據(jù)集/預(yù)處理方式、模型結(jié)構(gòu)、算法性能
GPT模型的訓(xùn)練需要超大的訓(xùn)練語料,超多的模型參數(shù)以及超強的計算資源。GPT系列的模型結(jié)構(gòu)秉承了不斷堆疊transformer的思想,通過不斷的提升訓(xùn)練語料的規(guī)模和質(zhì)量,提升網(wǎng)絡(luò)的參數(shù)數(shù)量來完成GPT系列的迭代更新的。GPT也證明了,通過不斷的提升模型容量和語料規(guī)模(模型參數(shù)不斷擴大產(chǎn)生的涌現(xiàn)現(xiàn)象),模型的能力是可以不斷提升的。
模型 | 發(fā)布時間 | 能力 | 模型結(jié)構(gòu) | 參數(shù)量 | 預(yù)訓(xùn)練數(shù)據(jù)量 | 后訓(xùn)練策略 |
---|---|---|---|---|---|---|
GPT-1 | 2018 年 6 月 | ? | Decoder | 1.17 億 | 約 5GB | - |
GPT-2 | 2019 年 2 月 | ? | Decoder | 15 億 | 40GB | - |
GPT-3 | 2020 年 5 月 |
|
Decoder | 1,750 億 | 45TB |
- |
ChatGPT(GPT-3.5) | 2022 年 11 月 |
|
Decoder | ? | ? | RLHF |
GPT-4 | 2023 年 3 月 | ? | Transformer-Style | ? | ? | RLHF(Reinforcement learning with human feedback)+RLHF(安全性)+RBRMS |
下圖展示了GPT生成模型的研究脈絡(luò):
0x1:GPT-1:無監(jiān)督學(xué)習(xí)
在GPT-1之前,傳統(tǒng)的NLP模型往往使用大量的數(shù)據(jù)對有監(jiān)督的模型進行任務(wù)相關(guān)的模型訓(xùn)練,但是這種有監(jiān)督學(xué)習(xí)的任務(wù)存在兩個缺點:?
- 需要大量的標注數(shù)據(jù),高質(zhì)量的標注數(shù)據(jù)往往很難獲得,特別是在一個垂直領(lǐng)域,獲取高質(zhì)量樣本的成本,甚至超過了訓(xùn)練模型和模型預(yù)測所能帶來的收益,簡單說就是ROI不高。
- 根據(jù)一個任務(wù)訓(xùn)練的模型很難泛化到其它任務(wù)中,這個模型只能叫做“領(lǐng)域?qū)<摇倍皇钦嬲睦斫饬薔LP。
GPT-1的思想是先通過在無標簽的數(shù)據(jù)上學(xué)習(xí)一個生成式的語言模型,然后再根據(jù)特定垂直任務(wù)進行微調(diào),處理的有監(jiān)督任務(wù)包括:
- 自然語言推理(Natural Language Inference 或者 Textual Entailment):判斷兩個句子是包含關(guān)系(entailment),矛盾關(guān)系(contradiction),或者中立關(guān)系(neutral)
- 問答和常識推理(Question answering and commonsense reasoning):類似于多選題,輸入一個文章,一個問題以及若干個候選答案,輸出為每個答案的預(yù)測概率
- 語義相似度(Semantic Similarity):判斷兩個句子是否語義上市是相關(guān)的
- 分類(Classification):判斷輸入文本是指定的哪個類別
將無監(jiān)督學(xué)習(xí)應(yīng)用于有監(jiān)督模型的預(yù)訓(xùn)練目標,因此叫做生成式預(yù)訓(xùn)練(Generative Pre-training,GPT)。
1、GPT-1的訓(xùn)練
GPT-1的訓(xùn)練分為無監(jiān)督的預(yù)訓(xùn)練和有監(jiān)督的模型微調(diào)。
1)無監(jiān)督訓(xùn)練
GPT-1的無監(jiān)督預(yù)訓(xùn)練是基于語言模型進行訓(xùn)練的,給定一個無標簽的序列,語言模型的優(yōu)化目標是最大化下面的似然值:
其中 k?是滑動窗口的大小,P?是條件概率,?Θ?是模型的參數(shù)。這些參數(shù)使用SGD進行優(yōu)化。
在GPT-1中,使用了12個transformer塊(6個編碼器、6個解碼器)的結(jié)構(gòu),每個transformer塊是一個多頭的自注意力機制,然后通過全連接得到輸出的概率分布。
其中是當前時間片的上下文token(決定用多少的輸入預(yù)測下一個字符的輸出), n?是層數(shù), We?是詞嵌入矩陣, Wp?是位置嵌入矩陣。
2)有監(jiān)督微調(diào)
當?shù)玫綗o監(jiān)督的預(yù)訓(xùn)練模型之后,我們將它的值直接應(yīng)用到有監(jiān)督任務(wù)中。對于一個有標簽的數(shù)據(jù)集C,每個實例有m個輸入token:{x1,…,xm}?,它對于的標簽 y?組成。
其中 Wy?為全連接層的參數(shù)。有監(jiān)督的目標則是最大化上式的值:?

作者并沒有直接使用 L2,而是向其中加入了 L1,并使用 λ?進行兩個任務(wù)權(quán)值的調(diào)整,?λ?的值一般為?0.5?:?

當進行有監(jiān)督微調(diào)的時候,我們只訓(xùn)練輸出層(后接的小模型)的 Wy?和分隔符(delimiter)的嵌入值。?
3)任務(wù)相關(guān)的輸入變換
對于不同的輸入,GPT-1有不同的處理方式,具體介紹如下:- 分類任務(wù):將起始和終止token加入到原始序列兩端,輸入transformer中得到特征向量,最后經(jīng)過一個全連接得到預(yù)測的概率分布;
- 自然語言推理:將前提(premise)和假設(shè)(hypothesis)通過分隔符(Delimiter)隔開,兩端加上起始和終止token。再依次通過transformer和全連接得到預(yù)測結(jié)果;
- 語義相似度:輸入的兩個句子,正向和反向各拼接一次,然后分別輸入給transformer,得到的特征向量拼接后再送給全連接得到預(yù)測結(jié)果;
- 問答和常識推理:將 n?個選項的問題抽象化為 n?個二分類問題,即每個選項分別和內(nèi)容進行拼接,然后各送入transformer和全連接中,最后選擇置信度最高的作為預(yù)測結(jié)果。

(左):transformer的基本結(jié)構(gòu),(右):GPT-1應(yīng)用到不同任務(wù)上輸入數(shù)據(jù)的變換方式
2、GPT-1的數(shù)據(jù)集
GPT-1使用了BooksCorpus數(shù)據(jù)集,這個數(shù)據(jù)集包含?7,000?本沒有發(fā)布的書籍。作者選這個數(shù)據(jù)集的原因有二:- 數(shù)據(jù)集擁有更長的上下文依賴關(guān)系,使得模型能學(xué)得更長期的依賴關(guān)系
-
這些書籍因為沒有發(fā)布,所以很難在下游數(shù)據(jù)集上見到,更能驗證模型的泛化能力
3、GPT-1的網(wǎng)絡(luò)結(jié)構(gòu)細節(jié)
GPT-1使用了12層的transformer,使用了掩碼自注意力頭,掩碼的使用使模型看不見未來的信息,得到的模型泛化能力更強。
1)無監(jiān)督訓(xùn)練
- 使用字節(jié)對編碼(byte pair encoding,BPE),共有?40,000?個字節(jié)對;
- 詞編碼的長度為?768?;
- 位置編碼也需要學(xué)習(xí);
- 12?層的transformer,每個transformer塊有?12?個頭;
- 位置編碼的長度是?3,072?;
- Attention,殘差,Dropout等機制用來進行正則化,drop比例為?0.1?;
- 激活函數(shù)為GLEU;
- 訓(xùn)練的batchsize為?64?,學(xué)習(xí)率為?2.5e?4?,序列長度為?512?,序列epoch為?100?;
- 模型參數(shù)數(shù)量為?1.17?億。
2)有監(jiān)督微調(diào)
- 無監(jiān)督部分的模型也會用來微調(diào);
- 訓(xùn)練的epoch為?3?,學(xué)習(xí)率為?6.25e?5?,這表明模型在無監(jiān)督部分學(xué)到了大量有用的特征。
4、GPT-1的性能
- 在有監(jiān)督學(xué)習(xí)的12個任務(wù)中,GPT-1在9個任務(wù)上的表現(xiàn)超過了state-of-the-art的模型。
- 在沒有見過數(shù)據(jù)的zero-shot任務(wù)中,GPT-1的模型要比基于LSTM的模型穩(wěn)定,且隨著訓(xùn)練次數(shù)的增加,GPT-1的性能也逐漸提升,表明GPT-1有非常強的泛化能力,能夠用到和有監(jiān)督任務(wù)無關(guān)的其它NLP任務(wù)中。
GPT-1證明了transformer對學(xué)習(xí)詞向量的強大能力,在GPT-1得到的詞向量基礎(chǔ)上進行下游任務(wù)的學(xué)習(xí),能夠讓下游任務(wù)取得更好的泛化能力。對于下游任務(wù)的訓(xùn)練,GPT-1往往只需要簡單的微調(diào)便能取得非常好的效果。
GPT-1在未經(jīng)微調(diào)的任務(wù)上雖然也有一定效果,但是其泛化能力遠遠低于經(jīng)過微調(diào)的有監(jiān)督任務(wù),說明了GPT-1只是一個簡單的領(lǐng)域?qū)<?,而非通用的語言學(xué)家。
0x2:GPT-2:多任務(wù)學(xué)習(xí)?
GPT-2的目標旨在訓(xùn)練一個泛化能力更強的詞向量模型,它并沒有對GPT-1的網(wǎng)絡(luò)進行過多的結(jié)構(gòu)的創(chuàng)新與設(shè)計,只是使用了更多的網(wǎng)絡(luò)參數(shù)和更大的數(shù)據(jù)集。?
1、GPT-2的核心思想
GPT-2的學(xué)習(xí)目標是使用無監(jiān)督的預(yù)訓(xùn)練模型做有監(jiān)督的任務(wù)。因為文本數(shù)據(jù)的時序性,一個輸出序列可以表示為一系列條件概率的乘積:?
上式也可以表示為,它的實際意義是根據(jù)已知的上文
預(yù)測未知的下文
,因此語言模型可以表示為
。對于一個有監(jiān)督的任務(wù),它可以建模為
的形式。在decaNLP中,他們提出的MQAN模型可以將機器翻譯,自然語言推理,語義分析,關(guān)系提取等10類任務(wù)統(tǒng)一建模為一個分類任務(wù),而無需再為每一個子任務(wù)單獨設(shè)計一個模型。
?
基于上面的思想,作者認為,當一個語言模型的容量足夠大時,它就足以覆蓋所有的有監(jiān)督任務(wù),也就是說所有的有監(jiān)督學(xué)習(xí)都是無監(jiān)督語言模型的一個子集。例如:
- 當模型訓(xùn)練完“Micheal Jordan is the best basketball player in the history”語料的語言模型之后,便也學(xué)會了(question:“who is the best basketball player in the history ?”,answer:“Micheal Jordan”)的Q&A任務(wù)。
綜上,GPT-2的核心思想概括為:任何有監(jiān)督任務(wù)都是語言模型的一個子集,當模型的容量非常大且數(shù)據(jù)量足夠豐富時,僅僅靠訓(xùn)練語言模型的學(xué)習(xí)便可以完成其他有監(jiān)督學(xué)習(xí)的任務(wù)。
2、GPT-2的數(shù)據(jù)集
GPT-2的文章取自于Reddit上高贊的文章,命名為WebText。數(shù)據(jù)集共有約800萬篇文章,累計體積約40G。為了避免和測試集的沖突,WebText移除了涉及Wikipedia的文章。
3、GPT-2的模型參數(shù)
- 同樣使用了使用字節(jié)對編碼構(gòu)建字典,字典的大小為?50,257?;
- 滑動窗口的大小為?1,024?;
- batchsize的大小為?512?;
- Layer Normalization移動到了每一塊的輸入部分,在每個self-attention之后額外添加了一個Layer Normalization;
- 將殘差層的初始化值用
進行縮放,其中 N?是殘差層的個數(shù)。
參數(shù)量 | 層數(shù) | 詞向量長度 |
---|---|---|
117M(GPT-1) | 12 | 768 |
345M | 24 | 1024 |
762M | 36 | 1280 |
1542M | 48 | 1600 |
4、GPT-2的性能
- 在8個語言模型任務(wù)中,僅僅通過zero-shot學(xué)習(xí),GPT-2就有7個超過了state-of-the-art的方法;
- 在“Children's Book Test”數(shù)據(jù)集上的命名實體識別任務(wù)中,GPT-2超過了state-of-the-art的方法約7%;
- “LAMBADA”是測試模型捕捉長期依賴的能力的數(shù)據(jù)集,GPT-2將困惑度從99.8降到了8.6;
- 在閱讀理解數(shù)據(jù)中,GPT-2超過了4個baseline模型中的三個;
- 在法譯英任務(wù)中,GPT-2在zero-shot學(xué)習(xí)的基礎(chǔ)上,超過了大多數(shù)的無監(jiān)督方法,但是比有監(jiān)督的state-of-the-art模型要差;
- GPT-2在文本總結(jié)的表現(xiàn)不理想,但是它的效果也和有監(jiān)督的模型非常接近。
0x3:GPT-3:初代GPT-3與大規(guī)模預(yù)訓(xùn)練
初代GPT-3展示了三個重要能力:?
- 語言生成:遵循提示詞(prompt),然后生成補全提示詞的句子。這也是今天人類與語言模型最普遍的交互方式。
- 上下文學(xué)習(xí) (in-context learning):遵循給定任務(wù)的幾個示例,然后為新的測試用例生成解決方案。很重要的一點是,GPT-3雖然是個語言模型,但它的論文幾乎沒有談到“語言建?!?(language modeling),作者將他們?nèi)康膶懽骶Χ纪度氲搅藢ι舷挛膶W(xué)習(xí)的愿景上,這才是GPT-3的真正重點。
- 世界知識:包括事實性知識(factual knowledge)和常識(commonsense)。
- 長距離理解能力:是多輪對話的基礎(chǔ)
那么這些能力從何而來呢?
基本上,以上三種能力都來自于大規(guī)模預(yù)訓(xùn)練:在有3000億單詞的語料上預(yù)訓(xùn)練擁有1750億參數(shù)的模型(訓(xùn)練語料的60%來自于 2016 - 2019 的 C4 + 22% 來自于 WebText2 + 16% 來自于Books + 3%來自于Wikipedia)。其中:
- 語言生成的能力來自于語言建模的訓(xùn)練目標?(language modeling)。
- 世界知識來自 3000 億單詞的訓(xùn)練語料庫。
- 模型的 1750 億參數(shù)是為了存儲知識,Liang et al. (2022) 的文章進一步證明了這一點。他們的結(jié)論是,知識密集型任務(wù)的性能與模型大小息息相關(guān)。
- 長距離理解能力來自對代碼語料庫的微調(diào)學(xué)習(xí)。
上下文學(xué)習(xí)的能力來源及為什么上下文學(xué)習(xí)可以泛化,仍然難以溯源。?直覺上,這種能力可能來自于同一個任務(wù)的數(shù)據(jù)點在訓(xùn)練時按順序排列在同一個batch中。然而,目前還沒有明確的研究確定語言模型為什么預(yù)訓(xùn)練會促使上下文學(xué)習(xí),以及為什么上下文學(xué)習(xí)的行為與微調(diào) (fine-tuning) 如此不同。
0x4:GPT-3.5:存在于大模型而非小模型的涌現(xiàn)能力
從最初的GPT-3開始,為了展示OpenAI是如何發(fā)展到ChatGPT的,我們看一下GPT-3.5的進化樹:
- 在 2020 年 7 月,OpenAI 發(fā)布了模型索引為的 davinci 的初代 GPT-3 論文,從此它就開始不斷進化。
- 在 2021 年 7 月,Codex 的論文發(fā)布,其中初始的 Codex 是根據(jù)(可能是內(nèi)部的)120 億參數(shù)的 GPT-3 變體進行微調(diào)的。后來這個 120 億參數(shù)的模型演變成 OpenAI API 中的code-cushman-001。
- 在 2022 年 3 月,OpenAI 發(fā)布了指令微調(diào) (instruction tuning) 的論文,其監(jiān)督微調(diào) (supervised instruction tuning) 的部分對應(yīng)了davinci-instruct-beta和text-davinci-001。
- 在 2022 年 4 月至 7 月的,OpenAI 開始對code-davinci-002模型進行 Beta 測試,也稱其為 Codex。然后code-davinci-002、text-davinci-003和ChatGPT 都是從code-davinci-002進行指令微調(diào)得到的。詳細信息請參閱 OpenAI的模型索引文檔。
盡管 Codex 聽著像是一個只管代碼的模型,但code-davinci-002可能是最強大的針對自然語言的GPT-3.5 變體(優(yōu)于 text-davinci-002和 -003)。code-davinci-002很可能在文本和代碼上都經(jīng)過訓(xùn)練,然后根據(jù)指令進行調(diào)整。
- 在 2022 年 5-6 月發(fā)布的text-davinci-002是一個基于code-davinci-002的有監(jiān)督指令微調(diào) (supervised instruction tuned) 模型。在text-davinci-002上面進行指令微調(diào)很可能降低了模型的上下文學(xué)習(xí)能力,但是增強了模型的零樣本能力。
- 然后是text-davinci-003和 ChatGPT,它們都在 2022 年 11 月發(fā)布,是使用的基于人類反饋的強化學(xué)習(xí)的版本指令微調(diào) (instruction tuning with reinforcement learning from human feedback) 模型的兩種不同變體。text-davinci-003 恢復(fù)了(但仍然比code-davinci-002差)一些在text-davinci-002 中丟失的部分上下文學(xué)習(xí)能力(大概是因為它在微調(diào)的時候混入了語言建模) 并進一步改進了零樣本能力(得益于RLHF)。另一方面,ChatGPT 似乎犧牲了幾乎所有的上下文學(xué)習(xí)的能力來換取建模對話歷史的能力。
總的來說,在 2020 - 2021 年期間,在code-davinci-002之前,OpenAI 已經(jīng)投入了大量的精力通過代碼訓(xùn)練和指令微調(diào)來增強GPT-3。當他們完成code-davinci-002時,所有的能力都已經(jīng)存在了。很可能后續(xù)的指令微調(diào),無論是通過有監(jiān)督的版本還是強化學(xué)習(xí)的版本,都會做以下事情:
- 指令微調(diào)不會為模型注入新的能力 —— 所有的能力都已經(jīng)存在了。指令微調(diào)的作用是解鎖 / 激發(fā)這些能力。這主要是因為指令微調(diào)的數(shù)據(jù)量比預(yù)訓(xùn)練數(shù)據(jù)量少幾個數(shù)量級(基礎(chǔ)的能力是通過預(yù)訓(xùn)練注入的)。
- 指令微調(diào)將 GPT-3.5 的分化到不同的技能樹。有些更擅長上下文學(xué)習(xí),如text-davinci-003,有些更擅長對話,如ChatGPT。
- 指令微調(diào)通過犧牲性能換取與人類的對齊(alignment)。OpenAI 的作者在他們的指令微調(diào)論文中稱其為 “對齊稅” (alignment tax)。許多論文都報道了code-davinci-002在基準測試中實現(xiàn)了最佳性能(但模型不一定符合人類期望)。在code-davinci-002上進行指令微調(diào)后,模型可以生成更加符合人類期待的反饋(或者說模型與人類對齊),例如:零樣本問答、生成安全和公正的對話回復(fù)、拒絕超出模型它知識范圍的問題。
總結(jié)來說:
- 語言生成能力 + 基礎(chǔ)世界知識 + 上下文學(xué)習(xí)都是來自于預(yù)訓(xùn)練。
- 存儲大量知識的能力來自 1750 億的參數(shù)量。
- 遵循指令和泛化到新任務(wù)的能力來自于擴大指令學(xué)習(xí)中指令的數(shù)量。
- 執(zhí)行復(fù)雜推理的能力很可能來自于代碼訓(xùn)練。
- 生成中立、客觀的能力、安全和翔實的答案來自與人類的對齊。具體來說:
- 如果是監(jiān)督學(xué)習(xí)版,得到的模型是text-davinci-002
- 如果是強化學(xué)習(xí)版 (RLHF) ,得到的模型是text-davinci-003
- 無論是有監(jiān)督還是 RLHF ,模型在很多任務(wù)的性能都無法超過 code-davinci-002 ,這種因為對齊而造成性能衰退的現(xiàn)象叫做對齊稅。
- 對話能力也來自于 RLHF(ChatGPT),具體來說它犧牲了上下文學(xué)習(xí)的能力,來換?。?
- 建模對話歷史
- 增加對話信息量
- 拒絕模型知識范圍之外的問題
在以上的效果圖中,我們可以觀察到模型的表現(xiàn):
- 當尺寸相對小的時候提升并不大
- 當模型變大時有很明顯的提升
這從根本上說明,某些能力可能不存在于小模型中,而是在大模型中獲得的。有很多種突現(xiàn)能力,但目前學(xué)術(shù)界主流主要對以下能力感興趣:
- NLP社區(qū)近幾年都關(guān)注但還沒實現(xiàn)的能力
- 之前的NLP模型很難達到的能力
- 源自于人類語言最深層的本質(zhì)的能力
- 可能達到人類智力的最高水平的能力
很多有意思的能力都可以歸到上文提到的類別里,在它們之中,我們主要討論以下三種典型能力:
- 復(fù)雜推理,大型模型在沒有使用全部訓(xùn)練數(shù)據(jù)的情況下便顯著優(yōu)于以前的小型模型。
- 知識推理,大型模型可能沒有小模型效果好,但大模型不需要額外的知識來源(知識可能很昂貴,或者很難從非結(jié)構(gòu)化數(shù)據(jù)中抽取)。
- 分布外魯棒性,這是之前進行模型精調(diào)時需要努力解決的問題。大型模型雖然在同分布情況下的效果不如以前的方法,但非同分布情況下的泛化性能卻好得多。
復(fù)雜推理
雖然這道題對于10歲的孩子來說很容易,但對語言模型來說卻很難,主要是由于數(shù)學(xué)和語言混合在一起。
GSM8K 最初由 OpenAI 于 2021 年 10 月提出。當時他們用第一版GPT3在全部訓(xùn)練集上進行了精調(diào),準確率約為 35%。這個結(jié)果讓作者相當悲觀,因為他們的結(jié)果顯示了語言模型的縮放規(guī)律:隨著模型大小呈指數(shù)增長,性能呈線性增長(即投入收益不成比例)。因此,他們在第 4.1 節(jié)中思考:
“175B 模型似乎需要至少額外兩個數(shù)量級的訓(xùn)練數(shù)據(jù)才能達到 80% 的求解率?!?/pre>
- 三個月后,即 2022 年 1 月,Wei 等人基于 540B PaLM 模型,僅使用了8個思維鏈提示示例便將準確率提高到56.6%?(無需將訓(xùn)練集增加兩個數(shù)量級)
- 之后在?2022 年 3 月,Wang 等人基于相同的 540B PaLM 模型,通過多數(shù)投票的方法將準確率提高到?74.4%
從以上進展可以看到,技術(shù)進步確實呈指數(shù)級增長。
思維鏈提示是一個展示模型隨著規(guī)模突現(xiàn)出能力的典型例子:
- 從突現(xiàn)能力來看:盡管不需要 17500B,但模型大小確實要大于 100B ,才能使思維鏈的效果大于的僅有回答提示。所以這種能力只存在于大型模型中。
- 從效果來看:思想鏈提示的性能明顯優(yōu)于其之前的精調(diào)方法(目前還沒有能公平對比提示詞和微調(diào)的工作。但當思維鏈被提出的時候,盡管他們對于提示和精調(diào)的比較可能是不公平的,但確實比精調(diào)效果要好)。
- 從標注效率上來看:思維鏈提示只需要 8 個示例的注釋,而微調(diào)需要完整的訓(xùn)練集。
知識推理
下一個例子是需要知識的推理能力(例如問答和常識推理)
Yu et. al. 2022. 以前的 SOTA 模型需要從外部知識源中檢索。GPT-3 的性能與以前的模型相當/優(yōu)于以前的模型,且無需檢索。
如表中所示,與數(shù)學(xué)題的例子不同,GPT-3 并沒有明顯優(yōu)于之前的精調(diào)模型。但它不需要從外部文檔中檢索,本身就包含了知識(雖然這些知識可能過時或者不可信,但選擇哪種可信知識源超出了本文的討論范圍)。
為了理解這些結(jié)果的重要性,我們可以回顧一下歷史:NLP 社區(qū)從一開始就面臨著如何有效編碼知識的挑戰(zhàn)。人們一直在不斷探究把知識保存在模型外部或者內(nèi)部的方法。上世紀九十年代以來,人們一直試圖將語言和世界的規(guī)則記錄到一個巨大的圖書館中,將知識存儲在模型之外。但這是十分困難的,畢竟我們無法窮舉所有規(guī)則。因此,研究人員開始構(gòu)建特定領(lǐng)域的知識庫,來存儲非結(jié)構(gòu)化文本、半結(jié)構(gòu)化(如維基百科)或完全結(jié)構(gòu)化(如知識圖譜)等形式的知識。
通常,結(jié)構(gòu)化知識很難構(gòu)建(因為要設(shè)計知識的結(jié)構(gòu)體系),但易于推理(因為有體系結(jié)構(gòu)),非結(jié)構(gòu)化知識易于構(gòu)建(直接存起來就行),但很難用于推理(沒有體系結(jié)構(gòu))。然而,語言模型提供了一種新的方法,可以輕松地從非結(jié)構(gòu)化文本中提取知識,并在不需要預(yù)定義模式的情況下有效地根據(jù)知識進行推理。下表為優(yōu)缺點對比:
? | 構(gòu)建 | 推理 | |
---|---|---|---|
結(jié)構(gòu)化知識 |
難構(gòu)建,需要設(shè)計體系結(jié)構(gòu)并解析
|
容易推理,模型結(jié)構(gòu)已經(jīng)確定,輸入和輸出的格式都是確定的 | ? |
非結(jié)構(gòu)化知識 | 容易構(gòu)建,只存儲文本即可 |
難推理,強依賴于
|
? |
語言模型 | 容易構(gòu)建,在非結(jié)構(gòu)化文本上訓(xùn)練 | 容易推理,使用提示詞即可 | ? |
分布外魯棒性

Si et. al. 2022. 雖然 GPT-3 在同分布設(shè)置下比 RoBERTa 要差,但在非同分布設(shè)置下優(yōu)于 RoBERTa,性能下降明顯更小。
同樣,在此實驗中,同分布情況下基于提示詞的 GPT-3 的效果并沒有精調(diào)后的 RoBERTa要好。但它在三個其他分布(領(lǐng)域切換、噪聲和對抗性擾動)中優(yōu)于 RoBERTa,這意味著 GPT3 更加魯棒。
此外,即使存在分布偏移,好的提示詞所帶來的泛化性能依舊會繼續(xù)保持。比如:

Fu et. al. 2022. 即使測試分布與訓(xùn)練分布不同,復(fù)雜提示也始終比簡單提示的表現(xiàn)更好。
Fu 等人2022年的研究顯示,輸入提示越復(fù)雜,模型的性能就越好。這種趨勢在分布轉(zhuǎn)移的情況下也會繼續(xù)保持:無論測試分布與原分布不同、來自于噪聲分布,或者是從另一個分布轉(zhuǎn)移而來的,復(fù)雜提示始終優(yōu)于簡單提示。?在進一步討論之前,讓我們再回顧一下之前的工作,就會發(fā)現(xiàn)一個很奇怪的問題:GPT-3 在 2020 年就發(fā)布了,但為什么直到現(xiàn)在我們才發(fā)現(xiàn)并開始思考范式的轉(zhuǎn)變?這個問題的答案就藏在兩種曲線中:對數(shù)線性曲線和相變曲線。如下圖:
左圖: 比例定律. 當模型大小呈指數(shù)增長時,相應(yīng)的模型性能呈線性增長。
右圖: 當模型尺寸達到一定規(guī)模時,會出現(xiàn)突現(xiàn)能力,讓性能急劇增加。
最初,(OpenAI)的研究者認為語言模型的性能與模型尺寸的關(guān)系可以通過對數(shù)線性曲線預(yù)測,即模型尺寸呈指數(shù)增長時,性能會隨之線性增加。這種現(xiàn)象被稱為語言模型的縮放定律,正如 Kaplan 等人在2020年最初的GPT3文章中討論的那樣。重要的是,在那個階段,即便最大的 GPT-3 在有提示的情況下也不能勝過小模型精調(diào)。所以當時并沒有必要去使用昂貴的大模型(即使提示詞的標注效率很高)。
直到2021年,Cobbe 等人發(fā)現(xiàn)縮放定律同樣適用于精調(diào)。這是一個有點悲觀的發(fā)現(xiàn),因為它意味著我們可能被鎖定在模型規(guī)模上——雖然模型架構(gòu)優(yōu)化可能會在一定程度上提高模型性能,但效果仍會被鎖定在一個區(qū)間內(nèi)(對應(yīng)模型規(guī)模),很難有更顯著的突破。
在縮放定律的掌控下(2020年到2021),由于GPT-3無法勝過精調(diào) T5-11B,同時T5-11B微調(diào)已經(jīng)很麻煩了,所以NLP社區(qū)的關(guān)注點更多的是研究更小的模型或者高效參數(shù)適應(yīng)。Prefix tuning就是提示和適應(yīng)交叉的一個例子,后來由 He 等人在 2021統(tǒng)一。當時的邏輯很簡單:如果精調(diào)效果更好,我們就應(yīng)該在高效參數(shù)適應(yīng)上多下功夫;如果提示詞的方法更好,我們應(yīng)該在訓(xùn)練大型語言模型上投入更多精力。
之后在 2022 年 1 月,思維鏈的工作被放出來了。正如作者所展示的那樣,思維鏈提示在性能-比例曲線中表現(xiàn)出明顯的相變。當模型尺寸足夠大時,性能會顯著提高并明顯超越比例曲線。當使用思維鏈進行提示時,大模型在復(fù)雜推理上的表現(xiàn)明顯優(yōu)于微調(diào),在知識推理上的表現(xiàn)也很有競爭力,并且分布魯棒性也存在一定的潛力。要達到這樣的效果只需要8個左右的示例,這就是為什么范式可能會轉(zhuǎn)變的原因。
范式轉(zhuǎn)變究竟意味著什么?下面我們給出精調(diào)和提示詞方法的對比:
模型規(guī)模 | 學(xué)習(xí)方法 | 學(xué)習(xí)范式 | 數(shù)據(jù) | 泛化 |
---|---|---|---|---|
小模型 | 微調(diào)/精調(diào) | ?監(jiān)督學(xué)習(xí) | 完整訓(xùn)練數(shù)據(jù)集 | 分布內(nèi)泛化,分布外泛化能力欠佳 |
大模型 | 上下文學(xué)習(xí) | ?自監(jiān)督學(xué)習(xí)/無監(jiān)督學(xué)習(xí) | 少量提示詞 | 同時泛化到分布內(nèi)(分布內(nèi)泛化能力有所損失) + 分布遷移 |
提示詞的好處很明顯:我們不再需要繁瑣的數(shù)據(jù)標注和在全量數(shù)據(jù)上進行精調(diào),只需要編寫提示詞并獲得滿足要求的結(jié)果,這比精調(diào)要快很多。??
參考資料:
https://mp.weixin.qq.com/s?__biz=MzAxMTk4NDkwNw==&mid=2247492293&idx=1&sn=14f0e33658ee2f33100113c55ebf9e2c&scene=21#wechat_redirect https://mp.weixin.qq.com/s?__biz=MzAxMTk4NDkwNw==&mid=2247492896&idx=1&sn=69484f88ee4bc67221e2a5a08fff8f91&chksm=9bba6c44accde55299c96060366cafa427c63453100df6c4922bb50403d9f36eefd020123a9a&token=1296225236&lang=zh_CN#rd https://zhuanlan.zhihu.com/p/350017443
?
三、GPT技術(shù)對垂直業(yè)務(wù)的賦能展望
在應(yīng)用領(lǐng)域,GPT-4是一個速度倍增器,可以用來強化/增強/輔助/加速現(xiàn)有技術(shù)、效率和生產(chǎn)力。
產(chǎn)品 | 戰(zhàn)略 | AI核心能力 | 定位 | 技術(shù)落地形式 | 產(chǎn)品形態(tài) | 產(chǎn)品優(yōu)勢能力 |
---|---|---|---|---|---|---|
Microsoft Security Copilot | 數(shù)據(jù)【威脅情報】+ 算法【AI】+ 算力【云】 | 加速整個pipline處理流程各個環(huán)節(jié),提升生產(chǎn)力和效率 | AI并非取代安全人員的工作,而是輔助/賦能安全分析師更高效輸出價值 | 延續(xù)了ChatGPT的問答模式,核心技術(shù)是GPT-4和安全專用模型 | OpenAI GPT預(yù)訓(xùn)練模型+微軟安全垂直領(lǐng)域語料+安全專家訓(xùn)練的fine-tune小模型+大規(guī)模的威脅情報數(shù)據(jù)+e2e安全工具 |
|
Bing搜索引擎【AI賦能】 | 待跟進? | ? | ? | ? | ? | ? |
Office套件【AI賦能】 | ?待跟進 | ? | ? | ? | ? | ? |
惡意代碼檢測 | ? | ? | ? |
|
? | ? |
大模型在每一個領(lǐng)域的應(yīng)用效果,取決于后訓(xùn)練的數(shù)據(jù)質(zhì)量,其本質(zhì)上是對大模型的引導(dǎo)程度和引導(dǎo)深度。
GPT大模型的出現(xiàn),引發(fā)了對知識和人腦智能機制的重新理解。
- “預(yù)訓(xùn)練”是指科技巨頭通過大量文本語料庫的訓(xùn)練,教會它語言的基本模式和關(guān)系——簡而言之,是教它理解世界。
- “生成式”意味著AI可以從這個基礎(chǔ)知識庫中創(chuàng)造新的想法。
但是,其實GPT在”創(chuàng)造“新想法的時候,其實并沒有引入新的語料庫,也沒有修改原始模型,它本質(zhì)上只是在自己的模型中進行”搜索“。也就是說,這些所謂的”被創(chuàng)造“出來的”新知識“,其實一早就已經(jīng)存在于GPT內(nèi)部的網(wǎng)絡(luò)中,只是在等待對應(yīng)的”引導(dǎo)(prompt)“去激發(fā)出這些新知識。
這讓筆者想起了一句話:
?
四、預(yù)訓(xùn)練大模型+后訓(xùn)練小模型fine-tune 和 GPT預(yù)訓(xùn)練大模型+instruction tuning的技術(shù)區(qū)別
對于GPT模型來說,模型參數(shù)永遠是固定不變的,本質(zhì)是在做預(yù)測任務(wù),多輪對話的本質(zhì)是不斷擴充input,
比如下面的例子:
可以看到,通過不斷的對話,不斷擴充了input,激活了模型更多的神經(jīng)元,回答地就更精確了。
筆者認為,其本質(zhì)是因為GPT模型內(nèi)部的搜索空間和路徑預(yù)測空間十分巨大,因此,通過調(diào)整和明確的instruction tuning,可以獲得不同精確程度的預(yù)測路徑,這在宏觀上就表現(xiàn)出了一種”創(chuàng)造性“行為。
而預(yù)訓(xùn)練大模型+小模型fine-tune的本質(zhì)是重新做訓(xùn)練任務(wù),決定最終效果的因素可能包括:
- 基模型本身的泛化能力,以及在新的任務(wù)上的遷移能力
- 小模型自身的復(fù)雜程度
- 訓(xùn)練語料庫的質(zhì)量
參考資料:
https://www.kunchengblog.com/essay/ilya https://toooold.com/2023/04/08/magnificient_underdogs.html?continueFlag=34ed6b02ba678ae8608c3a02e8607732
??
五、未來大模型和網(wǎng)絡(luò)安全的潛在結(jié)合點
如果說近十幾年來,全球的”算法工程師“相當于60年代”大躍進“時普遍搞”小煙囪式“的小模型(相比GPT),當GPT-4技術(shù)出來后,相當于出現(xiàn)了”首鋼/寶鋼“這類的大型壟斷企業(yè),小作坊式的小算法模型將徹底被放進歷史博物館。
少數(shù)頭部機構(gòu)/公司基于語料庫+計算能力的絕對壁壘,將壟斷大模型的研發(fā)和迭代,下游各個領(lǐng)域的業(yè)務(wù)工程師則基于這些預(yù)訓(xùn)練大模型開發(fā)自己的垂直領(lǐng)域小模型(僅僅需要喂入領(lǐng)域數(shù)據(jù)對大模型進行fine-tune)。
先展望一下在大模型應(yīng)用端的幾種可能應(yīng)用形態(tài):
- 現(xiàn)有產(chǎn)品接入OpenAI API
- 基于開源類GPT大模型+領(lǐng)域小模型fine-tune,訓(xùn)練出垂直領(lǐng)域xGPT模型
- 如果遇到國家間技術(shù)封鎖,則依賴國內(nèi)公司自研國產(chǎn)大模型,使用其服務(wù)和資源
具體到應(yīng)用領(lǐng)域上,其實網(wǎng)絡(luò)安全幾乎所有領(lǐng)域都可以找到結(jié)合點。從最抽象的層面來看,”問答“的本質(zhì)就是”輸入-輸出“模型,這里輸入可以是一個樣本、一條日志、一段shellcode、一個問題,這里輸出可以是一個樣本分析結(jié)果、一個入侵判斷結(jié)果、一個入侵/回溯處置建議。
- 增強攻擊欺騙技術(shù):預(yù)設(shè)不同的角色給到GPT模型,例如終端角色,如果攻擊者輸入cat /etc/passwd,GPT就會返回相應(yīng)信息,以假亂真,生成符合預(yù)期的與攻擊者交互的“攻擊和響應(yīng)”對話內(nèi)容,但也要注意攔截偏離預(yù)期的回答。
- 增強可信縱深檢測和防御體系:預(yù)設(shè)場景提問,給出預(yù)期內(nèi)行為的定義,讓GPT直接去預(yù)測?;蚴墙o出正常行為數(shù)據(jù),讓GPT自己總結(jié)出預(yù)期內(nèi)行為的特征和規(guī)律,輔助/加速做可信策略。
值得注意的是,?擁抱大模型對于網(wǎng)絡(luò)安全從業(yè)者提質(zhì)增效而言肯定是一個正確甚至必要的方向。事實上,如果不考慮信息泄露風(fēng)險的話,在安全產(chǎn)品研發(fā)過程中直接使用ChatGPT這類大模型就可以直接獲得顯著的開發(fā)效率和質(zhì)量提升。然而,要想實現(xiàn)系統(tǒng)和全面的智能安全化,還有很多基礎(chǔ)性的工作需要去做,同時還有一些關(guān)鍵問題需要探索。以下是相關(guān)的幾點思考和建議。文章來源:http://www.zghlxwxcb.cn/news/detail-413166.html
- 扎實做好安全垂直領(lǐng)域的數(shù)字化和知識化積累。大模型不僅可以為安全產(chǎn)品的數(shù)字化和知識化提供技術(shù)和業(yè)務(wù)背景知識,而且還為我們整合數(shù)字化和知識化平臺中的信息和知識提供了一種有力的手段。
?
到了這里,關(guān)于Generative Pre-trained Transformer(GPT)模型技術(shù)初探的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!