一. 注意力提示

1. 生物学中的注意力提示

非自主性提示是基于环境中物体的突出性和易见性。假如你面前有五个物品: 一份报纸、一篇研究论文、一杯咖啡、一本笔记本和一本书,如下图所示。 所有纸制品都是黑白印刷的,但咖啡杯是红色的。 也即是这个咖啡杯在这种视觉环境中是突出和显眼的, 不由自主地引起人们的注意。 所以你把视力最敏锐的地方放到咖啡上。

自主性提示:喝咖啡后,你会变得兴奋并想读书。 所以你转过头,重新聚焦你的眼睛,然后看看书,如下图所示。 与上面非自主性提示突出性导致的选择不同, 此时选择书是受到了认知和意识的控制, 因此注意力在基于自主性提示去辅助选择时将更为谨慎。 受试者的主观意愿推动,选择的力量也就更强大。

2. 查询、键和值

自主性的与非自主性的注意力提示解释了人类的注意力的方式, 下面通过这两种注意力提示用神经网络来设计注意力机制的框架。
首先考虑一个相对简单的状况, 即只使用非自主性提示。 要想将选择偏向于感官输入, 可以简单地使用参数化的全连接层, 甚至是非参数化的最大汇聚层或平均汇聚层。
因此,“是否包含自主性提示”将注意力机制与全连接层或汇聚层区别开来。 在注意力机制的背景下,将自主性提示称为查询(query)。 给定任何查询,注意力机制通过注意力汇聚(attention pooling) 将选择引导至感官输入(sensory inputs,例如中间特征表示)。 在注意力机制中,这些感官输入被称为值(value)。 更通俗的解释每个值都与一个键(key)配对, 可以想象为感官输入的非自主提示。如下图所示可以设计注意力汇聚, 以便给定的查询(自主性提示)可以与键(非自主性提示)进行匹配, 这将引导得出最匹配的值(感官输入)。

二. 注意力权重可视化

平均汇聚层可以被视为输入的加权平均值, 其中各输入的权重是一样的。 实际上注意力汇聚得到的是加权平均的总和值(经过softmax后加权平均的总和值), 其中权重是在给定的查询和不同的键之间计算得出的。
show_heatmaps()函数作为可视化注意力权重,其输入matrices的形状是 (要显示的行数,要显示的列数,查询的数目,键的数目)。

import torch
from torch import nn
import d2l.torch
def show_heatmap(matrices,xlabel,ylabel,titles=None,figsize=(2.5,2.5),cmap='Reds'):"""显示矩阵热图"""d2l.torch.use_svg_display()num_rows,num_colums = matrices.shape[0],matrices.shape[1]fig,axes = d2l.torch.plt.subplots(num_rows,num_colums,figsize=figsize,sharex=True,sharey=True,squeeze=False)for i,(row_axes,row_matrices) in enumerate(zip(axes,matrices)):for j,(ax,matrix) in enumerate(zip(row_axes,row_matrices)):pcm = ax.imshow(matrix.detach().numpy(),cmap=cmap)if i == num_rows-1:ax.set_xlabel(xlabel)if j == 0:ax.set_ylabel(ylabel)if titles:ax.set_title(titles[j])fig.colorbar(pcm,ax=axes,shrink=0.6)

下面使用一个简单的例子进行演示显示注意力权重的热力图,结果如下图所示:

attention_weights = torch.eye(10).reshape(1,1,10,10)
show_heatmap(attention_weights,xlabel='Keys',ylabel='Queries')

三. 注意力汇聚:Nadaraya-Watson 核回归

查询(自主提示)和键(非自主提示)之间的交互形成了注意力汇聚, 注意力汇聚有选择地聚合了值(感官输入)以生成最终的输出。下面使用Nadaraya-Watson核回归模型,一个简单完整的例子,用于演示具有注意力机制的机器学习。

1. 生成数据集

