天天看點

預訓練語言模型 | (2) transformer

原文連結

目錄

1. 背景

2. transformer流程與技術細節

3. 總結

1. 背景

17年之前,語言模型都是通過rnn,lstm來模組化,這樣雖然可以學習上下文之間的關系,但是無法并行化,給模型的訓練和推理帶來了困難,是以論文提出了一種完全基于attention來對語言模組化的模型,叫做transformer。transformer擺脫了nlp任務對于rnn,lstm的依賴,使用了self-attention的方式對上下文進行模組化,提高了訓練和推理的速度,transformer也是後續更強大的nlp預訓練模型的基礎,是以有必要花很大的篇幅詳解一下這個模型。

transformer中的self-attention是從普通的點積attention中演化出來的,演化過程中可以看:遍地開花的 Attention ,你真的懂嗎?

2. transformer流程與技術細節

預訓練語言模型 | (2) transformer

<1> Inputs是經過padding的輸入資料,大小是[batch size, max seq length]。

<2> 初始化embedding matrix,通過embedding lookup将Inputs映射成token embedding,大小是[batch size, max seq length, embedding size],然後乘以embedding size的開方。

乘以embedding size開方的原因是:猜測是因為embedding matrix的初始化方式是xavier init,這種方式的方差是1/embedding size,是以乘以embedding size的開方使得embedding matrix的方差是1,在這個scale下可能更有利于embedding matrix的收斂。

<3> 通過sin和cos函數建立positional encoding,表示一個token的絕對位置資訊,并加入到token embedding中,然後dropout。

inputs/token embedding加入positional encoding原因:因為self-attention是位置無關的,無論句子的順序是什麼樣的,通過self-attention計算的token的hidden embedding都是一樣的,這顯然不符合人類的思維。是以要有一個辦法能夠在模型中表達出一個token的位置資訊,transformer使用了固定的positional encoding來表示token在句子中的絕對位置資訊。positional encoding的公式如下:

預訓練語言模型 | (2) transformer

至于positional encoding為什麼能表示位置資訊,可以看如何了解Transformer論文中的positional encoding,和三角函數有什麼關系?

<4> multi-head attention

<4.1> 輸入token embedding,分别通過三個Dense層生成Q,K,V,大小都是[batch size, max seq length, embedding size],然後按第2維(embedding_size維)split成num heads份并按第0維concat(多個注意力頭并行計算),生成新的Q,K,V,大小是[num heads*batch size, max seq length, embedding size/num heads],完成multi-head的操作。

<4.2> 将K的第1維和第2維進行轉置,然後Q和轉置後的K的進行點積(QK^T),結果的大小是[num heads*batch size, max seq length, max seq length]。(包括每一個token查詢向量和其他所有token的鍵向量的内積結果)

<4.3> 将<4.2>的結果除以hidden size的開方(在transformer中,hidden size=embedding size),完成scale的操作。

scale的原因:以數組為例,2個長度是len,均值是0,方差是1的數組點積會生成長度是len,均值是0,方差是len的數組。而方差變大會導緻softmax的輸入推向正無窮或負無窮,這時的梯度會無限趨近于0,不利于訓練的收斂。是以除以len的開方,可以是數組的方差重新回歸到1,有利于訓練的收斂。

<4.4> 将<4.3>中padding部分token的點積結果置成一個很小的數(-2^32+1),完成mask操作,後續softmax對padding的結果就可以忽略不計了。

<4.5> 将經過mask的結果進行softmax操作。

<4.6> 将softmax的結果和V進行點積,得到attention的結果,大小是[num heads*batch size, max seq length, hidden size/num heads]。

<4.7> 将attention的結果按第0維split成num heads份并按第2維concat,生成multi-head attention的結果,大小是[batch size, max seq length, hidden size]。Figure 2上concat之後還有一個linear的操作,但是代碼裡并沒有。

為什麼attention需要multi-head,一個大head行不行?

multi-head相當于把一個大空間劃分成多個互斥的小空間,然後在小空間内分别計算attention,雖然單個小空間的attention計算結果沒有大空間計算得精确,但是多個小空間并行計算attention然後結果concat有助于網絡捕捉到更豐富的資訊,類比cnn網絡中的channel。

<5> 将token embedding和multi-head attention的結果相加,并進行Layer Normalization(二者次元相同)。

multi-head attention的輸入和輸出相加的原因:類似于resnet中的殘差學習單元(殘差連接配接,shortcut,緩解梯度消失),有ensemble的思想在裡面,解決網絡退化問題。

<6> 将<5>的結果經過2層Dense(全連接配接層),其中第1層的activation=relu,第2層activation=None。

為什麼multi-head attention後面要加一個ffn?

類比cnn網絡中,cnn block和fc交替連接配接,效果更好。相比于單獨的multi-head attention,在後面加一個ffn,可以提高整個block的非線性變換的能力。

<7> 功能和<5>一樣。

<8> Outputs是經過padding的輸出資料,與Inputs不同的是,Outputs的需要在序列前面加上一個起始符号”

<s>

”,用來表示序列生成的開始,而Inputs不需要。(batch_size,max seq length)

<9> 功能和<2>一樣。

<10> 功能和<3>一樣。

<11> 功能和<4>類似,唯一不同的一點在于mask,<11>中的mask不僅将padding部分token的點積結果置成一個很小的數,而且将目前token(查詢向量)與之後的token(鍵向量)的點積結果也置成一個很小的數。

為什麼要mask目前時刻的token與後續token的點積結果?

自然語言生成(例如機器翻譯,文本摘要)是auto-regressive的,在推理的時候隻能依據之前的token生成目前時刻的token,正因為生成目前時刻的token的時候并不知道後續的token長什麼樣,是以為了保持訓練和推理的一緻性,訓練的時候也不能利用後續的token來生成目前時刻的token。這種方式也符合人類在自然語言生成中的思維方式。

<12> 功能和<5>一樣。

<13> 功能和<4>類似,唯一不同的一點在于Q,K,V的輸入,<13>的Q的輸入來自于Outputs 的token embedding,<13>的K,V來自于<7>的結果(分别經過兩個Dense層)。

<14> 功能和<5>一樣。

<15> 功能和<6>一樣。

<16> 功能和<7>一樣,結果的大小是[batch size, max seq length, hidden size]。

<17> 将<16>的結果的後2維和embedding matrix的轉置進行點積,生成的結果的大小是[batch size, max seq length, vocab size]。

<18> 将<17>的結果進行softmax操作,生成的結果就表示目前時刻預測的下一個token在vocab上的機率分布。

<19> 計算<18>得到的下一個token在vocab上的機率分布和真實的下一個token的one-hot形式的cross entropy,然後sum非padding的token的cross entropy當作loss,利用adam進行訓練。

3. 總結

在小模型上self-attention并不比rnn,lstm好。直到大力出奇迹的bert出現,當模型變得越來越大,樣本數越來越多的時候,self-attention無論是并行化帶來的訓練提速,還是在長距離上的模組化,都是要比傳統的rnn,lstm好很多。transformer現在已經是各種具有代表性的nlp預訓練模型的基礎,bert系列預訓練模型使用了transformer的encoder,gpt系列預訓練模型使用了transformer的decoder。在推薦領域,transformer的multi-head attention也應用得很廣泛。

繼續閱讀