AutoEncoder (二)- RNN/LSTM、Seq2Seq、Attention

Moris
NLP & Speech Recognition Note
13 min readJun 24, 2019

--

圖1. 推薦必讀論文(從Seq2seq到Attention再到Self attention演進史)

接下來,讓我們快速回味一下RNN/LSTM,方便後續模型理解。

圖3. (左). Seq2seq model, 將 “Are you very big?” 翻譯為Chinese “你很大?”. 圖3. (右). Decoder 公式.

RNN/LSTM

RNN在反向訓練誤差時,都會乘上參數,參數乘上誤差的結果,大則出現梯度爆炸;小則梯度消失,導致模型成效不佳,如圖4。

圖4. (左). The RNN model, 記憶過多常會發生梯度爆炸、消失等問題. 圖4. (右).The LSTM model

為了解決健忘、訓練誤差的問題,LSTM有了像是遺忘/輸入/輸出門(forget/input/output gate),隱藏狀態(hidden state),記憶單元(cell memory)等概念,帶來了更好的結果。在2014年,論文 Learning Phrase Representations 除了提出Seq2seq的概念,更提出了LSTM的簡化版GRU,此後,LSTM和GRU便取代RNN成為深度學習當中的主流。

下圖是LSTM的各種應用,在此不深入描述。

圖5. LSTM應用.

vanilla encoder-decoder model

Encoder RNN首先逐字讀取來源字串,將文字訊息編碼為隱藏狀態,並將上下文向前傳遞。

在完整的傳遞中,Encoder,即雙向RNN產生字串或though vector的編碼,這些編碼代表從輸入字串捕捉到的所有訊息和上下文。Decoder是另一個RNN學習如何將though vector解碼為輸出序列。

Bidirectional RNN(雙向RNN)

以往單向RNN的問題在於t時刻時,只能透過之前的訊息進行預測,但事實上,模型有時候可能也需要利用未來時刻的訊息進行預測,其運作模式為,一個hidden layer用來由左到右,另一個由右到左,透過雙向RNN掃描左右兩側的輸入,使右邊的單詞和左邊的單詞都包含在上下文中,我們可以對詞語進行更好的預測。

舉例來說,”我喜歡蘋果,因為它很好吃”?和”我喜歡蘋果,因為他比安卓穩定”這兩個句子當中,如果只看”我喜歡蘋果”,你可能不知道蘋果指的是水果還是手機,但如果可以根據後面那句得到訊息,答案就很顯而易見,這就是雙向RNN運作的方式。

圖. 13(上). RNN 和 Bi-directional RNN的差異. 圖. 13(下). Bi-directional RNN in attention model.

Seq2seq

圖6.Seq2seq中,Decoder 公式和RNN公式有異曲同工之妙。

回到正題,所以Seq2seq是怎麼組成的?我們可以看到Seq2seq包含兩部分:Encoder和Decoder。一旦將句子輸入至Encoder,即可從Decoder獲得目標句。

Encoder

Encoder就是個單純的RNN/LSTM,如前面所述,此外RNN/LSTM可以互相代替,以下僅以RNN作為解釋。

Decoder

Decoder的公式和RNN根本就是同一個模子出來的,差別在於Decoder多了一個C — 圖(6),這個C是指context vector/thought vector

context vector 可以想成是一個含有所有輸入句訊息的向量,也就是Encoder當中,最後一個hidden state。簡單來說,Encoder將輸入句壓縮成固定長度的context vector,context vector即可完整表達輸入句,再透過Decoder 將context vector內的訊息產生輸出句,如圖7。

圖7. (左). Seq2seq model細節. 圖7. (右). 如何計算context vector和輸出文字

但是,在Seq2seq模型中,Encoder將輸入句壓縮成固定長度的context vector,但若如果句子今天很長,固定長度的context vector效果就會不好。

在2015年,有個救星誕生了,叫作注意力模型(attention model)。

Attention model

為什麼要用 attention model?

  • The attention model 用來幫助解決自動摘要在輸入序列過長時效果不佳的問題。
  • 主要瓶頸是輸入字串的固定大小編碼,這是在最後一個時間t的LSTM輸出。由於它的大小是固定的,所以當模型變大時,它不能捕獲輸入序列的所有相關信息。
  • Attention通過當前步驟的Decoder輸出和輸入Encoder之間進行相似性檢查,計算當前步驟中每個輸入編碼的重要性,對於所有的輸入Encoder做標準化,我們得到一個重要的向量為Attention vector。然後通過softmax將其轉換為機率。最後我們通過與輸入Encoder相乘來形成一個context vector。
  • 這種新的架構替輸入句的每個文字都創造一個context vector,而非僅僅替輸入句創造一個從最終的hidden state得來的context vector,舉例來說,如果一個輸入句有N個文字,就會產生N個context vector,好處是,每個context vector能夠被更有效的解碼。
圖9. (左). The attention model

在Attention model 中,Encoder和Seq2seq概念一樣,一樣是從輸入句<X1,X2,X3…Xm>產生<h1,h2,h….hm>的hidden state,再計算目標句<y1…yn>。

圖10. (左). The decoder formula, 針對輸入句中的每個文字,給予不同的context vector、attention score. Fig. 10(右). A brief picture of attention score.
equation. 1 Context vector
equation. 2 Attention score
equation. 3 score

