【NLP】四萬(wàn)字全面詳解 | 深度學(xué)習(xí)中的注意力機(jī)制(三)
NewBeeNLP原創(chuàng)出品???
公眾號(hào)專欄作者@蘑菇先生??
知乎?|?蘑菇先生學(xué)習(xí)記
深度學(xué)習(xí)Attenion小綜述系列:
目前深度學(xué)習(xí)中熱點(diǎn)之一就是注意力機(jī)制(Attention Mechanisms)。Attention源于人類視覺(jué)系統(tǒng),當(dāng)人類觀察外界事物的時(shí)候,一般不會(huì)把事物當(dāng)成一個(gè)整體去看,往往傾向于根據(jù)需要選擇性的去獲取被觀察事物的某些重要部分,比如我們看到一個(gè)人時(shí),往往先Attend到這個(gè)人的臉,然后再把不同區(qū)域的信息組合起來(lái),形成一個(gè)對(duì)被觀察事物的整體印象。
「同理,Attention Mechanisms可以幫助模型對(duì)輸入的每個(gè)部分賦予不同的權(quán)重,抽取出更加關(guān)鍵及重要的信息,使模型做出更加準(zhǔn)確的判斷,同時(shí)不會(huì)對(duì)模型的計(jì)算和存儲(chǔ)帶來(lái)更大的開銷,這也是Attention Mechanism應(yīng)用如此廣泛的原因」
本部分介紹Attention機(jī)制的各種變體。包括但不限于:
「基于強(qiáng)化學(xué)習(xí)的注意力機(jī)制」:選擇性的Attend輸入的某個(gè)部分 「全局&局部注意力機(jī)制」:其中,局部注意力機(jī)制可以選擇性的Attend輸入的某些部分 「多維度注意力機(jī)制」:捕獲不同特征空間中的Attention特征。 「多源注意力機(jī)制」:Attend到多種源語(yǔ)言語(yǔ)句 「層次化注意力機(jī)制」:word->sentence->document 「注意力之上嵌一個(gè)注意力」:和層次化Attention有點(diǎn)像。 「多跳注意力機(jī)制」:和前面兩種有點(diǎn)像,但是做法不太一樣。且借助殘差連接等機(jī)制,可以使用更深的網(wǎng)絡(luò)構(gòu)造多跳Attention。使得模型在得到下一個(gè)注意力時(shí),能夠考慮到之前的已經(jīng)注意過(guò)的詞。 「使用拷貝機(jī)制的注意力機(jī)制」:在生成式Attention基礎(chǔ)上,添加具備拷貝輸入源語(yǔ)句某部分子序列的能力。 「基于記憶的注意力機(jī)制」:把Attention抽象成Query,Key,Value三者之間的交互;引入先驗(yàn)構(gòu)造記憶庫(kù)。 「自注意力機(jī)制」:自己和自己做attention,使得每個(gè)位置的詞都有全局的語(yǔ)義信息,有利于建立長(zhǎng)依賴關(guān)系。
Multi-step Attention
NIPS2017:Convolutional Sequence to Sequence Learning[1]
2017年,F(xiàn)aceBook Research在論文《Convolutional Sequence to Sequence Learning》提出了完全基于CNN來(lái)構(gòu)建Seq2Seq模型。Motivation在于,以往的自然語(yǔ)言處理領(lǐng)域,包括 seq2seq 任務(wù)中,大多數(shù)都是通過(guò)RNN來(lái)實(shí)現(xiàn)。這是因?yàn)镽NN的鏈?zhǔn)浇Y(jié)構(gòu),能夠很好地應(yīng)用于處理序列信息。
但是,RNN也存在著劣勢(shì):一個(gè)是由于RNN運(yùn)行時(shí)是將序列的信息逐個(gè)處理,不能實(shí)現(xiàn)并行操作,導(dǎo)致運(yùn)行速度慢;另一個(gè)是傳統(tǒng)的RNN并不能很好地處理句子中的結(jié)構(gòu)化信息,或者說(shuō)更復(fù)雜的關(guān)系信息,同時(shí)對(duì)于長(zhǎng)語(yǔ)句中詞依賴關(guān)系的捕捉不夠好。
相比之下,CNN的優(yōu)勢(shì)就凸顯出來(lái)。最重要的一點(diǎn)就是,CNN能夠并行處理數(shù)據(jù),計(jì)算更加高效。此外,CNN是層級(jí)結(jié)構(gòu),與循環(huán)網(wǎng)絡(luò)建模的鏈結(jié)構(gòu)相比,層次結(jié)構(gòu)提供了一種較短的路徑來(lái)捕獲詞之間遠(yuǎn)程的依賴關(guān)系,因此也可以更好地捕捉更復(fù)雜的關(guān)系, 具體而言低層的卷積網(wǎng)絡(luò)可以捕獲鄰近的詞之間的關(guān)系;高層的卷積網(wǎng)絡(luò)以低層的卷積網(wǎng)絡(luò)的輸出作為輸入,可以捕獲遠(yuǎn)程的詞之間的關(guān)系。
另外,作者在Decoder中,使用了multi-step attention,即,在 decoder 的每一個(gè)卷積層都會(huì)進(jìn)行 attention 操作,并將結(jié)果輸入到下一層。有點(diǎn)類似于人做閱讀理解時(shí),會(huì)反復(fù)去原文中尋找是否有合適的答案(且每次尋找時(shí),理解會(huì)加深,找的更準(zhǔn))。當(dāng)然,這種多跳機(jī)制在下文所述的End-to-End Memory Networks中實(shí)際上已經(jīng)有所體現(xiàn)了。
直接上模型圖:(英文翻譯成德文,從上到下看)
Embedding Layer
word embedding+position embedding。
Convolutional Block Structure
層級(jí)的卷積塊結(jié)構(gòu),通過(guò)層級(jí)疊加能夠得到遠(yuǎn)距離的兩個(gè)詞之間的關(guān)系信息,encoder和decoder都由多層的Convolutional Block疊加而成。每層由1個(gè)Block構(gòu)成,且“卷積計(jì)算+非線性計(jì)算+殘差連接”看作一個(gè)Convolutional Block。
「卷積計(jì)算時(shí)」,以單詞 為中心的窗口 內(nèi) 個(gè) 維的embedding詞全部concat在一起,得到輸入 ;卷積核矩陣為 ,可以理解為每個(gè)卷積核大小為 ,一共有2d個(gè)卷積核,卷積完的輸出 ;
「非線性運(yùn)算時(shí)」,采用了門控結(jié)構(gòu)(GLU),計(jì)算公式為: , 其中 是非線性運(yùn)算, 是門控函數(shù)。也就是說(shuō)上述2d個(gè)卷積核,卷積得到的前d個(gè)元素構(gòu)成的向量為A,后d個(gè)元素構(gòu)成的向量為B,且B作為門控函數(shù)的輸入。 的輸出也是d維的。
「殘差連接時(shí)」(GLU的右側(cè)),直接加上單詞 的embedding得到一個(gè)Block的輸出。作者為了保證卷積的輸出長(zhǎng)度和輸入長(zhǎng)度一致,添加了padding策略。這樣多個(gè)Blocks可以疊加在一起。Decoder最后一層Block的輸出經(jīng)過(guò)softmax全連接層得到下一個(gè)詞的概率。
Multi-step Attention
上面描述還未使用到Attention,只不過(guò)用多層卷積塊分別提取了Encoder表示和Decoder表示,Decoder還未用到Encoder的信息。Multi-step意味著Decoder每一個(gè)卷積層都會(huì)進(jìn)行Attention。
首先將Decoder經(jīng)過(guò)卷積層提取到的特征表示和前一個(gè)已經(jīng)預(yù)測(cè)的輸出詞的embedding結(jié)合在一起,
再和Encoder最后一個(gè)Block提取的特征表示 ( 是Encoder最后一個(gè)Block)求Attention(點(diǎn)乘+softmax),記做 。
接著計(jì)算上下文向量,除了利用 ,還利用了對(duì)應(yīng)單詞的embedding,則
最后將 加到Decoder的特征表示上 上(),作為Block的輸出,且是Decoder下一個(gè)Block的輸入。
如此,在Decoder每一個(gè)卷積層都會(huì)進(jìn)行 attention 的操作,得到的結(jié)果輸入到下一層卷積層,這就是多跳注意機(jī)制multi-hop attention。這樣做的好處是使得模型在得到下一個(gè)注意力時(shí),能夠考慮到之前的已經(jīng)注意過(guò)的詞。
Attention with Pointer/Copying mechanism
NIPS2015:Pointer Networks[2] ACL2016:Incorporating Copying Mechanism in Sequence-to-Sequence Learning[3] ACL2017:Get To The Point: Summarization with Pointer-Generator Networks[4]
Pointer Networks
首先是“NIPS2015:Pointer Network“。作者想解決的是「輸出序列語(yǔ)句中每個(gè)元素是離散的單詞,且該元素和輸入序列語(yǔ)句中每個(gè)位置相對(duì)應(yīng)」的應(yīng)用場(chǎng)景(an output sequence with elements that are discrete tokens corresponding to positions in an input sequence,說(shuō)白了就是拷貝),如尋找凸包(比如訓(xùn)練的時(shí)候最多4個(gè)頂點(diǎn),后來(lái)遇到10個(gè)頂點(diǎn)的幾何圖形就解決不了了)等。
這種場(chǎng)景的特點(diǎn)是,「輸出序列的詞匯表」會(huì)隨著「輸入序列長(zhǎng)度」的改變而改變,也就是說(shuō)對(duì)很多樣例而言,「out-of-vocabulary」現(xiàn)象是經(jīng)常存在的。傳統(tǒng)的seq2seq模型無(wú)法解決該問(wèn)題,因?yàn)閷?duì)于這類問(wèn)題,輸出往往是輸入集合的子集,且輸出的類別詞匯表是可變的。基于這種特點(diǎn),作者考慮能不能找到一種結(jié)構(gòu)類似編程語(yǔ)言中的指針,每個(gè)指針對(duì)應(yīng)輸入序列的一個(gè)元素,從而我們可以直接操作輸入序列而不需要特意「設(shè)定」輸出詞匯表。
作者給出的答案是指針網(wǎng)絡(luò)(Pointer Networks)。Pointer Networks的核心思想在于,直接將「輸入序列」對(duì)應(yīng)的Attention Score向量作為Pointer指針來(lái)選擇輸入序列的一部分作為輸出,因?yàn)锳ttention可以衡量不同輸入序列token的重要性程度(而先前的Attention Score用于加權(quán)encoder的隱狀態(tài)并得到一個(gè)上下文向量用于Decoder階段)。
總結(jié)一下,傳統(tǒng)的帶有注意力機(jī)制的seq2seq模型的運(yùn)行過(guò)程是這樣的,先使用encoder部分對(duì)輸入序列進(jìn)行編碼,然后對(duì)編碼后的向量做attention,最后使用decoder部分對(duì)attention后的向量進(jìn)行解碼從而得到預(yù)測(cè)結(jié)果。但是作為Pointer Networks,得到預(yù)測(cè)結(jié)果的方式便是輸出一個(gè)概率分布,也即所謂的指針。換句話說(shuō),傳統(tǒng)帶有注意力機(jī)制的seq2seq模型輸出的是針對(duì)「輸出詞匯表」的一個(gè)概率分布,而Pointer Networks輸出的則是針對(duì)「輸入文本序列」的概率分布。直接優(yōu)化該概率分布的交叉熵?fù)p失即可。
接著我們先介紹下ACL2017應(yīng)用Pointer Network的文章“Get To The Point: Summarization with Pointer-Generator Networks“,這篇文章略好懂一些。作者提出了Pointer-Generator模型,在傳統(tǒng)的Attention Encoder-Decoder基礎(chǔ)上加入了Pointer Network+Coverage技術(shù)來(lái)解決文本摘要的seq2seq模型存在的兩大缺陷:
模型容易不準(zhǔn)確地再現(xiàn)事實(shí)細(xì)節(jié),也就是說(shuō)模型生成的摘要不準(zhǔn)確; 往往會(huì)重復(fù),也就是會(huì)重復(fù)生成一些詞或者句子。
模型結(jié)構(gòu)如下:
這里主要介紹Pointer Networks部分。作者對(duì)Pointer Networks應(yīng)用的思想非常直觀,就是用它來(lái)「復(fù)制」源文本中的單詞。簡(jiǎn)單來(lái)說(shuō),在每一次預(yù)測(cè)的時(shí)候,通過(guò)傳統(tǒng)seq2seq模型的預(yù)測(cè)(即softmax層的結(jié)果)可以得到針對(duì)「詞匯表」的概率分布(圖中綠色柱形圖),然后通過(guò)Pointer Networks可以得到針對(duì)「輸入序列」的概率分布(圖中藍(lán)色柱形圖),對(duì)二者做并集就可以得到結(jié)合了輸入文本中詞匯和預(yù)測(cè)詞匯表的一個(gè)概率分布(最終結(jié)果的柱形圖中的“2-0”這個(gè)詞不在預(yù)測(cè)詞匯表中,它來(lái)自「輸入文本」),這樣一來(lái)模型就有可能直接從輸入文本中「復(fù)制」一些詞到輸出結(jié)果中。
當(dāng)然,直接這樣操作未必會(huì)有好的結(jié)果,因此作者又加入了一個(gè) 來(lái)作為soft概率。Pgen的作用可以這樣理解:決定當(dāng)前預(yù)測(cè)是直接從源文本中復(fù)制一個(gè)詞過(guò)來(lái)還是從詞匯表中生成一個(gè)詞出來(lái),二者通過(guò)插值combine起來(lái)。
其中, 根據(jù)上下文向量,decoder層隱狀態(tài),decoder輸入,經(jīng)過(guò)1層MLP+sigmoid得到。 是Decoder輸出層得到的詞匯表中 的概率, 則是對(duì)輸入序列中, 詞對(duì)應(yīng)的attention值加起來(lái)(可能多次出現(xiàn))。
Copying Mechanism
最后是ACL2016的文章“Incorporating Copying Mechanism in Sequence-to-Sequence Learning”,幾乎和ACL2017文章思想一樣。文章創(chuàng)新點(diǎn)包括3個(gè)部分:
預(yù)測(cè):基于兩種模式的混合概率模型預(yù)測(cè)下一個(gè)詞的概率分布。包括:Generation-Mode,用來(lái)根據(jù)詞匯表生成詞匯,計(jì)算詞匯表詞的生成概率;Copy-Mode,用來(lái)直接復(fù)制「輸入序列」中的一些詞,計(jì)算源語(yǔ)句序列詞被拷貝的概率。最后預(yù)測(cè)時(shí),二者概率相加(上一篇文章根據(jù) 插值,這里直接相加)。因此,該模型具備解決OOV問(wèn)題的能力。
Decoder隱狀態(tài)的更新:傳統(tǒng)的Seq2Seq模型在Decoder層計(jì)算下一個(gè)時(shí)刻的隱狀態(tài)時(shí),使用的信息包括前一時(shí)刻隱狀態(tài),attention后的上下文狀態(tài),前一時(shí)刻已經(jīng)預(yù)測(cè)的輸出詞的embedding。而該模型中,還使用了「前一時(shí)刻已經(jīng)預(yù)測(cè)的輸出詞在源語(yǔ)句Encoder中對(duì)應(yīng)的特定位置的隱狀態(tài)」(因?yàn)榍耙粫r(shí)刻的輸出詞可能是來(lái)自于源語(yǔ)句序列的拷貝,故在Encoder中有對(duì)應(yīng)的隱狀態(tài))。
Encoder隱狀態(tài)的使用方式:傳統(tǒng)的Seq2Seq模型對(duì)于Encoder隱狀態(tài)的使用只包括Attention Read,即轉(zhuǎn)成attentional上下文向量在Decoder中使用,這可以看做是「Content-based Addressing」。而本文還加了一種使用方式Selective Read,也就是上述"Decoder隱狀態(tài)更新"中所述,會(huì)使用前一時(shí)刻已經(jīng)預(yù)測(cè)的輸出詞在源語(yǔ)句Encoder中對(duì)應(yīng)的特定位置的隱狀態(tài),這種方式可以看做「Location-based Addressing」(伴隨著信息的流動(dòng),下一個(gè)位置的信息在預(yù)測(cè)下一個(gè)Decoder隱狀態(tài)時(shí)會(huì)被關(guān)注,因此Location-based Addressing使得模型具備拷貝源語(yǔ)句某個(gè)連續(xù)「子序列」的能力)。
模型結(jié)構(gòu)如下:

