深度學習的seq2seq模型——本質是LSTM,訓練過程是使得所有樣本的p(y1,...,yT‘|x1,...,xT)概率之和最大


from:https://baijiahao.baidu.com/s?id=1584177164196579663&wfr=spider&for=pc

seq2seq模型是以編碼(Encode)和解碼(Decode)為代表的架構方式,seq2seq模型是根據輸入序列X來生成輸出序列Y,在翻譯,文本自動摘要和機器人自動問答以及一些回歸預測任務上有着廣泛的運用。以encode和decode為代表的seq2seq模型,encode意思是將輸入序列轉化成一個固定長度的向量,decode意思是將輸入的固定長度向量解碼成輸出序列。其中編碼解碼的方式可以是RNN,CNN等。

上圖為seq2seq的encode和decode結構,采用CNN/LSTM模型。在RNN中,當前時間的隱藏狀態是由上一時間的狀態和當前時間的輸入x共同決定的,即

【編碼階段】

得到各個隱藏層的輸出然后匯總,生成語義向量

也可以將最后的一層隱藏層的輸出作為語義向量C

【解碼階段】

這個階段,我們要根據給定的語義向量C和輸出序列y1,y2,…yt1來預測下一個輸出的單詞yt,即

也可以寫做

其中g()代表的是非線性激活函數。在RNN中可寫成yt=g(yt1,ht,C),其中h為隱藏層的輸出。

以上就是seq2seq的編碼解碼階段,seq2seq模型的抽象框架可描述為下圖:

 
 
http://blog.csdn.net/Jerr__y/article/details/53749693 這里匯總了seq2seq誕生的幾篇論文
 

深度學習的seq2seq模型

from:http://blog.csdn.net/starzhou/article/details/78171936

從rnn結構說起

根據輸出和輸入序列不同數量rnn可以有多種不同的結構,不同結構自然就有不同的引用場合。如下圖,

  • one to one 結構,僅僅只是簡單的給一個輸入得到一個輸出,此處並未體現序列的特征,例如圖像分類場景。
  • one to many 結構,給一個輸入得到一系列輸出,這種結構可用於生產圖片描述的場景。
  • many to one 結構,給一系列輸入得到一個輸出,這種結構可用於文本情感分析,對一些列的文本輸入進行分類,看是消極還是積極情感。
  • many to many 結構,給一些列輸入得到一系列輸出,這種結構可用於翻譯或聊天對話場景,對輸入的文本轉換成另外一些列文本。
  • 同步 many to many 結構,它是經典的rnn結構,前一輸入的狀態會帶到下一個狀態中,而且每個輸入都會對應一個輸出,我們最熟悉的就是用於字符預測了,同樣也可以用於視頻分類,對視頻的幀打標簽。

這里寫圖片描述

seq2seq

在 many to many 的兩種模型中,上圖可以看到第四和第五種是有差異的,經典的rnn結構的輸入和輸出序列必須要是等長,它的應用場景也比較有限。而第四種它可以是輸入和輸出序列不等長,這種模型便是seq2seq模型,即Sequence to Sequence。它實現了從一個序列到另外一個序列的轉換,比如google曾用seq2seq模型加attention模型來實現了翻譯功能,類似的還可以實現聊天機器人對話模型。經典的rnn模型固定了輸入序列和輸出序列的大小,而seq2seq模型則突破了該限制。

這里寫圖片描述

這里寫圖片描述

其實對於seq2seq的decoder,它在訓練階段和預測階段對rnn的輸出的處理可能是不一樣的,比如在訓練階段可能對rnn的輸出不處理,直接用target的序列作為下時刻的輸入,如上圖一。而預測階段會將rnn的輸出當成是下一時刻的輸入,因為此時已經沒有target序列可以作為輸入了,如上圖二。

encoder-decoder結構

