一,原始seq2seq模型
1,seq2seq模型的本质
seq2seq属于encoder-decoder 结构的一种,这里看看常见的encoder-decoder结构,也就是编码-解码模型。基本思想就是利用两个RNN,一个RNN作为encoder,另一个RNN作为decoder。
2,encoder
encoder负责将输入序列压缩成指定长度的向量, 这个向量就可以看成是这个序列的语义,这个过程称为编码,如下图,获取语义向量最简单的方式就是直接将最后一个输入的隐状态作为语义向量C。 也可以对最后一个隐含状态做一个变换得到语义向量,还可以将输入序列的所有隐含状态做一个变换得到语义变量。
3,decoder
decoder则负责根据语义向量生成指定的序列,这个过程也称为解码, 如下图,最简单的方式是将encoder得到的语义变量作为初始状态输入到decoder的RNN中,得到输出序列。可以看到上一时刻的输出会作为当前时刻的输入,而且其中语义向量C只作为初始状态参与运算,后面的运算都与语义向量C无关。
4,seq2seq中Encoder-Decoder结构
seq2seq 作为 2015 - 2016 年较为流行的机器翻译模型,如下入所示,seq2seq模型包含 Encoder和Decoder两部分,分别为RNN模型或LSTM等其变种等模型,Encoder输出S隐含状态,该隐藏状态和初始值NULL一同输入到Docoder模型中,作为Docoder的输入值。
5,原始seq2seq的缺点
当编码长度越长,前面离隐藏状态远的信息就会被稀释,这样的状态就不能被保存在隐藏状态S中,会影响翻译的质量。
详细信息:https://baijiahao.baidu.com/s?id=1650496167914890612
二,基于attention的seq2seq模型
1,模型结构
a,encoder_outputs
Enoder中每一步的输出都属于encoder_outputs
b,hidden_state
Decoder中每一步的输出都属于hidden_state
c,context_vector
Decoder中每一步的hidden_state去和encoder_ouputs计算attetion,attetion是一个向量,代表着权重,Encoder中的encoder_outputs的元素个数应该和attetion向量的长度相等,attention向量中的每一个都代表着Encoder输出的权重。attetion权重和encoder_outputs做加权求和,得到了一个context_vector,再将context_vector和input一起输入给每一步的Decoder做词语的生成,生成后下一步的hidden_state再和encoder_outputs计算attetion权重,并做加权求和得到context_vector,和input输入给下一步的Decoder,以此类推。
2,计算模型
a,计算符号
b,attention权重sore的计算
注:
- 1, 在Babdanau注意力计算sore中,因为EO是Encoder的多步结果,H为Decoder的某一部的结果,维度并不对应,tf会将H拷贝EO长度的份数,并分别和EO的每一个向量做加法运算。sore得到了一个和EO长度一样的一个向量。
- 2,将得到的score代码softmax激活函数,得到0-1的数字,这是可以称之为权重。
- 3,将得到的权重和EO做加权求和,得到一个context,此时EO是一个矩阵,attention_weights是一个向量,得到的context是一个向量。
- 4,将context和经过enbding的x拼接到一起,输入给下一步。