上圖解讀分成3部分,首先令Encoder得到的所有hidden state為矩陣 。目前要預(yù)測(cè)當(dāng)前時(shí)刻的輸出詞 Jebara。
左側(cè)和常規(guī)的Attention模型一致,在預(yù)測(cè)此刻輸出詞"Jebara"時(shí),使用前一時(shí)刻的Decoder隱狀態(tài) 和 求Attention,該Attention得分向量作為源語(yǔ)句每個(gè)詞的概率分布(文中好像用的是 ,那這個(gè)應(yīng)該是未更新前的)。
右側(cè)下半部分,根據(jù) ,, , 更新此刻的Decoder狀態(tài) 。重點(diǎn)是前一時(shí)刻輸出詞 (Tony)除了它的embedding之外,作者還考慮了如果前一時(shí)刻的輸出詞是輸入序列某個(gè)位置的詞,例如Tony就是輸入序列的詞,那么利用Attention向量對(duì)這些輸入詞的Encoder hidden state進(jìn)行加權(quán)作為對(duì)輸入序列的Selective Read(此處是Tony,但是Tony可能出現(xiàn)多次;如果沒(méi)有出現(xiàn),那么這部分為空,退化為傳統(tǒng)的方法)。然后將Tony的Embedding和Selective Read連接在一起作為 。最后一起經(jīng)過(guò)LSTM/GRU得到此刻的 。
最后右側(cè)上半部分,Decoder根據(jù)生成模式和拷貝模式計(jì)算下一個(gè)詞的概率分布。詞語(yǔ)分成3大部分,源序列輸入詞,詞匯表詞,未知詞(統(tǒng)一設(shè)置成UNK)。下一個(gè)詞概率分布:
其中,第一個(gè)式子是生成模式(g),對(duì)應(yīng)右上圖左側(cè);第二個(gè)詞時(shí)拷貝模式(c),對(duì)應(yīng)右上圖右側(cè)。具體不同模式詞匯的概率分布都是先根據(jù)得分模型(MLP)計(jì)算不同詞的得分,再進(jìn)行softmax得到分布;生成模式得分模型依賴于上一步計(jì)算的 和輸出詞的embedding表示;拷貝模式得分模型依賴于 和輸入詞的hidden state(M中某列)。 所有計(jì)算情況如下圖所示,圖中 就是得分模型。