seq2seq屬於encoder-decoder結構的一種,這里看看常見的encoder-decoder結構,基本思想就是利用兩個RNN,一個RNN作為encoder,另一個RNN作為decoder。encoder負責將輸入序列壓縮成指定長度的向量,這個向量就可以看成是這個序列的語義,這個過程稱為編碼,如下圖,獲取語義向量最簡單的方式就是直接將最后一個輸入的隱狀態作為語義向量C。也可以對最后一個隱含狀態做一個變換得到語義向量,還可以將輸入序列的所有隱含狀態做一個變換得到語義變量。

這里寫圖片描述

而decoder則負責根據語義向量生成指定的序列,這個過程也稱為解碼,如下圖,最簡單的方式是將encoder得到的語義變量作為初始狀態輸入到decoder的rnn中,得到輸出序列。可以看到上一時刻的輸出會作為當前時刻的輸入,而且其中語義向量C只作為初始狀態參與運算,后面的運算都與語義向量C無關。

這里寫圖片描述

decoder處理方式還有另外一種,就是語義向量C參與了序列所有時刻的運算,如下圖,上一時刻的輸出仍然作為當前時刻的輸入,但語義向量C會參與所有時刻的運算。

這里寫圖片描述

encoder-decoder模型對輸入和輸出序列的長度沒有要求,應用場景也更加廣泛。

如何訓練

前面有介紹了encoder-decoder模型的簡單模型,但這里以下圖稍微復雜一點的模型說明訓練的思路,不同的encoder-decoder模型結構有差異,但訓練的核心思想都大同小異。

這里寫圖片描述

我們知道RNN是可以學習概率分布然后進行預測的,比如我們輸入t個時刻的數據后預測t+1時刻的數據,最經典的就是字符預測的例子,可在前面的《循環神經網絡》《TensorFlow構建循環神經網絡》了解到更加詳細的說明。為了得到概率分布一般會在RNN的輸出層使用softmax激活函數,就可以得到每個分類的概率。

對於RNN,對於某個序列,對於時刻t,它的輸出概率為p(xt|x1,...,xt1),則softmax層每個神經元的計算如下:

p(xt,j|x1,...,xt1)=exp(wjht)Ki=1exp(wiht) 
其中ht是隱含狀態,它與上一時刻的狀態及當前輸入有關,即ht=f(ht1,xt)

那么整個序列的概率就為

p(x)=Tt=1p(xt|x1,...,xt1)

而對於encoder-decoder模型,設有輸入序列x1,...,xT,輸出序列y1,...,yT,輸入序列和輸出序列的長度可能不同。那么其實就是要根據輸入序列去得到輸出序列的可能,於是有下面的條件概率,x1,...,xT發生的情況下y1,...,yT發生的概率等於p(yt|v,y1,...,yt1)連乘。其中v表示x1,...,xT對應的隱含狀態向量,它其實可以等同表示輸入序列。

p(y1,...,yT|x1,...,xT)=Tt=1p(yt|x1,...xT,y1,...,yt1)=Tt=1p(yt|v,y1,...,yt−1)

此時,ht=f(ht1,yt1,v),decoder的隱含狀態與上一時刻狀態、上一時刻輸出和狀態向量v都有關,這里不同於RNN,RNN是與當前時刻輸入相關,而decoder是將上一時刻的輸出輸入到RNN中。於是decoder的某一時刻的概率分布可用下式表示,

p(yt|v,y1,...,yt1)=g(ht,yt1,v)

所以對於訓練樣本,我們要做的就是在整個訓練樣本下,所有樣本的p(y1,...,yT|x1,...,xT)概率之和最大,對應的對數似然條件概率函數為,1NNn=1log(yn|xn,θ),使之最大化,θ則是待確定的模型參數。對於rnn、lstm和gru的結構可以看這幾篇文章《循環神經網絡》 《LSTM神經網絡》 《GRU神經網絡》

 

 

 

 

seq2seq 入門

 

 

 

 

本文結構:

 

  • 什么是 seq2seq?
  • Encoder–Decoder 結構?
  • seq2seq 結構?

 


 

