Loading

注意力机制

Attention is all we need

一、研究背景

一、引入背景与分析

  1. 生物学背景

视觉注意力机制是人类视觉所特有的大脑信号处理机制。人类视觉通过快速扫描全局图像,获得需要重点关注的目标区域,也就是一般所说的注意力焦点,而后对这一区域投入更多注意力资源,以获取更多所需要关注目标的细节信息,抑制其他无用信息。这是人类利用有限的注意力资源从大量信息中快速筛选出高价值信息的手段,是人类在长期进化中形成的一种生存机制,人类视觉注意力机制极大地提高了视觉信息处理的效率与准确性。

注意力模型(Attention Model)被广泛使用在自然语言处理、图像识别及语音识别等各种不同类型的深度学习任务中,是深度学习技术中最值得关注与深入了解的核心技术之一。深度学习中的注意力机制从本质上讲和人类的选择性视觉注意力机制类似,核心目标也是从众多信息中选择出对当前任务目标更关键的信息。


  1. 提出原因:我们为什么需要 Attention
    序列输入时,随着序列的不断增长,原始根据时间步的方式的表现越来越差,这是由于原始的时间步模型设计结构有缺陷,所有的上下文输入信息都被限制到固定长度,整个模型的能力同样受到限制。

  2. Attention 的出现是为了两个解决以下两个问题:

    1. 减小处理高维输入数据的计算负担,通过结构化选取输入的子集,降低数据维度
    2. 使任务处理系统更专注于找到输入数据中显著地与当前输出相关的有用信息,从而提高输出质量.
  3. 具体意义
    Attention 模型的最终目的是帮助类似编解码器这样的框架,更好的学到多种内容模态之间的相互关系,从而更好的表示这些信息,克服其无法解释从而很难设计的缺陷。


二、分类

从 Attention 的作用角度出发,可以分为:

  1. Spatial Attention 空间注意力
  2. Temporal Attention 时间注意力

从Attention的作用方法,也可以分为:

  1. Soft Attention
    所有的数据都会注意,都会计算出相应的注意力权值,不设置筛选条件
  2. Hard Attention
    在生成注意力权重后筛选掉部分不符合条件的注意力,使其权值为 0。即不再注意不符合条件的内容

三、Encoder-Decoder 框架

Encoder-Decoder 框架是一种深度学习领域的研究模式,应用场景异常广泛。该框架不仅仅在文本领域广泛使用,在语音识别、图像处理等领域也经常使用。一般而言,文本处理和语音识别的 Encoder 部分通常采用 RNN 模型,图像处理的 Encoder 一般采用 CNN 模型。

二、Attention机制

一、无注意力机制的Encoder-Decoder模型

图展示的 Encoder-Decoder 框架是没有体现出 “注意力模型” 的,可以把它看作是注意力不集中的分心模型.为什么说它注意力不集中呢?观察下目标句子中每个单词 \(y_i\) 的生成过程如下,其中 \(f\)是 Decoder 的非线性变换函数。

\(\begin{align}y_1 & = f(c)\newline y_2 & = f(c, y_1) \newline y_3 & = f(c, y_1, y_2)\end{align}\)

可以看到,在生成目标句子的第 \(i\) 个单词 \(y_i\) 时,不论生成哪个单词,它们使用的输入句子 Source 的语义编码 \(c\) 都是一样的,没有任何区别。而语义编码 \(c\) 是由句子 Source 的每个单词经过 Encoder 编码产生的,这意味着不论是生成哪个单词,句子 Source 中任意单词对生成某个目标单词 \(y_i\)来说影响力都是相同的,这是为何说这个模型没有体现出注意力的缘由。


二、以翻译模型为例的注意力机制介绍

如果拿机器翻译来解释这个分心模型的 Encoder-Decoder 框架更好理解,比如输入的是英文句子:

Tom chases Jerry

Encoder-Decoder 框架逐步生成中文单词:

"汤姆", "追逐", "杰瑞"

在翻译 “杰瑞” 这个中文单词的时候,分心模型里的每个英文单词对于翻译目标单词 “杰瑞” 贡献是相同的,很明显这不太合理。显然 “Jerry” 对于翻译成 “杰瑞” 更重要,分心模型无法体现这一点的,这就是为何说它没有引入注意力。

没有引入注意力的模型在输入句子比较短的时候问题不大,但如果输入句子比较长,此时所有语义完全通过一个中间语义向量来表示,单词自身的信息已经消失,可想而知会丢失很多细节信息,这也是为何要引入注意力模型的重要原因。上面的例子中,如果引入 Attention 模型的话,应该在翻译 “杰瑞” 的时候,体现出英文单词对于翻译当前中文单词不同的影响程度,比如给出类似下面一个概率分布值:

(Tom, 0.3) (Chases, 0.2) (Jerry, 0.5)

每个英文单词的概率代表了翻译当前单词 “杰瑞” 时,注意力分配模型分配给不同英文单词的注意力大小。这对于正确翻译目标语单词肯定是有帮助的,因为引入了新的信息。同理,目标句子中的每个单词都应该学会其对应的源语句子中单词的注意力分配概率信息。这意味着在生成目标单词 \(y_i\) 的过程中,中间语义信息 \(c\) 会随着 \(i\) 的不同而发生变化,参与实际解码过程的语义信息会更新为 \(c_i\). 理解 Attention 模型的关键就是这里,即由固定的中间语义表示 \(c\) 换成了根据当前输出单词来调整成加入注意力模型的变化的 \(c_i\)

