【NLP】四万字全面详解 | 深度学习中的注意力机制(三)
NewBeeNLP原創出品???
公眾號專欄作者@蘑菇先生??
知乎?|?蘑菇先生學習記
深度學習Attenion小綜述系列:
四萬字全面詳解 | 深度學習中的注意力機制(一)
四萬字全面詳解 | 深度學習中的注意力機制(二)
目前深度學習中熱點之一就是注意力機制(Attention Mechanisms)。Attention源于人類視覺系統,當人類觀察外界事物的時候,一般不會把事物當成一個整體去看,往往傾向于根據需要選擇性的去獲取被觀察事物的某些重要部分,比如我們看到一個人時,往往先Attend到這個人的臉,然后再把不同區域的信息組合起來,形成一個對被觀察事物的整體印象。
「同理,Attention Mechanisms可以幫助模型對輸入的每個部分賦予不同的權重,抽取出更加關鍵及重要的信息,使模型做出更加準確的判斷,同時不會對模型的計算和存儲帶來更大的開銷,這也是Attention Mechanism應用如此廣泛的原因」
本部分介紹Attention機制的各種變體。包括但不限于:
「基于強化學習的注意力機制」:選擇性的Attend輸入的某個部分
「全局&局部注意力機制」:其中,局部注意力機制可以選擇性的Attend輸入的某些部分
「多維度注意力機制」:捕獲不同特征空間中的Attention特征。
「多源注意力機制」:Attend到多種源語言語句
「層次化注意力機制」:word->sentence->document
「注意力之上嵌一個注意力」:和層次化Attention有點像。
「多跳注意力機制」:和前面兩種有點像,但是做法不太一樣。且借助殘差連接等機制,可以使用更深的網絡構造多跳Attention。使得模型在得到下一個注意力時,能夠考慮到之前的已經注意過的詞。
「使用拷貝機制的注意力機制」:在生成式Attention基礎上,添加具備拷貝輸入源語句某部分子序列的能力。
「基于記憶的注意力機制」:把Attention抽象成Query,Key,Value三者之間的交互;引入先驗構造記憶庫。
「自注意力機制」:自己和自己做attention,使得每個位置的詞都有全局的語義信息,有利于建立長依賴關系。
Multi-step Attention
NIPS2017:Convolutional Sequence to Sequence Learning[1]
2017年,FaceBook Research在論文《Convolutional Sequence to Sequence Learning》提出了完全基于CNN來構建Seq2Seq模型。Motivation在于,以往的自然語言處理領域,包括 seq2seq 任務中,大多數都是通過RNN來實現。這是因為RNN的鏈式結構,能夠很好地應用于處理序列信息。
但是,RNN也存在著劣勢:一個是由于RNN運行時是將序列的信息逐個處理,不能實現并行操作,導致運行速度慢;另一個是傳統的RNN并不能很好地處理句子中的結構化信息,或者說更復雜的關系信息,同時對于長語句中詞依賴關系的捕捉不夠好。
相比之下,CNN的優勢就凸顯出來。最重要的一點就是,CNN能夠并行處理數據,計算更加高效。此外,CNN是層級結構,與循環網絡建模的鏈結構相比,層次結構提供了一種較短的路徑來捕獲詞之間遠程的依賴關系,因此也可以更好地捕捉更復雜的關系, 具體而言低層的卷積網絡可以捕獲鄰近的詞之間的關系;高層的卷積網絡以低層的卷積網絡的輸出作為輸入,可以捕獲遠程的詞之間的關系。
另外,作者在Decoder中,使用了multi-step attention,即,在 decoder 的每一個卷積層都會進行 attention 操作,并將結果輸入到下一層。有點類似于人做閱讀理解時,會反復去原文中尋找是否有合適的答案(且每次尋找時,理解會加深,找的更準)。當然,這種多跳機制在下文所述的End-to-End Memory Networks中實際上已經有所體現了。
直接上模型圖:(英文翻譯成德文,從上到下看)
Embedding Layer
word embedding+position embedding。
Convolutional Block Structure
層級的卷積塊結構,通過層級疊加能夠得到遠距離的兩個詞之間的關系信息,encoder和decoder都由多層的Convolutional Block疊加而成。每層由1個Block構成,且“卷積計算+非線性計算+殘差連接”看作一個Convolutional Block。
「卷積計算時」,以單詞 為中心的窗口 內 個 維的embedding詞全部concat在一起,得到輸入 ;卷積核矩陣為 ,可以理解為每個卷積核大小為 ,一共有2d個卷積核,卷積完的輸出 ;
「非線性運算時」,采用了門控結構(GLU),計算公式為: , 其中 是非線性運算, 是門控函數。也就是說上述2d個卷積核,卷積得到的前d個元素構成的向量為A,后d個元素構成的向量為B,且B作為門控函數的輸入。 的輸出也是d維的。
「殘差連接時」(GLU的右側),直接加上單詞 的embedding得到一個Block的輸出。作者為了保證卷積的輸出長度和輸入長度一致,添加了padding策略。這樣多個Blocks可以疊加在一起。Decoder最后一層Block的輸出經過softmax全連接層得到下一個詞的概率。
Multi-step Attention
上面描述還未使用到Attention,只不過用多層卷積塊分別提取了Encoder表示和Decoder表示,Decoder還未用到Encoder的信息。Multi-step意味著Decoder每一個卷積層都會進行Attention。
首先將Decoder經過卷積層提取到的特征表示和前一個已經預測的輸出詞的embedding結合在一起,
再和Encoder最后一個Block提取的特征表示 ( 是Encoder最后一個Block)求Attention(點乘+softmax),記做 。
接著計算上下文向量,除了利用 ,還利用了對應單詞的embedding,則
最后將 加到Decoder的特征表示上 上(),作為Block的輸出,且是Decoder下一個Block的輸入。
如此,在Decoder每一個卷積層都會進行 attention 的操作,得到的結果輸入到下一層卷積層,這就是多跳注意機制multi-hop attention。這樣做的好處是使得模型在得到下一個注意力時,能夠考慮到之前的已經注意過的詞。
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“。作者想解決的是「輸出序列語句中每個元素是離散的單詞,且該元素和輸入序列語句中每個位置相對應」的應用場景(an output sequence with elements that are discrete tokens corresponding to positions in an input sequence,說白了就是拷貝),如尋找凸包(比如訓練的時候最多4個頂點,后來遇到10個頂點的幾何圖形就解決不了了)等。
這種場景的特點是,「輸出序列的詞匯表」會隨著「輸入序列長度」的改變而改變,也就是說對很多樣例而言,「out-of-vocabulary」現象是經常存在的。傳統的seq2seq模型無法解決該問題,因為對于這類問題,輸出往往是輸入集合的子集,且輸出的類別詞匯表是可變的。基于這種特點,作者考慮能不能找到一種結構類似編程語言中的指針,每個指針對應輸入序列的一個元素,從而我們可以直接操作輸入序列而不需要特意「設定」輸出詞匯表。
作者給出的答案是指針網絡(Pointer Networks)。Pointer Networks的核心思想在于,直接將「輸入序列」對應的Attention Score向量作為Pointer指針來選擇輸入序列的一部分作為輸出,因為Attention可以衡量不同輸入序列token的重要性程度(而先前的Attention Score用于加權encoder的隱狀態并得到一個上下文向量用于Decoder階段)。
總結一下,傳統的帶有注意力機制的seq2seq模型的運行過程是這樣的,先使用encoder部分對輸入序列進行編碼,然后對編碼后的向量做attention,最后使用decoder部分對attention后的向量進行解碼從而得到預測結果。但是作為Pointer Networks,得到預測結果的方式便是輸出一個概率分布,也即所謂的指針。換句話說,傳統帶有注意力機制的seq2seq模型輸出的是針對「輸出詞匯表」的一個概率分布,而Pointer Networks輸出的則是針對「輸入文本序列」的概率分布。直接優化該概率分布的交叉熵損失即可。
接著我們先介紹下ACL2017應用Pointer Network的文章“Get To The Point: Summarization with Pointer-Generator Networks“,這篇文章略好懂一些。作者提出了Pointer-Generator模型,在傳統的Attention Encoder-Decoder基礎上加入了Pointer Network+Coverage技術來解決文本摘要的seq2seq模型存在的兩大缺陷:
模型容易不準確地再現事實細節,也就是說模型生成的摘要不準確;
往往會重復,也就是會重復生成一些詞或者句子。
模型結構如下:
這里主要介紹Pointer Networks部分。作者對Pointer Networks應用的思想非常直觀,就是用它來「復制」源文本中的單詞。簡單來說,在每一次預測的時候,通過傳統seq2seq模型的預測(即softmax層的結果)可以得到針對「詞匯表」的概率分布(圖中綠色柱形圖),然后通過Pointer Networks可以得到針對「輸入序列」的概率分布(圖中藍色柱形圖),對二者做并集就可以得到結合了輸入文本中詞匯和預測詞匯表的一個概率分布(最終結果的柱形圖中的“2-0”這個詞不在預測詞匯表中,它來自「輸入文本」),這樣一來模型就有可能直接從輸入文本中「復制」一些詞到輸出結果中。
當然,直接這樣操作未必會有好的結果,因此作者又加入了一個 來作為soft概率。Pgen的作用可以這樣理解:決定當前預測是直接從源文本中復制一個詞過來還是從詞匯表中生成一個詞出來,二者通過插值combine起來。
其中, 根據上下文向量,decoder層隱狀態,decoder輸入,經過1層MLP+sigmoid得到。 是Decoder輸出層得到的詞匯表中 的概率, 則是對輸入序列中, 詞對應的attention值加起來(可能多次出現)。
Copying Mechanism
最后是ACL2016的文章“Incorporating Copying Mechanism in Sequence-to-Sequence Learning”,幾乎和ACL2017文章思想一樣。文章創新點包括3個部分:
預測:基于兩種模式的混合概率模型預測下一個詞的概率分布。包括:Generation-Mode,用來根據詞匯表生成詞匯,計算詞匯表詞的生成概率;Copy-Mode,用來直接復制「輸入序列」中的一些詞,計算源語句序列詞被拷貝的概率。最后預測時,二者概率相加(上一篇文章根據 插值,這里直接相加)。因此,該模型具備解決OOV問題的能力。
Decoder隱狀態的更新:傳統的Seq2Seq模型在Decoder層計算下一個時刻的隱狀態時,使用的信息包括前一時刻隱狀態,attention后的上下文狀態,前一時刻已經預測的輸出詞的embedding。而該模型中,還使用了「前一時刻已經預測的輸出詞在源語句Encoder中對應的特定位置的隱狀態」(因為前一時刻的輸出詞可能是來自于源語句序列的拷貝,故在Encoder中有對應的隱狀態)。
Encoder隱狀態的使用方式:傳統的Seq2Seq模型對于Encoder隱狀態的使用只包括Attention Read,即轉成attentional上下文向量在Decoder中使用,這可以看做是「Content-based Addressing」。而本文還加了一種使用方式Selective Read,也就是上述"Decoder隱狀態更新"中所述,會使用前一時刻已經預測的輸出詞在源語句Encoder中對應的特定位置的隱狀態,這種方式可以看做「Location-based Addressing」(伴隨著信息的流動,下一個位置的信息在預測下一個Decoder隱狀態時會被關注,因此Location-based Addressing使得模型具備拷貝源語句某個連續「子序列」的能力)。
模型結構如下:
上圖解讀分成3部分,首先令Encoder得到的所有hidden state為矩陣 。目前要預測當前時刻的輸出詞 Jebara。
左側和常規的Attention模型一致,在預測此刻輸出詞"Jebara"時,使用前一時刻的Decoder隱狀態 和 求Attention,該Attention得分向量作為源語句每個詞的概率分布(文中好像用的是 ,那這個應該是未更新前的)。
右側下半部分,根據 ,, , 更新此刻的Decoder狀態 。重點是前一時刻輸出詞 (Tony)除了它的embedding之外,作者還考慮了如果前一時刻的輸出詞是輸入序列某個位置的詞,例如Tony就是輸入序列的詞,那么利用Attention向量對這些輸入詞的Encoder hidden state進行加權作為對輸入序列的Selective Read(此處是Tony,但是Tony可能出現多次;如果沒有出現,那么這部分為空,退化為傳統的方法)。然后將Tony的Embedding和Selective Read連接在一起作為 。最后一起經過LSTM/GRU得到此刻的 。
最后右側上半部分,Decoder根據生成模式和拷貝模式計算下一個詞的概率分布。詞語分成3大部分,源序列輸入詞,詞匯表詞,未知詞(統一設置成UNK)。下一個詞概率分布:
其中,第一個式子是生成模式(g),對應右上圖左側;第二個詞時拷貝模式(c),對應右上圖右側。具體不同模式詞匯的概率分布都是先根據得分模型(MLP)計算不同詞的得分,再進行softmax得到分布;生成模式得分模型依賴于上一步計算的 和輸出詞的embedding表示;拷貝模式得分模型依賴于 和輸入詞的hidden state(M中某列)。 所有計算情況如下圖所示,圖中 就是得分模型。
圖中, 是源序列輸入詞; 是詞匯表的詞;unk是未知詞。某個輸出詞可能屬于上述4種情況中的一種。
Summary
本文主要對基本的Attention機制以及Attention的變體方面的工作進行了梳理。我們不難發現Attention機制簡單,優雅,效果好,溝通了輸入和輸出之間的聯系,易于推廣和應用到多種多樣的任務和場景中,如計算機視覺,NLP,推薦系統,搜索引擎等等。
除此之外,我們可以回顧下早期的一些奠基性的工作,注意力機制的好處在于很容易融入到其他早期的一些工作當中,來進一步提升早期成果,例如,將注意力機制引入到早期詞預訓練過程中,作為特征提取器,來提升預訓練的效果,這在今年NLP工作中尤為突出(e.g.,BERT)。還比如,可以將注意力機制用于模型融合;或者將注意力機制引入到門限函數的設計中(e.g.,GRU中代替遺忘門等)。
總之,Attention機制的易用性和有效性,使得很容易引入到現有的很多工作中,也很容易的應用到各種各樣的實際業務或場景當中。另外Attention的改進工作包括了,覆蓋率(解決重復或丟失信息的問題),引入馬爾科夫性質(前一時刻Attention會影響下一時刻的Attention,實際上多跳注意力能夠解決該問題),引入監督學習(例如手動對齊或引入預訓練好的強有力的對齊模型來解決Attention未對齊問題)等等。
ok,今天就到這兒啦,敬請期待下一篇~我是蘑菇先生,歡迎大家到我的公眾號『蘑菇先生學習記』一起交流!
一則小通知
由于微信平臺算法改版,公號內容將不再以時間排序展示,如果大家想第一時間看到我們的文章,強烈建議星標我們和給我們多點點【在看】。星標具體步驟為:
1. 點擊頁面最上方"NewBeeNLP",進入公眾號主頁。
2. 點擊右上角的小點點,在彈出頁面點擊“設為星標”,就可以啦。
感謝每一份支持,比心
本文參考資料
[1]
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?-
往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載機器學習的數學基礎專輯 獲取本站知識星球優惠券,復制鏈接直接打開: https://t.zsxq.com/qFiUFMV 本站qq群704220115。加入微信群請掃碼: 與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的【NLP】四万字全面详解 | 深度学习中的注意力机制(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Win7系统默认浏览器的更改教程
- 下一篇: 【NLP】四万字全面详解 | 深度学习中