理解transformer
文章目錄
- 1 注意力機制
- 2 自注意力機制
- 3 自注意力機制加強版
- 4 Transformer的結構
- 4.1 input
- 4.2 encoder
- 4.2.1 Multi-head attention
- 4.2.2 殘差鏈接
- 4.2.3 層正則化layer norm
- 4.2.4 前饋神經網絡 feed forward network
- 4.3 decoder
- 4.3.1 輸入
- 4.3.1 Masked Multi-head attention
- 4.3.2 Multi-head attention
- 4.3.3 前饋神經網絡 feed forward network
- 4.4 The Final Linear and Softmax Layer
- 4.5 decoder總結
- 4.4 The Loss Function
- 4.5 代碼閱讀
1 注意力機制
在LSTM模型中,將encoder最后一個時間步的隱狀態作為decoder的輸入,這會導致一個問題:會丟失很多前面的信息。畢竟隱狀態的維度是有限的,能承載的信息也是有限的。距離越遠,丟的信息越多。注意力機制的提出就是用來解決這個問題的。
注意力機制是在seq2seq模型中提出的。注意力機制是seq2seq帶給nlp最好的禮物。
我們希望h1,h2,h3,h4h_1,h_2,h_3,h_4h1?,h2?,h3?,h4?都能參與到解碼器的計算中。這樣就需要給他們分配一個權重,那這個權重怎么學習呢?
我們把編碼器的輸出變量h1,h2,h3,h4h_1,h_2,h_3,h_4h1?,h2?,h3?,h4?稱為value。
把解碼器的每一步輸出hi′h_i'hi′?稱為query。
使用(query,key)對計算權重。key就是h1,h2,h3,h4h_1,h_2,h_3,h_4h1?,h2?,h3?,h4?。
上一步得到的權重與value(這里仍然是h1,h2,h3,h4h_1,h_2,h_3,h_4h1?,h2?,h3?,h4?)加權平均得到注意力輸出。
這樣的模式可以推廣到所有需要注意力模型的地方。
value通常是上一個階段的輸出,key和value是一樣的。
query通常是另外的一個向量。
使用 (query,key) 進行加權求和,得到的值作為權重,再對value進行加權求和。
這樣的話在decoder階段,每一步的輸入會有3個變量:編碼器經過注意力加權后的輸出h(這個時候的query是hi?1′h_{i-1}'hi?1′?),解碼器上一步的隱狀態hi?1′h_{i-1}'hi?1′?,上一步的輸出yi?1y_{i-1}yi?1?。
Bahdanau是注意力機制的一種計算方法,也是現在很多工具包中的實現方法。
當前處于解碼器中的第i步
在解碼器中上一步的隱狀態si?1s_{i-1}si?1?,上一步的輸出yi?1y_{i-1}yi?1?,這一步的上下文向量cic_ici?
在編碼器中的最后輸出的隱狀態為h1h_1h1?,h2h_2h2?,h3h_3h3?,h4h_4h4?
為了計算cic_ici?,需要使用注意力機制來解決。
value : h1h_1h1?,h2h_2h2?,h3h_3h3?,h4h_4h4?
query : si?1s_{i-1}si?1?
key : h1h_1h1?,h2h_2h2?,h3h_3h3?,h4h_4h4?
我們會使用(query,key)計算value的權重。對于其中第j個權重的計算方式是這樣的:
eij=a(si?1,hj)e_{ij}=a(s_{i-1,h_j})eij?=a(si?1,hj??) # 這里是將兩個向量拼接
αij=exp(eij)∑j=1Txexp(eik)\alpha_{ij}=\dfrac{exp(e_{ij})}{\sum_{j=1}^{T_x}exp(e_{ik})}αij?=∑j=1Tx??exp(eik?)exp(eij?)? #這里會保證權重和為1。這里Tx=4{T_x}=4Tx?=4
ci=∑j=1Txαijhjc_i=\sum_{j=1}^{T_x}\alpha_{ij}h_jci?=∑j=1Tx??αij?hj? #計算得到上下文向量,Tx=4{T_x}=4Tx?=4
si=f(si?1,yi?1,ci)s_i=f(s_{i-1},y_{i-1},c_i)si?=f(si?1?,yi?1?,ci?) #得到第i步的隱狀態
P(yi∣y1,y2...yi?1,X)=g(yi?1,si,ci)P(y_i|y_1,y_2...y_{i-1},X) = g(y_{i-1},s_i,c_i)P(yi?∣y1?,y2?...yi?1?,X)=g(yi?1?,si?,ci?) #得到第i步的輸出
2 自注意力機制
在上面的介紹中 (query,key)計算得到一個權重。這里query是不同于key的向量。自注意力機制中query是key的一部分。就是說key通過自己注意自己學習到權重。所以稱為自注意力機制。
例如在學習x2x_2x2?的權重參數值時候,使用x2x_2x2?作為query,x1,x3,x4x_1,x_3,x_4x1?,x3?,x4?作為key和value。
對每個位置都計算得到權重參數,然后加權平均得到y2y_2y2?。
同理y3,y4,y1y_3,y_4,y_1y3?,y4?,y1?的計算也是一樣。
dkd_kdk?是embedding的維度。在歸一化之前會對每一個分數除以定值(embedding的維度開根號)。這樣可以讓softmax的分布更加平滑。
3 自注意力機制加強版
增強版的自注意力機制是
1 不使用x2x_2x2?作為query,而是先對x2x_2x2?做線性變換:Wqx2W_qx_2Wq?x2?,之后的向量作query。
2 x1,x3,x4x_1,x_3,x_4x1?,x3?,x4?不直接作為key和value,而是先做線性變換之后再做key和value。Wkx1W_kx_1Wk?x1?作為key,Wvx1W_vx_1Wv?x1?作為value。
其余步驟相同。
這樣的模型有更多的參數,模型性能也更加強大。
4 Transformer的結構
以下內容會部分來自于The Illustrated Transformer【譯】
了解了注意力機制的變遷之后,我們再來看transformer結構。Transformer是在"Attention is All You Need"中提出的。這是一篇刷爆朋友圈的論文。因為它的效果基于現有效果有了較大幅度的提升。
transformer與之前一些結構的不同在于:
- 雙向LSTM:一個模型想要包含當前位置的信息,前一個位置的信息,后一個位置的信息
- CNN:一個位置包含的信息取決于kernel size大小
- transformer:可以得到全局信息
transformer 是由input、encoder、decoder和output四部分組成的。
encoder組件由6層首尾相連的encoder組成。decoder組件是由6層decoder組成。
4.1 input
transformer模型的輸入由詞向量以及位置編碼兩部分組成。
詞向量是使用word-piece。數據集是英-法 WMT 2014,包含36M 句子,這些句子被分為 32000 word-piece 詞匯。每個詞匯使用dmodel=512d_{model}=512dmodel?=512來表示。
每個位置都定義了一個encoding。 在transformer中一直在做加權平均,沒有前后順序,這就會成為bag of words。
在這里有些位置用sin,有些位置用cos,表示位置信息。每個位置的encoding是什么樣子并不重要。重要的是每個位置的encoding不一樣
位置信息encoding之后 與 詞向量相加,也就是 embed(word) + embed(position),整體作為輸入送入到encoder。embed(position)的位置也是512。
按照偶數位sin,奇數位cos的方式,得到的結果確實是i,j越接近,pm.pnp_m.p_npm?.pn?越大。相對位置越遠,點乘的結果越?。
4.2 encoder
6個encoder結構完全相同,但是參數不共享。
4.2.1 Multi-head attention
多頭注意力機制是transformer模型中的重要改進。這個模型使用的是自注意力機制加強版。這部分內容在前面已經介紹了。這里重點介紹一下Multi-head。
不是對輸入做一個Attention,而是需要做多個Attention。
假如每個單詞512維度,這里有h個scaled dot-product attention。每一套可以并行計算。 Q K V 做了不同的affine變換,投射到不同的空間,得到不同的維度,也就是WX+b變換。不同head的長度一樣,但是映射參數是不一樣的。
之后過一個scaled dot-product attention。
h個結果concat
然后再做Linear
論文中h=8,dk=dv=dmodel/h=64d_k=d_v=d_{model/h}=64dk?=dv?=dmodel/h?=64,dmodel=512d_{model}=512dmodel?=512
做Attention,Q K V 形狀是不會發生變化的,每個的形狀還是 seq_length,x,hidden_size。
公式如下:
輸入X,包含token embedding和position embedding
- 對X做變換
Qi=QWiQQ^i=QW^Q_iQi=QWiQ?,Ki=KWiKK^i=KW^K_iKi=KWiK?,Vi=VWiVV^i=VW^V_iVi=VWiV?
每一次映射不共享參數,每一次映射會有(WiQ,WiK,WiV)W^Q_i,W^K_i,W^V_i)WiQ?,WiK?,WiV?)三個參數。
- 對多頭中的某一組做attention
Attention(Qi,Ki,Vi)=KiQiTdkViAttention(Q_i,K_i,V_i)=\dfrac{K_iQ_i^T}{\sqrt{d_k}}V_iAttention(Qi?,Ki?,Vi?)=dk??Ki?QiT??Vi?
headi=Attention(Qi,Ki,Vi)head_i=Attention(Q_i,K_i,V_i)headi?=Attention(Qi?,Ki?,Vi?)
h組并行計算
- 拼接之后輸出
MultiHead(Q,K,V)=Concat(head1,head2,...head5)MultiHead(Q,K,V)=Concat(head_1,head_2,...head_5)MultiHead(Q,K,V)=Concat(head1?,head2?,...head5?)
經過multi-head之后,得到h1,h2,h3,h4h_1,h_2,h_3,h_4h1?,h2?,h3?,h4?。
看圖上怎么還有一個Linear???
4.2.2 殘差鏈接
殘差鏈接是這樣的。
將輸入x加到multi-head或者feed network的輸出h上。這樣可以加快訓練。
這一步得到的結果記為h1′,h2′,h3′,h4′h_1',h_2',h_3',h_4'h1′?,h2′?,h3′?,h4′?。
4.2.3 層正則化layer norm
層正則化,是對殘差鏈接的結果做正則化。
對h1′,h2′,h3′,h4′h_1',h_2',h_3',h_4'h1′?,h2′?,h3′?,h4′?這4個向量分別計算每個向量的均值μ\muμ和方差σ\sigmaσ。
γ\gammaγ和β\betaβ是共享的參數,在模型中需要訓練。
γ\gammaγ和β\betaβ可以在一定程度上抵消掉正則的操作。為什么正則了又要抵消呢?
這樣做可以讓每一個時間步的值更平均一些,差異不會特別大。
這一步的輸出是h1′′,h2′′,h3′′,h4′′h_1'',h_2'',h_3'',h_4''h1′′?,h2′′?,h3′′?,h4′′?。
4.2.4 前饋神經網絡 feed forward network
對于上一步的結果加一個前饋神經網絡。
FFN(x)=max(0,xW1+b1)W2+b2FFN(x) = max(0, xW_1 + b_1 )W_2 + b_2FFN(x)=max(0,xW1?+b1?)W2?+b2?
在每一個時間步會做一個y=F(x)的變化,得到另外的100維的向量。
對這一步的結果再加一個殘差鏈接和層正則化。
這樣就得到一個transformer block。
輸入->Multi head attention ->殘差鏈接->層正則化->Feed-forward Network->殘差鏈接->層正則化。
在實際使用過程中層正則化會放在Multi head attention或者Feed-forward Network-前面。
4.3 decoder
decoder組件是由多個decoder組成的。在本模型中是6個decoder。
每一個decoder是由Masked Multi-head attention, Multi-head attention以及Feed-Forward三部分組成。
4.3.1 輸入
在decoder中的第一步輸入是始位置表示以及 encoder組件的輸出:K和V。經過decoder之后,輸出第一個單詞I。第二步的輸入是第一步的輸出,以及K和V。
4.3.1 Masked Multi-head attention
Masked Multi-head attention的輸入是decoder前一步的輸出。第一個位置為起始位置表示。
接著加上位置編碼。整體作為輸入送入 Masked Multi-head attention。
在這里,處理第i步的時候,只能使用第1步到第i-1的向量做attention。這就是Masked含義。i位置之后的信息不可見。
之后做殘差鏈接。
再之后做層正則化。將結果送入Multi-head attention。
4.3.2 Multi-head attention
Multi-head attention這一部分與encoder的Multi-head attention相同。輸入是encoder組件的輸出K和V,以及Masked Multi-head attention的輸出,三部分作為輸入。
經過Multi-head attention->殘差鏈接->層正則化,輸出。
4.3.3 前饋神經網絡 feed forward network
上一步的輸出,經過前饋神經網絡的結果作為輸出。
至此,一個decoder完成。其輸出作為下一個decoder的輸入。
4.4 The Final Linear and Softmax Layer
解碼器最后輸出浮點向量,如何將它轉成詞?這是最后的線性層和softmax層的主要工作。
線性層是個簡單的全連接層,將解碼器的最后輸出映射到一個非常大的logits向量上。假設模型已知有1萬個單詞(輸出的詞表)從訓練集中學習得到。那么,logits向量就有1萬維,每個值表示是某個詞的可能傾向值。
softmax層將這些分數轉換成概率值(都是正值,且加和為1),最高值對應的維上的詞就是這一步的輸出單詞。
4.5 decoder總結
encoder組件從輸入序列的處理開始,最后的encoder組件的輸出被轉換為K和V,它倆被每個解碼器的"encoder-decoder atttention"層來使用,幫助解碼器集中于輸入序列的合適位置。
下面的步驟一直重復直到一個特殊符號出現表示解碼器完成了翻譯輸出。每一步的輸出被喂到下一個解碼器中。正如編碼器的輸入所做的處理,對解碼器的輸入增加位置向量。
4.4 The Loss Function
如何對比兩個概率分布呢?簡單采用 cross-entropy或者Kullback-Leibler divergence中的一種。
4.5 代碼閱讀
總結
以上是生活随笔為你收集整理的理解transformer的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode答案汇总(持续更新...
- 下一篇: array专题8