bert系列一:《Attention is all you need》論文解讀


論文創新點:

  • 多頭注意力
  • transformer模型

 

 Transformer模型

上圖為模型結構,左邊為encoder,右邊為decoder,各有N=6個相同的堆疊。

encoder

先對inputs進行Embedding,再將位置信息編碼進去(cancat方式),位置編碼如下:

 然后經過多頭注意力模塊后,與殘余連接cancat后進行一個Norm操作,多頭注意力模塊如下:

左圖:縮放點乘注意力,這就是個平常的注意力機制,只不過多了scale和mask(僅對於decoder下面橙色框部分),使用的是dot-product attention,原文還提到另一種additive attention。

右圖:多頭注意力實現。每個Q,K,V都經過h個(不同)線性結構,以捕獲不同子空間的信息,經過左圖結構后,對h個dot-product attention進行concat后,再經過一個線性層。

之后,再通過一個有殘余連接的前向網絡。

decoder

同樣先經過Embedding和位置編碼,輸入outputs右移了(因為每一個當前輸出基於之前的輸出)。

下面的橙色框:

之后也經過一個多頭的self-attention,不同的是,它多了個mask操作。

這個mask操作是什么意思呢?注意我們的self-attention是一句話中每個詞向量都與句子中所有詞向量有關,對於encoder這沒問題,而對於decoder,我們是根據之前的輸出預測下一個輸出。

舉個例子,在BiLSTM中(當然這里是Transformer模型),假設我們decode時輸入為A-B-C-D序列,在B處解碼下一個輸出時,我們根據之前的輸出進行預測,但是這是雙向模型,

即我們存在這樣的一個之前的輸出C-B-A-B,那么這個之前的輸出里居然包含了我們下一個需要正確預測的C!這就是“自己看見自己”問題。

所以,mask操作是掩蓋掉之后的位置(原文leftward,即向左流動的信息)的影響,原文是置為負無窮。這個橙色框我覺得可以稱為half-self-attention。

最上面的橙色框:

它就不能叫self-attention結構了,因為它的K和V來自encoder的輸出,Q是下面橙色框的輸出。到這步為止,我們的輸入inputs是完整的self-attention了,我們的輸出outputs也是half-self-attention了。

好了,前戲准備完畢,開始短兵相接了。

這里的K和V一般相同,表示經過self-attention的隱藏語義向量,Q為經過half-self-attention的上一個輸出,此處即為解碼操作。經過一個有殘余連接的前向網絡,一個線性層,再softmax得到輸出概率分布。

至此,Transformer模型描述完畢。


 

我們再看看self-attention模塊,我之前一直不明白這些Q,K,V是啥東東。此處也是我個人推斷

在self-attention中,K,V表示當前位置的詞向量,Q表示所有位置的詞向量,用Q中每一個詞向量與K進行操作(類似上面縮放點乘注意力截止到softmax),得到L個(L為句子單詞數)權重向量。

此時應該有2種操作,一種是對L個權重向量相加,一種是取平均。得到的結果權重向量與V點乘,即為有self-attention后的詞向量。


 

其余的實驗及結果部分不再講述,沒什么難點。

這里再提下另一篇論文《End-To-End Memory Networks》中的一個模型結構。因為這篇論文被上面論文提到,對於理解上面論文有所幫助。

 

 上圖左邊為單層,右邊為多層版本。

單層的輸出為:

 Embedding B和C用於將輸入x和問題q轉化為嵌入向量,Embedding A用另一套參數將輸出x轉化為嵌入向量,與問題q共同決定注意力權重。

因為右圖涉及到眾多參數,為了簡化模型,作者提出2種方案,這里直接上圖:

 

這篇論文的創新點在於右圖的多層版本類似RNNs,運算復雜度也比擬RNNs,避免了RNNs存在的一些問題。在QA問題上取得不錯的成績。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM