日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

【NLP】四万字全面详解 | 深度学习中的注意力机制(四,完结篇)

發布時間:2025/3/12 pytorch 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【NLP】四万字全面详解 | 深度学习中的注意力机制(四,完结篇) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

作者 | 蘑菇先生??

知乎?|?蘑菇先生學習記

深度學習Attention小綜述系列:

  • 四萬字全面詳解 | 深度學習中的注意力機制(一)

  • 四萬字全面詳解 | 深度學習中的注意力機制(二)

  • 四萬字全面詳解 | 深度學習中的注意力機制(三)

本部分介紹Attention機制的各種變體。包括但不限于:

  • 「基于強化學習的注意力機制」:選擇性的Attend輸入的某個部分

  • 「全局&局部注意力機制」:其中,局部注意力機制可以選擇性的Attend輸入的某些部分

  • 「多維度注意力機制」:捕獲不同特征空間中的Attention特征。

  • 「多源注意力機制」:Attend到多種源語言語句

  • 「層次化注意力機制」:word->sentence->document

  • 「注意力之上嵌一個注意力」:和層次化Attention有點像。

  • 「多跳注意力機制」:和前面兩種有點像,但是做法不太一樣。且借助殘差連接等機制,可以使用更深的網絡構造多跳Attention。使得模型在得到下一個注意力時,能夠考慮到之前的已經注意過的詞。

  • 「使用拷貝機制的注意力機制」:在生成式Attention基礎上,添加具備拷貝輸入源語句某部分子序列的能力。

  • 「基于記憶的注意力機制」:把Attention抽象成Query,Key,Value三者之間的交互;引入先驗構造記憶庫。

  • 「自注意力機制」:自己和自己做attention,使得每個位置的詞都有全局的語義信息,有利于建立長依賴關系。

Memory-based Attention

  • ICLR 2015:Memory Networks[1]

  • NIPS2015:End-To-End Memory Networks[2]

  • ACL2016:Key-Value Memory Networks for Directly Reading Documents[3]

  • ICML2016:Ask Me Anything:Dynamic Memory Networks for Natural Language Processing[4]

基于記憶的Attention機制將注意力分數的計算過程重新解釋為根據查詢/問題 進行soft memory addressing的過程,將編碼視為從基于attention分值的memory中查詢注意力分支的過程。

  • 從重用性的角度上,這種注意力機制能夠通過迭代memory更新(也稱為多跳)來模擬時間推理過程,逐步將注意力引導到正確的答案位置,對于答案和問題沒有「直接關系」的復雜問答效果較好(需要多步推理)。

  • 從靈活性角度看,可以人工設計key的嵌入以更好的匹配問題,人工設計value的嵌入來更好的匹配答案。這種解耦的模塊化設計,能夠在不同組件中注入領域知識,使模塊之間的通信更有效,并將模型推廣到傳統問答之外的更廣泛的任務。

形式化來說,memory中存儲的是key-value pairs,,給定一個查詢 。定義上下文向量獲取3步驟:

  • (address memory)

  • (normalize)

  • (read contents)

實際上memory存儲的就是輸入序列(更準確的說是外部記憶,輸入序列是一種外部記憶,也可以引入其他領域先驗知識,如知識庫來構造外部記憶庫),只不過可以設計key和value;如果key和value相等,那么上述就退化成了Basic Attention的操作了。

Memory Network

首先是ICLR2015文章"Memory Network"。該模型的出發點在于,傳統的深度學習模型(RNN、LSTM、GRU等)使用hidden states或者Attention機制作為他們的記憶功能(實際上是短期的內部記憶),但是這種方法產生的記憶太小了,無法精確記錄一段話中所表達的全部內容,也就是在將輸入編碼成dense vectors的時候丟失了很多信息。所以本文就提出了一種可讀寫的「外部記憶模塊」(external memory),并將其和inference組件聯合訓練,最終得到一個可以被靈活操作的記憶模塊。

這篇文章的貢獻在于提出了一種普適性的模型架構memory networks。其核心組件包括4部分:

簡單來說,就是輸入的文本經過Input模塊編碼成向量,然后將其作為Generalization模塊的輸入,該模塊根據輸入的向量對memory進行讀寫操作,即對記憶進行更新(最基本的更新就是將memory劃分為slots,以slot為單位進行讀寫,更新的時候,最簡單的方法就是 ,即新根據輸入x進行Hash索引,然后替換掉某個Slot為最新的input的內部特征表示)。然后Output模塊會根據Question(也會進過Input模塊進行編碼)對memory的內容進行權重處理(Question會觸發對memory的Attention),將記憶按照與Question的相關程度進行組合得到輸出向量,最終Response模塊根據輸出向量編碼生成一個自然語言的答案出來。

