Seq2Seq--原理

seq to seq
Seq2Seq 模型顾名思义,输入一个序列,用一个 RNN (Encoder)编码成一个向量 u,再用另一个 RNN (Decoder)解码成一个序列输出,且输出序列的长度是可变的。用途很广,机器翻译,自动摘要,对话系统,只要是序列对序列的问题都能来搞。

seq2seq 是一个Encoder–Decoder 结构的网络,它的输入是一个序列,输出也是一个序列, Encoder 中将一个可变长度的信号序列变为固定长度的向量表达,Decoder 将这个固定长度的向量变成可变长度的目标的信号序列。

Seq2Seq--原理_第1张图片
在训练阶段可能对rnn的输出不处理,直接用target的序列作为下时刻的输入。

Seq2Seq--原理_第2张图片
而预测阶段会将rnn的输出当成是下一时刻的输入,因为此时已经没有target序列可以作为输入了,如上图二。

encoder-decoder结构
seq2seq属于encoder-decoder结构的一种,这里看看常见的encoder-decoder结构,基本思想就是利用两个RNN,一个RNN作为encoder,另一个RNN作为decoder。encoder负责将输入序列压缩成指定长度的向量,这个向量就可以看成是这个序列的语义,这个过程称为编码,如下图,获取语义向量最简单的方式就是直接将最后一个输入的隐状态作为语义向量C。也可以对最后一个隐含状态做一个变换得到语义向量,还可以将输入序列的所有隐含状态做一个变换得到语义变量。
Seq2Seq--原理_第3张图片
而decoder则负责根据语义向量生成指定的序列,这个过程也称为解码,如下图,最简单的方式是将encoder得到的语义变量作为初始状态输入到decoder的rnn中,得到输出序列。可以看到上一时刻的输出会作为当前时刻的输入,而且其中语义向量C只作为初始状态参与运算,后面的运算都与语义向量C无关。
Seq2Seq--原理_第4张图片
decoder处理方式还有另外一种,就是语义向量C参与了序列所有时刻的运算,如下图,上一时刻的输出仍然作为当前时刻的输入,但语义向量C会参与所有时刻的运算。
Seq2Seq--原理_第5张图片

Seq2Seq--原理_第6张图片
我们知道RNN是可以学习概率分布然后进行预测的,比如我们输入t个时刻的数据后预测t+1时刻的数据,为了得到概率分布一般会在RNN的输出层使用softmax激活函数,就可以得到每个分类的概率。

对于RNN,对于某个序列,对于时刻t,它的输出概率为在这里插入图片描述,则softmax层每个神经元的计算如下:

p(xt,j|x1,...,xt−1)=exp(wjht)∑Ki=1exp(wiht)p(xt,j|x1,...,xt−1)=exp(wjht)∑i=1Kexp(wiht)
其中ht是隐含状态,它与上一时刻的状态及当前输入有关,即ht=f(ht−1,xt)。

那么整个序列的概率就为
p(x)=∏Tt=1p(xt|x1,...,xt−1)p(x)=∏t=1Tp(xt|x1,...,xt−1)

而对于encoder-decoder模型,设有输入序列x1,…,xT,输出序列y1,…,yT,输入序列和输出序列的长度可能不同。那么其实就是要根据输入序列去得到输出序列的可能,于是有下面的条件概率,x1,…,xT发生的情况下y1,…,yT‘发生的概率等于p(yt|v,y1,…,yt−1)连乘。其中v表示x1,…,xT对应的隐含状态向量,它其实可以等同表示输入序列。


此时,ht=f(ht−1,yt−1,v),decoder的隐含状态与上一时刻状态、上一时刻输出和状态向量v都有关,这里不同于RNN,RNN是与当前时刻输入相关,而decoder是将上一时刻的输出输入到RNN中。于是decoder的某一时刻的概率分布可用下式表示,

p(yt|v,y1,...,yt−1)=g(ht,yt−1,v)p(yt|v,y1,...,yt−1)=g(ht,yt−1,v)
所以对于训练样本,我们要做的就是在整个训练样本下,所有样本的p(y1,…,yT‘|x1,…,xT)概率之和最大,对应的对数似然条件概率函数为,
在这里插入图片描述
使之最大化,θ则是待确定的模型参数。
————————————————
版权声明:本文为CSDN博主「超人汪小建(seaboat)」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wangyangzhizhou/article/details/77883152

你可能感兴趣的:(Artificial,Neural,Networks)