從Seq2seq到Attention模型到Self Attention


Seq2seq

Seq2seq全名是Sequence-to-sequence,也就是從序列到序列的過程,是近年當紅的模型之一。Seq2seq被廣泛應用在機器翻譯、聊天機器人甚至是圖像生成文字等情境。
seq2seq 是一個Encoder–Decoder 結構的網絡,它的輸入是一個序列,輸出也是一個序列, Encoder 中將一個可變長度的信號序列變為固定長度的向量表達,Decoder 將這個固定長度的向量變成可變長度的目標的信號序列。

整個過程可以用下面這張圖來詮釋:

Seq2seq結構

其中,X、Y均由各自的單詞序列組成(X,Y可以是同一種語言,也可以是兩種不同的語言)。
Encoder:是將輸入序列通過非線性變換編碼成一個指定長度的向量\(C\)(中間語義表示),得到\(c\)有多種方式,最簡單的方法就是把Encoder的最后一個隱狀態賦值給\(c\),還可以對最后的隱狀態做一個變換得到\(c\),也可以對所有的隱狀態做變換。
Decoder:是根據向量\(C\)(encoder的輸出結果)和之前生成的歷史信息\(y1\),\(y2\),...,\(yn\)來生成\(i\)時刻要生成的單詞\(yi\)

  • 編碼階段
    在RNN中,當前時間的隱藏狀態由上一時間的狀態和當前時間輸入決定的,即:

\[h_t = f(h_{t-1},x_t) \]

獲得了各個時間段的隱藏層以后,再將隱藏層的信息匯總,生成最后的語義向量

\[C = q(h_1,h_2,h_3,...,h_x) \]

當然,有一種最簡單的方法是將最后的隱藏層作為語義向量C,即

\[C = q(h_1,h_2,h_3,...,h_x) = h_x \]

  • 解碼階段
    可以看做編碼的逆過程。這個階段,我們根據給定的語義向量\(C\)和之前已經生成的輸出序列\(y_1\),\(y_2\),...,\(y_{t-1}\)來預測下一個輸出的單詞\(y_t\),即

\[y_t = \argmax P(y_t)=\sum_{t=1}^T p(y_t|y_1,...,t_{t-1},C) \]

也可以寫作

\[y_t = g({y_1,...,y_{t-1}},C) \]

在RNN中,也可以簡化成

\[y_t = g(y_{t-1},s_t,C) \]

其中\(s\)是輸出RNN(即RNN解碼器)中的隱藏層,\(C\)代表之前編碼器得到的語義向量,\(y_{t-1}\)表示上個時間段的輸出,反過來作為這個時間段的輸入。\(g\)可以是一個非線性的多層神經網絡,產生詞典中各個詞語屬於\(y_t\)的概率。

Attention模型

encoder-decoder模型雖然非常經典,但是局限性也非常大。最大的局限性就在於編碼和解碼之間的唯一聯系就是一個固定長度的語義向量C。也就是說,編碼器要將整個序列的信息壓縮進一個固定長度的向量中去。但是這樣做有兩個弊端,一是語義向量無法完全表示整個序列的信息,二是先輸入的內容攜帶的信息會被后輸入的信息稀釋掉。輸入序列越長,這個現象就越嚴重。這就使得在解碼的時候一開始就沒有獲得輸入序列足夠的信息, 那么解碼時准確率就要打一定折扣。
為了解決上述問題,在 Seq2Seq出現一年之后,Attention模型被提出了。該模型在產生輸出的時候,會產生一個注意力范圍來表示接下來輸出的時候要重點關注輸入序列的哪些部分,然后根據關注的區域來產生下一個輸出,如此反復。attention 和人的一些行為特征有一定相似之處,人在看一段話的時候,通常只會重點注意具有信息量的詞,而非全部詞,即人會賦予每個詞的注意力權重不同。attention 模型雖然增加了模型的訓練難度,但提升了文本生成的效果。模型的大概示意圖如下。

attention 模型

每一個\(c\)會自動去選取與當前所要輸出的\(y\)最合適的上下文信息。具體來說,我們用 \(a_{ij}\) 衡量編碼中第\(j\)階段的\(h_j\)和解碼時第\(i\)階段的相關性,最終Decoder中第\(i\)階段的輸入的上下文信息 \(c_i\) 就來自於所有 \(h_j\)\(a_{ij}\)的加權和。
Attention的原理就是計算當前輸入序列與輸出向量的匹配程度,匹配度高也就是注意力集中點其相對的得分越高,其中Attention計算得到的匹配度權重,只限於當前序列對,不是像網絡模型權重這樣的整體權重。

attention 模型實例

