记录一下自己所理解的 Attention 机制:首先先从 Encoder-Decoder 框架来宏观角度的看 Attention 机制,再从微观角度来看。
一、Encoder-Decoder 框架
抽象的文本处理领域的Encoder-Decoder框架由此可见,生成 i 时刻要生成的单词:
二、Soft Attention 模型(对比于 Hard 模型:one-hot 编码的固定区域)
上图展示的 Encoder-Decoder 框架没有体现出“注意力模型”,因为在目标句子 Target 中每个单词的生成过程如下:
其中 f 是 Decoder 的非线性变换函数,可以看出,在生成目标句子的单词时,不论生成哪个单词,它们使用的输入句子 Source 的语义编码 C 都是一样的,没有任何区别。而语义编码 C 是由句子 Source 的每个单词经过 Encoder 编码产生的,这意味着不论是生成哪个单词,y1,y2还是y3,其实句子 Source 中任意单词对生成某个目标单词 yi 来说影响力都是相同的,这是为何说这个模型没有体现出注意力的缘由。
真正体现注意力机制的框架如下:
引入注意力模型的 Encoder-Decoder 框架即生成目标句子单词的过程成了下面的形式:
而每个 Ci 可能对应着不同的源语句子单词的注意力分配概率分布,比如对于上面的英汉翻译来说,其对应的信息可能如下:
其中,f2 代表 Encoder 对输入英文单词的某种变换函数,比如 Encoder 是 RNN 模型的话,f2 函数结果是某个时刻输入 xi 后隐层节点的状态值;g 函数一般是对构成的元素加权求和。所以,Attention 形成过程如下图:
问题:分配的概率分布值(0.6,0.2,0.2)如何生成的呢?
以 Encoder 采用 RNN,Decoder 也采用 RNN 模型为例,则 Encoder-Decoder 框架转换成下图:
那么下图很通用的表示了注意力分配概率分布值的计算过程:
注意力分配概率计算物理意义:一般在自然语言处理应用里会把 Attention 模型看作是输出 Target 句子中某个单词和输入 Source 句子每个单词的对齐模型。
三、Attention 机制的本质思想
三阶段计算 Attention 过程在第一个阶段,可以引入不同的函数和计算机制,根据Query和某个Key_i,计算两者的相似性或者相关性,最常见的方法包括:求两者的向量点积、求两者的向量Cosine相似性或者通过再引入额外的神经网络来求值,即如下方式:
Query, Key, Value 的定义
对于一个 Attention 机制而言,定义好 Query, Key, Value 是至关重要的,这一点我个人认为是一个经验工程,看的多了,自然就懂了。 我这里简单举阅读理解与机器翻译的例子:
- 对于机器翻译而言,常见的是: Query 就是上一时刻 Decoder 的输出Si-1 , 而Key,Value 是一样的,指的是 Encoder 中每个单词的上下文表示。
- 对于英语高考阅读理解而言, Query 可以是问题的表示,也可以是问题+选项的表示,而对于Key,Value而言,往往也都是一样的,都指的是文章。而此时Attention的目的就是找出文章中与问题或问题+选项的相关片段,以此来判断我们的问题是否为正确的选项。
由此我们可以看出, Attention 中 Query, Key, Value 的定义都是很灵活的,不同的定义可能产生不一样的化学效果
四、Self-Attention
在 self-attention 中,我们可以认为source = target。 self-attention可以捕捉到句子里面的长依赖关系。 self-attention 是针对句子中所有词两两计算,不存在距离长短这一说。
下面介绍 self-attention 的具体计算:
上图是分别得到 查询向量、键向量、值向量。下图就是全部的流程:
分以下步骤实现:
- 获得查询向量、键向量、值向量。
- 计算得分。这些分数是通过打分单词(所有输入句子的单词)的键向量与“Thinking”的查询向量相点积来计算的。所以如果我们是处理位置最靠前的词的自注意力的话,第一个分数是q1和k1的点积,第二个分数是q1和k2的点积。
- 第三步和第四步是将分数除以8(8是论文中使用的键向量的维数64的平方根,这会让梯度更稳定。这里也可以使用其它值,8只是默认值),然后通过softmax传递结果。softmax的作用是使所有单词的分数归一化,得到的分数都是正值且和为1。
- 将每个值向量乘以softmax分数(这是为了准备之后将它们求和)。这里的直觉是希望关注语义上相关的单词,并弱化不相关的单词(例如,让它们乘以0.001这样的小数)。
- 对加权值向量求和(译注:自注意力的另一种解释就是在编码某个单词时,就是将所有单词的表示(值向量)进行加权求和,而权重是通过该词的表示(键向量)与被编码词表示(查询向量)的点积并通过softmax得到。),然后即得到自注意力层在该位置的输出(在我们的例子中是对于第一个单词)。
注意:self-attention 是针对句子内部,所以并不是输出整个句子的 Attention 结果,而是每个单词的 Attention 结果,与上面介绍的 Encoder-Decoder 机制有点不一样。简单的说:Attention 机制发生在 Target 的元素 Query 和 Source 中的所有元素之间。而 Self Attention 顾名思义,指的不是 Target 和 Source 之间的 Attention 机制,而是 Source 内部元素之间或者 Target 内部元素之间发生的 Attention 机制,也可以理解为 Target=Source 这种特殊情况下的注意力计算机制。
五、Global attention 与 Local attention
Global Attention Local Attention在 soft attention阵营中,很快又划分为两大阵营: Glocal attention 与 Local attention, 二者的区别在于关注的范围大小不同, 其中,Global attention 关注全部的文字序列,而 Local attention 关注的是固定的窗口中的所有文字序列。
比较二者, Global attention 的计算量要比 Local Attention 要大,尤其是对于长句子而言,效率变得很低; 而 Local Attention 只与窗口内的文字相关,因此窗口的大小就显得至关重要了,且在 local attention 中多了一个预测中心词 pt,这有可能会忽略一些重要的词。因此基本不考虑 Local Attention。
网友评论