RNN, Seq2Seq, Attention注意力機制完全解析

2021-03-02 深度學習這件小事

循環神經網絡RNN結構被廣泛應用於自然語言處理、機器翻譯、語音識別、文字識別等方向。本文主要介紹經典的RNN結構,以及RNN的變種(包括Seq2Seq結構和Attention機制)。希望這篇文章能夠幫助初學者更好地入門。

   經典的RNN結構
圖1

這就是最經典的RNN結構,它的輸入是:

輸出為:

也就是說,輸入和輸出序列必有相同的時間長度!

圖2

假設輸入  (  ) 是一個長度為  (  ) 的列向量:

隱藏層  是一個長度為  (  ) 的列向量:

輸出  是一個長度為  (  ) 的列向量:

其中  ,  ,  都是由人工設定的。

圖3

 時刻輸入層--> 時刻隱藏層:

 時刻隱藏層--> 時刻隱藏層:

 時刻隱藏層--> 時刻輸出層:

需要注意的是,對於任意時刻  ,所有的權值(包括  ,  ,  ,  ,  ,  )都相等,這也就是RNN中的「權值共享」,極大的減少參數量。

其實RNN可以簡單的表示為:

圖4

還有一個小細節:在  時刻,如果沒有特別指定初始狀態,一般都會使用全0的  作為初始狀態輸入到  中

   Sequence to Sequence模型圖5

在Seq2Seq結構中,編碼器Encoder把所有的輸入序列都編碼成一個統一的語義向量Context,然後再由解碼器Decoder解碼。在解碼器Decoder解碼的過程中,不斷地將前一個時刻  的輸出作為後一個時刻  的輸入,循環解碼,直到輸出停止符為止。

圖6

接下來以機器翻譯為例,看看如何通過Seq2Seq結構把中文「早上好」翻譯成英文「Good morning」:

將「早上好」通過Encoder編碼,並將最後  時刻的隱藏層狀態  作為語義向量。

以語義向量為Decoder的  狀態,同時在  時刻輸入<start>特殊標識符,開始解碼。之後不斷的將前一時刻輸出作為下一時刻輸入進行解碼,直接輸出<stop>特殊標識符結束。

當然,上述過程只是Seq2Seq結構的一種經典實現方式。與經典RNN結構不同的是,Seq2Seq結構不再要求輸入和輸出序列有相同的時間長度!

圖7

進一步來看上面機器翻譯例子Decoder端的  時刻數據流,如圖7:


   Embedding

還有一點細節,就是如何將前一時刻輸出類別index(數值)送入下一時刻輸入(向量)進行解碼。假設每個標籤對應的類別index如下:

'<start>' : 0,
'<stop>' : 1,
'good' : 2,
'morning' : 3,
...

已知<start>標誌符index為0,如果需要將<start>標誌符輸入到input層,就需要把類別index=0轉變為一個  長度的特定對應向量。這時就需要應用嵌入 (embedding) 方法。

圖8 嵌入 (embedding)

假設有  個詞,最簡單的方法就是使用  長度的one-hot編碼,詞表alphabet如下:

'<start>' : 0 <> label('<start>')=[1, 0, 0, 0, 0,..., 0]
'<stop>' : 1 <> label('<stop>') =[0, 1, 0, 0, 0,..., 0]
'hello': 2 <> label('hello') =[0, 0, 1, 0, 0,..., 0]
'good' : 3 <> label('good') =[0, 0, 0, 1, 0,..., 0]
'morning' : 4 <> label('morning')=[0, 0, 0, 0, 1,..., 0]
..

但是使用one-hot編碼進行嵌入過於稀疏,所以我們使用一種更加優雅的辦法:

如此不停循環解碼。

可以看到,其實Seq2Seq引入嵌入機制解決從label index數值到輸入向量的維度恢復問題。在Tensorflow中上述過程通過以下函數實現:

tf.nn.embedding_lookup

而在pytorch中通過以下接口實現:

torch.nn.Embedding

需要注意的是:train和test階段必須使用一樣的embedding矩陣!否則輸出肯定是亂碼。

當然,還可以使用word2vec/glove/elmo/bert等更加「精緻」的嵌入方法,也可以在訓練過程中迭代更新embedding。這些內容超出本文範圍,不再詳述。embedding入門請參考:https://zhuanlan.zhihu.com/p/89637281

   Seq2Seq訓練問題

