前文傳送門:
在上一次面試失利后,我回來仔細研究了一下Attention機制,研究完我不禁感悟,這機制真的厲害啊!因為我之前面試被問到的Encoder - Decoder框架中有個瓶頸是編碼的結果以固定長度的中間向量表示,這導致較長的序列編碼后很多信息被稀釋了,導致解碼時效果不佳。當時只記得有個Attention,但是不了解他的原理,所以上次面試沒過:從零開始學自然語言處理(25)—— 通用的Encoder-Decoder模型框架
NLP中的Attention機制是在論文《NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE》被提出的,有興趣的朋友可以去閱讀論文:https://arxiv.org/pdf/1409.0473.pdf
上次面試問到的Encoder - Decoder框架如下圖所示:
而加入Attention機制之后,Encoder - Decoder框架可以改為如下所示:
大家應該注意到上下兩張圖的主要區別在于中間向量C從固定不變的一個變成了不同的多個,在解碼每個序列字符串時使用不同的Ci。
例如我們在翻譯 “Through the woods, we reached the bank of the river.” 時,我們會翻譯成 “穿過樹林,我們到達了河岸。”,當我們在翻譯 “bank” 這個詞時,應該將注意力集中在 “bank ”上,同時也應該考慮上下文,例如“river”,這樣我們才會將“bank”翻譯為“河岸”,而不是“銀行”,這符合我們人類的認知,又例如,我們翻譯“woods”時,會重點關注“woods”和“through”等。所以我們每次在翻譯(解碼)一個詞時,重點關注的內容是不同的,那如何表示在Decoder階段解碼某個輸出(翻譯某個詞)時對原始輸入關注的重點不同呢?
這個問題在上述的論文中得到了解決,論文提出了以下結構的模型:
這里使用了雙層的RNN結構,關于RNN和雙層RNN可以參考之前的文章:
首先,在Encoder階段,輸入的是 X 序列,X=(X1,X2,X3,...,XT),經過一個雙向RNN結構編碼,得到隱藏層每個單元的向量hi ,然后使用如下的公式計算得到解碼不同單詞時用到的Ci:
大家應該發現了,這里的C不再是傳統Encoder-Decoder框架中那個固定的C了,而是根據解碼不同 y 有著不同的Ci !理解這一點就理解了Attention的精髓了!
你可能會問,這里的αij是如何計算的?這里的 αij 類似權重的意思,如上圖所示,在解碼yt時,會綜合考慮αt1,αt2,...,αtT作為對不同輸入 Xi 的關注程度不同,αij計算公式如下:
所以αij其實是 eij經過softmax之后的結果,那問題變為eij是如何計算的了!eij的計算公式如下:
這里的a是一個對齊模型(Alignment model),實際上是一個前饋神經網絡,這里的“對齊”你可以理解為是一種相似度的計算,計算的是當前解碼內容的上一個隱藏狀態s(i-1)和當前hj的關系,相當于將每個編碼輸入和當前輸出進行匹配,從而得到權重。這樣就完成了對Encoder-Decoder框架加入Attention機制,解決了一開始的問題!
這個Attention面試問題也就迎刃而解了~
掃碼下圖關注我們不會讓你失望!