End-To-End Memory Networks

接著是NIPS2015的文章“End-To-End Memory Networks”。作者的應用場景是問答系統(比較復雜的問答推理),包括3要素,input-question-answer。

首先介紹下語句表示組件(對應上篇論文的I組件)。語句表示組件的作用是將語句 表示成一個向量。作者在bag-of-words(BoW)基礎上添加位置序列信息。令某個語句為為 。則語句向量化表示為:

其中, 看做是每個單詞的embedding表示, 是根據「位置」計算的權重向量,稱作position encoding。

是語句長度, 是單詞序號, 代表 的第 個元素, 是Embedding的維度數( 維度數)。

此外,語句之間也存在時序關系,作者對語句之間的時序也進行了encoding,但是一筆帶過。坐在在計算 和 時加了一個額外的叫做 temporal encoding的模型,。 是個矩陣,編碼了時序信息,也是需要學習。當然,Position encoding和Temporal Encoding可以同時考慮。

下面要介紹的模型的memory input/output, question都需要利用該組件進行向量化表示,只不過Embedding矩陣不同。

首先給出模型架構圖:

上圖左側(a)是單層的網絡結構。最左邊的就是memory,里面存儲著輸入集合 ,每個 代表一個句子。memory的輸入和輸出不同,按照我的理解memory的輸入是key,輸出是value。輸入key用于計算和查詢的相似性,輸出value用于計算上下文向量。

對于輸入記憶(可以理解為Key memory,記憶的一種表現形式),即圖中下半部分藍色線條,使用上述語句表示組件(Embedding A)將每個語句 轉成向量表示 作為memory的輸入(可以理解為 存儲在memory中,不斷寫入memory直到fixed buffer size),即key,memory input用于得到memory不同語句的attention得分向量。首先將問題語句 也使用語句表示組件(Embedding B)轉成向量化表示 ,即query,然后根據key和query和計算 ,這是address memory+normalize操作。

對于輸出記憶(可以理解為Value memory,記憶的另一種表現形式),即圖中上半部分黃色線條,首先根據語句表示組件(Embedding C)將語句轉成 作為memory的輸出,即value,然后利用該輸出以及 ,加權得到attentional上下文向量,即:, 這是read contents操作。

最后預測的時候,將問題表示 和上下文向量 相加,經過Softmax全連接層預測答案的概率分布(文中似乎只針對單個單詞的答案。對于多個單詞的答案,會把答案句子看成一個整體,從多個候選的答案句子中選擇其中一個),,其中,。 是詞匯表所有詞的概率,使用交叉熵損失進行訓練。