在attention model中,context vector又稱為attention vector。我們可以將attention score列為矩陣,透過此矩陣可看到輸入端文字和輸出端文字間的對應關係,也就是論文當中提出align的概念。

Attention精華理解 :

Attention機制:

  • 又稱為註意力機制,顧名思義,是一種能讓模型對重要信息重點關注並充分學習吸收的技術,它不算是一個完整的模型,應當是一種技術,能夠作用於任何序列模型中
  • Attention model中的encoder 用的是改良版RNN:雙向RNN(Bi-directional RNN),Attention model雖然解決了輸入句僅有一個context vector的缺點,但依舊存在不少問題。
Fig. 15(left). The encoder-decoder model. Fig. 15(right). The attention-based model. Seq2seq、Attention model,差別在於計算context vector的方式
  1. context vector計算的是輸入句、目標句間的關聯,卻忽略了輸入句中文字間的關聯,和目標句中文字間的關聯性,
  2. 不管是Seq2seq或是Attention model,其中使用的都是RNN,RNN的缺點就是無法平行化處理,導致模型訓練的時間很長。

Why attention?

  • 對於seq2seq模型輸入一段文本序列,我們通常要使用某種機制對該序列進行編碼,通過降維等方式將其encode成一個固定長度的向量,用於輸入到後面的全連接層
  • 一般我們會使用CNN或者RNN(包括GRU或者LSTM)等模型來對序列數據進行編碼,然後採用各種pooling或者對RNN直接取最後一個t時刻的hidden state作為句子的向量輸出。
  • 這裡會有一個問題, 常規的編碼方法,無法體現對一個句子序列中不同語素的關注程度,在自然語言中,一個句子中的不同部分是有不同含義和重要性的
  • 比如上面的例子中:I hate this movie.如果做情感分析,明顯對hate這個詞語應當關注更多。當然是用CNN和RNN能夠編碼這種信息。但是如果序列長度很長的情況下,這種方法會有一定的瓶頸 ; CNN的核心就是卷積核能夠變相學習n-gram的信息,如果是用hierarchical的捲積核,那麼越上層的捲積核越能編碼原始距離較遠的詞組的信息。但是這種編碼能力也是有上限的,對於較長的文本,模型效果不會再提升太多。RNN也是同理

How to use attention?

具體構成如下:

  • 我們的最終目標是要能夠幫助decoder在生成詞語時,有一個不同詞語的權重的參考。
  • 在訓練時,對於decoder我們是有訓練目標的,此時將decoder中的信息定義為一個Query。而encoder中包含了所有可能出現的詞語,我們將其作為一個字典,該字典的key為所有encoder的序列信息。n個單詞相當於當前字典中有n條記錄,而字典的value通常也是所有encoder的序列信息。
  • 上面對應於第一步,然後是第二部計算注意力權重,由於我們要讓模型自己去學習該對哪些語素重點關注,因此要用我們的學習目標Query來參與這個過程,因此對於Query的每個向量,通過一個函數,計算預測i時刻詞時,需要學習的注意力權重
  • 由於包含n個單詞,因此應當是一個n維的向量,為了後續計算方便,需要將該向量進行softmax歸一化,讓向量的每一維元素都是一個概率值。

最後對Value vectors進行加權線性組合,得到帶權重參考的“字典”輸出:

權重計算函數

attention機制比較核心的地方就是如何對Query和key計算注意力權重。下面簡單總結幾個常用的方法:

1、多層感知機方法

  • 主要是先將query和key進行拼接,然後接一個激活函數為tanh的全連接層,然後再與一個網絡定義的權重矩陣做乘積。
  • 這種方法據說對於大規模的數據特別有效。

2、Bilinear方法

  • 通過一個權重矩陣直接建立q和k的關係映射,比較直接,且計算速度較快。

3、Dot Product

  • 這個方法更直接,連權重矩陣都省了,直接建立q和k的關係映射
  • 優點是計算速度更快了,且不需要參數,降低了模型的複雜度。但是需要q和k的維度要相同。

4、scaled-dot Product

  • 解決點積方法的效率問題,就是隨著向量維度的增加,最後得到的權重也會增加,為了提升計算效率,防止數據上溢,對其進行scaling

應用 :

  1. Seq2Seq Attention

2. Pointer-Generator

  • pointer-generator network是一個baseline和point network的混合體,因為他允許通過指向複製單詞,同時也可以從固定的詞彙表中生成詞
  • 用bi-LSTM 讀過Source Text(每個時間點) 透過Decode Rnn輸出的key hidden state與當前輸入文本(similarity)計算attention weight => 形成Context Vector

Conclusion

  • 透過上述內容,快速的了解Seq2seq、Attention model運作、計算方式,有些論文嘗試用CNN去解決這樣的問題,像是Facebook提出的Convolutional Seq2seq learning
  • 但CNN實際上是透過大量的layer去解決局部訊息的問題,在2017年,Google提出了一種叫做”The transformer”的模型,透過self attention、multi-head的概念去解決上述缺點,完全捨棄了RNN、CNN的架構

Reference :

seq2seq文本摘要:Autoencoder

Seq2seq pay Attention to Self Attention: Part 1(中文版)

Attention機制簡單總結

--

--

Moris
Moris

Written by Moris

An AI engineer who loves deep learning technology and is willing to share resources and learn new technologies