參考了:https://www.jianshu.com/p/ef41302edeef?utm_source=oschina-app
文章要點:
- 達到了new state of art。
- 用transformer模型代替傳統的lstm/rnn,提供並行方法,降低計算複雜度,訓練更快。
- 引入position embedding代替rnn時序特徵。
以機器翻譯爲例解析transformer,其實分爲兩個sublayer,一個是multi-head attention,另外一個是 feed foward。兩個sublayer都用了殘差連接和lyaernorm。
- Scaled dot-product attention
attention一共有三種。
- 用於encoder self-attention,用來提取輸入之間的相關性和側重點,可以代替時序特徵。
- 用於decoder self-attention,用來提取輸出之間的相關性和側重點,不同的是要加mask即只能前面影響後面。
- 用於encoder-decoder self-attention,計算翻譯過程中的每個目標字對於輸入的不同側重。
以第三種爲例:
一般情況下K和V相同,核心思想都是計算目標和源的相似度,softmax得到得分,然後點乘V,得到加權後的結果。
計算相似度的方法有好多種,參見http://phontron.com/class/nn4nlp2017/assets/slides/nn4nlp-09-attention.pdf
大概有拼接加權(適用於大數據),變維相乘,和點乘等。
然後到了multi-head。
本質上就是對不同的head實現不同的線性轉換,每個head表示獨特的信息,假設原來的維度是[batch, max_seq_len, dim]
論文中用了head=8, dim=512(詞向量維度),dk-dv-domodel/h=64
我們先轉換成dim/head = 512/8 = 64,輸入點乘[512, 64],變成[batch, max_seq, 64]
這樣操作8次就得到[batch, 8, max_seq_len, 64],這也就是multi-head attention
然後接下來就是線性加權,點乘一個[h*dv,dim]的權重矩陣,會發現數據被還原成[batch, max_seq_len, dim],但這是加了attention權重之後的結果啦。