上述是單層網絡,作者將多個單層網絡stack在一塊,來解決多跳(Multi-Hop)操作(我的理解是每一跳都要和memory交互,形成更有用的記憶上下文向量 ,并不斷更新查詢語句表示 ,將注意力引導向正確的答案(查詢表示向量基礎上加上記憶上下文向量進行Transition,來引導到最佳答案位置),如上圖(b)所示。

從圖中可以看出,每經過一層都要和memory交互,且后一層的問題語句表示為,。為了減少參數量,作者對 ,, 矩陣做了限制,比如后一層的 為前一層的 ;最后的 是最后一層的 。

對于這里面memory的理解,我個人認為memory會使用所有的問答系統的輸入語句經過語句表示模塊后提取的特征表示來初始化。后面訓練的時候,如果遇到的輸入語句已經在memory中了,那么就直接替換其舊值來更新memory(embedding A矩陣訓練過程中在更新,因此 也會相應的更新,同理memoy的輸出 也可以更新)。如果memory的容量有限,那么先隨機初始化滿,后面訓練的時候遇到不在memory的語句,再根據一定策略替換掉某個值(例如使用Hash策略或FIFO策略,文章沒細說)。

Key-Value Memory Networks

接著是ACL2016文章,"Key-Value Memory Networks for Directly Reading Documents"。這篇文章在key和value上進一步解耦,并引入先驗知識分別來設計key embedding和value embedding,也就是人工設計key的嵌入以更好的匹配問題,人工設計value的嵌入來更好的匹配答案。模型結構如下:

幾乎一樣,這里的Key Addressing就是Input Memory Addressing,Value Reading就是Output Memory Reading。核心的創新之處在于,

  • 可以使用不同方式來映射不同的語句。Key, Value,Question,Answer,對應圖中不同的 。最簡單的映射方式就是Bag-of-words,作者對Question,Answer的處理就是用BoW。而對Key和Value的處理不同。

  • 使用Knowledge base引入先驗,來構建記憶;作者使用知識庫的結構化三元組,subject relation object,即主謂賓。然后可以使用主語和謂語作為Key,賓語作為Value。作者把三元組寫成被動語句,這樣一條三元組有2種形式的(key, value)。舉個例子:Blade Runner directed_by Ridley Scott / Ridley Scott !directed_by Blade Runner,對于前者Key是Blade Runner directed_by,Value是Ridley Scott;對于后者Key是Ridley Scott !directed_by,Value是Blade Runner。

  • Window-Level: 將文檔切分成若干個windows,作者只保留中心位置是名詞的windows,每個window由若干個詞語構成。可以將整個window當做key來匹配問題,把中心位置名詞當做value來匹配。

還有一個有趣的地方,之前的模型會限制記憶的大小,主要是因為不能保留所有的語句。這里為了解決大型記憶庫的計算效率,提出了Key Hashing的概念。對于每個Question,Key Addressing過程中作者引入了Key Hashing,即可以從大型的記憶庫中使用Hash索引檢索出部分記憶,例如對應key里頭至少有1個單詞和Question相同的記憶,再根據部分記憶Address+Read。

Dynamic Memory Networks

最后是ICML2016的文章,“Ask Me Anything:Dynamic Memory Networks for Natural Language Processing“,采取了更復雜的動態記憶網絡。前面兩篇文章,都是使用Bag-of-Words提取語句向量化表示,這篇文章使用RNN來提取語句向量化表示。并且前面文章預測的答案一般只有1個單詞,這里可以多個單詞。

模型細分為Input Module,Question Module, Episodic Memory Module和Answer Module。模型結構如下:

  • Input Module:對輸入(語句,故事,文章,Wiki百科)使用GRU提取隱狀態表示 。如果輸入是一句話,那么提取到的隱狀態個數等于單詞個數(每個單詞對應一個);如果輸入是多個語句,那么提取的隱狀態等于語句數(每個語句對應一個,訓練時將所有語句concat在一起,語句之間添加特殊分割token,經過GRU后,保留每個token處提取到的隱狀態表示,如圖 , )。

  • Question Module:對問題使用GRU提取隱狀態,不同的是只保留問題最后一個時刻得到的隱狀態 。

  • Episodic Memory Module:本模塊和Input Module是「對齊」的,對齊的目的是要計算Input不同Token的Attention Score值。該模塊主要包含Attention機制、Memory更新機制兩部分組成,每次迭代都會通過Attention機制對輸入向量進行權重計算,然后生成新的記憶。第 次迭代過程中,

    Episodic Memory Module場景向量 用于壓縮和抽象輸入序列,相當于將輸入序列狀態集合壓縮并抽象成一個場景描述向量 ,這個場景描述向量是和「具體問題」以及「具體輸入」都是相關的。為了計算場景向量,該模塊維護了自己的隱狀態 ,根據融合了Attention機制的第一個公式來計算;第二個公式表明,最后一個時刻得到的隱狀態作為提取到的新場景 ;第三個公式再根據提取到的新場景和前一次迭代得到的記憶「更新記憶」

    上述過程,一般會經過多次迭代(可以理解為多跳),將最后一次迭代得到的強化的記憶作為下一個Answer Module的輸入。

    • 計算Attention Score。attention mechanism使用一個門控函數作為Attention。為了計算輸入序列某個時刻的attention score,門控函數的輸入是該時刻的輸入序列提取的表示 ,前一次迭代的記憶 和問題 ,門控函數最終輸出輸入序列每個token(這里是每個句子)和該問題的相似性Attention score值 ,所有時刻的score構成Attention向量,記做 。

    • 更新記憶(先計算新場景Episode,再計算新記憶Memory):

  • Answer Module:采用GRU。將上述提取到的最后一次迭代的記憶 作為初始隱狀態,問題 和前一時刻預測的輸出 作為輸入,得到當前時刻的隱狀態 ,接一個softmax全連接層得到該時刻輸出詞的概率分布。

這篇文章的動態性我個人理解為,每輸入一句話,記憶就會產生和更新,且這種記憶是Input-Level的,有點像短期的記憶(和Attention比較像,Attention也是Input-Level的短期內部記憶)。而之前3篇文章的工作,記憶庫是初始的一次性讀取所有輸入并產生memory庫,這個記憶庫是Task-Level的,跟這個任務相關的數據都能用于構造該記憶庫,只不過受限于容量,記憶庫也需要辭舊迎新。不管如何,二者的記憶表示都需要在訓練過程中不斷更新。

另外,這篇文章的優點就是將Memory機制更好的應用到了Seq2Seq模型。前面的3篇工作都不是標準的Seq2Seq模型,都只是利用簡單的Bag-of-Words來處理序列,預測的時候,答案要么是單個單詞;要么是看成一個整體的句子。而本文則用GRU在Answer Module建模答案序列。

Self Attention

  • NIPS2017: Attention Is All You Need[5]

Google Brain團隊在2017年提出了一種新的神經網絡架構,稱作Transformer。該架構只使用了attention機制(+MLPs),不需要RNN、CNN等復雜的神經網絡架構,并行度高。

文章創新點包括:

  • 提出了**(Multi-Head Attention)機制**,可以看成attention的ensemble版本,不同head學習不同位置不同的表示子空間的不同語義。

  • 提出了「Self-Attention」,自己和自己做attention,使得每個位置的詞都有全局的語義信息,有利于建立長依賴關系。這是因為Self-Attention是每個詞和所有詞都要計算 Attention,所以不管他們中間有多大距離,最大的路徑長度也都只是 1,因此可以捕獲長距離依賴關系。

  • Attention的「抽象」(應該也不算第一次在這篇文章中做的抽象):文章將Attention抽象成q(query)、k(key)、v(value)三者的函數。即,首先根據q和k計算attention分配情況,然后根據分配的權重,對v進行加權,最后得到上下文向量。做個類比,q就是Decoder端 時刻的隱狀態,k就是Encoder端 時刻的隱狀態,v也是Encoder端s時刻的隱狀態,但是這里的k和v只需要一一對應即可,不需要完全相等,因此一種變體的話,v可以是 (加了個residual connection)

1. ?Encoder

  • 輸入層:word embedding + position embedding。

word embedding是常規操作。這里的position embedding是因為不使用RNN的話,位置信息就不能間接利用了,因此需要顯示的對position進行embedding表示,即給每個位置一個向量化表達。作者使用正弦和余弦函數,使得位置編碼具有周期性,并且有很好的表示相對位置的關系的特性(對于任意的偏移量 , 可以由 線性表示),同時模型可以拓展到那些比訓練集中最大長度還大的未知句子的position表示(關于pos的函數)。

其中,pos是位置編號, 為embedding的第 維。記:,其中, 是輸入詞的word embedding, 是輸入詞的position embedding, 是接下來Attention的輸入。輸入的序列長度是 ,embedding維度是 ,所以輸入是 的矩陣 。

  • Attention層:N=6,6個重復一樣的結構(可以看出這里也是使用了多跳),每種結構由兩個子層組成:

    每個Head獲取一種子空間的語義,多個Head可以看做是ensemble,且可以并行計算。對于一個Head,

    a)首先,原始的 、、 先經過全連接進行線性變換映射成 。

    b) ?接著,將映射后的 輸入到Scaled Dot-Product Attention,得到中間Attention值,記做,。對于 函數,先計算 和 點乘相似性,并使用 縮放,然后經過softmax激活后得到權重分布,最后再對 加權,即:

    c) 然后,將所有的中間Attention值concat在一起 ,

    d) 最后,再經過一個線性映射 ,得到最終輸出的Multi-Head Attention值,,其捕獲了不同表示子空間的語義。

    綜合起來,即:

    • 子層1:「Multi-Head self-attention」

      源語句的self attention。Multi-Head Attention如下圖右邊所示,每個Multi-Head Attention包含了 個Scaled Dot-Product Attention組件,也就是每個Head就是一個Scaled Dot-Product Attention組件,如下圖左邊所示。

