文章目录
- 1.注意机制
-
- 1.1 注意力机制
-
- 1.1.1 非注意力池化层
- 1.1.2 Nadaraya-Watson核回归
- 1.1.3 参数注意机制
- 1.1.4 注意力聚集:Nadaraya-Watson实现核回归代码
- 2 注意力分数
-
- 2.1 加性注意力
- 2.2 缩放点注意力
- 2.3 注意力打分函数代码
- 3 使用注意机制seq2seq
- 4 多头注意力
- 5 自注意力
-
- 5.1 比较卷积神经网络、循环神经网络和自注意力
- 5.2 位置编码
-
- 5.2.1 绝对位置信息
- 5.2.2 相对位置信息
1.注意机制
- 动物需要 在复杂环境杂环境下值得注意的点
- 心理学框架:人类根据随机线索和随机线索选择注意点
举个例子:
假如你面前有五件物品: 一份报纸,一篇研究论文,一杯咖啡,一本笔记本和一本书, 所有的纸制品都是黑白印刷的,但咖啡杯是红色的。 换句话说,这个咖啡杯在这种视觉环境中是突出的, 不由自主地引起人们的注意。 所以你把最敏锐的视力放在咖啡上, 下图。
红杯因其突出的非自主提示而被称为。
喝完咖啡,你会变得兴奋,想读书。 所以你转过头,重新聚焦眼睛,然后看书, 如下图所示。 不同于上图中的突出选择, 此时,选书是由认知和意识控制的, 所以注意力是基于的去辅助选择时会更加谨慎。 受试者的主观意愿被提升,选择的力量更强。
依靠任务的意志提示(想读一本书),注意力被独立引导到书中,所以书被称为。
1.1 注意力机制
- 卷积、全连接、池化层只考虑线索
- 注意机制考虑随机线索
- 随机线索被称为查询(query),结合以前的内容,query就是想读书。
- 每个输入都是一个值(value)线索不随意(key)对,结合前面,key是红杯,value它可以是一样的,也可以是不同的杯子value它可以是杯子的价值,也可以是杯子的重量。
- 通过注意力池化层选择有偏见的输入
- 注意力机制也可以称为注意力池化(attention pooling),会根据query有偏见的选择key-value pair。总结注意力池(attention pooling)以及以前的池化(pooling)不同的地方是:
因此,是否包含自主提示将注意力机制与全连接层或汇聚层区分开来。 在注意机制的背景下,我们称自主提示为查询(query)。 通过注意力聚集,给出任何查询,注意力机制(attention pooling) 将选择引导到感官输入(sensory inputs,例如表示中间特征)。 这些感官输入在注意机制中被称为值(value)。 更流行的解释是,每个值都有一个键(key)配对, 这可以想象为感官输入的非自主提示。 如下图所示,我们可以设计聚集注意力, 使给定的查询(自主提示)能与键(非自主提示)相匹配, 这将导致最匹配的值(感官输入)。
1.1.1 非注意力池化层
- 给定数据 ( x i , y i ) , i = 1 , . . . , n (x_i,y_i),i=1,...,n (xi,yi),i=1,...,n
- 平均池化是最简单的方案: f ( x ) = 1 n ∑ i y i f(x) = \frac{1}{n} \sum_{i} y_i f(x)=n1∑iyi
- 更好的方案是60年代提出的Nadaraya-Watson核回归 f ( x ) = ∑ i = 1 n K ( x − x i ) ∑ j = 1 n K ( x − x j ) y i (①) f(x)=\sum^n_{i=1}\frac{K(x-x_i)}{\sum^n_{j=1}K(x-x_j)}y_i \tag{①} f(x)=i=1∑n∑j=1nK(x−xj)K(x−xi)yi(①)
其中,
x x x是query;
x i x_{i} xi是key;
y i y_i yi是value;
K是衡量 x x x和 x i x_{i} xi之间距离的一个函数(kernel),比如K值越大距离就越近,越小就距离越远;
公式中的分式,就是概率,每一项是一个相对重要性。对这项加权对 y i y_{i} yi求和,意思是将和x相近那些的 x i x_{i} xi和 y i y_{i} yi选出来。可以这么理解,找出和query相近的key-value pair,别的就不管了。
1.1.2 Nadaraya-Watson核回归
- 使用高斯核 K ( u ) = 1 2 π exp ( − u 2 2 ) K(u)=\frac{1}{\sqrt{2\pi}}\exp(-\frac{u^2}{2}) K(u)=2π 1exp(−2u2)
- 那么 f ( x ) = ∑ i = 1 n exp ( − 1 2 ( x − x i ) 2 ) ∑ j = 1 n exp ( − 1 2 ( x − x i ) 2 ) y i = ∑ i = 1 n s o f t m a x ( − 1 2 ( x − x i ) 2 ) y i (②) f(x) = \sum^n_{i=1}\frac{\exp(-\frac{1}{2}(x-x_i)^2)}{\sum^n_{j=1}\exp(-\frac{1}{2}(x-x_i)^2)}y_i = \sum^n_{i=1} softmax(-\frac{1}{2}(x-x_i)^2)y_i \tag{②} f(x)=i=1∑n∑j=1nexp(−21(x−xi)2)exp(−21(x−xi)2)yi=i=1∑nsoftmax(−21(x−xi)2)yi(②)
1.1.3 参数化的注意力机制
- 在之前的基础上引入可以学习的w f ( x ) = ∑ i = 1 n s o f t m a x ( − 1 2 ( ( x − x i ) w ) 2 ) y i (③) f(x) = \sum^n_{i=1} softmax(-\frac{1}{2}((x-x_i)w)^2)y_i \tag{③} f(x)=i=1∑nsoftmax(−21((x−xi)w)2)yi(③) w是一元的,因为是标量而不是向量
1.1.4 注意力汇聚:Nadaraya-Watson核回归的代码实现
非线性函数生成一个人工数据集,其中加入噪声 ϵ \epsilon ϵ
y i = 2 s i n ( x i ) + x i 0.8 + ϵ y_i = 2sin(x_i) + x_i^{0.8} + \epsilon yi=2sin(xi)+xi0.8+ϵ 其中 ϵ \epsilon ϵ服从均值为和标准差为的正态分布。生成了个50训练样本和50个测试样本。
import torch
from torch import nn
from d2l import torch as d2l
n_train = 50 # 训练样本数
x_train, _ = torch.sort(torch.rand(n_train) * 5) # 排序后的训练样本
def f(x):
return 2 * torch.sin(x) + x**0.8
y_train = f(x_train) + torch.normal(0.0, 0.5, (n_train,)) # 训练样本的输出
x_test = torch.arange(0, 5, 0.1) # 测试样本
y_truth = f(x_test) # 测试样本的真实输出
n_test = len(x_test) # 测试样本数
n_test
def plot_kernel_reg(y_hat):
d2l.plot(x_test, [y_truth, y_hat], 'x', 'y', legend=['Truth', 'Pred'],
xlim=[0, 5], ylim=[-1, 5])
d2l.plt.plot(x_train, y_train, 'o', alpha=0.5);
y_hat = torch.repeat_interleave(y_train.mean(), n_test)
plot_kernel_reg(y_hat)
平均汇聚忽略了输入 x i x_i xi,非参数注意力汇聚使用公式①或②对输出 y i y_i yi进行加权,K函数是描述输入 x i x_i xi与查询 x x x距离的函数,为了使距离越大K函数的值越小,K函数采用以下函数: K ( u ) = 1 2 π exp ( − u 2 2 ) = 1 2 π exp ( − 1 2 ( x − x i ) 2 ) K(u) = \frac{1}{\sqrt{2\pi}}\exp(-\frac{u^2}{2}) = \frac{1}{\sqrt{2\pi}}\exp(-\frac{1}{2}(x-x_i)^2) K(u)=2π 1exp(−2u2)=