Attention详解
Attention机制模仿生物观察行为的内部过程,将内部经验和外部对齐,从而增加部分区域的观察精细度。
Attention机制
在一般的Encoder-Decoder框架中,模型会将所有输入的$X$都转化成语义表示$C$,这将导致Decoder出来的每个字都是同权的考虑了输入中的所有词。例如Tom chase Jerry
目标翻译的结果是:汤姆追逐杰瑞
。在未考虑注意力机制的模型中,汤姆
这个词的翻译收到Tom
、chase
和Jerry
三个词同权重的影响。但实际上,汤姆
这个词的翻译应该受到Tom
这个词的影响最大!
在带有Attention机制的Encoder-Decoder模型需要从序列中学习到每一个元素的重要成都,然后按照重要程度将元素合并。因此,注意力机制可以看作是 Encoder 和 Decoder 之间的接口,它向 Decoder 提供来自每个 Encoder 隐藏状态的信息。通过该设置,模型能够选择性地关注输入序列的有用部分,从而学习它们之间的“对齐”。这就表明,在 Encoder 将输入的序列元素进行编码时,得到的不在是一个固定的语义编码 C ,而是存在多个语义编码,且不同的语义编码由不同的序列元素以不同的权重参数组合而成。一个简单地体现 Attention 机制运行的示意图如下:
在 Attention 机制下,语义编码 $C$ 就不在是输入序列 $X$ 的直接编码了,而是各个元素按其重要程度加权求和得到的,即
$$
C_i=\sum^{T_x}{j=0}{a{ij}f(x_j)}
$$
其中,$i$表示时刻,$j$ 表示序列中的第 $j$ 个元素, $T_x$ 表示序列的长度, $f(⋅)$表示对元素 $x_j$x的编码。$a_{ij}$可以看作是一个概率,反映了元素 $h_j$ 对 $C_i$ 的重要性,可以使用 softmax 来表示:
$$
a_{ij}=\frac{exp(e_{ij})}{\sum_{k=1}^{T_x}exp(e_{ik})}
$$
这里$e_{ij}$ 正是反映了待编码的元素和其它元素之间的匹配度,当匹配度越高时,说明该元素对其的影响越大,则 $a_{ij}$ 的值也就越大。
因此,得出$a_{ij}$ 的过程如下图:
其中,$h_i$表示 Encoder 的转换函数,$F(h_j,H_i)$ 表示预测与目标的匹配打分函数。将以上过程串联起来,则注意力模型的结构如下图所示:
Attention原理
Attention 机制的一个重点就是获得 attention value,即机器翻译中的语义编码 $C_i$。在上一节中我们知道该值是通过输入元素按照不同的权重参数组合而成的,所以我们可以将其定义为一个 attention 函数,比较主流的 attention 函数的机制是采用键值对查询的方式,其工作实质如下图所示:
在自然语言任务中,往往 Key 和 Value 是相同的。需要注意的是,计算出来的 attention value 是一个向量,代表序列元素 $x_j$ 的编码向量,包含了元素 $x_j$ 的上下文关系,即同时包含全局联系和局部联系。全局联系很好理解,因为在计算时考虑了该元素与其他所有元素的相似度计算;而局部联系则是因为在对元素 $x_j$ 进行编码时,重点考虑与其相似度较高的局部元素,尤其是其本身。
Step 1:准备隐藏状态
首先准备第一个 Decoder 的隐藏层状态(红色)和所有可用的 Encoder 隐藏层状态(绿色)。在示例中,有 4 个 Encoder 隐藏状态和 1 个 Decoder 隐藏状态。
Step 2:得到每一个 Encoder 隐藏状态的得分
分值(score)由 score
函数来获得,最简单的方法是直接用 Decoder 隐藏状态和 Encoder 中的每一个隐藏状态进行点积。
Step 3:将所有得分送入 softmax 层
该部分实质上就是对得到的所有分值进行归一化,这样 softmax
之后得到的所有分数相加为 1。而且能够使得原本分值越高的隐藏状态,其对应的概率也越大,从而抑制那些无效或者噪音信息。
Step 4:用每个 Encoder 的隐藏状态乘以 softmax 之后的得分
通过将每个编码器的隐藏状态与其softmax之后的分数(标量)相乘,我们得到 对齐向量 或标注向量。这正是对齐产生的机制。
Step 5:将所有对齐的向量进行累加
对对齐向量进行求和,生成 上下文向量 。上下文向量是前一步的对齐向量的聚合信息。
Step 6:把上下文向量送到 Decoder 中
通过将上下文向量和 Decoder 的上一个隐藏状态一起送入当前的隐藏状态,从而得到解码后的输出。
最终得到完整的注意力层结构如下图所示:
其他理解
Q就是词的查询向量,K是“被查”向量,V是内容向量。
简单来说一句话:Q是最适合查找目标的,K是最适合接收查找的,V就是内容,这三者不一定要一致,所以网络这么设置了三个向量,然后学习出最适合的Q, K, V,以此增强网络的能力。
主要要理解Q,K的意义,可以类比搜索的过程:
假设我们想查一篇文章,我们不会直接把文章的内容打上去,而是会在搜索框输入该文章的关键字,如果我们搜不到,我们往往会再换一个关键字,直到搜到为止,那么可以让我们搜到的关键字就是最适合查找目标文章的关键字。这个最适合查找目标文章的关键字就是Q。
那么搜索引擎拿到我们输入的关键字Q之后,就会把Q和库里面的文章对比,当然搜索引擎为了节省资源加快对比速度,提前把库里面的文章进行了处理提取了关键信息,关键信息有很多,那么那个关键信息能够使得搜索命中率高,那个就是最适合接收查找的关键信息,这个最适合接收查找的关键信息就是K。
使用Q和K计算了相似度之后得到score,这就是相似度评分,之后有了相似度评分,就可以把内容V加权回去了。