學習資料來源于字母站大學
1 Transformer架構
- 基于編碼器-解碼器的架構來處理序列對。
- 跟使用注意力的seq2seq不同,Transformer是基于純注意力。
2 注意力
2.1 自注意力機制
使用注意力:需要根據整個序列進行預測,對于同一input,不同的上下文輸出不同,序列長度也不同,無法用固定窗口。
首先要得到一個能表示輸入向量本身及其與序列其他向量的關聯性( α \alpha α)的向量, α \alpha α即注意力分數。
根據 α \alpha α可以得知,哪些向量和 a a a關聯性最高,就可以根據 α \alpha α抽取信息
將所有的 a a a, q q q拼起來成矩陣,就一次性計算得到了所有的 q q q,同理, k k k, v v v也通過矩陣運算一次性得到。
注意力分數的計算同樣將 q q q, k k k的點乘過程拼接成矩陣,然后對每一列做softmax
總過程:
2.2 多頭注意力
由于所謂的“相關性”不是一個固定的定義,可以有多種表現形式,所以在用 q q q尋找不同的 k k k時,需要不同的 q q q負責得到不同種類的相關性,同時,由于有多個 q q q,所以也有多個 k k k和多個 v v v,相同類別的 q q q, k k k, v v v一起計算
3 Add&LayerNorm
Transformer在自注意力塊的輸出部分又加上了輸入,然后一起輸入Norm層。
Transformer的LayerNorm計算公式:
y = x ? E ( x ) V a r ( x ) + ? ? α + β y=\frac{x-E(x)}{\sqrt{Var(x)+\epsilon}}*\alpha+\beta y=Var(x)+??x?E(x)??α+β
其中 α \alpha α, β \beta β是可學習參數,用來防止輸出數據落在后續的激活函數近似線性的范圍內,失去激活函數非線性特性。 ? \epsilon ?用來防止分母為0。
LayerNorm用來穩定神經網絡的訓練,將輸入歸一化到均值為0方差為1的分布中,避免訓練中產生梯度消失或梯度爆炸。LayerNorm是在最后一個特征維度做歸一化(一個單詞內部),可以保證穩定性。
4 解碼器——交叉注意力
對于Transformer架構解碼器中間部分,有來自Encoder的輸入,也有來自Decoder的輸入,這部分架構叫做交叉注意力。總的來說,交叉注意力的 q q q來自于Decoder, k k k, v v v來自于Encoder,也就是用Decoder的 q q q來抽取Encoder信息作為下一步的輸入。
面試題篇
1 Transformer/RNN/CNN對比
各個模型對于NLP任務需要抽取的特征的性能:
- 上下文語義(方向、長度):Transformer > RNN > CNN
- 序列特征:RNN > Transformer > CNN
- 速度:CNN > Transformer > RNN
Transformer擅長抽取上下文語義特征的原因:RNN只能對句子進行單向的編碼,CNN只能對短句進行編碼,而transformer既可以同時編碼雙向的語義,又可以抽取長距離特征,在NLP特征抽取方面能力更強。
CNN其實是self-attention的特例。單向RNN未考慮右邊序列的input且順序執行,self-attention是并行的。
2 Transformer為什么將特征維度拆分成多個頭
- 從不同角度捕捉信息,防止每個輸入對自身注意力分數過高,增強模型表達能力
- 實現并行計算,提高計算效率
- 緩解梯度消失:當維度 d d d很大時,點積結果的方差也會很大,做softmax后會變成近似one-hot編碼,導致梯度消失。
3 為什么使用乘性注意力而不用加性注意力
在GPU場景下,矩陣乘法的計算效率更高
4 A t t e n t i o n ( Q , K , V ) = s o f t m a x Q K T d k V \mathrm{Attention}(Q,K,V)=\mathrm{softmax}\frac{QK^T}{\sqrt{d_k}}V Attention(Q,K,V)=softmaxdk??QKT?V為什么要除以 d k \sqrt{d_k} dk??
如果兩個矩陣都是服從正態分布的,矩陣相乘后由于元素是相乘再相加,那么結果就變成均值為0,方差為 d d d的分布了,方差如果很大,和問題1的原因相同,可能會產生很分散的數值,使得softmax后導致梯度消失,所以要除以標準差恢復到正態分布。
梯度消失舉例:對于 z = [ 1000 , 1 , ? 1000 ] z=[1000,1,-1000] z=[1000,1,?1000],計算softmax:
s o f t m a x ( z ) = [ d 1000 e 1000 + e 1 + e ? 1000 , e 1 e 1000 + e 1 + e ? 1000 , e ? 1000 e 1000 + e 1 + e ? 1000 ] ≈ [ 1 , 0 , 0 ] \mathrm{softmax}(z)=[\frac{d^{1000}}{e^{1000}+e^1+e^{-1000}},\frac{e^1}{e^{1000}+e^1+e^{-1000}},\frac{e^{-1000}}{e^{1000}+e^1+e^{-1000}}]\approx[1,0,0] softmax(z)=[e1000+e1+e?1000d1000?,e1000+e1+e?1000e1?,e1000+e1+e?1000e?1000?]≈[1,0,0]
對softmax求梯度
s o f t m a x ( z i ) = e z i ∑ k = 1 C e z k , i ∈ { 1 , 2 , . . . , C } \mathrm{softmax}(z_i)=\frac{e^{z_i}}{\sum_{k=1}^{C}e^{z_k}},i\in \{1,2,...,C\} softmax(zi?)=∑k=1C?ezk?ezi??,i∈{1,2,...,C}
? s o f t m a x ( z i ) ? z j = { s o f t m a x ( z i ) , i f i = j ? s o f t m a x ( z i ) ? s o f t m a x ( z j ) , i f i ≠ j \frac{\partial \mathrm{softmax}(z_i)}{\partial z_j}=\begin{cases} \mathrm{softmax}(z_i),\mathrm{if}\ i=j \\-\mathrm{softmax}(z_i)·\mathrm{softmax}(z_j),\mathrm{if}\ i\neq j \end{cases} ?zj??softmax(zi?)?={softmax(zi?),if?i=j?softmax(zi?)?softmax(zj?),if?i=j?
帶入數值,對于 s o f t m a x ( z i ) ≈ 1 \mathrm{softmax}(z_i)\approx 1 softmax(zi?)≈1,梯度為0,對于其他位置 j j j s o f t m a x ( z i ) ≈ 0 \mathrm{softmax}(z_i)\approx 0 softmax(zi?)≈0,梯度同樣為0,導致梯度消失。
5 為什么源碼實現中mask被丟棄的token值置為-10000而不是置0
如果被丟棄的token值為0,做softmax時分子為1而不是趨近于0的值,也能得到概率值,無法滿足正常token的概率和為1。