值得一提的是,在seq2seq結構中將  作為下一時刻輸入  進網絡,那麼某一時刻輸出  錯誤就會導致後面全錯。在訓練時由於網絡尚未收斂,這種蝴蝶效應格外明顯。

圖9

為了解決這個問題,Google提出了大名鼎鼎的Scheduled Sampling(即在訓練中  按照一定概率選擇輸入  或  時刻對應的真實值,即標籤,如圖10),既能加快訓練速度,也能提高訓練精度。

圖10

Scheduled Sampling對應文章如下:

Scheduled Sampling for Sequence Prediction with Recurrent Neural Networks

連結:https://arxiv.org/pdf/1506.03099.pdf

   Attention注意力機制

圖11

在Seq2Seq結構中,encoder把所有的輸入序列都編碼成一個統一的語義向量Context,然後再由Decoder解碼。由於context包含原始序列中的所有信息,它的長度就成了限制模型性能的瓶頸。如機器翻譯問題,當要翻譯的句子較長時,一個Context可能存不下那麼多信息,就會造成精度的下降。除此之外,如果按照上述方式實現,只用到了編碼器的最後一個隱藏層狀態,信息利用率低下。

所以如果要改進Seq2Seq結構,最好的切入角度就是:利用Encoder所有隱藏層狀態  解決Context長度限制問題。

接下來了解一下attention注意力機制基本思路(Luong Attention)

圖12

考慮這樣一個問題:由於Encoder的隱藏層狀態  代表對不同時刻輸入  的編碼結果:


即Encoder狀態  ,  ,  對應編碼器對「早」,「上」,「好」三個中文字符的編碼結果。那麼在Decoder時刻  通過3個權重  ,  ,  計算出一個向量  :

然後將這個向量與前一個狀態拼接在一起形成一個新的向量輸入到隱藏層計算結果:

Decoder時刻  :

Decoder時刻  和  同理,就可以解決Context長度限制問題。由於  ,  ,  不同,就形成了一種對編碼器不同輸入  對應  的「注意力」機制(權重越大注意力越強)。

那麼到底什麼是LuongAttention注意力機制?

圖13
Effective Approaches to Attention-based Neural Machine Translation連結:https://arxiv.org/abs/1508.04025
為了說明具體結構,重新定義符號:  代表Encoder狀態,  代表Decoder狀態,  代表Attention Layer輸出的最終Decoder狀態,如圖13。需要說明,  和  是  大小的向量。接下來一起看看注意力機制具體實現方式。

這裡的  可以通過以下三種方式計算:

所謂Dot就是向量內積,而General通過乘以  權重矩陣進行計算(  是  大小的矩陣)。一般經驗General方法好於Dot方法,Concat方法略去不講。

這裡  和  大小都是 ,拼接後會變大。由於需要恢復為原來形狀,所以乘以全連接  矩陣。當然不恢復也可以,但是會造成Decoder RNN cell變大。

也可以根據需要,把新生成的狀態  繼續送入RNN繼續進行學習。其中  和  參數需要通過學習獲得。

圖14

在實際應用中當輸入一組  ,除了可以獲得輸出  ,還能提取出  與  對應的權重數值  並畫出來,如圖15,這樣就可以直觀的看到時刻  注意力機制到底「注意」了什麼。

圖15 注意力機制中的權重

可以看到,整個Attention注意力機制相當於在Seq2Seq結構上加了一層「包裝」,內部通過函數  計算注意力向量 ,從而給Decoder RNN加入額外信息,以提高性能。無論在機器翻譯,語音識別,自然語言處理(NLP),文字識別(OCR),Attention機制對Seq2Seq結構都有很大的提升。

   如何向RNN加入額外信息

Attention機制其實就是將的Encoder RNN隱藏層狀態加權後獲得權重向量  ,額外加入到Decoder中,給Decoder RNN網絡添加額外信息,從而使得網絡有更完整的信息流。

圖16 RNN添加額外信息的3中方式

所以,假設有額外信息  (如上文中的注意力向量  ),給RNN網絡添加額外信息主要有以下3種方式:

ADD:直接將  疊加在輸出  上。

MLP:新添加一個對  的感知單元  。

特別說明:上文介紹的LuongAttention僅僅是注意力機制的一種具體實現,不代表Attention僅此一種。事實上Seq2Seq+Attention還有很多很玩法。望讀者了解!

