您當前的位置:首頁 > 動漫

草稿紙上的seq2seq模型與Attention機制

作者:由 KIRA 發表于 動漫時間:2018-10-07

【寫在前面】

最近有計劃寫一系列自然語言處理方面的總結。按順序來說應該從語料庫、語言模型、詞法分析、詞性標註等基礎知識開始講起,但最近的工作需要,先接觸了一些具體的應用場景,於是就先介紹基於深度學習的自然語言生成模型——序列到序列模型,大多數情況下被簡寫成seq2seq模型。後續的文章將不斷補充上述自然語言處理的內容,我也將指明他們的銜接與依賴關係。

【符號簡介】

————————————————————————

m——編碼器的隱層神經元個數

n——輸入序列詞向量維度

p——解碼器隱層神經元個數

q——輸出序列詞向量維度

v——詞彙表大小

————————————————————————

【正文開始】

我們之前遇到的較為熟悉的序列問題,主要是利用一系列輸入序列構建模型,預測某一種情況下的對應取值或者標籤,在數學上的表述也就是透過一系列形如

X_i=(x_{i1},x_{i2},...,x_{in})

的向量序列來預測

Y

值,這類的問題的共同特點是,輸入可以是一個定長或者不定長的序列,但輸出一般要求是一個固定長度的序列(單個標籤較為常見,即長度為1的序列)。例如利用RNN網路的文字情感分類,輸入的文字長度不固定,但輸出是某一個情感標籤。這樣的問題我們已經有相對成熟的方法解決,而在有的現實場景中,我們更希望

輸入與輸出的序列長度都不固定

,針對此類問題,我們來介紹

序列到序列(seq2seq)模型

一、Encoder-Decoder框架

Encoder-Decoder(編碼-解碼器)框架是Cho et al[1]和Sutskever[2]兩位學者在2014年分別獨立卻又不約而同提出的,目的是針對輸入-輸出這一對不定長的序列對,利用編碼器將輸入序列“編碼”為一個抽象的資訊,再透過解碼器對抽象資訊進行逐步“解碼”。所謂編碼與解碼其實就是一種函式的對映,類似於在兩種序列對之間找到一個公共的橋樑,使得兩種序列對儘可能的對應上。

下面我將以較為常見的序列到序列的任務場景——中英文機器翻譯為例,來說明Encoder-Decoder這個框架具體工作流程。

Encoder

以中文為源語言,拿“我很帥”為例,翻譯為“I am handsome”的英文目標語言。當然開始對源語言編碼之前,還是要將這些非結構化的文字轉化為可計算的結構化資料,也就是眾所周知的“詞向量(其實更合理的名字叫word embedding~)”,不妨設源語言和目標語言的詞w都被對映為n維的詞向量E(w),如圖1所示,首先將源語言的每個詞輸入到編碼器中。

草稿紙上的seq2seq模型與Attention機制

圖1 編碼器(Encoder)示例

需要說明的是,在序列到序列處理不定長序列的過程中,

採用了序列的起始標記<S>和終止標記</S>來“告訴”編碼器的編碼過程何時開始與結束,也就是間接反映了當前序列的長度資訊

,編碼器一般採用處理序列比較有優勢的迴圈神經網路(RNN),主要流程是將序列中每個n維詞向量

E(w_{i})

與其前一時刻的m維隱狀態向量

h_{i-1}

拼接為m+n維向量

[E(w_{i}),h_{i-1}]

,透過全連線網路及門控運算(GRU/LSTM中會涉及)

【注1】

,產生當前時刻對應的m維隱狀態向量

h_{i}

例如

h_{1}=f([E(<S>),h_{0}])

h_{2}=f([E(我),h_{1}])

等等以此類推,特別地,取初始隱狀態

h_{0}

為m維零向量。

當終止符輸入至編碼器的時候,編碼器將輸出整個輸入序列的m維上下文向量c——以抽象輸入序列的特徵向量,類似於我們人類讀一句話提煉出這句話的梗概一樣,至此整個編碼過程完成。

Decoder