简单起见,考虑下面这个回归问题:给定的成对的“输入-输出”数据集{(x1,y1),…,(xn,yn)}\{(x_1, y_1), \ldots, (x_n, y_n)\}{(x1​,y1​),…,(xn​,yn​)},如何学习fff来预测任意新输入xxx的输出y^=f(x)\hat{y} = f(x)y^​=f(x)?
根据下面的非线性函数生成一个人工数据集,其中加入的噪声项为ϵ\epsilonϵ:
yi=2sin⁡(xi)+xi0.8+ϵ,y_i = 2\sin(x_i) + x_i^{0.8} + \epsilon,yi​=2sin(xi​)+xi0.8​+ϵ,
其中ϵ\epsilonϵ服从均值为000和标准差为0.50.50.5的正态分布。生成505050个训练样本和505050个测试样本。为了更好地可视化之后的注意力模式,将训练样本进行排序。

n_train = 50 # 训练样本数
x_train,_ = torch.sort(torch.rand(n_train)*5)  # 排序后的训练样本
x_train
输出结果如下所示:
tensor([0.1256, 0.1617, 0.3182, 0.3923, 0.4773, 0.6612, 0.8686, 0.9875, 1.0238,1.0555, 1.1690, 1.1852, 1.2633, 1.3428, 1.3704, 1.5106, 1.6027, 1.6256,1.6413, 1.8150, 1.9900, 2.1302, 2.1854, 2.2397, 2.3324, 2.3599, 2.5099,2.6554, 2.8174, 2.9159, 2.9763, 3.0784, 3.0822, 3.3583, 3.4745, 3.7680,3.7723, 3.7987, 3.8181, 3.8351, 4.0055, 4.0567, 4.0728, 4.2019, 4.3304,4.3628, 4.6436, 4.6437, 4.9091, 4.9439])
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.0,5.0,0.1)  # 测试样本
y_truth = f(x_test) # 测试样本的真实输出
n_test = len(x_test) # 测试样本数
y_truth
输出结果如下所示:
tensor([0.0000, 0.3582, 0.6733, 0.9727, 1.2593, 1.5332, 1.7938, 2.0402, 2.2712,2.4858, 2.6829, 2.8616, 3.0211, 3.1607, 3.2798, 3.3782, 3.4556, 3.5122,3.5481, 3.5637, 3.5597, 3.5368, 3.4960, 3.4385, 3.3654, 3.2783, 3.1787,3.0683, 2.9489, 2.8223, 2.6905, 2.5554, 2.4191, 2.2835, 2.1508, 2.0227,1.9013, 1.7885, 1.6858, 1.5951, 1.5178, 1.4554, 1.4089, 1.3797, 1.3684,1.3759, 1.4027, 1.4490, 1.5151, 1.6009])

plot_kernel_reg()函数将绘制所有的训练样本(样本由圆圈表示), 不带噪声项的真实数据生成函数

