概述
Seq2Seq是一个Encoder-Deocder结构的模型,输入是一个序列,输出也是一个序列。
Encoder将一个可变长度的输入序列变为固定长度的向量,Decoder将这个固定长度的向量解码成可变长度的输出序列。
使用表示输入语句,代表输出语句,代表当前输出词。
所有的Seq2Seq模型都是以下目标函数,都是为了优化这个函数:
即输出的不仅依赖之前的输出,还依赖输入语句,模型无论怎么变化都是在该公式的约束下。
【注】
该条件概率模型存在问题:数值下溢问题。
原因:该式中每一项都小于1甚至于远远小于1,很多1乘起来,会得到很小很小的数字,造成数值下溢(numerical underflow)。
因此,在实际中一般是将其取log值,求其概率的对数和而不是概率的乘积,因此实际中一般用如下目标函数,目标是最大化该目标函数:
改进
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提出该模型。
该模型包括Encoder和Decoder两个部分,图中每个圆圈是一个RNN Cell,可以是RNN,也可以是LSTM、GRU等。
【流程】
-
Encoder
- 每个时刻输入一个词,隐藏层状态根据公式改变。其中**函数可以是sigmod,tanh,ReLU,sotfplus,LSTM等。
- 读完序列的每一个词之后,会得到一个固定长度向量
-
Decoder
由结构图可以看出,t时刻的隐藏层状态由决定:,其中
-
最后的输出是由决定
以上,都是**函数,其中一般是softmax
-
目标
- 最大化对数似然条件概率
- 最大化对数似然条件概率
改进模型
该模型由Sequence to Sequence Learning with Neural Networks提出。
该模型包括Encoder和Decoder两个部分,图中每个圆圈是一个RNN Cell,可以是RNN,也可以是LSTM、GRU等。本篇论文中Encoder、Decoder用的都是LSTM
【流程】
-
Encoder
同上个模型。如下图所示:
-
Decoder
初始状态:Encoder得到的向量表示即Encoder最后一个时间步长的隐藏层状态会作为Decoder的初始状态输入。通过**函数与softmax层得到候选symbols,筛选出概率最大的symbol,作为下一时刻的输入。
t时刻的输出:由决定,而没有 :。即在Decoder中,每个时刻的输出会作为下一时刻的输入,直到Decoder在某个时刻预测出结束符号才停止。
-
目标函数:
-
最终多层模型采用下图说明:
【区别】
与上个模型的区别是Decoder部分
- 上个模型Decoder输入是上一时刻的输出和C向量,而是前一时刻的目标值。
Seq2Seq with Attention
Attention机制由NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE提出。
【流程】
-
Encoder
- 使用双向RNN
- 表示前向RNN的隐藏层状态,表示反向隐藏层状态
- 最终因状态将两者拼接起来,即
-
Decoder
-
每一时刻的输出由三个要素决定:时刻的隐状态,attention计算得到的context向量,上一时刻的输出
其中由三个要素决定:时刻的隐状态,attention计算得到的context向量,上一时刻输出 -
其中由以下公式得到
其中 是输入序列全部隐状态的的加权和
代表权重参数,它并不是一个固定权重,而是由另一个神经网络训练得到
-
【总结】
- context向量通过计算输入中的每个单词的权重,加权求和得到。
- 其中权重即Decoder的上一时刻隐状态和Encoder的最终隐状态通过非线性函数得到。