接下來將藉助源語言的上下文向量c及目標語言的上下文關係來完成源語言向目標語言的解碼過程。解碼器一般也會選用RNN系列的神經網路,具體流程如圖2所示。

草稿紙上的seq2seq模型與Attention機制

圖2 解碼器(Decoder示例)

在圖2所示的流程中,解碼的每一步

需要依賴三個變數

,一個是從編碼器得到的源語言上下文向量c,用於描述源語言的資訊,第二個是前一時刻的解碼隱狀態向量

s_{i-1}

,最後一個是前一時刻預測得到的目標詞向量

E(o_{i-1})

,用於捕捉目標語言的上下文依賴關係。在數學的表達上也就是將m維源語言上下文向量c,p維隱狀態向量

s_{i-1}

,q維預測所得詞向量

E(o_{i-1})

拼接為m+p+q維向量

[c,s_{i-1},E(o_{i-1})]

,透過全連線及門控運算得到當前時刻對應的p維隱狀態向量

s_{i}

,輸出層利用全連線及softmax函式歸一化,得到v維度(v為詞彙表大小)的輸出向量,取最大機率那個分量對應的詞向量作為當前時刻的目標詞向量

E(o_{i})

例如

s_{1}=g([c,s_{0},E(o_{0})])

,在輸出層向量如果為

[0.5,0.1,0.2,0.2]

(該向量每個分量分別是解碼為I、am、handsome、對應的機率),這時候發現I對應的機率最大,因此此時輸出的目標即為I對應的詞向量

E(I)

。特別地,初始解碼狀態

s_{0}

取p維零向量,初始詞向量

E(o_{0})

取起始符對應的詞向量。

當預測目標輸出為的時候,整個解碼過程結束,也就意味著一個不定長的序列被生成。

二、Attention機制

上述Encoder-Decoder框架在序列到序列模型中有很廣泛的應用。但該框架有個潛在的問題就出在編碼器產生的源語言上下文向量c上了,一般來說c向量具有兩個侷限性,第一個是當輸入序列很長的時候,透過迴圈網路產生的c向量很難表達整句的資訊,而是偏向於表達離序列結尾近的資訊;另一方面,由於在機器翻譯的過程中,需要明確目標語言詞彙與源語言詞彙的大致對應關係,這樣如果所有的解碼都用同一個上下文c向量,就很難表現出源語言詞彙的具體貢獻情況,因此引入了一個現在非常流行的方法——注意力(Attention)機制。

要解決c向量引發的問題,最自然的想法是

讓固定的c“動”起來

,也就是在解碼的過程中每個時刻待拼接的c向量是不同的,是隨著解碼過程中的需要不斷變化的。此時c向量的生成過程如圖3所示。

草稿紙上的seq2seq模型與Attention機制

圖3 Attention機制在Encoder-Decoder框架的應用

從圖3不難看出,c向量從原來編碼完一整個輸入序列產生一個,變成了每個時刻都會產生的向量

c_{i}

。 而且

c_{i}

是由各個編碼器隱狀態向量

h_{i}

加權求和所得,圖中以

c_{1}

為例,

c_{1}=a_{11}h_{1}+a_{12}h_{2}+...+a_{15}h_{5}=\sum_{j=1}^{5}{a_{1j}h_{j}}

其中, 權重

a_{1j}

為實數,

c_{1}

為m維向量。

現在的問題就被轉化為,如何確定第i個時刻的上下文向量

c_{i}

內的權重分配

a_{ij},j=1,2,..5

。這個時候就需要我們剛提到的源語言和目標語言在翻譯過程中的詞彙對應關係,考慮解碼過程的第i個時刻,此時應該給解碼器輸入隱狀態

s_{i-1}

, 前一個詞

E(o_{i-1})

,以及剛從

固定的c替換過來的 #FormatImgID_39#

。我們希望

c_{i}

告訴我們,在解碼器完成上一個詞的解碼後,當前要解碼的詞彙與源語言的哪些詞彙相對應,也就是比較源語言哪個時刻的資訊與當前包含解碼資訊的隱狀態

s_{i-1}

關聯最緊密,於是構造一個”打分器“,將隱狀態

