深度學習-->NLP-->Seq2Seq Learning(Encoder-Decoder,Beam Search,Attention)

村頭陶員外發表於2017-11-22

之前總結過RNNLM

RNNLM
,是一個SequenceModel,其結構類似如下:

這裡寫圖片描述

這裡面是一個一個的輸出。我們如果以這種方式做機器翻譯,每一個時刻輸入一個詞,相應的翻譯一個詞,顯然這種一個一個單詞的翻譯方式不是很好,因為沒有聯絡上下文進行翻譯。我們希望先把一整句話餵給模型,然後模型在這一個整句的角度上來進翻譯。這樣翻譯的效果更好。

所以本篇博文要總結的是Seq2Seq Model,給出一個完整的句子,能得出另外一個完整的句子。

下面我們以機器翻譯來講解下面幾個要點。

Encoder-Decoder模型

網路結構

這裡寫圖片描述

其中f1,f2,f3

{f}_{1},{f}_{2},{f}_{3}
是輸入資訊做完 embedding
embedding
後的矩陣,Encoder部分是一個兩層的LSTM
LSTM
神經網路,這個神經網路不做任何輸出,只輸出最後一步的h,c
h,c
,我們可以理解這個h,c
h,c
是已經總結了的輸入資訊,Decoder
Decoder部分
也是一個兩層的LSTM
LSTM
神經網路,並且其隱藏層h,c
h,c
的初始值為Encoder
Encoder
部分輸出的h,c
h,c
,然後在Decoder
Decoder
部分進行翻譯。

注意在Encoder

Encoder
部分每一步並不預測任何東西,其初始的h,c
h,c
為全零向量,並且與Decoder
Decoder
是完全不同的引數。

EncoderDecoder
Encoder-Decoder
的引數集合

首先注意Encoder

Encoder
Decoder
Decoder
部分都是兩層的LSTM
LSTM
神經網路。回顧下LSTM Cell
LSTM\ Cell
大致結構:

這裡寫圖片描述

以及它的計算公式:

這裡寫圖片描述

EncoderDecoder

Encoder-Decoder
超引數

  • num_layers=n,hidden size=d(embedding)
    num\_layers=n, hidden\ size=d(embedding的維度)
  • vocab for F=VF(),vocab for E=VE
    vocab\ for\ F = {V}_{F}(輸入單詞的個數) , vocab\ for\ E = {V}_{E}(輸出單詞的個數)

Encoder

Encoder
部分引數

  • Input:input embedding for f:VFd
    Input: input\ embedding\ for\ f : {V}_{F} ∗ d
  • LSTM
    LSTM
    : 第一層,第二層: 2(8d2+4d)
    2*(8{d}^{2} +4d)
    (我們可以看上面LSTM
    LSTM
    的計算公式,對於i,f,o,g
    i,f,o,g
    四個公式,每個公式都有兩個引數矩陣,每個矩陣大小都是dd
    d*d
    ,再加上四個bias
    bias
    引數矩陣,故每層共有(8d2+4d)
    (8{d}^{2} +4d)
    個引數)

Decoder

Decoder
部分引數

  • Input:input embedding for e:VEd
    Input: input\ embedding\ for\ e: {V}_{E} ∗ d
  • LSTM
    LSTM
    : 第一層,第二層: 2(8d2+4d)
    2*(8{d}^{2} +4d)
  • Output
    Output

    output embedding for eVEd
    output\ embedding\ for\ e: {V}_{E} ∗ d

    output bias for eVE
    output\ bias\ for\ e: {V}_{E}

Mismatch between Train and Test
Mismatch\ between\ Train\ and\ Test

首先需要注意到模型訓練和模型預測是兩個不同的過程,在訓練時,我們知道每一步真正的reference

reference
,而在預測時是不知道每一步的reference
reference
的。

這裡寫圖片描述

在上圖的網路結構中,都是以上一時刻真正的reference

reference
作為下一時刻的input
input
來訓練模型。

那麼train

train
出這樣一個模型,應該如何進行預測呢?因為在預測階段我們是不知道reference
reference
的,我們可以嘗試這樣做,把上一次的輸出作為下一次的輸入。

這裡寫圖片描述

很顯然,這樣做的後果很嚴重:

這裡寫圖片描述

一步錯,步步錯!

那麼應如何解決上面這個問題呢?我們嘗試這樣做,現在假設語料庫只有A,B

A,B
兩個word
word
,那麼:

這裡寫圖片描述

我們看上圖的LSTM

LSTM
結構,共有三個時間段,第一個時間段會輸出兩個單詞P(A),P(B)
P(A),P(B)
的概率,並不真正的輸出最大概率對應的word
word
作為當時刻的輸出,分別以[A,B]T
{[A,B]}^{T}
作為下一個時刻的輸入,然後得到這一時刻輸出P(A),P(B),P(A),P(B)
P(A),P(B),P(A),P(B)
的概率矩陣,以此類推,直到最後我們可以得到輸出是AAA,AAB,ABA,ABB,.....
AAA,AAB,ABA,ABB,.....
各個序列的概率,選擇概率最大的作為真正的輸出序列。


這裡寫圖片描述

這裡需要注意,在Decoder

