深度學習中的注意力機制(三)

2020-12-18     AI科技大本營

原標題:深度學習中的注意力機制(三)

作者 | 蘑菇先生

來源 | 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未對齊問題)等等。

參考資料

[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

文章來源: https://twgreatdaily.com/zh-tw/0UuOenYB9j7PxaI7uhg9.html










CSDN湘苗培優

2020-12-24