67 自注意力【动手学深度学习v2】

自注意力
- 在深度学习中,经常使用卷积神经网络或者循环神经网络对序列进行编码
- 对于 key 、value 和 query ,自注意力有自己的一套选法,因为 key 、value 和 query 的值来自同一组输入,因此被称为自注意力(self-attention)或者内部注意力(intra-attention)
自注意力

- 给定序列是一个长为 n 的序列,每个 xi 是一个长为 d 的向量
- 自注意力将 xi 同时作为 key 、value 和 query ,以此来对序列抽取特征
- 基本上可以认为给定一个序列,会对序列中的每一个元素进行输出,也就是说,每个查询都会关注所有的键-值对并生成一个注意力输出
- 自注意力之所以叫做自注意力,是因为 key,value,query 都是来自于自身,xi 既作为 key ,又作为 value ,同时还作为 query (self-attention 中的 self 所强调的是 key,value,query 的取法)
和 CNN,RNN 对比

- 自注意力 P1 - 03:08
- CNN、RNN、自注意力都可以用来处理序列
- CNN 如何处理序列:给定一个序列,将其看作是一个一维的输入(之前在处理图片时,图片具有高和宽,而且每个像素都具有 chanel 数,也就是特征数),如果用 CNN 做序列的话,经过一个 1d 的卷积(只有宽没有高)之后,将每个元素的特征看作是 channel 数,这样就可以用来处理文本序列了
- k:窗口大小,每次看到的长度为 k
- n:长度
- d:dimension,每个 x 的维度(长度)
- 并行度:每个输出( yi )可以自己并行做运算,因为 GPU 有大量的并行单元,所以并行度越高,计算的速度就越快
- 最长路径:对于最长的那个序列,前面时刻的信息通过神经元传递到后面时刻,对应于计算机视觉中的感受野的概念(每一个神经元的输出对应的图片中的视野)
- 卷积神经网络和自注意力都拥有并行计算的优势,而且自注意力的最大路径长度最短。但是因为自注意力的计算复杂度是关于序列长度的二次方,所以在很长的序列中计算会非常慢
位置编码(position encoding)
1、和 CNN / RNN 不同,自注意力并没有记录位置信息
- CNN 中其实是有记录位置信息的,从输出可以反推出输入所在的窗口的位置,窗口大小可以看成是位置信息
- RNN 本身就是序列相关的,它是通过逐个的重复地处理词元
- 对于自注意力来说,如果将输入进行随机打乱,对应输出的位置可能会发生变化,但是每个输出的内容不会发生变化
- 所以如果是想纯用自注意力机制来做序列模型的话,没有位置信息的话可能会出现问题,所以可以通过加入位置编码来加入位置信息
2、为了使用序列的顺序信息,通过在输入表示中添加位置编码将位置信息注入到输入里

- 位置编码不是将位置信息加入到模型中,一旦位置信息加入到模型中,会出现各种问题(比如在 CNN 中就需要看一个比较长的序列,RNN 中会降低模型的并行度)
- P 中的每个元素根据对应的 X 中元素位置的不同而不同
3、P 的元素具体计算如下:

- 对于 P 中的每一列,奇数列是一个 cos 函数,偶数列是一个 sin 函数,不同的列之间的周期是不一样的
位置编码矩阵

- 自注意力 P1 - 17:28
- X 轴横坐标表示 P 矩阵中的行数
- 图中不同颜色的曲线表示 P 矩阵中不同的列
- 这里可以理解为 X 轴上任意一点对应的 j 列的曲线上在 Y 轴的值,就表示 P 矩阵第 X 行第 j 列的元素的值
- 图中的四条曲线分别代表了第 6 、7 、8 、9 列,从图中可以看出,第 6 列是一个 sin 函数,第 7 列在第 6 列的基础上发生了位移,变成了 cos 函数,第 8 列在第 6 列的基础上周期变长了一倍,仍然是 sin 函数,第 9 列在第 8 列的基础上发生了唯一,变成了 cos 函数
- 从图中可以看出,对于 P 矩阵中同一行,不同的列的元素的数值是不同的,也就是说,对于输入序列(X + P 作为自编码输入)来讲,每个 dimension 所加的值是不同的;同样的,对于同一个输入序列,不同的样本所加的值也是不同的(对于同一条曲线,X 不同的情况下,即不同的行,元素的值也是不同的,这里 sin 函数和 cos 函数都是周期函数,应该讲的是在同一个周期内的样本)
- P 实际上是对每一个样本(row)、每一个维度(dimension)添加一点不一样的值,使得模型能够分辨这种细微的差别,作为位置信息
- 这种方式跟之前的方式的不同之处在于,之前是将位置信息放进模型中或者将位置信息与数据分开然后进行拼接(concat),位置编码是直接将位置信息加入到了数据中,这样做的好处是不改变模型和数据的大小,缺点是需要模型对于 P 中元素的细微信息进行辨认,取决于模型是否能够有效地使用 P 中的位置信息
绝对位置信息
计算机使用的是二进制编码