s_{i-1}

與源語言的

每個隱狀態

h_{j}

逐一比較

,計算其關聯得分,這個得分即可作為每個源語言隱狀態

h_{j}

前的權重

a_{ij}

。以下打分函式是常見的一種:

a_{ij}=softmax(a(s_{i-1},h_{j})),j=1,2,...,5

,其中

a(\cdot)

為刻畫距離的函式

【注2】

從上式也可反映出來,j變數是要遍歷每個取值的,而對於確定的第i時刻來說,i則是不變的,也就是”隱狀態

s_{i-1}

與源語言的

每個隱狀態

h_{j}

逐一比較

“。

這個方法在直觀上理解為,翻譯不同的目標詞彙時,我們對源語言的各個詞彙應該有著不一樣的關注度(權重),例如翻譯出“handsome”這個詞的時候,中文的”帥“在直觀上應該被賦予更高的權重。這種類似於人腦的注意力機制(Attention)就很自然的被引入到Encoder-Decoder框架中來了。

注意力機制(Attention)其實本質上就是一種權重分配

,而權重則來自於我們針對具體任務設計的關聯度函式,基於這種模式的注意力機制目前被應用的比較廣泛,可以在不同任務中不斷改進和嘗試。

三、seq2seq模型的最佳化目標

在監督學習的大部分模型中,我們都將考慮如何根據損失函式(或者叫目標函式)來更新模型引數,這也是模型訓練的目標,在seq2seq模型中也不例外。

seq2seq模型的目標在於根據輸入序列的資訊最大化目標輸出序列的機率,類似於語言模型的思路。對於所有的訓練樣本,有以下形式的損失函式:

loss=-\frac{1}{N}\sum_{n=1}^{N}{logp(Y_{n}|X_{n},\theta)}

其中N為訓練樣本數量,

X_{n}

Y_{n}

為每個樣本對應的輸入和輸出序列,

\theta

為待學習的引數向量。每一個

p(Y_{n}|X_{n},\theta)

都由Encoder-Decoder框架生成,其中包含在神經網路中的大量引數,可透過梯度下降的方式逐步最佳化。

個人認為這種目標函式的設計類似於語言模型,對訓練集也就是語料有一定的依賴性,後續我也將繼續思考這個問題,並進行補充。

至此,seq2seq模型及注意力(Attention)機制的基本流程已經介紹完了,目前的前沿領域還有很多的深入探討和改進,我也將不斷整理總結。

感謝你的閱讀。

【注1】

在Bahdanau[3]的論文原文中,隱狀態

h_{i}

的計算形式與本文的表述有些差別,以如下形式表述:

h_{i}=f(W_{n\times m}E_{m\times 1}(w_{i})+U_{n\times n}[r_{i}\circ h_{i-1}]_{n\times 1})

這種表述與本文提到的將拼接向量

[E(w_{i}),h_{i-1}]

送入全連線網路及門控運算過程是等價的,論文原文的表述實際上是一種矩陣分塊運算的展開。

【注2】

在Bahdanau[3]的論文原文中,刻畫距離的函式

a(\cdot)

表述為

a(s_{i-1},h_{j})=v_{a}^{T}tanh(W_as_{i-1}+U_ah_j)

其中

W_a

U_a

v_a

為相應變數的待訓練權重矩陣。刻畫距離的函式在不同的應用場景下有著不同的設計和選取,上述形式只是常見的一種。

【參考文獻】

[1] Cho K, Merrienboer B V, Gulcehre C, et al。 Learning Phrase Representations using RNN Encoder-Decoder for Statistical Machine Translation[J]。 Computer Science, 2014。

[2] Sutskever I, Vinyals O, Le Q V。 Sequence to Sequence Learning with Neural Networks[J]。 2014, 4:3104-3112。

[3] Bahdanau D, Cho K, Bengio Y。 Neural Machine Translation by Jointly Learning to Align and Translate[J]。 Computer Science, 2014。

[4] 車萬翔譯,基於深度學習的自然語言處理,2018,機械工業出版社

標簽: 向量  序列  源語言  解碼  編碼器