相關焦點

  • 經典Seq2Seq與注意力Seq2Seq模型結構詳解
    注意力機制什麼是Seq2Seq模型?在Seq2seq模型中,神經機器翻譯以單詞序列的形式接收輸入,並生成一個單詞序列作為輸出。例如,義大利語的「Cosa vorresti ordinare?」但是注意力能解決這個問題!注意力機制在這一點上,我們知道要解決的問題在於上下文向量。這是因為,如果輸入是一個包含大量單詞的句子,那麼模型就會陷入麻煩。
  • tensorflow源碼解析之seq2seq.py文件(上)
    2、*全部的序列模型包括:-basic_rnn_seq2seq:#最簡單版本,輸入和輸出都是embedding的形式;最後一步的state vector#作為decoder的initial state;encoder和decoder用相同的RNN cell, #但不共享權值參數;-tied_rnn_seq2seq:#同basic_rnn_seq2seq
  • 直觀理解並使用Tensorflow實現Seq2Seq模型的注意機制
    採用帶注意機制的序列序列結構進行英印地語神經機器翻譯Seq2seq模型構成了機器翻譯、圖像和視頻字幕、文本摘要、聊天機器人以及任何你可能想到的包括從一個數據序列到另一個數據序列轉換的任務的基礎。如果您曾使用過谷歌Translate,或與Siri、Alexa或谷歌Assistant進行過互動,那麼你就是序列對序列(seq2seq)神經結構的受益者。我們這裡的重點是機器翻譯,基本上就是把一個句子x從一種語言翻譯成另一種語言的句子y。機器翻譯是seq2seq模型的主要用例,注意機制對機器翻譯進行了改進。
  • 從Seq2seq到Attention模型到Self Attention(二)
    到Attention模型到Self Attention(一)——作者:Bgg——系列一介紹了Seq2seq和 Attention model。「The transformer」和Seq2seq模型皆包含兩部分:Encoder和Decoder。
  • Seq2seq框架下的文本生成
    隨後,Bahdanau在Neural Machine Translation by Jointly Learning to Align and Translate中提出了融合attention和seq2seq結構的NMT模型結構,至此,由Encoder-Attention-Decoder組成的seq2seq框架正式形成。
  • pytorch編程之基於注意力機制的 seq2seq 神經網絡翻譯
    為了改進此模型,我們將使用注意機制,該機制可讓解碼器學習將注意力集中在輸入序列的特定範圍內。', 'i m not tall .']CopySeq2Seq 模型遞歸神經網絡(RNN)是在序列上運行並將其自身的輸出用作後續步驟的輸入的網絡。序列到序列網絡或 seq2seq 網絡或編碼器解碼器網絡是由兩個稱為編碼器和解碼器的 RNN 組成的模型。編碼器讀取輸入序列並輸出單個向量,而解碼器讀取該向量以產生輸出序列。
  • Seq2seq強化,Pointer Network簡介
    seq2seq的基礎是一個LSTM編碼器加上一個LSTM解碼器。在機器翻譯的語境中, 最常聽到的是: 用一種語言造句, 編碼器把它變成一個固定大小的陳述。解碼器將他轉換成一個句子, 可能和之前的句子長度不同。例如, 「como estas?」-兩個單詞-將被翻譯成 「how are you?」-三個單詞。當「注意力」增強時模型效果會更好。
  • Abstractive Text Summarization using Seq2Seq RNNs and Beyond
    同時,本文還提出多種模型來研究自動文摘中的重要問題,比如對關鍵詞進行建模,並且得出詞對於文檔研究起關鍵作用的結論。研究結果表明本文的解決方案在性能上有很大的提升,另外,還貢獻了一個包括多句子文摘的數據集和基準。
  • seq2seq 的 keras 實現
    seq2seq 的 keras 實現什麼是 seq2seq?seq2seq 是一個 Encoder–Decoder 結構的網絡,它的輸入是一個序列,輸出也是一個序列, Encoder 中將一個可變長度的信號序列變為固定長度的向量表達,Decoder 將這個固定長度的向量變成可變長度的目標的信號序列。
  • IBM、哈佛聯合提出Seq2Seq-Vis:機器翻譯模型的可視化調試工具
    為此,IBM 研究院、Watson AI Lab、哈佛 NLP 團隊和哈佛視覺計算團隊聯合研發了一款針對 seq2seq 模型的可視化調試工具 Seq2Seq-Vis,使用戶可以可視化模型執行過程中的注意力、單詞預測、搜索樹、狀態軌跡和近鄰詞列表等,從而更高效地進行分析和調試。
  • 完全圖解RNN、RNN變體、Seq2Seq、Attention機制
    本文主要是利用圖片的形式,詳細地介紹了經典的RNN、RNN幾個重要變體,以及Seq2Seq模型、Attention機制。希望這篇文章能夠提供一個全新的視角,幫助初學者更好地入門。它的輸入是x1, x2, .....xn,輸出為y1, y2, ...yn,也就是說,輸入和輸出序列必須要是等長的。由於這個限制的存在,經典RNN的適用範圍比較小,但也有一些問題適合用經典的RNN結構建模,如:計算視頻中每一幀的分類標籤。因為要對每一幀進行計算,因此輸入和輸出序列等長。
  • 十分鐘掌握Keras實現RNN的seq2seq學習
    作者 | Francois Chollet編譯 | 雁驚寒seq2seq是一種把序列從一個域(例如英語中的句子
  • 深入理解圖注意力機制(Graph Attention Network)
    作為一種代表性的圖卷積網絡,Graph Attention Network (GAT) 引入了注意力機制來實現更好的鄰居聚合。通過學習鄰居的權重,GAT 可以實現對鄰居的加權聚合。因此,GAT 不僅對於噪音鄰居較為魯棒,注意力機制也賦予了模型一定的可解釋性。下圖概述了 Graph Attention Network 主要做的事情。
  • 基於seq2seq模型的中文糾錯任務
    深度學習近來在自然語言處理領域獲得了 廣泛運用,seq2seq 模型在諸多自然語言處理任務,如詞性標註、語義依存分析、 機器翻譯等,均取得了顯著的成績。本文首先對中文糾錯任務進行詳細的梳理, 包括錯誤的來源、目前的處理方法、相關的公開競賽、數據源等;第二,由於缺 少大規模公開的數據集,本文涉及顯示人工構造大規模糾錯數據集的算法;第三, 本文將深度學子中的 seq2seq 模型引入,處理中文糾錯任務,在基本的模型基礎 上引入 attention 機制(包括諸多變種)以及多任務學習的理念,嘗試多種組合, 並最終在構造數據集上 GLEU 評分達到了 0.75
  • 模型匯總17 基於Depthwise Separable Convolutions的Seq2Seq模型_SliceNet原理解析
    基於RNN(LSTM、GRU)的Seq2Seq模型在自然語言處理領域取得了巨大成功,特別是對機器翻譯領域,神經機器翻譯(NMT)已經完全替代了以前的統計(SMT)。但基於RNN的Seq2Seq有2個致命缺點:    1、基於sequence中t-i的context計算t時刻估計,不適合併行計算,因此計算效率低。
  • 機器翻譯中的 Attention 機制
    上篇我們學習了基本的 seq2seq 模型,它的流程為將輸入序列送入 encoder,計算得到的隱層狀態傳遞給 decoder,然後進行解碼得到輸出序列
  • 谷歌開源神經機器翻譯技術,推出tf-seq2seq框架
    陳樺 編譯自 Google官方博客量子位 報導 | 公眾號 QbitAI谷歌研究軟體工程師、谷歌大腦團隊成員Anna Goldie和Denny Britz今天撰文,宣布在「谷歌神經機器翻譯」的基礎上推出開源框架tf-seq2seq,給外部研究人員提供幫助。
  • Attention!當推薦系統遇見注意力機制
    NewBeeNLP原創出品公眾號專欄作者@上杉翔二悠閒會 · 信息檢索當注意力機制都已經變成很tasteless的手法的時候,使用或者魔改注意力機制一定要專注講好自己的故事:即『為什麼要用Attention,為什麼要魔改Attention』
  • nlp領域發生了新的技術突破,用attention機制研究nlp領域
    包括:attention機制,cnn,adaptive attention network(an),兩層cnn相比較,an表現優於一層的cn。lstm,已經有了兩種不同的,看似性能和效率差異不大的attention機制:rnnattention,lstmattention。今天我們將從這兩種attention機制開始研究nlp領域突破性技術!
  • 圖解神經機器翻譯中的注意力機制
    等人 (2014b) 這三篇論文,其中我們較為熟悉的框架是 Sutskever 等人論文提出的序列到序列(seq2seq)學習。本文基於 seq2seq 框架闡述如何構建注意力。圖 0.1:seq2seq,輸入序列長度為 4。