- 可以认为,假设计算机要表示八个数字的话,可以用一个长为 3 的特征来表示,可以认为是一个三维的特征,每一个维度都在 0 和 1 之间进行变化,而且变化的频率不同,最后一维变化的频率最快,最前面一维变化的频率最慢
位置矩阵编码可以认为和计算机的二进制编码类似
- 首先,位置编码是实数(因为对应的输入也是实数),是在 1 和 -1 之间进行实数的变化,所以能编码的范围更广,可以在任意多的维度上进行编码
- 其次,因为位置编码中所使用的 sin 函数和 cos 函数都是周期函数,所以位置编码也是存在周期性的

- 上图是一个热度图,和上一个图是一样的,只不过将 X 轴和 Y 轴进行了翻转
- X 轴表示特征
- Y 轴表示样本
- 可以认为是对每一行的位置信息进行了编码,将第 i 个样本用一个长为 d 的向量进行编码
- 这里和计算机的二进制编码有一点不同,最前面的维度变化频率比较高,越到后面变化频率越来越慢
- 核心思想是对序列中的第 i 个样本,给定长为 d 的独一无二的位置信息,然后加入到数据中作为自编码输入,使得模型能够看到数据的位置信息
相对位置信息
为什么要使用 sin 函数和 cos 函数?
- 编码的是一个相对位置信息,位置位于 i + σ 处的位置编码可以线性投影位置 i 处的位置编码来表示,也就是说位置信息和绝对位置 i 无关,只是和相对位置 σ 有关

- 投影矩阵和序列中的位置 i 是无关的,但是和 j 是相关的(和 dimension 的信息是相关的),意味着在一个序列中,假设一个词出现在另外一个词两个或者三个位置的时候,不管这对词出现在序列中的什么位置,对于位置信息来讲,都是可以通过一个同样的线性变换查找出来的
- 相对来讲,这样编码的好处在于模型能够更加关注相对的位置信息,而不是关注一个词出现在一个句子中的绝对位置
总结
1、自注意力池化层将 xi 当作 key ,value query 来对序列抽取特征
2、完全并行、最长序列为 1 、但对长序列计算复杂度高
- 可以完全并行,和 CNN 是一样的,所以计算效率比较高
- 最长序列为 1 ,对于任何一个输出都能够看到整个序列信息,所以这也是为什么当处理的文本比较大、序列比较长的时候,通常会用注意力和自注意力
- 但是问题是对长序列的计算复杂度比较高,这也是一大痛点
3、位置编码在输入中加入位置信息,使得自注意力能够记忆位置信息
- 类似于计算机的数字编码,对每个样本,给定一个长为 d 的编码
- 编码使用的是 sin 函数或者是 cos 函数,使得它对于序列中两个固定距离的位置编码,不管它们处于序列中的哪个位置,他们的编码信息都能够通过一个线性变换进行转换
Q&A
- 1、老师,输入是 n 维,卷积大小是 k ,为什么 CNN 的最长路径是 n/k ,最长路径是和层数无关吗?
- QA P3 - 00:00
- 2、如果做阅读理解,比如 IELTS 或者高考语文,比如把几个问题(比如主观题)作为 query,把整篇文章作为 key/value ,用注意力机制提取问题可能指向的段落或者句子,理论上能够实现吗,或者是以目前技术和硬件有什么局限?
- QA P3 - 00:42
- 3、前面的余弦图是怎么得到热力图这个编码的?
- QA P3 - 02:15
- 4、位置编码里的位置在实际中指的是什么?
- QA P3 - 02:37
- 5、相对位置的基准位置是怎么确定的?每个序列的基准位置是一样的吗?
- QA P3 - 03:22
- 6、位置编码是需要模型自动学习吗,是如何解码的呢?
- QA P3 - 03:50
- 7、可以介绍下可学习的相对位置编码吗?
- QA P3 - 04:31
- 8、transformer 的输入数据应该是怎么组织的?
- QA P3 - 04:43
- 9、位置编码能否写成 nn.parameter 这种可训练的形式?
- QA P3 - 04:51
- 10、老师,自注意力机制是不是也可以理解为一个网络层,就像 CNN 或者 RNN 的一层来理解?
- QA P3 - 05:05
- 11、位置编码在经过 attention 之后会丢失相对位置信息吗?
- QA P3 - 05:26
- 12、通过 NLP 提取文本中问题对应的内容,这块会讲吗?
- QA P3 - 05:59
- 13、ViT 的位置编码好像做的很简单,没有用余弦,是一个一维向量?
- QA P3 - 06:14
----end----
其他参考
1、《动手学深度学习》,课程 PPT ,https://courses.d2l.ai/zh-v2/assets/pdfs/part-4_4.pdf
2、《动手学深度学习》,教程,https://zh-v2.d2l.ai/chapter_attention-mechanisms/self-attention-and-positional-encoding.html