什么是 seq2seq?

 

seq2seq 是一個 Encoder–Decoder 結構的網絡,它的輸入是一個序列,輸出也是一個序列, Encoder 中將一個可變長度的信號序列變為固定長度的向量表達,Decoder 將這個固定長度的向量變成可變長度的目標的信號序列。

 

這個結構最重要的地方在於輸入序列和輸出序列的長度是可變的,可以用於翻譯,聊天機器人,句法分析,文本摘要等。

 

下面是寫過的 seq2seq 的應用:

 

RNN與機器翻譯
http://www.jianshu.com/p/23b46605857e
如何自動生成文本摘要
http://www.jianshu.com/p/abc7e13abc21
自己動手寫個聊天機器人吧
http://www.jianshu.com/p/d0f4a751012b

 


 

Encoder–Decoder 結構?

 

Cho 在 2014 年提出了 Encoder–Decoder 結構,即由兩個 RNN 組成,
https://arxiv.org/pdf/1406.1078.pdf

 

 

(其中的 RNNCell 可以用 RNN ,GRU,LSTM 等結構)

 

在每個時刻, Encoder 中輸入一個字/詞,隱藏層就會根據這個公式而改變,

 

到最后一個字/詞 XT 時 ,隱藏層輸出 c ,因為 RNN 的特點就是把前面每一步的輸入信息都考慮進來了,所以 c 相當於把整個句子的信息都包含了,可以看成整個句子的一個語義表示。

 

Decoder 在 t 時刻的隱藏層狀態 ht 由 ht−1,yt−1,c 決定:

 

yt 是由 ht,yt−1,c 決定:

 

f 和 g 都是激活函數,其中 g 函數一般是 softmax。

 

模型最終是要最大化下面這個對數似然條件概率:

 

 

其中每個 (xn, yn) 表示一對輸入輸出的序列, θ 為模型的參數。

 


 

seq2seq 結構?

 

Sutskever 在 2014 年也發表了論文:
https://arxiv.org/pdf/1409.3215.pdf

 

這個模型結構更簡單,

 

 

因為 Decoder 在 t 時刻 yt 是由 ht,yt−1 決定,而沒有 c:

 

論文中的 Encoder 和 Decoder 都用的 LSTM 結構,注意每句話的末尾要有 “” 標志。 Encoder 最后一個時刻的狀態 [cXT,hXT] 就和第一篇論文中說的中間語義向量 c 一樣,它將作為 Decoder 的初始狀態,在 Decoder 中,每個時刻的輸出會作為下一個時刻的輸入,直到 Decoder 在某個時刻預測輸出特殊符號 結束。

 

LSTM 的目的是估計條件概率 p(y1, … , yT′ |x1, … , xT ) ,
它先通過最后一個隱藏層獲得輸入序列 (x1, … , xT ) 的固定長度的向量表達 v,
然后用 LSTM-LM 公式計算輸出序列 y1, … , yT′ 的概率,
在這個公式中,初始狀態就是 v,

 

 

而且用了 4 層的 LSTM,而不是一層:論文中的實驗結果表明深層的要比單層的效果好
下面是個 3 層的例子

 

 

計算公式如下:

 

 

為了便於理解,單層的表示如下:

 

並且對輸入序列做了一個翻轉,即不是把 a, b, c 映射到 α, β, γ, 而是把 c, b, a 映射到 α, β, γ, 這樣的結果是相應的 a 會更接近 α,並且更利於 SGD 建立輸入輸出間的關系。

 


 

參考:
Learning Phrase Representations using RNN Encoder–Decoder
for Statistical Machine Translation
https://arxiv.org/pdf/1406.1078.pdf

 

Sequence to Sequence Learning
with Neural Networks
https://arxiv.org/pdf/1409.3215.pdf

 

Generating Sequences With
Recurrent Neural Networks
https://arxiv.org/pdf/1308.0850.pdf

 


免責聲明!

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



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