參考文檔:
- https://zhuanlan.zhihu.com/p/28054589
- https://zhuanlan.zhihu.com/p/47063917
- https://blog.csdn.net/u011984148/article/details/99440105
- https://blog.csdn.net/wolverine1999/article/details/111224561
- https://zhuanlan.zhihu.com/p/77307258?from_voters_page=true
這三篇足夠了。
個(gè)人理解:
為何需要attention機(jī)制?因?yàn)槲覀冃枰劳评硐乱粋€(gè)詞的時(shí)候,原來的input句子里哪些詞最相關(guān),幫助推理。因此需要輸入一個(gè)向量,該向量維度固定,且蘊(yùn)含了輸入句子的信息,且是和該輸出詞最相關(guān)的輸入詞的信息,是有側(cè)重的一個(gè)向量,不是整個(gè)輸入句子的向量。整個(gè)句子的向量就是encoder output。

上圖所示,context vector即一般公式里的c就是我們想要的這個(gè)向量,額外蘊(yùn)含了encoder詞的信息,關(guān)鍵的地方在于如何計(jì)算該c。這個(gè)c應(yīng)該是由上一個(gè)decoder的隱藏向量(圖中紅色),以及encoder的hidden向量(淡綠色)算出來的。
簡(jiǎn)單來說就是: 紅色和淡綠色向量哪個(gè)最相關(guān)性,就用哪個(gè)作為最終的c(深綠色)。更進(jìn)一步,是淡綠色向量的線性加權(quán),越相關(guān)則權(quán)重越大,權(quán)重就是這里的score。
怎么算score,即相關(guān)性?可以用MLP,或者簡(jiǎn)單的 dot product。即下圖中黃線部分。算出來的權(quán)重需要?dú)w一化,否則過大。之后就是權(quán)重和輸入向量相乘(即上圖中的普通綠色向量),累加的過程,獲得最終的輸出向量c。
decoder_hidden = [10, 5, 10]
encoder_hidden score
---------------------
[0, 1, 1] 15 (= 10×0 + 5×1 + 10×1, the dot product)
[5, 0, 1] 60
[1, 1, 0] 15
[0, 5, 1] 35
此處說明第二 第四個(gè) hidden state更加重要,需要重點(diǎn)關(guān)注,因此最終context里的權(quán)重占比更大。

我們希望RNN中,hidden state輸出是有意義和相關(guān)性的,有表征能力,且這種attention機(jī)制被模型學(xué)習(xí)到了,假設(shè)一個(gè)翻譯的case,I love you,模型翻譯輸出了 “我”+“愛”,通過attention的機(jī)制,知道后面的詞 , 和you最相關(guān),有更大概率輸出 “你”,而非“情”。
因?yàn)樵谠瓉淼膕eq2seq里,信息都蘊(yùn)含在一個(gè)encoder的輸出向量里,若decoder只在初始處輸入一個(gè)encoder向量,則 you這個(gè)特征可能被丟失掉,從而推理錯(cuò)誤。若將encoder輸出向量輸入到每個(gè)decoder時(shí)間步里,那么該時(shí)間步的decoder也不知道輸入句子哪個(gè)詞更重要。加入了attention機(jī)制后,就解決了這些問題。decoder知道了下一個(gè)時(shí)間步中,最相關(guān)的輸入詞的特征是什么,是“you”。
https://towardsdatascience.com/attn-illustrated-attention-5ec4ad276ee3