參考文檔:
- 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
這三篇足夠了占贫。
個人理解:
為何需要attention機制枫弟?因為我們需要知道推理下一個詞的時候,原來的input句子里哪些詞最相關(guān),幫助推理荧飞。因此需要輸入一個向量,該向量維度固定般此,且蘊含了輸入句子的信息跷车,且是和該輸出詞最相關(guān)的輸入詞的信息,是有側(cè)重的一個向量拧粪,不是整個輸入句子的向量修陡。整個句子的向量就是encoder output。
上圖所示可霎,context vector即一般公式里的c就是我們想要的這個向量魄鸦,額外蘊含了encoder詞的信息,關(guān)鍵的地方在于如何計算該c癣朗。這個c應(yīng)該是由上一個decoder的隱藏向量(圖中紅色)拾因,以及encoder的hidden向量(淡綠色)算出來的。
簡單來說就是: 紅色和淡綠色向量哪個最相關(guān)性旷余,就用哪個作為最終的c(深綠色)绢记。更進一步,是淡綠色向量的線性加權(quán)正卧,越相關(guān)則權(quán)重越大蠢熄,權(quán)重就是這里的score。
怎么算score穗酥,即相關(guān)性护赊?可以用MLP,或者簡單的 dot product砾跃。即下圖中黃線部分骏啰。算出來的權(quán)重需要歸一化,否則過大抽高。之后就是權(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
此處說明第二 第四個 hidden state更加重要壁熄,需要重點關(guān)注,因此最終context里的權(quán)重占比更大碳竟。
我們希望RNN中草丧,hidden state輸出是有意義和相關(guān)性的,有表征能力莹桅,且這種attention機制被模型學習到了昌执,假設(shè)一個翻譯的case,I love you,模型翻譯輸出了 “我”+“愛”懂拾,通過attention的機制煤禽,知道后面的詞 , 和you最相關(guān)岖赋,有更大概率輸出 “你”檬果,而非“情”。
因為在原來的seq2seq里唐断,信息都蘊含在一個encoder的輸出向量里选脊,若decoder只在初始處輸入一個encoder向量,則 you這個特征可能被丟失掉栗涂,從而推理錯誤知牌。若將encoder輸出向量輸入到每個decoder時間步里,那么該時間步的decoder也不知道輸入句子哪個詞更重要斤程。加入了attention機制后角寸,就解決了這些問題。decoder知道了下一個時間步中忿墅,最相關(guān)的輸入詞的特征是什么扁藕,是“you”。
https://towardsdatascience.com/attn-illustrated-attention-5ec4ad276ee3