锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

PyTorch注意力机制【动手学深度学习v2】

时间:2023-05-01 04:07:00 km02h1重量变送器2u1s9电力变送器

文章目录

  • 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)不同的地方是:attention显示加入query,即随机线索,然后根据query去找到感兴趣的key-value pair。

因此,是否包含自主提示将注意力机制与全连接层或汇聚层区分开来。 在注意机制的背景下,我们称自主提示为查询(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)=n1iyi
  • 更好的方案是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=1nj=1nK(xxj)K(xxi)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=1nj=1nexp(21(xxi)2)exp(21(xxi)2)yi=i=1nsoftmax(21(xxi)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=1nsoftmax(21((xxi)w)2)yi()
    w是一元的,因为是标量而不是向量

1.1.4 注意力汇聚:Nadaraya-Watson核回归的代码实现

  1. 生成数据集:

非线性函数生成一个人工数据集,其中加入噪声 ϵ \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
  1. 使用平均汇聚计算所有训练样本输出值的平均值
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)

  1. 非参数注意力汇聚(池化)

平均汇聚忽略了输入 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)=

相关文章