輸入的序列是“我愛中國”,因此,Encoder中的\(h_1\)\(h_2\)\(h_3\)\(h_4\)就可以分別看做是“我”、“愛”、“中”、“國”所代表的信息。在翻譯成英語時,第一個上下文\(c_1\)應該和“我”這個字最相關,因此對應的 \(a_{11}\)就比較大,而相應的 \(a_{12}\)\(a_{13}\)\(a_{14}\) 就比較小。\(c_2\)應該和“愛”最相關,因此對應的 \(a_{22}\) 就比較大。最后的\(c_3\)\(h_3\)\(h_4\)最相關,因此 \(a_{33}\)\(a_{34}\)的值就比較大。具體模型權重 \(a_{ij}\) 是如何計算出來的呢?

當前輸出詞\(Y_i\)針對某一個輸入詞\(j\)的注意力權重由當前的隱層\(H_i\),以及輸入詞\(j\)的隱層狀態(\(h_j\))共同決定;然后再接一個\(sofrmax\)得到0-1的概率值。即通過函數\(F(h_j,H_i)\)來獲得目標單詞\(Y_i\)和每個輸入單詞對應的對齊可能性。

Attention算法過程

1)encode對輸入序列編碼得到最后一個時間步的狀態\(c\),和每個時間步的輸出\(h\),其中\(c\)又作為decode的初始狀態\(z_0\)

2)對於每個時間步的輸出\(h\)\(z_0\)做匹配也就是match操作,得到每個時間步的匹配向量\(α_{01}\),如圖。

Attention算法過程1

3)對所有時間步的輸出\(h\)\(z_0\)的匹配度\(α_0\),使用softmax做歸一化處理,得到各個時間步對於\(z_0\)的匹配分數。

4)求各個時間步的輸出\(h\)與匹配分數的加權求和得到\(c_0\),作為decode的下一個時間步的輸入,如圖。

Attention算法過程2

5)計算各個時間步的輸出\(h\)\(z_1\)的匹配度得到\(c_1\)作為decode下一個時間步的輸入,如此一步一步重復下去,如圖。

Attention算法過程3

這樣就可以把每個時間步重要的信息傳給decode中,以上就是Attention機制的處理過程。其中match操作一般是求兩個向量的相似度,通常有如下方法:
1)余弦相似度
2)一個簡單的神經網絡,輸入為\(h\)\(w\),輸出為\(α\)
3)或者矩陣變換(Multiplicative attention,Luong et al., 2015)

圖解Attention模型

圖解Attention模型

(1)\(h_t=RNN_{enc}(x_t,h_{t-1})\),Encoder方面接受的是每一個單詞word embedding,和上一個時間點的hidden state。輸出的是這個時間點的hidden state。
(2)\(s_t=RNN_{dec}(\hat{y_{t-1}},s_{t-1})\), Decoder方面接受的是目標句子里單詞的word embedding,和上一個時間點的hidden state。
(3)\(c_i=\sum_{j=1}^{T_x} \alpha_{ij}h_j\), context vector是一個對於encoder輸出的hidden states的一個加權平均。
(4)\(\alpha_{ij}=\frac{\exp(e_{ij})}{\sum_{k=1}^{T-x} \exp(e_{ik}) }\), 每一個encoder的hidden states對應的權重。
(5)\(e_{ij}=score(s_i,h_j)\), 通過decoder的hidden states加上encoder的hidden states來計算一個分數,用於計算權重(4)
(6)\(\hat{s_t}=tanh(W_c|c_t;s_t)\), 將context vector 和 decoder的hidden states 串起來。
(7)\(p(y_t|y<t,x)=softmax(W_s \hat{s_t})\),計算最后的輸出概率。

CNN的seq2seq

現在大多數場景下使用的Seq2Seq模型是基於RNN構成的,雖然取得了不錯的效果,但也有一些學者發現使用CNN來替換Seq2Seq中的encoder或decoder可以達到更好的效果。最近,FaceBook發布了一篇論文:《Convolutional Sequence to Sequence Learning》,提出了完全使用CNN來構成Seq2Seq模型,用於機器翻譯,超越了谷歌創造的基於LSTM機器翻譯的效果。此網絡獲得暫時性勝利的重要原因在於采用了很多的竅門,這些技巧值得學習:
•捕獲long-distance依賴關系
底層的CNN捕捉相聚較近的詞之間的依賴關系,高層CNN捕捉較遠詞之間的依賴關系。通過層次化的結構,實現了類似RNN(LSTM)捕捉長度在20個詞以上的Sequence的依賴關系的功能。

改進

