論文創新點:
- 多頭注意力
- 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問題上取得不錯的成績。