李沐动手学深度学习V2-attention注意力机制相关推荐

  1. 李沐动手学深度学习v2/总结1

    总结 编码过程 数据 数据预处理 模型 参数,初始化参数 超参数 损失函数,先计算损失,清空梯度(防止有累积的梯度),再对损失后向传播计算损失关于参数的梯度 优化算法,使用优化算法更新参数 训练求参数 ...

  2. 14李沐动手学深度学习v2/权重衰退简洁实现

    # 权重衰退是广泛应用的正则化技术 %matplotlib inline import torch from torch import nn from d2l import torch as d2l ...

  3. 李沐动手学深度学习V2-全卷积网络FCN和代码实现

    一.全卷积网络FCN 1. 介绍 语义分割是对图像中的每个像素分类,全卷积网络(fully convolutional network,FCN)采用卷积神经网络实现了从图像像素到像素类别的变换 ,与前 ...

  4. 李沐动手学深度学习(pytorch版本)d2lzh_pytorch包的缺少安装问题

    学习深度学习时候,很多人参考的是李沐的动手学深度学习Pytorch版本(附上官方地址:https://tangshusen.me/Dive-into-DL-PyTorch/#/). 在学习3.5.1节 ...

  5. 【李沐动手学深度学习】读书笔记 01前言

    虽然之前已经学过这部分内容和深度学习中的基础知识,但总觉得学的不够系统扎实,所以希望再通过沐神的课程以及书籍,系统条理的学习一遍.在读书过程中,利用导图做了一下梳理,形成了这个读书笔记.如有侵权,请联 ...

  6. 关于李沐动手学深度学习(d2l)pytorch环境本地配置

    本地安装d2l 由于之前试了很多次d2l课本的安装方法失败了,这里提供一种我可以成功安装d2l包的方法. pytorch安装 首先安装cuda.cudnn.pytroch(gpu版本).可以参考这篇文 ...

  7. 【动手学深度学习】(task123)注意力机制剖析

    note 将注意力汇聚的输出计算可以作为值的加权平均,选择不同的注意力评分函数会带来不同的注意力汇聚操作. 当查询和键是不同长度的矢量时,可以使用可加性注意力评分函数.当它们的长度相同时,使用缩放的& ...

  8. 李沐动手学深度学习:08 线性回归(代码逐行理解)

    目录 一.相关资料连接 1.1 李沐视频 1.2 代码.PPT 二.代码及笔记(使用Jupyter Notebook) 2.1 线性回归从零开始实现 2.1.1 基本概念 2.1.2 基础优化算法 2 ...

  9. windows上配置深度学习(李沐-动手学深度学习)

    1.安装miniconda windows下安装,去清华大学开源镜像下载,速度比较快. 选中Miniconda3-latest-Windos-x86_64.exe下载安装包(目前最新的是py3.9) ...

  10. 李沐动手学深度学习第四章-4.9.环境和分布偏移

    我们从来没有想过数据最初从哪里来?以及我们计划最终如何处理模型的输出? 根据测试集的精度衡量,模型表现得非常出色. 但是当数据分布突然改变时,模型在部署中会出现灾难性的失败. 解决方案很简单(要求&q ...

最新文章

  1. python计算四元素组合算法_python – 算法,列表元素之间的最近点
  2. 围观各大企业如何活用人工智能,并运用实践?
  3. 计算机网络-思维导图(2)物理层
  4. anaconda和python有什么不一样_黄山毛峰的味道为什么会不一样?
  5. 莫比乌斯反演 做题记录
  6. 网络多人游戏架构与编程 电子书_Java互联网架构-高性能网络编程必备技能IO与NIO阻塞分析...
  7. linux 线程同步消息队列,Linux 多线程同步之消息队列
  8. 计算机学科研究方向统计
  9. 东芝M300系列笔记本拆解图片教程 (跟自己电脑很像)
  10. c++小程序代码_# 微信小程序的原生框架和taro对比 ##
  11. 关于char, wchar_t, TCHAR, _T(),L,宏 _T、TEXT,_TEXT
  12. Emscripten 单词_免费下载 | 北师大版高中英语教材重点单词汇总(可下载mp3版本)...
  13. mysql限制用户只能访问指定数据库
  14. VC2010升级到VC2015遇到问题及解决办法
  15. 【JAVA 数据结构】 JAVA实现动态数组
  16. 北京胜新疆夺CBA总冠军 苏群:广东依旧实力最强
  17. CenOS7 搭建无人值守安装服务器
  18. 联想笔记本重装系统无法进入记录
  19. Java8常用循环遍历操作方式的效率对比
  20. alm服务java_ALM TFS/VSTS工具 的Java集成

热门文章

  1. 今日恐慌与贪婪指数为21 恐慌程度有所缓解
  2. 数据挖掘:Apriori 关联规则分析算法原理分析与代码实现
  3. 全局变量、函数原型和Guard macro
  4. 浪擎科技:定位中高端,做灾备蓝海的“弄潮儿”
  5. iOS-QQ分享功能实现
  6. 「75页PDF免费下载」面向所有人的机器学习科普大全
  7. cisco2960(思科2960)
  8. python Django(五)
  9. bps、Bps、pps的概念和区别
  10. [USACO10HOL]牛的政治Cow Politics