在上节的seq2seq框架中,让两个循环神经网络(RNN)构成了 编码器-解码器 结构。其中编码器逐个读取输入词,获得固定维度的向量表示,然后解码器基于这些输入逐个提取输出词。
所以对于较长的输入文本,结构会变成如下图所示
所以我们如果可以向解码器提供每个编码器时间步的向量表示,而不是只把最终的给它,是不是就能改进翻译的结果呢,这就需要引入注意力机制。
注意力机制的本质:通过为每个单词分配值,注意力机制可以为不同单词分配不同的注意力。然后利用softmax对编码器隐藏状态进行加权求和,得到上下文向量(Context Vector)。
注意力层的实现可以分成6个步骤。
首先需要准备一个解码器隐藏状态和所有可用的编码器的隐藏状态
分数(标量)通过评分函数获得。图示是解码器和编码器隐藏状态之间的点积。
将上一步的得分放到softmax层,这些得分代表注意力分布。
将每个编码器隐藏状态与对应的softmax得分相乘,获得alignment向量
将所有的alignment向量相加,生成上下文向量(Context Vector)
最后一步就是把生成的上下文向量给编码器作为输入使用
在没有本节学习之前,我一直以为注意力机制就是Transformer中使用的自注意力机制。通过注意力机制的过程学习,我才发现,自注意力机制只是注意力机制中的一种,并且Transformer这种也只是自注意力机制的一种实现形式。宏观上来看,自注意力机制可以用在更广泛的场景中,比如计算一下特征图每层之间的注意力分数,叫做通道注意力机制。