Attention model雖然解決了輸入句僅有一個context vector的缺點,但依舊存在不少問題。
1.context vector計算的是輸入句、目標句間的關聯,卻忽略了輸入句中文字間的關聯,和目標句中文字間的關聯性;
2.不管是Seq2seq或是Attention model,其中使用的都是RNN,RNN的缺點就是無法平行化處理,導致模型訓練的時間很長,有些論文嘗試用CNN去解決這樣的問題,像是Facebook提出的Convolutional Seq2seq learning,但CNN實際上是透過大量的layer去解決局部信息的問題,在2017年,Google提出了一種叫做”The transformer”的模型,透過self attention、multi-head的概念去解決上述缺點,完全舍棄了RNN、CNN的構架。
Seq2Seq的核心部分是其解碼部分,大部分改進基於此:
greedy search:基礎解碼方法
beam search:對greedy search的改進
attention:它的引入使得解碼時,每一步可以有針對地關注與當前有關的編碼結果,從而減小了編碼器輸出表示的學習難度,也更容易學到長期的依賴關系。
memory network:從外部獲取知識。
其他方法:
堆疊多層RNN的Decoder
增加dropout機制
與Encoder建立殘差連接

Self attention

傳統的rnn難於並行,而流行的attention模型往往會利用rnn。總之為了解決無法並行訓練問題,google提出了self-attention,完全摒棄了rnn單元,從而做到並行訓練。
Attention函數的本質可以被描述為一個查詢(query)到一系列(鍵key-值value)對的映射,如下圖。

Self attention

在計算attention時主要分為三步,第一步是將query和每個key進行相似度計算得到權重,常用的相似度函數有點積,拼接,感知機等;然后第二步一般是使用一個softmax函數對這些權重進行歸一化;最后將權重和相應的鍵值value進行加權求和得到最后的attention。目前在NLP研究中,key和value常常都是同一個,即key=value。

Self attention

Attention is all you need

Attention is all you need 是google機器翻譯團隊在2017年nips上發表的論文,
主要亮點在於:
1)不同於以往主流機器翻譯使用基於RNN的seq2seq模型框架,該論文用attention機制代替了RNN搭建了整個模型框架。
2)提出了多頭注意力(Multi-headed attention)機制方法,在編碼器和解碼器中大量的使用了多頭自注意力機制(Multi-headed self-attention)。
3)在WMT2014語料中的英德和英法任務上取得了先進結果,並且訓練速度比主流模型更快。
該論文模型的整體結構如下圖,還是由編碼器和解碼器組成,在編碼器的一個網絡塊中,由一個多頭attention子層和一個前饋神經網絡子層組成,整個編碼器棧式搭建了N個塊。類似於編碼器,只是解碼器的一個網絡塊中多了一個多頭attention層。為了更好的優化深度網絡,整個網絡使用了殘差連接和對層進行了規范化(Add&Norm)。

Self attention

多頭attention(Multi-head attention)結構如下圖,Query,Key,Value首先進過一個線性變換,然后輸入到放縮點積attention,注意這里要做h次,其實也就是所謂的多頭,每一次算一個頭。而且每次Q,K,V進行線性變換的參數W是不一樣的。然后將h次的放縮點積attention結果進行拼接,再進行一次線性變換得到的值作為多頭attention的結果。可以看到,google提出來的多頭attention的不同之處在於進行了h次計算而不僅僅算一次,論文中說到這樣的好處是可以允許模型在不同的表示子空間里學習到相關的信息,后面還會根據attention可視化來驗證。

Self attention

那么在整個模型中,是如何使用attention的呢?如下圖,首先在編碼器到解碼器的地方使用了多頭attention進行連接,K,V,Q分別是編碼器的層輸出(這里K=V)和解碼器中都頭attention的輸入。其實就和主流的機器翻譯模型中的attention一樣,利用解碼器和編碼器attention來進行翻譯對齊。然后在編碼器和解碼器中都使用了多頭自注意力self-attention來學習文本的表示。Self-attention即K=V=Q,例如輸入一個句子,那么里面的每個詞都要和該句子中的所有詞進行attention計算。目的是學習句子內部的詞依賴關系,捕獲句子的內部結構。

Self attention

對於使用自注意力機制的原因,論文中提到主要從三個方面考慮(每一層的復雜度,是否可以並行,長距離依賴學習),並給出了和RNN,CNN計算復雜度的比較。如果輸入序列n小於表示維度d的話,每一層的時間復雜度self-attention是比較有優勢的。當n比較大時,作者也給出了一種解決方案self-attention(restricted)即每個詞不是和所有詞計算attention,而是只與限制的r個詞去計算attention。在並行方面,多頭attention和CNN一樣不依賴於前一時刻的計算,可以很好的並行,優於RNN。在長距離依賴上,由於self-attention是每個詞和所有詞都要計算attention,所以不管他們中間有多長距離,最大的路徑長度也都只是1。可以捕獲長距離依賴關系。

self-attention可以是一般attention的一種特殊情況,在self-attention中,Q=K=V每個序列中的單元和該序列中所有單元進行attention計算。Google提出的多頭attention通過計算多次來捕獲不同子空間上的相關信息。self-attention的特點在於無視詞之間的距離直接計算依賴關系,能夠學習一個句子的內部結構,實現也較為簡單並行可以並行計算。從一些論文中看到,self-attention可以當成一個層和RNN,CNN,FNN等配合使用,成功應用於其他NLP任務。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM