seq2seq详细总结
1.前言
seq2seq屬于encoder-decoder結(jié)構(gòu)的一種,基本思想就是利用兩個(gè)RNN,一個(gè)RNN作為encoder,另一個(gè)RNN作為decoder。
為什么不直接使用一個(gè) RNN 呢?有一種RNN結(jié)構(gòu)是 many to many, 但它只適用于輸出序列的長度和輸入序列的長度相等的情況,結(jié)構(gòu)圖如下
seq2seq框架很好地解決了這個(gè)問題
seq2seq介紹:
seq2seq模型,全稱Sequence to sequence,由Encoder和Decoder兩個(gè)部分組成,每部分都是一個(gè)RNNCell(RNN、LSTM、GRU等)結(jié)構(gòu)。Encoder將一個(gè)輸入序列編碼為一個(gè)固定長度的語義向量c,c可以表示輸入句子的語義信息,Decoder將該語義向量解碼為另一個(gè)序列。
特點(diǎn):輸入序列和輸出序列的長度是可變的,輸出序列長度可以不等于輸入序列長度。
應(yīng)用:比如機(jī)器翻譯、聊天,問答系統(tǒng)等
seq2seq有兩種常見的框架,下面逐一介紹:
2. seq2seq框架1
該框架由這篇論文提出:Sutskever et al.(2014) Sequence to Sequence Learning with Neural Networks。結(jié)構(gòu)圖如下
輸入序列是:x1, x2, x3, x4。 輸出序列是 y1, y2, y3
encoder負(fù)責(zé)將輸入序列壓縮成指定維度的向量c,這個(gè)向量就可以看成是這個(gè)序列的語義信息了,這個(gè)過程稱為編碼。
這個(gè)框架的特點(diǎn):在decoder部分, 上一時(shí)刻的輸出y_t-1會(huì)作為當(dāng)前時(shí)刻的輸入,而且語義向量c只作為初始隱層狀態(tài)參與運(yùn)算,后面的運(yùn)算都與語義向量C無關(guān).
Encoder
獲取語義向量c最簡單的方式就是: ①直接將輸入序列最后一個(gè)時(shí)刻的隱藏狀態(tài)作為語義向量C;②也可以對(duì)最后一個(gè)隱含狀態(tài)做一個(gè)維度變換得到指定維度的語義向量c。具體看這兩個(gè)方法:
假設(shè):RNNCell 就是簡單的 RNN
①
W,V是權(quán)值矩陣,可以學(xué)習(xí)得到,[ ]中括號(hào)表示拼接
h_t 是輸入序列每個(gè)時(shí)刻 t 的隱層狀態(tài),y_t 是輸入序列每個(gè)時(shí)刻 t 的輸出(后面并不要它)
我們要一直計(jì)算到最后一個(gè)時(shí)刻 h_T的隱層狀態(tài)值,令 h_T = c
② 假設(shè)我們只要50 維的 c 向量,而 h_T 是 100 維,怎么辦呢? 我想大家都能想到就是接一個(gè)線性層(假設(shè)線性層權(quán)重是 Wc),因?yàn)榈玫降闹涤写笥行?#xff0c;我們用 tanh 函數(shù)把它歸一化到0均值,也就是(-1,1)之間。注意:當(dāng)RNNCell 就是簡單的 LSTM時(shí)不需要tanh,因?yàn)檫@個(gè)模型輸出就是tanh后的。公式如下
Decoder
接收到Encoder來的語義向量 c,首先輸入一個(gè)開始信號(hào)y0(比如為 < START>),然后計(jì)算 h1’ ,當(dāng)然不能直接把< START>輸進(jìn)去,要輸入它的embedding向量
W,V是權(quán)值矩陣,可以學(xué)習(xí)得到,[ ] 中括號(hào)表示拼接
h_1‘ 是輸出序列的初始隱層狀態(tài),y_1’ 是輸出序列初始時(shí)刻的概率分布,向量中的每個(gè)值是對(duì)應(yīng)單詞的概率,為|V|維向量,|V|為詞庫大小
o_1是 y_1中最大概率值對(duì)應(yīng)的單詞
e(o_1) 是單詞 o_1 的embedding 向量
有了 h_1’ 和 y_1’,剩下時(shí)刻按照如下公式計(jì)算
可以看到剩余時(shí)刻,c 都是沒有參與的
直到預(yù)測值為 < END > 時(shí)結(jié)束預(yù)測。
畫個(gè)圖,便于大家理解輸入的關(guān)系
3.seq2seq 框架2
該框架由論文Cho et al.(2014) Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation
結(jié)構(gòu)圖如下:
這個(gè)模型的特點(diǎn):語義向量C參與了輸出序列所有時(shí)刻的運(yùn)算,如上圖從c 出發(fā)的箭頭既指向圓圈(就是decoder的隱層狀態(tài)),又指向了輸出 y
這篇論文的 RNNCeil 是 GRU,那么就以GRU為例
Encoder
如圖:
我們要一直計(jì)算到最后一個(gè)時(shí)刻的隱層狀態(tài) h_T, 然后按① 或 ②的方法計(jì)算出語義向量c
Decoder
接收到Encoder來的語義向量 c,首先輸入一個(gè)開始信號(hào)y0(比如為 < START>),然后計(jì)算 h1’ ,當(dāng)然不能直接把< START>輸進(jìn)去,要輸入它的embedding向量, 由于語義向量 c 作用于Decoder的每一時(shí)刻,可以把公式合并成一個(gè)
注意:不要弄混編碼時(shí)的輸出 y_t, 和解碼時(shí)的輸出 y_t’, 編碼的輸出 y_t我們是不要它的
上面公式中: [ ] 同樣表示拼接,* 表示元素級(jí)別的乘法,要求符號(hào)兩邊矩陣維度相同
o_t 是 t 時(shí)刻的單詞, e(o_t) 是單詞 o_t 的 embedding向量
y_t’ 是 t 時(shí)刻的輸出概率分布,向量中的每個(gè)值是對(duì)應(yīng)單詞的概率,維度為 |V|, |V|為詞庫大小
直到預(yù)測值為 < END > 時(shí)結(jié)束預(yù)測。
仍然畫張圖便于理解
4. seq2seq 的訓(xùn)練過程
我們以seq2seq框架2為例,假如要訓(xùn)練這樣的數(shù)據(jù)
在Decoder部分,我們是可以計(jì)算出每個(gè)時(shí)刻的單詞概率分布(維度為|V|), 只要把每個(gè)時(shí)刻的單詞概率分布連乘,就可以得到我們的目標(biāo)函數(shù)了
例如上圖:X是輸入序列“機(jī)器學(xué)習(xí)", 輸出序列y1, y2
第一時(shí)刻:p(y1| X) = p(machine | < bos >, c)
第二時(shí)刻:p(y2| X) = p(learning | machine, c)
目標(biāo)函數(shù)是:p(y1, y2| X) = p(machine | < bos >, c) ? p(learning | machine, c)(通常會(huì)轉(zhuǎn)化為log形式)
用官方一點(diǎn)的話講:
設(shè)有輸入序列X(x1,x2,…,xT),輸出序列Y(y1,y2,…yT’),輸入序列和輸出序列的長度可能不同即T 和 T‘ 可能不同。那么其實(shí)就需要根據(jù)輸入序列去得到輸出序列可能輸出的詞概率,于是有下面的條件概率:x1,x2,…,xT發(fā)生的情況下,y1,y2,…yT 發(fā)生的概率等于p( yt | y1, y2, …y_t-1, c) 的連乘
用公式表示目標(biāo)函數(shù):
現(xiàn)在問題是如何求 p( yt | y1,y2…y_t-1, c)的形式
下面直接上公式:
符號(hào)的意思跟上面說的一樣; 這里 g 表示一個(gè) softmax 層,其實(shí)就是下面這個(gè)概率。加上 ’ 只是為了區(qū)分Encoder 和 Decoder 部分,大家可以不用糾結(jié)于此
然后公式中出現(xiàn)了 h_t’,也直接上公式
符號(hào)的意思跟上面說的一樣; 這里 f 取決于你用的RNNCeil , 比如 這里用 RGU, 那么 h_t’ 就是:
所以對(duì)于訓(xùn)練樣本,我們要做的就是在整個(gè)訓(xùn)練樣本下,所有樣本的條件概率之和最大。對(duì)應(yīng)的對(duì)數(shù)似然條件概率函數(shù)為
樣本形式: < x, y >, x 是輸入序列,y 是輸出序列。
如樣本 < 我 是 中國 人,l am chinease >
yn: 第 n 個(gè)樣本的輸出序列,xn : 第 n 個(gè)樣本的輸入序列
最后:可以用交叉熵?fù)p失函數(shù)訓(xùn)練模型
總結(jié)
以上是生活随笔為你收集整理的seq2seq详细总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据库课程
- 下一篇: MP1584各种故障分析