seq2seq attention
1.seq2seq:分为encoder和decoder
a.在decoder中,第一时刻输入的是上encoder最后一时刻的状态,如果用了双向的rnn,那么一般使用逆序的最后一个时刻的输出(网上说实验结果比较好)
b.每一时刻都有一个输出,即:[batch_size, decoder_output_size],经过一个MLP后,都跟词汇表中的每一个词都对应了一个概率,即: [batch_size, vocab_size]。
c.将每一个时刻的输出拼接起来,那么就是[batch_size, decoder_timestep, vocab_size],然后用beam search去寻找最优的解。
2.seq2seq attention: 在decoder的时候加入了attention机制
解释
a.在decoder中,第一时刻输入的是上encoder最后一时刻的状态,如果用了双向的rnn,那么一般使用逆序的最后一个时刻的输出c0(网上说实验结果比较好),以后每一个时刻的输入则是上一时刻的输出与encoder的隐状态计算attention加权的结果。
b.attention:
1).用c0去跟encoder的所有时间步骤中的输出,进行match,即:用c0去和所有的输入求一个相似度,那么这个就是一个权值(attention的权值),含义就是当前时刻的输入是有encoder中的哪几个时刻来决定的,就是神经网络翻译中的那张经典的图。
2).decoder第一个时间步骤c1,会输出一个向量,那么再重复1)中的步骤用c1替换c0
c.将每一个时刻的输出拼接起来,那么就是[batch_size, decoder_timestep, vocab_size],然后用beam search去寻找最优的解。
代码实现
a. Wh * hi 可以用线性来计算直接一个全连接层,也可以用卷积方法来计算,但是无论用哪种方法进行计算,计算出来的shape都要是跟原来encoder state一样(这里卷积有点不同,因为输入的要是4D tensor,所以输入的是[batch_size, time_step, 1, embedd_size], 采用[1, 1]的卷积核,具体可以参考pointer generator实现),得到 r1,shape [batch_size, time_step, embedd_size]
b. decoder端t时刻的输入和上一时刻的context vector做一个线性变换,得到输入到LSTM的输入;LSTM输出output和state,output可以用来经过一个线性变换求词表,state用于计算attention
1)在训练时,第一的时间步骤时,context vector为0
2)在预测时,context vector为encoder输出的state经过attention后的结果
c. 用state经过一个线性变化,并加上bias,就等于这部分 WS * st + b,得到r2,shape [batch_size, embedd_size]
d. 最后再经过vt * tanh(r1 + r2)得到的r3,再对r3进行求和,得到r4, shape [batch_size, time_step], 最后再经过softmax,shape [batch_size, time_step],这里要经过mask,即让为0的部分概率为0
Seq2Seq Attention Decoder Tensorflow Api
https://tensorflow.google.cn/api_docs/python/tf/contrib/legacy_seq2seq/attention_decoder