子層1的輸出:,此時 。

  • 子層2:

    position-wise 前饋神經網絡。即上述輸出的矩陣每一行代表相應位置的單詞經過attention后的表示,每個位置的向量 經過兩層的前饋神經網絡(中間接RELU激活)得到一個輸出FFN。

    上述參數所有位置共享,。

    子層2的輸出:

2. Decoder

  • 輸入層:

    「已經翻譯出的」目標詞word embedding+position embedding。結構同encoder中的輸入層,每個單詞embedding維度為 ,假設已經翻譯了 個詞,則輸入為矩陣 。

  • Attention層:共6個。

    • 子層1:Masked Multi-Head Self-Attention

      目標語句的self-attention,加了掩碼的multi-head attention,防止目標語句中前面的單詞attend到后面的單詞,來維護自回歸的性質。這和Encoder中不同,Encoder中沒有加該限制。具體實現時,只需要在scaled dot-product Attention中,將softmax的輸入中不合法的attend連接設置成無窮小即可(這樣經過softmax后這些權重為0)。

      該層的輸出同樣采取Add和LayerNorm。

    • 子層2:Multi-Head Attention

      前面兩次用到的Multi-Head Attention都是源語句或目標語句各自內部的Attention。而該子層2是目標語句和源語句之間的Attention。此時, 是Decoder端的單詞表示,即上述Masked Multi-Head Self-Attention得到的輸出,, 是Encoder端的輸出,即前文所述的 。

      該子層允許目標語句每個詞都能attend到源語句不同的單詞上,且每個目標單詞都能計算一個對應的上下文向量。該子層的輸出 。

    • 子層3:Position wise 前饋神經網絡

      和Encoder中的一致。輸出 。

  • 輸出層:

    將上述依次經過6個Attention層的輸出經過一個全連接層并softmax激活后得到下一個預測的單詞的概率分布。

