机器学习 | 注意力机制
注意力机制 (Attention):是人工神经网络中一种模仿认知注意力的技术。这种机制可以增强神经网络输入数据中某些部分的权重,同时减弱其他部分的权重,以此将网络的关注点聚焦于数据中最重要的一小部分。数据中哪些部分比其他部分更重要取决于上下文。
本篇文章为论文 Attention Is All You Need 的笔记,因此本文的注意力机制架构遵照原论文。
1 总览
首先,我们通过非常简略的数学方式来总览一下注意力机制的操作过程,感受一下总体框架后,下文再进行详细展开。
对于一段文字:
首先将其切分为 Token(假设按词切分):
然后通过 Embedding 将单词转为
然后给词向量乘上 Query 矩阵
然后给词向量乘上 Key 矩阵
然后将查询向量和键向量一一做向量点积,得到一个实数,这些值组成一个新的矩阵:
然后对这些值进行列 SoftMax 操作:
然后给每一项乘上 Value 矩阵
然后计算每列的更新值
原始
上述过程的结构可以以下图方式展现:
2 Query 查询
从 Token 嵌入得来的词向量是没有上下文语意信息的,例如 Transformer
到底指变形金刚、变压器还是一种机器学习模型,词向量中是没有相关信息的。为了获取这个 Token 具体的含义,就得从上下文 Token 中获取具体的信息。同时,有些上下文与该 Token 关联不大,比如 The
,但有些词语对该 Token 关联非常大,例如 Model
. 注意力机制便是让模型自己学会上下文之间的关联程度。
获取上下文关联程度的第一步是是求得查询向量,可以将查询向量理解为该 Token 对上下文提出的“问题”,接下来根据上下文 Token 的”回应“来确认他们之间的关联程度。
对于每个 Token 的词向量
其中,
3 Key 键
Key 向量便是对 Token 提出”问题“的”回应“。
对于每个 Token 的词向量
其中,
获得了 Key 值后,就要通过 Compatibility Function (评分函数) 来获得关联程度了。评分函数可以是向量点积:
上面我们说到原论文中
计算得到关联程度形成矩阵:
接下来有一个可选步骤——Mask (掩码)。对于大语言模型,训练时是通过上文来生成下文,因此上文是不可以从下文获取信息的,否则这就泄露了要预测的信息,造成干扰。但对于文本翻译,就不存在这种问题,因此掩码就是不必要的。
为了防止上文获取下文信息,可以直接将这些关联程度项设为
还需要注意的一点是,经过点积评分函数后会扩大原数据的方差,导致 Softmax 过于关注小梯度:若
再进行列 SoftMax,这些被置为
4 Value 值
计算了关联程度,下一步就是与 Value 矩阵相乘获得最终的更新,记上述矩阵
其中,
综上,注意力头总参数量为:
上述过程的结构可以以下图方式展现:
用公式来表示就是:
5 多头注意力
实际情况中,
多头注意力的思想就是,与其用一个完整维度的大参数单头注意力,不如将其拆分为多个低维度的小参数注意力,称为多头注意力。这样的效果要好于单头注意力。
我们可以用低秩分解的思想,将
低秩拆分是一种有损压缩技术,可以在一定程度上保留数据的重要特征,但无法完全保留原始数据的所有信息。另外,我们也可以将这个操作理解为做了两次线性映射:先将
矩阵乘法可以看作线性映射,例如有一个
维向量 ,将它与 的矩阵 相乘可以得到一个 维向量 :
这个矩阵
就实现了将 维空间的向量 映射到 维空间里,变成向量 .
上述拆分后仍然是单头注意力,接下来就是叠加注意力头了。最简单想到的一种方式是,直接将单头注意力复制
但是原论文并没有用这个方式。在原论文中,将单头注意力复制
- 每个注意力头拥有独立的参数
- 每个注意力头求得
,显然这个 是 维的向量。 - 将
个注意力头得到的结果向量拼接得到 ,显然这个 是 维的向量。 - 然后将
用 重新映射回 维的空间,显然此时 应当是 的矩阵。
综上,对于
对于原论文,
上述过程的结构可以以下图方式展现:
需要注意的是,上面原论文的图将表示为 Linear。虽说看着不一样,实际上是完全一样的,只是符号的区别。
本文采用 CC BY-SA 4.0 许可,本文 Markdown 源码:Haotian-BiJi