attention機制來自於視覺的感知,對某些關鍵區域聚焦,其應用在圖片上可行,是否能夠應用在文本處理。答案是可行的,其實當咱們快讀閱讀或者讀長篇文本的時候,咱們的注意力是集中在關鍵詞,事件或實體上。經過大量實驗證實,將attention機制應用在機器翻譯,摘要生成,閱讀理解等問題上,取得的成效顯著。本文不作過多分析,只指出大概的機制。主要方便本身複習。python
非attention機制的encoder-decoder模型以下圖所示: 即生成目標句子單詞的過程成了下面的形式: git
能夠簡單理解爲:x序列通過RNN產生的最後狀態hm來生成中間語義向量C,再由C產生輸出y序列。 y1,H1 = RNN(EOS,C) y2,H2 = RNN(y1,H1) y3,H3 = RNN(y2,H2) .... .... ....github
attention機制至關於C由h一、h二、...hm共同決定,且每輸出一個字符,C是動態變化的。 其模型以下圖所示: 即生成目標句子單詞的過程成了下面的形式: 網絡
其中Ci能夠表示爲: aij是encoder層狀態hj影響下一個輸出字符的權重。框架
那麼aij怎麼獲得呢?,看下圖: (上圖Si-2應該爲Hi-2)經過函數F(hj,Hi-1)來得到目標單詞yi和每一個輸入單詞對應的對齊可能性,這個F函數在不一樣論文裏可能會採起不一樣的方法,能夠是函數
而後函數F的輸出通過Softmax進行歸一化就獲得了符合機率分佈取值區間的注意力分配機率分佈數值。oop
公式彙總一下: H0 = 初始化狀態(decoder隱藏層初始化狀態),y0 = EOSgoogle
上圖表示不是很清楚,能夠理解爲: y1,H1 = RNN(EOS,C1) , C1 = sum(aij*hj), aij = F(hj, H0), H0爲初始化狀態 y2,H2 = RNN(y1,C2) , C2 = sum(aij*hj), aij = F(hj, H1) y3,H3 = RNN(y2,C3) , C3 = sum(ai*hj), aij = F(hj, H2) ... ... ... 補充一張更詳細的google教程上的圖: .net
經過(x---y)訓練修正--->F參數、RNN參數。翻譯
能夠參考google程序seq2seq:https://github.com/tensorflow/tensorflow/blob/64edd34ce69b4a8033af5d217cb8894105297d8a/tensorflow/contrib/legacy_seq2seq/python/ops/seq2seq.py 本身總結以下:
其中:函數cov_2d是卷積提取特徵,f是變換函數獲得權重,Liner是線性變換(matul(W([attns0,y0])+B) 在程序中若是loop_function存在,上圖則爲 OP1,H1 = F(<EOS>, hm, [O1,O2,..Om]), OP2,H2 = F(OP1, H1, [O1,O2,..Om]), OP3,H3 = F(OP2, H2, [O1,O2,..Om]), ...