动机
机器翻译中,每个生成的单词可能相关于源句子中的不同词。但Seq2sqe模型不能对此直接建模。
简单的Seq2Seq模型存在一个问题,即它将整个输入序列的信息压缩到了一个固定长度的向量中,这可能导致信息丢失,尤其是当输入序列很长的时候。此外,不同单词对于最终输出的重要性可能不同,但在传统模型中每个时间步的隐藏状态都被同等对待。
往Seq2Seq中加入注意力
注意力机制允许解码器在生成每一个输出元素时,动态地关注输入序列的不同部分。具体来说,注意力机制会在每一步解码时计算一个与当前解码步骤相关的权重分布,该分布表示输入序列中每个位置对当前预测的重要性。通过这种方式,模型能够“聚焦”于输入序列中与当前预测最相关的信息上。
编码器对每次词的输出(hidden_state)作为注意力机制的key和value。
query则是解码器对上一个词的预测输出,即解码器的前一个隐状态。
计算得出注意力后,注意力的输出和下一个词的embedding合并作为解码器RNN的输入。
加入注意力机制后的Seq2Seq模型工作流程大致如下:
- 编码阶段:编码器读取整个输入序列并为每个输入元素生成相应的隐藏状态。
- 初始化解码器:通常用编码器最后一个时间步产生的隐藏状态来初始化解码器的第一个隐藏状态。
- 解码阶段:
- 在解码器生成每个输出词的过程中,首先根据当前解码器的状态以及所有编码器隐藏状态来计算注意力分数。
- 使用这些注意力分数作为权重,对编码器的所有隐藏状态进行加权求和,得到当前步骤的上下文向量。
- 将上下文向量、前一时刻的输出以及解码器当前状态一起送入解码器以产生下一个词的概率分布,并选择最高概率的词作为输出。
- 重复上述过程直到达到最大长度或者遇到结束标志为止。
相当于,加入注意力之前,解码器总以上一个RNN的输出作为当前的隐状态。但现在,可以对所有编码器的隐状态加权求和,能够更加“注意”与当前预测相关的信息。
总结
Seq2Seq中通过hidden_state在编码器和解码器中传递信息
注意力机制可以根据解码器RNN的输出来匹配到合适的柏宁玛琪RNN输出来更有效地传递信息。