Transformer架構細節
1.Transformer各個模塊的作用
(1)Encoder模塊
- 經典的Transformer架構中的Encoder模塊包含6個Encoder Block.
- 每個Encoder Block包含兩個?模塊, 分別是多頭?注意?層, 和前饋全連接層.
- 多頭?注意?層采?的是?種Scaled Dot-Product Attention的計算?式, 實驗結果表 明, Multi-head可以在更細致的層?上提取不同head的特征, ?單?head提取特征的 效果更佳.
- 前饋全連接層是由兩個全連接層組成, 線性變換中間增添?個Relu激活函數, 具體的 維度采?4倍關系, 即多頭?注意?的d_model=512, 則層內的變換維度d_ff=2048.
(2)Decoder模塊
- 經典的Transformer架構中的Decoder模塊包含6個Decoder Block.
- 每個Decoder Block包含3個?模塊, 分別是多頭?注意?層, Encoder-Decoder Attention 層, 和前饋全連接層.
- 多頭?注意?層采?和Encoder模塊?樣的Scaled Dot-Product Attention的計算? 式, 最?的 區別在于需要添加look-ahead-mask, 即遮掩"未來的信息".
- Encoder-Decoder Attention層和上?層多頭?注意?層最主要的區別在于Q != K = V, 矩陣Q來源于上?層Decoder Block的輸出, 同時K, V來源于Encoder端的輸出.
- 前饋全連接層和Encoder中完全?樣.
(3)Add & Norm模塊
- Add & Norm模塊接在每?個Encoder Block和Decoder Block中的每?個?層的后?.
- 對于每?個Encoder Block, ??的兩個?層后?都有Add & Norm.
- 對于每?個Decoder Block, ??的三個?層后?都有Add & Norm.
- Add表示殘差連接, 作?是為了將信息?損耗的傳遞的更深, 來增強模型的擬合能?.
- Norm表示LayerNorm, 層級別的數值標準化操作, 作?是防?參數過?過?導致的學習過程異常 , 模型收斂特別慢的問題.
(4)位置編碼器Positional Encoding
- Transformer中采?三?函數來計算位置編碼.
- 因為三?函數是周期性函數, 不受序列?度的限制, ?且這種計算?式可以對序列中不同位置的編碼的重要程度同等看待
2.Decoder端訓練和預測的輸入
- 在Transformer結構中的Decoder模塊的輸?, 區分于不同的Block, 最底層的Block輸?有其特殊的地?。第?層到第六層的輸??致, 都是上?層的輸出和Encoder的輸出。
- 最底層的Block在訓練階段, 每?個time step的輸?是上?個time step的輸?加上真實標 簽序列向后移?位. 具體來看, 就是每?個time step的輸?序列會越來越?, 不斷的將之前的 輸?融合進來.
假設現在的真實標簽序列等于"How are you?", 當time step=1時, 輸?張量為?個特殊的token, ?如"SOS"; 當time step=2時, 輸?張量為"SOS How"; 當time step=3時, 輸?張量為"SOS How are"; 以此類推...
- 最底層的Block在訓練階段, 真實的代碼實現中, 采?的是MASK機制來模擬輸?序列不斷添 加的過程.
- 最底層的Block在預測階段, 每?個time step的輸?是從time step=0開始, ?直到上?個 time step的預測值的累積拼接張量. 具體來看, 也是隨著每?個time step的輸?序列會越來越長. 相?于訓練階段最?的不同是這?不斷拼接進來的token是每?個time step的預測值, ?不是訓練階段每?個time step取得的groud truth值
當time step=1時, 輸?的input_tensor="SOS", 預測出來的輸出值是output_tensor="What"; 當time step=2時, 輸?的input_tensor="SOS What", 預測出來的輸出值是output_tensor="is"; 當time step=3時, 輸?的input_tensor="SOS What is", 預測出來的輸出值是output_tensor="the"; 當time step=4時, 輸?的input_tensor="SOS What is the", 預測出來的輸出值是output_tensor="matter"; 當time step=5時, 輸?的input_tensor="SOS What is the matter", 預測出來的輸出值是output_tensor="?"; 當time step=6時, 輸?的input_tensor="SOS What is the matter ?", 預測出來的輸出值是output_tensor="EOS", 代表句?的結束符, 說明解碼結束, 預測結束.
3.Self-attention
Transformer中?直強調的self-attention是什么? 為什么能 發揮如此?的作?? 計算的時候如果不使?三元組(Q, K, V), ? 僅僅使?(Q, V)或者(K, V)或者(V)?不??
(1)self-attention的機制和原理
self-attention是?種通過?身和?身進?關聯的attention機制, 從?得到更好的 representation來表達?身.
self-attention是attention機制的?種特殊情況: 在self-attention中, Q=K=V, 序列中的每個單詞(token)都和該序列中的其他所有單詞 (token)進?attention規則的計算.
attention機制計算的特點在于, 可以直接跨越?句話中不同距離的token, 可以遠距離的學習到序列的知識依賴和語序結構.
- 從上圖中可以看到, self-attention可以遠距離的捕捉到語義層?的特征(it的指代對象是 animal).
- 應?傳統的RNN, LSTM, 在獲取?距離語義特征和結構特征的時候, 需要按照序列順序依次 計算, 距離越遠的聯系信息的損耗越?, 有效提取和捕獲的可能性越?.
- 但是應?self-attention時, 計算過程中會直接將句?中任意兩個token的聯系通過?個計算 步驟直接聯系起來,
(2)關于self-attention為什么要使?(Q, K, V)三元組?不是其他形式
?先?條就是從分析的?度看, 查詢Query是?條獨?的序列信息, 通過關鍵詞Key的提示作?, 得到最終語義的真實值Value表達, 數學意義更充分, 完備.
這?不使用(K, V)或者(V)沒有什么必須的理由, 也沒有相關的論?來嚴格闡述?較試驗的結果差異, 所以可以作為開放性問題未來去探索, 只要明確在經典self-attention實現中?的是三元組就好
4.Self-attention歸一化和放縮
(1)self-attention中的歸?化概述
訓練上的意義:隨著詞嵌?維度d_k的增?, q * k 點積后的結果也會增?, 在訓練時會將 softmax函數推入梯度?常?的區域, 可能出現梯度消失的現象, 造成模型收斂困難.
數學上的意義: 假設q和k的統計變量是滿?標準正態分布的獨?隨機變量, 意味著q和k滿?均 值為0, ?差為1。** 那么q和k的點積結果就是均值為0, ?差為** d k d_k dk?, 為了抵消這種?差被放? d k d_k dk?** 倍的影響, 在計算中主動將點積縮放**? 1 ( d k ) \frac{1}{\sqrt(d_k)} (?dk?)1?, 這樣點積后的結果依然滿?均值為0, ?差為 1。
(2)softmax的梯度變化
這?我們分3個步驟來解釋softmax的梯度問題:
第?步: softmax函數的輸?分布是如何影響輸出的
對于?個輸?向量x, softmax函數將其做了?個歸?化的映射, ?先通過?然底數e將輸?元素之間的差距先"拉?", 然后再歸?化為?個新的分布。 在這個過程中假設某個輸?x 中最?的元素下標是k, 如果輸?的數量級變?(就是x中的每個分量絕對值都很?), 那么在數學上會造成y_k的值?常接近1。
具體??個例?來演示, 假設輸?的向量 x = [ a , a , 2 a ] x = [a, a, 2a] x=[a,a,2a], 那么隨便給?個不同數量級的值來看看對y3產?的影響
a = 1時, y3 = 0.5761168847658291
a = 10時, y3 = 0.9999092083843412
a = 100時, y3 = 1.0
采??段實例代碼將a在不同取值下, 對應的y3全部畫出來, 以曲線的形式展示:
from math import exp
from matplotlib import pyplot as plt
import numpy as np
f = lambda x: exp(x * 2) / (exp(x) + exp(x) + exp(x * 2))
x = np.linspace(0, 100, 100)
y_3 = [f(x_i) for x_i in x]
plt.plot(x, y_3)
plt.show()
從上圖可以很清楚的看到輸?元素的數量級對softmax最終的分布影響?常之?。
結論: 在輸?元素的數量級較?時, softmax函數?乎將全部的概率分布都分配給了最?值分量所對應的標簽
第?步: softmax函數在反向傳播的過程中是如何梯度求導的
首先,定義神經網絡的輸入和輸出
設 X = [ x 1 , x 2 , . . . , x n ] , Y = s o f t m a x ( X ) = [ y 1 , y 2 , . . . , y 3 ] 則? y i = e x i ∑ j = 1 n e x j , 顯然? ∑ j = 1 n e x j = 1 設X=[x_1,x_2,..., x_n], Y=softmax(X)=[y_1, y_2,..., y_3] \\ 則~y_i=\frac{e^{x_i}}{\sum_{j=1}^{n} e^{x_j}},~顯然~ \sum_{j=1}^{n} e^{x_j}=1 設X=[x1?,x2?,...,xn?],Y=softmax(X)=[y1?,y2?,...,y3?]則?yi?=∑j=1n?exj?exi??,?顯然?j=1∑n?exj?=1
反向傳播就是輸出端的損失函數對輸?端求偏導的過程, 這?要分兩種情況,
**(1)當 ** i = j i=j i=j時:
? y i ? x j = ? y i ? x i = ? ? x i ( e x i ∑ k e x k ) = ( e x i ) ′ ( ∑ k e x k ) ? e x i ( ∑ k e x k ) ′ ( ∑ k e x k ) 2 = e x i ? ( ∑ k e x k ) ? e x i ? e x i ( ∑ k e x k ) 2 = e x i ? ( ∑ k e x k ) ( ∑ k e x k ) 2 ? e x i ? e x i ( ∑ k e x k ) 2 = e x i ∑ k e x k ? e x i ∑ k e x k ? e x i ∑ k e x k = y i ? y i ? y i = y i ( 1 ? y i ) \begin{aligned} \frac{\partial y_{i}}{\partial x_{j}}& =\frac{\partial y_i}{\partial x_i} \\ &=\frac{\partial}{\partial x_i}(\frac{e^{x_i}}{\sum_k e^{x_k}}) \\ &=\frac{(e^{x_i})'(\sum_k e^{x_k})-e^{x_i}(\sum_k e^{x_k})'}{(\sum_k e^{x_k})^2} \\ &=\frac{e^{x_i}\cdot(\sum_ke^{x_k})-e^{x_i}\cdot e^{x_i}}{(\sum_ke^{x_k})^2} \\ &=\frac{e^{x_i}\cdot(\sum_k e^{x_k})}{(\sum_k e^{x_k})^2}-\frac{e^{x_i}\cdot e^{x_i}}{(\sum_k e^{x_k})^2} \\ &=\frac{e^{x_i}}{\sum_k e^{x_k}}-\frac{e^{x_i}}{\sum_k e^{x_k}}\cdot\frac{e^{x_i}}{\sum_k e^{x_k}} \\ &=y_i-y_i\cdot y_i \\ &=y_i(1-y_i) \end{aligned} ?xj??yi???=?xi??yi??=?xi???(∑k?exk?exi??)=(∑k?exk?)2(exi?)′(∑k?exk?)?exi?(∑k?exk?)′?=(∑k?exk?)2exi??(∑k?exk?)?exi??exi??=(∑k?exk?)2exi??(∑k?exk?)??(∑k?exk?)2exi??exi??=∑k?exk?exi???∑k?exk?exi???∑k?exk?exi??=yi??yi??yi?=yi?(1?yi?)?
(2)當$ i ≠ j$時:
? y i ? x j = ? ? x j ( e x i ∑ k e x k ) = ( e x i ) ′ ( ∑ k e x k ) ? e x i ( ∑ k e x k ) ′ ( ∑ k e x k ) 2 = 0 ? ( ∑ k e x k ) ? e x i ? e x j ( ∑ k e x k ) 2 = ? e x i ? e x j ( ∑ k e x k ) 2 = ? e x i ∑ k e x k ? e x i ∑ k e x k = ? y i ? y i \begin{aligned} \frac{\partial y_{i}}{\partial x_{j}} & =\frac{\partial}{\partial x_{j}}\left(\frac{e^{x_{i}}}{\sum_{k} e^{x_{k}}}\right) \\ & =\frac{\left(e^{x_{i}}\right)^{\prime}\left(\sum_{k} e^{x_{k}}\right)-e^{x_{i}}\left(\sum_{k} e^{x_{k}}\right)^{\prime}}{\left(\sum_{k} e^{x_{k}}\right)^{2}} \\ & =\frac{0 \cdot\left(\sum_{k} e^{x_{k}}\right)-e^{x_{i}} \cdot e^{x_{j}}}{\left(\sum_{k} e^{x_{k}}\right)^{2}} \\ & =-\frac{e^{x_{i}} \cdot e^{x_{j}}}{\left(\sum_{k} e^{x_{k}}\right)^{2}} \\ & =-\frac{e^{x_{i}}}{\sum_{k} e^{x_{k}}} \cdot \frac{e^{x_{i}}}{\sum_{k} e^{x_{k}}} \\ & =-y_{i} \cdot y_{i} \end{aligned} ?xj??yi???=?xj???(∑k?exk?exi??)=(∑k?exk?)2(exi?)′(∑k?exk?)?exi?(∑k?exk?)′?=(∑k?exk?)20?(∑k?exk?)?exi??exj??=?(∑k?exk?)2exi??exj??=?∑k?exk?exi???∑k?exk?exi??=?yi??yi??
經過對兩種情況分別的求導計算, 可以得出最終的結論如下:
綜上所述: ? y i ? x j = { y i ? y i ? y i , i=j 0 ? y i ? y i , i ≠ j 所以: ? Y ? X = d i a g ( Y ) ? Y T ? Y (當 Y 的 s h a p e 為 ( 1 , n ) 時) \begin{aligned} & 綜上所述:\frac{\partial y_i}{\partial x_j}=\begin{cases}y_i-y_i\cdot y_i,&\text{i=j}\\ \\ 0-y_i\cdot y_i,&\text{i}\neq\text{j}\end{cases} \\ & 所以:\frac{\partial Y}{\partial X}=diag(Y)-Y^T\cdot Y(當Y的shape為(1,n)時) \end{aligned} ?綜上所述:?xj??yi??=? ? ??yi??yi??yi?,0?yi??yi?,?i=ji=j?所以:?X?Y?=diag(Y)?YT?Y(當Y的shape為(1,n)時)?
第三步: softmax函數出現梯度消失現象的原因
根據第二步中softmax函數的求導結果, 可以將最終的結果以矩陣形式展開如下:
? g ( X ) ? X ≈ [ y ^ 1 0 ? 0 0 y ^ 2 ? 0 ? ? ? ? 0 0 ? y ^ d ] ? [ y ^ 1 2 y ^ 1 y ^ 2 ? y ^ 1 y ^ d y ^ 2 y ^ 1 y ^ 2 2 ? y ^ 2 y ^ d ? ? ? ? y ^ d y ^ 1 y ^ d y ^ 2 ? y ^ d 2 ] \frac{\partial g(X)}{\partial X} \approx\left[\begin{array}{cccc} \hat{y}_{1} & 0 & \cdots & 0 \\ 0 & \hat{y}_{2} & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & \hat{y}_{d} \end{array}\right]-\left[\begin{array}{cccc} \hat{y}_{1}^{2} & \hat{y}_{1} \hat{y}_{2} & \cdots & \hat{y}_{1} \hat{y}_{d} \\ \hat{y}_{2} \hat{y}_{1} & \hat{y}_{2}^{2} & \cdots & \hat{y}_{2} \hat{y}_{d} \\ \vdots & \vdots & \ddots & \vdots \\ \hat{y}_{d} \hat{y}_{1} & \hat{y}_{d} \hat{y}_{2} & \cdots & \hat{y}_{d}^{2} \end{array}\right] ?X?g(X)?≈ ?y^?1?0?0?0y^?2??0??????00?y^?d?? ?? ?y^?12?y^?2?y^?1??y^?d?y^?1??y^?1?y^?2?y^?22??y^?d?y^?2???????y^?1?y^?d?y^?2?y^?d??y^?d2?? ?
根據第一步中的討論結果, 當輸入x的分量值較大時, softmax函數會將大部分概率分配給最大的元素, 假設最大元素是x1, 那么softmax的輸出分布將產生一個接近one-hot的結果張量y_ = [1, 0, 0,…, 0], 此時結果矩陣變為:
? g ( X ) ? X ≈ [ 1 0 ? 0 0 0 ? 0 ? ? ? ? 0 0 ? 0 ] ? [ 1 0 ? 0 0 0 ? 0 ? ? ? ? 0 0 ? 0 ] = 0 \frac{\partial g(X)}{\partial X} \approx\left[\begin{array}{cccc}1 & 0 & \cdots & 0 \\ 0 & 0 & \cdots & 0 \\ & & & \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & 0\end{array}\right]-\left[\begin{array}{cccc}1 & 0 & \cdots & 0 \\ 0 & 0 & \cdots & 0 \\ & & & \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & 0\end{array}\right]=0 ?X?g(X)?≈ ?10?0?00?0??????00?0? ?? ?10?0?00?0??????00?0? ?=0
結論:綜上可以得出,** 所有的梯度都消失為0(接近于0), 參數幾乎無法更新, 模型收斂困難**.
(3)維度與點積大小的關系
針對為什么維度會影響點積的大小, 原始論文中有這樣的一點解釋如下:
To illustrate why the dot products get large, assume that the components of q and k are independent random variables with mean 0 and variance 1. Then their doct product,q*k = (q1k1+q2k2+......+q(d_k)k(d_k)), has mean 0 and variance d_k.
分兩步對其進行一個推導, 首先就是假設向量q和k的各個分量是相互獨立的隨機變量, X = q i X = q_i X=qi?, Y = k i Y = k_i Y=ki?, X和Y各自有d_k個分量, 也就是向量的維度等于d_k, 有 E ( X ) = E ( Y ) = 0 E(X) = E(Y) = 0 E(X)=E(Y)=0, 以及 D ( X ) = D ( Y ) = 1 D(X) = D(Y) = 1 D(X)=D(Y)=1.
可以得到 E ( X Y ) = E ( X ) E ( Y ) = 0 ? 0 = 0 E(XY) = E(X)E(Y) = 0 * 0 = 0 E(XY)=E(X)E(Y)=0?0=0
同理, 對于 D ( X Y ) D(XY) D(XY)推導如下:
D ( X Y ) = E ( X 2 ? Y 2 ) ? [ E ( X Y ) ] 2 = E ( X 2 ) E ( Y 2 ) ? [ E ( X ) E ( Y ) ] 2 = E ( X 2 ? 0 2 ) E ( Y 2 ? 0 2 ) ? [ E ( X ) E ( Y ) ] 2 = E ( X 2 ? [ E ( X ) ] 2 ) E ( Y 2 ? [ E ( Y ) ] 2 ) ? [ E ( X ) E ( Y ) ] 2 = D ( X ) D ( Y ) ? [ E ( X ) E ( Y ) ] 2 = 1 × 1 ? ( 0 × 0 ) 2 = 1 \begin{aligned} D(XY)& =E(X^2\cdot Y^2)-[E(XY)]^2 \\ &=E(X^2)E(Y^2)-[E(X)E(Y)]^2 \\ &=E(X^2-0^2)E(Y^2-0^2)-[E(X)E(Y)]^2 \\ &=E(X^2-[E(X)]^2)E(Y^2-[E(Y)]^2)-[E(X)E(Y)]^2 \\ &=D(X)D(Y)-[E(X)E(Y)]^2 \\ &=1\times1-\left(0\times0\right)^2 \\ &=1 \end{aligned} D(XY)?=E(X2?Y2)?[E(XY)]2=E(X2)E(Y2)?[E(X)E(Y)]2=E(X2?02)E(Y2?02)?[E(X)E(Y)]2=E(X2?[E(X)]2)E(Y2?[E(Y)]2)?[E(X)E(Y)]2=D(X)D(Y)?[E(X)E(Y)]2=1×1?(0×0)2=1?
根據期望和方差的性質, 對于互相獨立的變量滿足下式:
E ( ∑ i Z i ) = ∑ i E ( Z i ) , D ( ∑ i Z i ) = ∑ i D ( Z i ) \begin{gathered} E(\sum_{i}Z_{i})=\sum_{i}E(Z_{i}), \\ D(\sum_{i}Z_{i})=\sum_{i}D(Z_{i}) \end{gathered} E(i∑?Zi?)=i∑?E(Zi?),D(i∑?Zi?)=i∑?D(Zi?)?
根據上面的公式, 可以很輕松的得出q*k的均值為 E ( q k ) = 0 E(qk) = 0 E(qk)=0, D ( q k ) = d k D(qk) = d_k D(qk)=dk?。所以方差越大, 對應的qk的點積就越大, 這樣softmax的輸出分布就會更偏向最大值所在的分量。一個技巧就是將點積除以 d k \sqrt{d_k} dk?? 將方差在數學上重新"拉回1", 如下所示
D ( q ? k d k ) = d k ( d k ) 2 = 1 D(\frac{q\cdot k}{\sqrt{d_k}})=\frac{d_k}{(\sqrt{d_k})^2}=1 D(dk??q?k?)=(dk??)2dk??=1
最終的結論:通過數學上的技巧將方差控制在1, 也就有效的控制了點積結果的發散, 也就控制了對應的梯度消失的問題!
5.Multi-head Attention
(1)采?Multi-head Attention的原因
- 原始論?中提到進?Multi-head Attention的原因是將模型分為多個頭, 可以形成多個子空間間, 讓模型去關注不同方面的信息, 最后再將各個??的信息綜合起來得到更好的效果.
- 多個頭進?attention計算最后再綜合起來, 類似于CNN中采?多個卷積核的作?, 不同的卷 積核提取不同的特征, 關注不同的部分, 最后再進行融合.
- 直觀上講, 多頭注意力有助于神經網絡捕捉到更豐富的特征信息.
(2)Multi-head Attention的計算?式
- Multi-head Attention和單?head的Attention唯?的區別就在于,** 其對特征張量的最后?個維度進行了分割, ?般是對詞嵌入的embedding_dim=512進?切割成head=8, **這樣每?個head的嵌?維度就是512/8=64, 后續的Attention計算公式完全?致, 只不過是在64這個維度上進??系列的矩陣運算?已.
- 在head=8個頭上分別進?注意?規則的運算后, 簡單采用拼接concat的?式對結果張量進 ?融合就得到了Multi-head Attention的計算結果.
6.Transformer和RNN
(1)Transformer的并行計算
對于Transformer?傳統序列模型RNN/LSTM具備優勢的第??原因就是強?的并?計算能力.
對于RNN來說, 任意時刻t
的輸?是時刻t的輸?x(t)
和上?時刻的隱藏層輸出h(t-1)
, 經過運算后得到當前時刻隱藏層的輸出h(t)
, 這個h(t)
也即將作為下?時刻t+1
的輸?的?部分. 這個計算過程是RNN的本質特征, RNN的歷史信息是需要通過這個時間步?步?步向后傳遞的. 而這就意味著RNN序列后?的信息只能等到前?的計算結束后, 將歷史信息通過hidden state傳遞給后?才能開始計算, 形成鏈式的序列依賴關系, 無法實現并行.
對于Transformer結構來說, 在self-attention層, ?論序列的?度是多少, 都可以?次性計算所有單詞之間的注意?關系, 這個attention的計算是同步的, 可以實現并?.
(2)Transformer的特征抽取能力
對于Transformer?傳統序列模型RNN/LSTM具備優勢的第??原因就是強?的特征抽取能力 。
Transformer因為采?了Multi-head Attention結構和計算機制, 擁有?RNN/LSTM更強?的特征抽取能?, 這?并不僅僅由理論分析得來, 而是?量的試驗數據和對?結果, 清楚的展示了Transformer的特征抽取能?遠遠勝于RNN/LSTM.
注意: 不是越先進的模型就越無敵, 在很多具體的應?中RNN/LSTM依然?有?武之地, 要具體問題具體分析
7.Transformer代替seq2seq?
(1)seq2seq的兩大缺陷
- seq2seq架構的第??缺陷是將Encoder端的所有信息壓縮成?個固定?度的語義向量中, ?這個固定的向量來代表編碼器端的全部信息. 這樣既會造成信息的損耗, 也?法讓Decoder 端在解碼的時候去?注意?聚焦哪些是更重要的信息.
- seq2seq架構的第二大缺陷是無法并行, 本質上和RNN/LSTM無法并行的原因?樣.
(2)Transformer的改進
Transformer架構同時解決了seq2seq的兩?缺陷, 既可以并?計算, ?應?Multi-head Attention機制來解決Encoder固定編碼的問題, 讓Decoder在解碼的每?步可以通過注意?去 關注編碼器輸出中最重要的那些部分.
8.Transformer并行化
(1)Encoder并行化
- 上圖最底層綠?的部分, 整個序列所有的token可以并?的進?Embedding操作, 這?層的處理是沒有依賴關系的.
- 上圖第?層???的部分, 也就是Transformer中最重要的self-attention部分, 這?對于任意?個單詞?如x1, 要計算x1對于其他所有token的注意?分布, 得到z1. 這個過程是具有依賴性的, 必須等到序列中所有的單詞完成Embedding才可以進?。因此這?步是不能并?處理的。 但是從另?個?度看, 我們真實計算注意?分布的時候, 采?的都是矩陣運算, 也就是可以?次性的計算出所有token的注意?張量, 從這個?度看也算是實現了并行, 只是矩陣運算的"并行"和詞嵌?的"并行"概念上不同?已.
- 上圖第三層藍?的部分, 也就是前饋全連接層, 對于不同的向量z之間也是沒有依賴關系的, 所以這?層是可以實現并行化處理的. 也就是所有的向量z輸?Feed Forward?絡的計算可以同步進?, 互不?擾
(2)Decoder的并行化
- Decoder模塊在訓練階段采用了并行化處理。 其中Self-Attention和Encoder-Decoder Attention兩個子層的并行化也是在進行矩陣乘法, 和Encoder的理解是一致的. 在進行Embedding和Feed Forward的處理時, 因為各個token之間沒有依賴關系, 所以也是可以完全并行化處理的, 這里和Encoder的理解也是一致的.
- Decoder模塊在預測階段基本上不認為采用了并行化處理. 因為第一個time step的輸入只是一個"SOS", 后續每一個time step的輸入也只是依次添加之前所有的預測token.
- 注意: 最重要的區別是訓練階段目標文本如果有20個token, 在訓練過程中是一次性的輸入給Decoder端, 可以做到一些子層的并行化處理. 但是在預測階段, 如果預測的結果語句總共有20個token, 則需要重復處理20次循環的過程, 每次的輸入添加進去一個token, 每次的輸入序列比上一次多一個token, 所以不認為是并行處理.
(3)總結
Transformer架構中Encoder模塊的并行化機制
- Encoder模塊在訓練階段和測試階段都可以實現完全相同的并行化.
- Encoder模塊在Embedding層, Feed Forward層, Add & Norm層都是可以并行化的.
- Encoder模塊在self-attention層, 因為各個token之間存在依賴關系, 無法獨立計算, 不是真正意義上的并行化.
- Encoder模塊在self-attention層, 因為采用了矩陣運算的實現方式, 可以一次性的完成所有注意力張量的計算, 也是另一種"并行化"的體現.
Transformer架構中Decoder模塊的并行化機制
- Decoder模塊在訓練階段可以實現并行化.
- Decoder模塊在訓練階段的Embedding層, Feed Forward層, Add & Norm層都是可以并行化的.
- Decoder模塊在self-attention層, 以及Encoder-Decoder Attention層, 因為各個token之間存在依賴關系, 無法獨立計算, 不是真正意義上的并行化.
- Decoder模塊在self-attention層, 以及Encoder-Decoder Attention層, 因為采用了矩陣運算的實現方式, 可以一次性的完成所有注意力張量的計算, 也是另一種"并行化"的體現.
- Decoder模塊在預測計算不能并行化處理.