Decoder
部分,第三個時間步處兩個輸入的B
B
表示不同的含義,第一個B
B
的前驅為A
A
,第二個B
B
的前驅為B
B

這樣我們可以計算出輸出序列P(AAA)=0.60.40.5=0.12,P(AAB)=0.60.40.5=0.12,P(ABA)=0.60.60.4=0.144....

P(AAA)=0.6*0.4*0.5=0.12,P(AAB)=0.6*0.4*0.5=0.12,P(ABA)=0.6*0.6*0.4=0.144....
如此類推計算,可以計算出最大概率對應的序列,作為預測結果。

在語料庫中的words

words
很少的情況下,可以利用這樣類似於窮舉的方式來獲得概率最大的那個序列作為預測結果,但是如果語料庫中的words
words
很多時,這種窮舉的方式肯定就變得不可行了,那麼這個時候應該如何做呢?

可以嘗試這樣做,例如語料庫有3個words

words
,我們可以設定Beam size=2
Beam\ size = 2
也就是每次選擇前一時刻輸出概率最大的前2個words
words
作為當前的輸入。

這裡寫圖片描述

這裡寫圖片描述

這裡需要注意,當對應輸入是a,b

a,b
時,輸出最大概率的兩個word
word
b,c
b,c
,並且其前驅都是a
a
,那麼此時以b
b
為前驅的就丟掉了。

這裡寫圖片描述

當語料庫中只有兩個words

words
時,取Beam size=2
Beam\ size=2
時,其過程如下:

這裡寫圖片描述

可以以下面這張圖更好的理解Beam Search

Beam\ Search
過程:

這裡寫圖片描述

注意在每個時間步時,可能有相同的word

word
作為輸入,但是他們的意義是不同的,其前驅不一樣。

Attention

上面講的傳統的EncoderDecoder

Encoder-Decoder
神經網路結構在應對較短文字翻譯時效果不錯,但是隨著文字長度的增加,其翻譯效果會迅速的惡化。由此提出了Attention
Attention
這種結構,使得模型能夠學習如何對input
input
output
output
進行對齊。

簡單來說,例如將“我 愛 你”翻譯成 "i love you"

"i\ love\ you"
,這裡模型如何學習到如何將翻譯出的"i"
"i"
對齊到(attention
attention
) 到”我“。

例如下圖:

這裡寫圖片描述

那麼問題來了,如何讓模型學習對其(Attention

Attention
) 呢?

attention

attention
的原始論文中是這樣說的:

這裡寫圖片描述

這裡我久不從數學公式角度來說明,只說下它的大致思路。

上圖中上半部分為Decoder

Decoder
,其中s
s
為其hiddenstates
hidden-states
輸出資訊,y
y
為其 output
output
。下半部分為Encoder
Encoder
X
X
為其 Input
Input
h
h
hiddenstates
hidden-states

假設在 t

t
時刻,其Decoder
Decoder
部分對應的hiddenstates
hidden-states
St
{S}_{t}
,這個時候,我們把St
{S}_{t}
Encoder
Encoder
部分的所有hiddenstate
hidden-state
資訊做個相似度的計算,得出at,1,at,2,at,3,...
{a}_{t,1},{a}_{t,2},{a}_{t,3},...
,然後再把這些計算出來的相似度做個softmax
softmax
,再進行如下計算:

這裡寫圖片描述

將得出的cj

{c}_{j}
作為Decoder
Decoder
部分的輸入。

這樣講的估計有許多人沒明白咋回事,為什麼這樣做就能Attention

Attention
呢?

我覺得這篇原始論文講的雖然詳細但是不夠直觀。我引用下臺大李宏毅教授所講attention

attention
ppt
ppt
來詳細進行講解。

這裡寫圖片描述

假設我們再Encoder

Encoder
部分輸入“機器學習” 四個字,經過wordEmbedding
word-Embedding
以後作為輸入餵給一個RNN
RNN
,然後經過隱藏層得出隱藏層資訊h1,h2,...
{h}_{1},{h}_{2},...
,這時候在Decoder
Decoder
部分的第一個時刻的hiddenstate
hidden-state
假設為z0
{z}_{0}
z0
{z}_{0}
的和h1,h2,,,
{h}_{1},{h}_{2},,,
進行相似度的計算,得出各個時刻的a10,a20,...
{a}^{1}_{0},{a}^{2}_{0},...
,然後在ai
{a}^{i}
與對應的hi
{h}^{i}
相乘求和得到這c0
{c}_{0}
,其大致過程如下:

這裡寫圖片描述

這裡寫圖片描述

我們可以看出encoder

encoder
decoder
decoder
是聯合的進行訓練,在訓練過程中,在某個時刻模型會學習到當前應該focus
focus
input
input
的哪一部分,這體現在a10,a20,...
{a}^{1}_{0},{a}^{2}_{0},...
不同的係數權重上,attention
attention
就是在學習這些係數。

得出的C0

{C}_{0}
作為Decoder
Decoder
的下一時刻的輸入。後面的時刻同理。

這裡寫圖片描述

其實對於attention

attention
沒有固定的套路,例如softmax
softmax
這一步不一定非要做,聽說有人做實驗發現不做softmax
softmax
效果還好些。其變種有很多。

相關文章