圖中, 是源序列輸入詞; 是詞匯表的詞;unk是未知詞。某個(gè)輸出詞可能屬于上述4種情況中的一種。
Summary
本文主要對(duì)基本的Attention機(jī)制以及Attention的變體方面的工作進(jìn)行了梳理。我們不難發(fā)現(xiàn)Attention機(jī)制簡(jiǎn)單,優(yōu)雅,效果好,溝通了輸入和輸出之間的聯(lián)系,易于推廣和應(yīng)用到多種多樣的任務(wù)和場(chǎng)景中,如計(jì)算機(jī)視覺(jué),NLP,推薦系統(tǒng),搜索引擎等等。
除此之外,我們可以回顧下早期的一些奠基性的工作,注意力機(jī)制的好處在于很容易融入到其他早期的一些工作當(dāng)中,來(lái)進(jìn)一步提升早期成果,例如,將注意力機(jī)制引入到早期詞預(yù)訓(xùn)練過(guò)程中,作為特征提取器,來(lái)提升預(yù)訓(xùn)練的效果,這在今年NLP工作中尤為突出(e.g.,BERT)。還比如,可以將注意力機(jī)制用于模型融合;或者將注意力機(jī)制引入到門限函數(shù)的設(shè)計(jì)中(e.g.,GRU中代替遺忘門等)。
總之,Attention機(jī)制的易用性和有效性,使得很容易引入到現(xiàn)有的很多工作中,也很容易的應(yīng)用到各種各樣的實(shí)際業(yè)務(wù)或場(chǎng)景當(dāng)中。另外Attention的改進(jìn)工作包括了,覆蓋率(解決重復(fù)或丟失信息的問(wèn)題),引入馬爾科夫性質(zhì)(前一時(shí)刻Attention會(huì)影響下一時(shí)刻的Attention,實(shí)際上多跳注意力能夠解決該問(wèn)題),引入監(jiān)督學(xué)習(xí)(例如手動(dòng)對(duì)齊或引入預(yù)訓(xùn)練好的強(qiáng)有力的對(duì)齊模型來(lái)解決Attention未對(duì)齊問(wèn)題)等等。
ok,今天就到這兒啦,敬請(qǐng)期待下一篇~我是蘑菇先生,歡迎大家到我的公眾號(hào)『蘑菇先生學(xué)習(xí)記』一起交流!
一則小通知
由于微信平臺(tái)算法改版,公號(hào)內(nèi)容將不再以時(shí)間排序展示,如果大家想第一時(shí)間看到我們的文章,強(qiáng)烈建議星標(biāo)我們和給我們多點(diǎn)點(diǎn)【在看】。星標(biāo)具體步驟為:
1. 點(diǎn)擊頁(yè)面最上方"NewBeeNLP",進(jìn)入公眾號(hào)主頁(yè)。
2. 點(diǎn)擊右上角的小點(diǎn)點(diǎn),在彈出頁(yè)面點(diǎn)擊“設(shè)為星標(biāo)”,就可以啦。
感謝每一份支持,比心

本文參考資料
NIPS2017:Convolutional Sequence to Sequence Learning: https://arxiv.org/pdf/1705.03122.pdf
[2]NIPS2015:Pointer Networks: https://papers.nips.cc/paper/5866-pointer-networks.pdf
[3]ACL2016:Incorporating Copying Mechanism in Sequence-to-Sequence Learning: http://aclweb.org/anthology/P16-1154
[4]ACL2017:Get To The Point: Summarization with Pointer-Generator Networks: https://nlp.stanford.edu/pubs/see2017get.pdf
-?END?-
往期精彩回顧
獲取本站知識(shí)星球優(yōu)惠券,復(fù)制鏈接直接打開:
https://t.zsxq.com/qFiUFMV
本站qq群704220115。
加入微信群請(qǐng)掃碼:
