RNN的局限性
處理Seq2seq問題時一般會首先想到RNN,但是RNN的問題在於無論使用單向還是雙向RNN都無法並行運算,輸出一個值必須等待其依賴的其他部分計算完成。
CNN的局限性
為了解決並行計算的問題,可以嘗試使用CNN來處理。如下圖,使用CNN時其同一個卷積層的卷積核的運算是可以並行執行的,但是淺層的卷積核只能獲取部分數據作為輸入,只有深層的卷積層的卷積核才有可能會覆蓋到比較廣的範圍的數據,因此CNN的局限性在於無法使用一層來輸出考慮了所有數據的輸出值。
Transformer是一種使用了Self-attention的Seq2seq模型。Self-attention是一種可以取代RNN的網絡結構,比起RNN其可以實現並行運算。
Self-attention的結構
①如下圖,首先要將輸入序列的向量經過一個Embedding層(即乘以權重)獲得,然後分別乘以三個權重來獲得:
分別代表query、key和value,在後面會用到:
②接下來需要拿每個query對每個key做attention,這裡使用的是Scaled Dot-Product Attention,其公式為:
也就是計算query與key的點積,另外點積需要除以,是的維度,主要是為了起到縮放的作用,避免梯度爆炸哦。至於更詳細的為什麼Dot-Product Attention需要被Scaled,可以參考該文章:為什麼 dot-product attention 需要被 scaled?
該過程如下圖所示,下圖展示了與key做Attention的過程,獲得了:
③然後將得到的結果通過函數獲得:
④然後將與對應的相乘在加起來就獲得了第一個輸出值。需要注意這裡的是考慮了所有的輸入所產生的,其具備與RNN類似的效果。該過程如下圖所示:
同理等也通過同樣的過程計算出來:
Self-attention如何並行運算
①將橫向排列到一起組成矩陣,然後分別用乘以來獲得矩陣,該過程如下圖所示:
該步驟的形式化過程如下:
由此也就完成了以下過程:
②接下來需要對和做attention,在每一個對每一個進行點積運算時可以將縱向疊加成一個矩陣即,該過程如下圖所示(下圖中省略了):
同樣地每一個也可以橫向排列到一起來與做點擊運算,得到矩陣,該過程如下圖所示:
該步驟的形式化過程如下:
③將矩陣的每一列通過函數獲得,該過程如下圖所示:
④然後將橫向排列到一起再與矩陣相乘來獲得最終的輸出矩陣,該過程如下圖所示:
該步驟的形式化過程如下:
並行運算的整個過程如下圖所示:
具體的細節可以用下圖來表示:
總而言之是一些矩陣運算,可以使用GPU來進行加速。
Multi-head Self-attention
還可以繼續乘以各自的權重獲得,比如,該過程如下圖所示(以2個head為例):
然後分別將對應的與對應的做attention,然後經過與上一部分介紹的相同的步驟來獲得,最後將所有的縱向拼接到一起再與權重相乘來獲得最終的輸出。該過程如下所示:
Self-attention如何考慮位置信息
顯然上述Self-attention的輸出是不考慮的順序的,可以通過將與一個向量加起來的方式來將序列的順序考慮進來,要注意這裡的是預先設定好的,並不會在參數更新過程中被學習。該過程如下所示:
這裡的的來源可以理解為:先將與一個代表向量在序列中位置的獨熱編碼縱向拼接起來然後乘以權重獲得,其中可以分為兩部分,其中不是學習得來的,是預先設定的。該過程的形式化描述如下:
以下是該過程的直觀的描述:
如何獲得設定的有特定的方法,這裡只展示一下將可視化的結果:
Self-attention在Seq2seq問題中的應用
Self-attention層可以直接替換RNN層來處理Seq2seq問題,比如可以將RNN的AutoEncoder中的Encoder和Decoder全部替換成Self-attention層,使用下圖中的網絡結構同樣可以做一些RNN能做的工作。比如翻譯等:
Transformer
下圖以機器翻譯為例展示了Transformer的結構:
可以看到Transformer共有Encoder和Decoder兩部分組成。
在Encoder部分:
①Input Embedding:指的是詞嵌入層,獲得詞的編碼向量;
②Positional Encoding:指的是上文提到的,用來確定輸入向量的位置;
③Multi-Head Attention:這一層指的是如下結構:
④Add&Norm:該部分處理順序如下:
這部分會把輸入加到Multi-Head Attention層的輸出上(一個殘差連接 residual connection)然後對相加的結果做Layer normalization,Layer normalization與Batch normalization有所不同,Batch normalization是在一個Batch的每一個維度上做標準化使其,而Layer normalization是對每一筆數據做標準化:
⑤Feed Forward:前饋神經網絡;
⑥總共有N個這樣的結構(Nx)。
在Decoder部分:
①Input:以Decoder的前一個時間步(time step)的輸出作為Decoder的輸入;
②Masked Multi-Head Attention:masking 的作用就是防止在訓練的時候使用未來的輸出的單詞,確保對位置i的預測僅依賴於已知的位置i之前的輸出,而不會依賴於位置i之後的輸出。比如訓練時, 第一個單詞是不能參考第二個單詞的生成結果的。Masking就會把這個信息變成0, 用來保證預測位置 i 的信息只能基於比 i 小的輸出;
③Multi-Head Attention:encoder-decoder attention layer ,這一層會attend到之前Encoder部分的輸出;
Self-attention的過程中序列中的任意兩個詞都會做attention,這裡可以將對應的權重做可視化:
在下面這張圖中有個有趣的現象,可以看到經過訓練後,句子「The animal didn't cross the street because it was too tired.」中「it」到「animal」的權重很大,而句子「The animal didn't cross the street because it was too wide.」中「it」到「street」的權重很大。
下圖展示了Multi-Head Attention的不同head的可視化結果,上面的部分可以看出這個head主要關注比較長序列(global)的信息,而下面的head比較關注距自己相近的序列(local)的信息,說明使用多個head時不同的head通過學習會關注不同的信息。
多文檔摘要
使用Transformer可以做多文檔摘要,如下圖所示,通過訓練一個Summarizer來輸入一個文檔的集合然後輸出這些文檔的摘要:
Transformer很好地解決了輸入序列長度較大的情況,而向RNN中輸入長序列結果通常不會好:
Universal Transformer
將Transfromer在深度上隨時間循環使用,即重複使用相同的網絡結構:
Self-Attention GAN
簡單了解一下:
參考資料ref:[深度學習中的「注意力機制」](https://rdc.hundsun.com/portal/article/922.html)
ref:[神經機器翻譯 之 谷歌 transformer 模型](https://www.jianshu.com/p/ef41302edeef)