帶Attention機制的Seq2Seq框架梳理

藉着與同事組內分享的機會,根據論文Neural Machine Translation By Jointly Learning to Align and Translate把帶Attention機制的Seq2Seq框架Encoder與Decoder部分的流程圖畫了一下,公式梳理了一遍。

Bi-RNN Encoder

Bi-RNN Encoder

Encoder的流程如上圖所示,最終的輸出結果是每個時刻的hidden_state h1,h2,h3,...,hT

其中的GRU使用的雙向的,正向部分的公式如下

h⃗ 0=0

z⃗ i=σ(W⃗ zE⃗ xi+U⃗ zh⃗ i1)(1)

r⃗ i=σ(W⃗ rE⃗ xi+U⃗ rh⃗ i1)(2)

h⃗ i^=tanh(W⃗ E⃗ xi+U⃗ [r⃗ ih⃗ i1])(3)

h⃗ i=(1z⃗ i)h⃗ i1+z⃗ ih⃗ i^,i>0(4)

反向的同上,最終的ht 爲將正向與反向的結果concat得到的向量。

Attention-Decoder

Attention-Decoder

Attention Decoder的流程圖如上圖所示,與參考論文中不同的一點是,我把hidden_state之後Dense_layer之前的maxout layer去掉了,因爲看到google Seq2Seq的實現中也沒有maxout layer,與朋友討論的結果是可能maxout layer會增加更多的計算量。還有就是最後的softmax直接變成argmax了。

上圖中拿掉右邊方框內的的Attention機制就是一個基本的decoder,基本的decoder與encoder的交互僅在decoder初始的hidden_state上,如將encoder中反向RNN最終的輸出狀態h0 作爲decoder的初始state s0 。這樣對於decoder而言,只能看到源信息的一個總體概要,對於翻譯任務,從人的角度來思考, 我們知道這段話的大意, 僅靠大意來進行翻譯, 所以我們只能意譯。爲了翻譯的更精準, 我們在知道大意的前提下進行翻譯, 還會逐詞去匹配, 比如“今天天氣真好”翻譯完今天之後, 注意力就會在“天氣”上,考慮應該將“天氣”翻譯成什麼詞。

Attention 機制也就是注意力機制,也稱爲對齊模型(alignment model), 在翻譯階段, 準備生成每個新的詞的時候, 這個機制可以將注意力集中在輸入的某個或某幾個詞上,重點關注這幾個詞, 可以想象成是將他們與待生成的新詞進行對齊,使得翻譯更精準。

整個decoding的過程可以拆分爲以下幾個部分

一、 離散的詞ID轉換爲詞向量

與Encoder 中的這個步驟是一樣的, 只不過embedding矩陣與Encoder的可能不一樣,比如翻譯源語言與目標語言需要使用不同的embbedding矩陣,但是如文本摘或是文本風格改寫這種就可以使用同一個embedding矩陣。

二、 由encoder的輸出結合decoder的prev_hidden_state生成energy

[(h1,h2,h3,...,hT),prev_hidden_state]=>(e1,e2,e3,...,eT)

prev_hidden_statesi1 , 由encoder所有時刻的輸出ht 以及decoder的hidden_state si1 產生能量 e1,e2,...,eT 的過程是Attention的關鍵步驟。能量et 的含義也就是對應的源語言輸入的詞xt 對即將生成的目標語言的詞yi 的影響力。既然我們需要一個對齊模型, 根據此時每個輸入詞能量的大小,就可以知道應該使用哪個詞與當前的yi 進行對齊。這樣的對齊方式又稱爲soft alignment, 也就是可以求得梯度, 所以可以與整個模型一起優化。

et=vTatanh(Wasi1+Uaht)

其中Uaht 的計算,與decoder的時刻無關,因此可以預先計算好,在每一個時刻將其代入即可。

三、 由energy 到概率

(e1,e2,e3,...,eT)=>(α1,α2,α3,...,αT)

使用attention的目的,是希望得到一個context向量,因此需要將h1,h2,...,hT 融合在一起,融合若干向量最容易想到的就是加權平均,但是如果直接把能量e 作爲權值,可能會將context向量縮放若干倍,所以需要將et 轉換爲概率值αt ,使得它們的和爲1, 同時可以 用來表示輸入序列中每個詞與當前待生成的詞的匹配程度。即

t=1Tet=1

使用softmax求得概率 , 公式如下
αt=exp(et)Tt=1exp(et)

四、context 向量合成

[(α1,α2,α3,...,αT),(h1,h2,h3,...,hT)]=>c

得到對輸入序列每一時刻的權值αt 後, 將其與encoder各時刻的輸出ht 加權求和,即得到decoder在當前時刻的context向量ci ,公式如下

ci=t1Tαtht

五、prev_hidden_state, 詞向量, context向量通過GRU單元生成下一時刻hidden_state

(embedded_input,prev_hidden_state,c)=>hidden_state

decoder本質是一個GRU單元,與GRU不同的在於融合了由attention機制產生的context向量。在decoding的場景,只能用單向的RNN,因爲後續時刻的結果在當前時刻是未知的。

將decoder在時刻ihidden_state表示爲siprev_hidden_statesi1 ,context向量c表示爲ciembedded_input表示爲Eyi1 , 則可由如下公式表示該過程:

si=(1zi)si1+zisi~

其中
si~=tanh(WEyi1+U[risi1]+Cci)

zi=σ(WzEyi1+UzSi1+Czci)

ri=σ(WrEyi1+Ursi1+Crci)

六、 使用全連接層將hidden_state映射爲vocabulary size的向量

(hidden_state)=>output_logist

生成的hidden_state已經包含了待生成的詞的信息了,但是要生成具體的詞,我們還需要知道目標語言中每個詞的條件概率p(yi|si) , 如果si 的維度就是目標語言的詞典大小, 那麼使用softmax就可以算出每個詞的概率, 但是si 的維度也屬於模型的一個參數,通常是不會等於目標語言詞典的大小的, 因此再增加一個全連接層, 將si 映射爲維度等於詞典大小L 的向量vi , 每個維度代表一個詞, 使用softmax計算出每個詞的概率。

vi=Wsi+b

probij=exp(vij)Lj=1vij

yi=argmaxprobi
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章