概述

Seq2Seq是一个Encoder-Deocder结构的模型,输入是一个序列,输出也是一个序列。

Encoder将一个可变长度的输入序列变为固定长度的向量,Decoder将这个固定长度的向量解码成可变长度的输出序列。

使用x={x1,x2,...,xn}x={x1,x2,...,xn}表示输入语句,y={y1,y2,...,yn}y={y1,y2,...,yn}
代表输出语句,ytyt代表当前输出词。

所有的Seq2Seq模型都是以下目标函数,都是为了优化这个函数:

p(y|x)=∏t=1nyp(yt|y1,y2,...,yt−1,x)p(y|x)=∏t=1nyp(yt|y1,y2,...,yt−1,x)
即输出的ytyt不仅依赖之前的输出{y1,y2,...,yn}{y1,y2,...,yn},还依赖输入语句{x1,x2,...,xn}{x1,x2,...,
xn},模型无论怎么变化都是在该公式的约束下。


【注】

该条件概率模型存在问题:数值下溢问题。

原因:该式中每一项p(yt|y1,y2,...,yt−1,x)p(yt|y1,y2,...,yt−1,x)
都小于1甚至于远远小于1,很多1乘起来,会得到很小很小的数字,造成数值下溢(numerical underflow)。

因此,在实际中一般是将其取log值,求其概率的对数和而不是概率的乘积,因此实际中一般用如下目标函数,目标是最大化该目标函数:

P(y|x)=∑t=1nylogP(yt|y1,y2,...,yt−1,x)P(y|x)=∑t=1nylog⁡P(yt|y1,y2,...,yt−1,x)


改进

Seq2Seq的核心部分是其解码部分,大部分改进基于此:

* greedy search:基础解码方法
* beam search:对greedy search的改进
* attention:它的引入使得解码时,每一步可以有针对地关注与当前有关的编码结果,从而减小了编码器输出表示的学习难度,也更容易学到长期的依赖关系。
* memory network:从外部获取知识。
* 其他方法:

* 堆叠多层RNN的Decoder
* 增加dropout机制
* 与Encoder建立残差连接
最早模型

Cho在2014年Learning Phrase Representations using RNN Encoder–Decoder for
Statistical Machine Translation <https://arxiv.org/pdf/1406.1078.pdf>提出该模型。



该模型包括Encoder和Decoder两个部分,图中每个圆圈是一个RNN Cell,可以是RNN,也可以是LSTM、GRU等。

【流程】

*
Encoder

* 每个时刻输入一个词,隐藏层状态根据公式ht=f(ht−1,xt)ht=f(ht−1,xt)改变。其中激活函数ff
可以是sigmod,tanh,ReLU,sotfplus,LSTM等。
* 读完序列的每一个词之后,会得到一个固定长度向量c=tanh(VhN)c=tanh(VhN)
*
Decoder

*
由结构图可以看出,t时刻的隐藏层状态htht由ht−1,yt−1,cht−1,yt−1,c决定:ht=f(ht−1,yt−1,c)ht=f(ht−1,yt−1
,c),其中h0=tanh(V′c)h0=tanh(V′c)

*
最后的输出ytyt是由ht,yt−1,cht,yt−1,c决定

P=(yt|yt−1,yt−2,...,y1,c)=g(ht,yt−1,c)P=(yt|yt−1,yt−2,...,y1,c)=g(ht,yt−1,c)
以上,f,gf,g都是激活函数,其中gg一般是softmax


*
目标

* 最大化对数似然条件概率
maxθ1N∑n=1Nlogpθ(yn|xn)maxθ1N∑n=1Nlogpθ(yn|xn)
改进模型

该模型由Sequence to Sequence Learning with Neural Networks
<https://arxiv.org/pdf/1409.3215.pdf>提出。



该模型包括Encoder和Decoder两个部分,图中每个圆圈是一个RNN
Cell,可以是RNN,也可以是LSTM、GRU等。本篇论文中Encoder、Decoder用的都是LSTM

【流程】

*
Encoder

同上个模型。如下图所示:



*
Decoder

*

初始状态:Encoder得到的向量表示即Encoder最后一个时间步长的隐藏层状态会作为Decoder的初始状态输入。通过激活函数与softmax层得到候选symbols,筛选出概率最大的symbol,作为下一时刻的输入。

*
t时刻的输出ytyt:由ht,yt−1ht,yt−1决定,而没有cc :p(yt)=f(ht,yt−1)p(yt)=f(ht,yt−1)
。即在Decoder中,每个时刻tt的输出ytyt会作为下一时刻t+1t+1的输入,直到Decoder在某个时刻预测出结束符号才停止。



*
目标函数:

p(y1,...,yT′|x1,...,xT)=∏t=1T′p(yt|v,y1,...,yt−1)p(y1,...,yT′|x1,...,xT)=∏t=1T′
p(yt|v,y1,...,yt−1)


*
最终多层模型采用下图说明:



【区别】

与上个模型的区别是Decoder部分

* 上个模型Decoder输入是上一时刻的输出和C向量,而是前一时刻的目标值。
Seq2Seq with Attention

Attention机制由NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND
TRANSLATE <https://arxiv.org/pdf/1409.0473.pdf>提出。


【流程】

*
Encoder

* 使用双向RNN
* hj→hj→表示前向RNN的隐藏层状态,hj^hj^表示反向隐藏层状态
* hjhj最终因状态将两者拼接起来,即hj=[hj→,hj^]hj=[hj→,hj^]
*
Decoder

*
每一时刻ii的输出由三个要素决定:时刻ii的隐状态sisi,attention计算得到的context向量cici,上一时刻i−1i−1的输出yi−1yi−1

p(yi|y1,...,yi−1,X)=yi=g(yi−1,si,ci)p(yi|y1,...,yi−1,X)=yi=g(yi−1,si,ci)
其中sisi由三个要素决定:时刻ii的隐状态,attention计算得到的context向量cici,上一时刻i−1i−1输出yi−1yi−1
si=f(si−1,yi−1,ci)si=f(si−1,yi−1,ci)


*
其中cici由以下公式得到

ci=∑j=1Txαijhjαij=exp(eij)∑Txk=1exp(eik)eij=a(si−1,hj)ci=∑j=1Txαijhjαij=exp(eij
)∑k=1Txexp(eik)eij=a(si−1,hj)
其中


*
cici是输入序列全部隐状态的h1,h2,...,hTh1,h2,...,hT的加权和

*
αijαij代表权重参数,它并不是一个固定权重,而是由另一个神经网络训练得到

【总结】

* context向量cici通过计算输入中的每个单词的权重,加权求和得到。
* 其中权重αijαij即Decoder的上一时刻i−1i−1隐状态si−1si−1和Encoder的最终隐状态hjhj通过非线性函数得到。

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信