另外,Transformer比較好的文章可以參考以下兩篇文章:

  • 一個是Jay Alammar可視化地介紹Transformer的博客文章The Illustrated Transformer[6] ,非常容易理解整個機制;

  • 然后可以參考哈佛大學NLP研究組寫的“The Annotated Transformer[7] ”,代碼原理雙管齊下,很細致。

總之,這篇文章中提出的Transformer本質上是個疊加的自注意力機制夠成的深度網絡,是非常強大的「特征提取器」,尤其是在NLP領域。Transformer近幾年也一躍成為踢開RNN和CNN傳統特征提取器,榮升頭牌,大紅大紫。很多后續的NLP先進的研究工作都會基于Transformer展開。例如,詞預訓練工作上,18年OpenAI工作:Improving Language Understanding by Generative Pre-Training[8](GPT)和 18年Google AI Language工作:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding[9] (BERT),這兩個重要工作都是基于Transformer特征提取器做的,其提出的兩階段訓練方式(pre-training+fine-tuning)做遷移學習幾乎刷爆了所有的NLP任務。

Summary

本文主要對基本的Attention機制以及Attention的變體方面的工作進行了梳理。我們不難發現Attention機制簡單,優雅,效果好,溝通了輸入和輸出之間的聯系,易于推廣和應用到多種多樣的任務和場景中,如計算機視覺,NLP,推薦系統,搜索引擎等等。

除此之外,我們可以回顧下早期的一些奠基性的工作,注意力機制的好處在于很容易融入到其他早期的一些工作當中,來進一步提升早期成果,例如,將注意力機制引入到早期詞預訓練過程中,作為特征提取器,來提升預訓練的效果,這在今年NLP工作中尤為突出(e.g.,BERT)。還比如,可以將注意力機制用于模型融合;或者將注意力機制引入到門限函數的設計中(e.g.,GRU中代替遺忘門等)。

總之,Attention機制的易用性和有效性,使得很容易引入到現有的很多工作中,也很容易的應用到各種各樣的實際業務或場景當中。另外Attention的改進工作包括了,覆蓋率(解決重復或丟失信息的問題),引入馬爾科夫性質(前一時刻Attention會影響下一時刻的Attention,實際上多跳注意力能夠解決該問題),引入監督學習(例如手動對齊或引入預訓練好的強有力的對齊模型來解決Attention未對齊問題)等等。

本文參考資料

[1]

ICLR 2015:Memory Networks: https://arxiv.org/pdf/1410.3916.pdf

[2]

NIPS2015:End-To-End Memory Networks: https://arxiv.org/pdf/1503.08895.pdf

[3]

ACL2016:Key-Value Memory Networks for Directly Reading Documents: https://arxiv.org/pdf/1606.03126.pdf

[4]

ICML2016:Ask Me Anything:Dynamic Memory Networks for Natural Language Processing: https://arxiv.org/pdf/1506.07285.pdf

[5]

NIPS2017: Attention Is All You Need: https://arxiv.org/pdf/1706.03762.pdf

[6]

The Illustrated Transformer: https://jalammar.github.io/illustrated-transformer/

[7]

The Annotated Transformer: http://nlp.seas.harvard.edu/2018/04/03/attention.html

[8]

Improving Language Understanding by Generative Pre-Training: https://s3-us-west-2.amazonaws.com/openai-assets/research-covers/language-unsupervised/language_understanding_paper.pdf

[9]

BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding: https://arxiv.org/pdf/1810.04805.pdf

-?END?-


往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載機器學習的數學基礎專輯 獲取本站知識星球優惠券,復制鏈接直接打開: https://t.zsxq.com/qFiUFMV 本站qq群704220115。加入微信群請掃碼:

總結

以上是生活随笔為你收集整理的【NLP】四万字全面详解 | 深度学习中的注意力机制(四,完结篇)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。