背景
Encoder-Decoder是個(gè)非常通用的計(jì)算框架,至于Encoder和Decoder具體使用什么模型都是由研究者自己定的,常見(jiàn)的比如 CNN / RNN / BiRNN / GRU / LSTM / Deep LSTM 等,這里的變化組合非常多。
seq2seq(14年)
- seq2seq 是一個(gè) Encoder–Decoder 結(jié)構(gòu)的網(wǎng)絡(luò),它的輸入是一個(gè)序列,輸出也是一個(gè)序列。
- Encoder 中將一個(gè)可變長(zhǎng)度的信號(hào)序列變?yōu)楣潭ㄩL(zhǎng)度的向量表達(dá),Decoder 將這個(gè)固定長(zhǎng)度的向量變成可變長(zhǎng)度的目標(biāo)的信號(hào)序列。
- 這個(gè)結(jié)構(gòu)最重要的地方在于輸入序列和輸出序列的長(zhǎng)度是可變的,可以用于翻譯,聊天機(jī)器人,句法分析,文本摘要等。
Encoder 對(duì)輸入語(yǔ)句 X 進(jìn)行編碼,經(jīng)過(guò)函數(shù)變換為中間語(yǔ)義向量 C,得到中間語(yǔ)義向量 C 后,使用 Decoder 進(jìn)行解碼。Decoder根據(jù)中間狀態(tài)向量 C 和已經(jīng)生成的歷史信息 yi-1 去生成 t 時(shí)刻的單詞 yi
兩種模型
如果將 c 直接輸入到Decoder中,則是 Seq2Seq 模型的第二種模型:
c直接作為Decoder階段RNN的初始化state,而不是在每次decode時(shí)都作為RNN cell的輸入。
如果將 c 當(dāng)作 Decoder 的每一時(shí)刻輸入,則是 Seq2Seq 模型的第一種模型:
tip:g函數(shù)往往是一個(gè)softmax函數(shù)
Seq-to-Seq with Attention(14年)
Encoder-Decoder 模型的局限性:
- 中間語(yǔ)義向量無(wú)法完全表達(dá)整個(gè)輸入序列的信息。Encoder 和 Decoder 的唯一聯(lián)系只有語(yǔ)義編碼 C ,即將整個(gè)輸入序列的信息編碼成一個(gè)固定大小的狀態(tài)向量再解碼,相當(dāng)于將信息”有損壓縮”。
- 句子X(jué)中任意單詞對(duì)生成某個(gè)目標(biāo)單詞yi來(lái)說(shuō)影響力都是相同的,沒(méi)有任何區(qū)別
- RNN難以處理長(zhǎng)序列的句子。隨著輸入信息長(zhǎng)度的增加,由于向量長(zhǎng)度固定,先前編碼好的信息會(huì)被后來(lái)的信息覆蓋,丟失很多信息。
- 每個(gè)時(shí)間步的輸出需要依賴于前面時(shí)間步的輸出,這使得模型沒(méi)有辦法并行,效率低;
- 并且面臨對(duì)齊問(wèn)題。
引入Attention機(jī)制優(yōu)點(diǎn):
- 打破了只能利用encoder最終單一向量結(jié)果的限制,從而使模型可以集中在所有對(duì)于下一個(gè)目標(biāo)單詞重要的輸入信息上,使模型效果得到極大的改善。
- 可解釋性。我們通過(guò)觀察attention 權(quán)重矩陣的變化,可以更好地知道哪部分翻譯對(duì)應(yīng)哪部分源文字。
Attention 模型的特點(diǎn)是 Decoder 不再將整個(gè)輸入序列編碼為固定長(zhǎng)度的中間語(yǔ)義向量 C ,而是根據(jù)當(dāng)前生成的新單詞計(jì)算新的 ,使得每個(gè)時(shí)刻輸入不同的 C,這樣就解決了單詞信息丟失的問(wèn)題。引入了 Attention 的 Encoder-Decoder 模型如下圖:
原來(lái):
現(xiàn)在:
attention 權(quán)重矩陣的計(jì)算
這里關(guān)鍵的操作是計(jì)算encoder與decoder state之間的關(guān)聯(lián)性的權(quán)重,得到Attention分布,從而對(duì)于當(dāng)前輸出位置得到比較重要的輸入位置的權(quán)重,在預(yù)測(cè)輸出時(shí)相應(yīng)的會(huì)占較大的比重。
Attention(17年)
背景:attention mechanism通常和RNN結(jié)合使用,每個(gè)時(shí)間步的輸出需要依賴于前面時(shí)間步的輸出,這使得模型沒(méi)有辦法并行,效率低;
應(yīng)用:機(jī)器翻譯,圖片描述,語(yǔ)音轉(zhuǎn)文字
注意力模型優(yōu)勢(shì):
- 提高任務(wù)性能
- 提高模型的可解釋性
- 并行計(jì)算減少模型訓(xùn)練時(shí)間。Attention機(jī)制每一步計(jì)算不依賴于上一步的計(jì)算結(jié)果,因此可以和CNN一樣并行處理。但是CNN也只是每次捕捉局部信息,通過(guò)層疊來(lái)獲取全局的聯(lián)系增強(qiáng)視野。
- 可以靈活的捕捉長(zhǎng)期和local依賴,而且是一步到位的。AM解決了RNN模型的很多問(wèn)題,例如在面對(duì)長(zhǎng)文本時(shí)的性能衰減,以及計(jì)算序列數(shù)據(jù)對(duì)任務(wù)的權(quán)重影響等。
可以從兩個(gè)角度來(lái)分類Attention:
- Spatial Attention 空間注意力和Temporal Attention 時(shí)間注意力。
- Soft Attention和Hard Attention。Soft Attention是所有的數(shù)據(jù)都會(huì)注意,都會(huì)計(jì)算出相應(yīng)的注意力權(quán)值,不會(huì)設(shè)置篩選條件。Hard Attention會(huì)在生成注意力權(quán)重后篩選掉一部分不符合條件的注意力,讓它的注意力權(quán)值為0,即可以理解為不再注意這些不符合條件的部分。
通用理解
Attention is all you need
本文的創(chuàng)新點(diǎn)在于拋棄了之前傳統(tǒng)的encoder-decoder模型必須結(jié)合cnn或者rnn的固有模式,只用attention。文章的主要目的是在減少計(jì)算量和提高并行效率的同時(shí)不損害最終的實(shí)驗(yàn)結(jié)果,創(chuàng)新之處在于提出了兩個(gè)新的Attention機(jī)制,分別叫做 Scaled Dot-Product Attention 和 Multi-Head Attention。提出了transformer。
將Source中的構(gòu)成元素想象成是由一系列的<Key,Value>數(shù)據(jù)對(duì)構(gòu)成,此時(shí)給定Target中的某個(gè)元素Query,通過(guò)計(jì)算Query和各個(gè)Key的相似性或者相關(guān)性,得到每個(gè)Key對(duì)應(yīng)Value的權(quán)重系數(shù),然后對(duì)Value進(jìn)行加權(quán)求和,即得到了最終的Attention數(shù)值。本質(zhì)上Attention機(jī)制是對(duì)Source中元素的Value值進(jìn)行加權(quán)求和,而Query和Key用來(lái)計(jì)算對(duì)應(yīng)Value的權(quán)重系數(shù)。其實(shí)就是一個(gè)查詢(query)到一系列鍵值(key-value)對(duì)的映射。
從概念上理解,把Attention仍然理解為從大量信息中有選擇地篩選出少量重要信息并聚焦到這些重要信息上,忽略大多不重要的信息,這種思路仍然成立。聚焦的過(guò)程體現(xiàn)在權(quán)重系數(shù)的計(jì)算上,權(quán)重越大越聚焦于其對(duì)應(yīng)的Value值上,即權(quán)重代表了信息的重要性,而Value是其對(duì)應(yīng)的信息。
scaled dot-product attention
?
attention函數(shù)共有三步完成得到attention value。
- Q與K進(jìn)行相似度計(jì)算得到權(quán)值
計(jì)算Query和每個(gè)Key之間的相似性或相關(guān)性一般有三種方式:
- dot:
- General:
- Concat:
- Preceptron:
-
對(duì)上部權(quán)值歸一化
-
用歸一化的權(quán)值與V加權(quán)求和
其意義為:為了用 value求出 query的結(jié)果, 根據(jù) query和 key 來(lái)決定注意力應(yīng)該放在value的哪部分。以前的 attention是用 LSTM 做 encoder,也就是用它來(lái)生成key 和 value,然后由 decoder來(lái)生成 query。(論文 Neural machine translation by jointly learning to align and translate,key 和 value是一樣的,都是文中的h ,而 query是文中的 s。)
有兩種常用的注意力函數(shù),一種是加法注意力(additive attention),另外一種是點(diǎn)乘注意力(dot-productattention),論文所采用的就是點(diǎn)乘注意力,這種注意力機(jī)制對(duì)于加法注意力而言,更快,同時(shí)更節(jié)省空間。
為什么scaling:
如果?太大,點(diǎn)乘的值太大,如果不做scaling,結(jié)果就沒(méi)有加法注意力好。(d_k是key和query的維度)
點(diǎn)乘的結(jié)果過(guò)大,這使得經(jīng)過(guò)softmax之后的梯度很小,不利于反向傳播的進(jìn)行,所以我們通過(guò)對(duì)點(diǎn)乘的結(jié)果進(jìn)行尺度化。
Multi-head Attention
這里面Multi-head Attention其實(shí)就是多個(gè)Self-Attention結(jié)構(gòu)的結(jié)合,每個(gè)head學(xué)習(xí)到在不同表示空間中的特征,如下圖所示,兩個(gè)head學(xué)習(xí)到的Attention側(cè)重點(diǎn)可能略有不同,這樣給了模型更大的容量。
self attention
Google最新的機(jī)器翻譯模型內(nèi)部大量采用了Self Attention模型。
在一般任務(wù)的Encoder-Decoder框架中,輸入Source和輸出Target內(nèi)容是不一樣的,比如對(duì)于英-中機(jī)器翻譯來(lái)說(shuō),Source是英文句子,Target是對(duì)應(yīng)的翻譯出的中文句子,Attention機(jī)制發(fā)生在Target的元素和Source中的所有元素之間。而Self Attention顧名思義,可以理解為Target=Source這種特殊情況下的注意力計(jì)算機(jī)制,指的不是Target和Source之間的Attention機(jī)制。
優(yōu)點(diǎn):
- 引入Self Attention后會(huì)更容易捕獲句子中長(zhǎng)距離的相互依賴的特征,因?yàn)槿绻荝NN或者LSTM,需要依次序序列計(jì)算,對(duì)于遠(yuǎn)距離的相互依賴的特征,要經(jīng)過(guò)若干時(shí)間步步驟的信息累積才能將兩者聯(lián)系起來(lái),而距離越遠(yuǎn),有效捕獲的可能性越小。
- Self Attention對(duì)于增加計(jì)算的并行性也有直接幫助作用。
Transformer
Encoder: encoder由6個(gè)相同的層堆疊而成,每個(gè)層有兩個(gè)子層。第一個(gè)子層是多頭自我注意力機(jī)制(multi-head self-attention mechanism),第二層是簡(jiǎn)單的位置的全連接前饋網(wǎng)絡(luò)(position-wise fully connected feed-forward network)。在兩個(gè)子層中會(huì)使用一個(gè)殘差連接,接著進(jìn)行層標(biāo)準(zhǔn)化(layer normalization)。也就是說(shuō)每一個(gè)子層的輸出都是LayerNorm(x + sublayer(x))。網(wǎng)絡(luò)輸入是三個(gè)相同的向量q, k和v,是word embedding和position embedding相加得到的結(jié)果。為了方便進(jìn)行殘差連接,我們需要子層的輸出和輸入都是相同的維度。
Decoder: decoder也是由N(N=6)個(gè)完全相同的Layer組成,decoder中的Layer由encoder的Layer中插入一個(gè)Multi-Head Attention + Add&Norm組成。輸出的embedding與輸出的position embedding求和做為decoder的輸入,經(jīng)過(guò)一個(gè)Multi-HeadAttention + Add&Norm((MA-1)層,MA-1層的輸出做為下一Multi-Head Attention + Add&Norm(MA-2)的query(Q)輸入。MA-2層的輸出輸入到一個(gè)前饋層(FF),經(jīng)過(guò)AN操作后,經(jīng)過(guò)一個(gè)線性+softmax變換得到最后目標(biāo)輸出的概率。對(duì)于decoder中的第一個(gè)多頭注意力子層,需要添加masking,確保預(yù)測(cè)位置i的時(shí)候僅僅依賴于位置小于i的輸出。層與層之間使用的Position-wise feed forward network。
key, query, value
- 對(duì)于encoder來(lái)說(shuō),其中key, query, value均來(lái)自前一層encoder的輸出,即encoder的每個(gè)位置都可以注意到之前一層encoder的所有位置。
- 對(duì)于decoder來(lái)講,有兩個(gè)與encoder不同的地方:
- 一個(gè)是第一級(jí)的Masked Multi-head。key, query, value均來(lái)自前一層decoder的輸出,但加入了Mask操作,即我們只能attend到前面已經(jīng)翻譯過(guò)的輸出的詞語(yǔ),因?yàn)榉g過(guò)程我們當(dāng)前還并不知道下一個(gè)輸出詞語(yǔ),這是我們之后才會(huì)推測(cè)到的。
- 另一個(gè)是第二級(jí)的Multi-Head Attention不僅接受來(lái)自前一級(jí)decoder的輸出,還要接收encoder的輸出。第二級(jí)decoder也被稱作encoder-decoder attention layer,即它的query來(lái)自于之前一級(jí)的decoder層的輸出,但其key和value來(lái)自于encoder的輸出,這使得decoder的每一個(gè)位置都可以attend到輸入序列的每一個(gè)位置。
- 總結(jié)一下,k和v的來(lái)源總是相同的,q在encoder及第一級(jí)decoder中與k,v來(lái)源相同,在encoder-decoder attention layer中與k,v來(lái)源不同。
因此,Transformer會(huì)在三個(gè)不同的方面使用multi-head attention:
- encoder-decoder attention:使用multi-head attention,輸入為encoder的輸出和decoder的self-attention輸出,其中encoder的self-attention作為 key and value,decoder的self-attention作為query
- encoder self-attention:使用 multi-head attention,輸入的Q、K、V都是一樣的(input embedding and positional embedding)
- decoder self-attention:在decoder的self-attention層中,deocder 都能夠訪問(wèn)當(dāng)前位置前面的位置
position encoding
注意由于該模型沒(méi)有recurrence或convolution操作,所以沒(méi)有明確的關(guān)于單詞在源句子中位置的相對(duì)或絕對(duì)的信息,為了更好的讓模型學(xué)習(xí)位置信息,所以添加了position encoding并將其疊加在word embedding上。該論文中選取了三角函數(shù)的encoding方式,其他方式也可以。
Add+Norm
其中Add代表了Residual Connection,是為了解決多層神經(jīng)網(wǎng)絡(luò)訓(xùn)練困難的問(wèn)題,通過(guò)將前一層的信息無(wú)差的傳遞到下一層,可以有效的僅關(guān)注差異部分,這一方法之前在圖像處理結(jié)構(gòu)如ResNet等中常常用到。
而Norm則代表了Layer Normalization,通過(guò)對(duì)層的激活值的歸一化,可以加速模型的訓(xùn)練過(guò)程,使其更快的收斂,
參考文獻(xiàn):
- 詳解從 Seq2Seq模型、RNN結(jié)構(gòu)、Encoder-Decoder模型 到 Attention模型
- 【NLP】Attention Model(注意力模型)學(xué)習(xí)總結(jié)(https://www.cnblogs.com/guoyaohua/p/9429924.html)
- 深度學(xué)習(xí)對(duì)話系統(tǒng)理論篇--seq2seq+Attention機(jī)制模型詳解
- 論文筆記:Attention is all you need
- Attention機(jī)制詳解(二)——Self-Attention與Transformer
- Attention 機(jī)制學(xué)習(xí)小結(jié)