中间语义信息 \(c\) 会随着输入目标的不同而变为 \(c_i\)

加入了Attention机制的Encoder- Decoder模型会变为

\(\begin{align}y_1 & = f(c_1)\newline y_2 & = f(c_2, y_1) \newline y_3 & = f(c_3, y_1, y_2)\end{align}\)

问题则转变为:如何求每个目标\(y_i\)所对应的中间语义变量\(c_i\) ?


三、中间语义变量\(c_i\)如何求解

可以发现,\(c_i\)的不同源于_source_中不同单词\(x_i\)对目标单词\(y_i\)的贡献度不同。

\(\begin{align}C_{tom} & = g(0.6 \times f_2(Tom), 0.2 \times f_2(chases), 0.2 \times f_2(jerry))\newline C_{chases} & = g(0.2 \times f_2(Tom), 0.7 \times f_2(chases), 0.1 \times f_2(jerry)) \newline C_{jerry} & = g(0.3 \times f_2(Tom), 0.2 \times f_2(chases), 0.5 \times f_2(jerry)) \newline \end{align}\)

其中,\(f_2\) 函数代表 Encoder 对输入英文单词的某种变换函数,如果 Encoder 为RNN 模型,\(f_2\) 函数的结果往往是某个时刻输入后隐层节点的状态值。\(g\) 函数代表 Encoder 根据单词的中间表示合成整个句子中间语义表示的变换函数,一般\(g\) 函数就是对构成元素加权求和,即下列公式:

\(c_i = \Sigma_{j=1}^{T_x}\alpha_{ij}h_{j}\)

其中,\(T_x\) 代表输入句子 Source 的长度,\(\alpha_{ij}\)代表在输出第 \(i\)个单词时 Source 输入句子中第 \(j\) 个单词的注意力分配系数, \(h_j\) 则是 Source 输入句子中第 j 个单词的语义编码。

现在的问题为:如何求 \(c_i\)中每个输入单词 \(x_j\)所对应的注意力分配系数 \(\alpha_{ij}\)


四、注意力分配系数 \(\alpha_{ij}\)如何求解

目标:采用_Decoder_模型,在时刻 \(i\) 生成目标单词 \(y_i\)

已知信息:

  1. 生成 \(y_i\)时的隐层节点输出值 \(h_{i}\)
  2. 输入句子 Source 中每个单词 \(x_j\) 对应的 RNN 隐层节点状态 \(H_j\)

方法:

  1. 通过函数 \(F(h_i,H_j)\) 来获得目标单词\(y_i\) 和每个输入单词\(x_j\) 对应的对齐可能性\(f_{ij}\)
  2. 遍历_source_,对单词\(y_{i}\)所得到的所有 \(f_{ij}\)做_softmax_归一化处理,得到\(x_{i}\)对应的概率分布情况

注意事项:

  1. 对于函数\(F\),不同的方法使用不同的\(F\) ,需要根据实际情况进行选取

三、深入理解Attention机制

一、查询思想

Source 中的构成元素想象成是由一系列的 <Key,Value> 数据对构成。给定 Target 中的某个元素 Query,通过计算 Query 和各个 Key 的相似性或者相关性,得到每个 Key 对应 Value 的权重系数,然后对 Value 进行加权求和,即得到了最终的 Attention 数值。

本质上 Attention 机制是对 Source 中元素的 Value 值进行加权求和,而 Query 和 Key 用来计算对应 Value 的权重系数。Value即上文所提输入句子 Source 中每个单词 \(x_j\) 对应的 RNN 隐层节点状态 \(H_j\)

\(Attention(Query,Source ) = \sum_{i=1}^{L_{x}}Similarity(Query,Key_{i}) * Value_{i}\)

其中,\(L_x = \parallel source\parallel\) 代表 Source 的长度,公式含义即如上所述。

当然,从概念上理解,把 Attention 仍然理解为从大量信息中有选择地筛选出少量重要信息并聚焦到这些重要信息上,忽略大多不重要的信息,这种思路仍然成立。聚焦的过程体现在权重系数的计算上,权重越大越聚焦于其对应的 Value 值上,即权重代表了信息的重要性,而 Value 是其对应的信息。

至于 Attention 机制的具体计算过程,可以将其归纳为两个过程:

  1. 根据 Query 和 Key 计算权重系数
    1. 根据 Query 和 Key 计算两者的相似性或者相关性
      • 计算公式1:\(similarity(Query,Key_i) = Query\cdot Key_i\)
      • 计算公式2: \(similarity(Query,Key_i)= MLP(Query,Key_i)\)
      • 计算公式3:\(similarity(Query,Key_i)= \frac{Query \cdot Key_i}{\parallel Query\parallel \cdot \parallel Key_i\parallel }\)
    2. 对Query 和 Key 的相似性分值进行归一化处理
      计算公式:\(\alpha_{i} = softmax(sim_i) = \frac{e^{sim_i}}{\Sigma_{j=1}^{L_x}e^{sim_j}}\)
  2. 根据权重系数对 Value 进行加权求和
    1. 计算公式:\(Attention(Query,Source) = \Sigma_{i=1}^{L_x}\alpha_i \cdot Value_i\)
posted @ 2022-10-09 13:25  MarkL124950  阅读(248)  评论(0)    收藏  举报