参加网站建设项目人员保障体系,北京市工程建设,凡科建站小程序,教程网站建设系列文章目录 文章目录 系列文章目录注意力提示生物学中的注意力提示查询、键和值注意力的可视化使用 show_heatmaps 显示注意力权重代码示例 代码解析结果 小结练习 注意力提示
#x1f3f7;sec_attention-cues
感谢读者对本书的关注#xff0c;因为读者的注意力是一种稀缺…系列文章目录 文章目录 系列文章目录注意力提示生物学中的注意力提示查询、键和值注意力的可视化使用 show_heatmaps 显示注意力权重代码示例 代码解析结果 小结练习 注意力提示
sec_attention-cues
感谢读者对本书的关注因为读者的注意力是一种稀缺的资源此刻读者正在阅读本书而忽略了其他的书因此读者的注意力是用机会成本与金钱类似来支付的。为了确保读者现在投入的注意力是值得的作者们尽全力全部的注意力创作一本好书。 自经济学研究稀缺资源分配以来人们正处在“注意力经济”时代即人类的注意力被视为可以交换的、有限的、有价值的且稀缺的商品。许多商业模式也被开发出来去利用这一点在音乐或视频流媒体服务上人们要么消耗注意力在广告上要么付钱来隐藏广告为了在网络游戏世界的成长人们要么消耗注意力在游戏战斗中从而帮助吸引新的玩家要么付钱立即变得强大。总之注意力不是免费的。 注意力是稀缺的而环境中的干扰注意力的信息却并不少。比如人类的视觉神经系统大约每秒收到 1 0 8 10^8 108位的信息这远远超过了大脑能够完全处理的水平。幸运的是人类的祖先已经从经验也称为数据中认识到“并非感官的所有输入都是一样的”。在整个人类历史中这种只将注意力引向感兴趣的一小部分信息的能力使人类的大脑能够更明智地分配资源来生存、成长和社交例如发现天敌、找寻食物和伴侣。
生物学中的注意力提示
注意力是如何应用于视觉世界中的呢这要从当今十分普及的双组件two-component的框架开始讲起这个框架的出现可以追溯到19世纪90年代的威廉·詹姆斯他被认为是“美国心理学之父” :cite:James.2007。在这个框架中受试者基于非自主性提示和自主性提示有选择地引导注意力的焦点。非自主性提示是基于环境中物体的突出性和易见性。 想象一下假如我们面前有五个物品一份报纸、一篇研究论文、一杯咖啡、一本笔记本和一本书就像 :numref:fig_eye-coffee。 所有纸制品都是黑白印刷的但咖啡杯是红色的。换句话说这个咖啡杯在这种视觉环境中是突出和显眼的不由自主地引起人们的注意。所以我们会把视力最敏锐的地方放到咖啡上如 :numref:fig_eye-coffee所示。
fig_eye-coffee
喝咖啡后我们会变得兴奋并想读书所以转过头重新聚焦眼睛然后看看书就像 :numref:fig_eye-book中描述那样。 与 :numref:fig_eye-coffee中由于突出性导致的选择不同此时选择书是受到了认知和意识的控制因此注意力在基于自主性提示去辅助选择时将更为谨慎。受试者的主观意愿推动选择的力量也就更强大。
fig_eye-book
查询、键和值
自主性的与非自主性的注意力提示解释了人类的注意力的方式下面来看看如何通过这两种注意力提示用神经网络来设计注意力机制的框架首先考虑一个相对简单的状况即只使用非自主性提示。要想将选择偏向于感官输入则可以简单地使用参数化的全连接层甚至是非参数化的最大汇聚层或平均汇聚层。 因此“是否包含自主性提示”将注意力机制与全连接层或汇聚层区别开来。在注意力机制的背景下自主性提示被称为查询query。给定任何查询注意力机制通过注意力汇聚attention pooling将选择引导至感官输入sensory inputs例如中间特征表示。在注意力机制中这些感官输入被称为值value。更通俗的解释每个值都与一个键key配对这可以想象为感官输入的非自主提示。如 :numref:fig_qkv所示可以通过设计注意力汇聚的方式便于给定的查询自主性提示与键非自主性提示进行匹配这将引导得出最匹配的值感官输入。 注意力机制框架如下图所示。 fig_qkv
鉴于上面所提框架在 :numref:fig_qkv中的主导地位因此这个框架下的模型将成为本章的中心。然而注意力机制的设计有许多替代方案。例如可以设计一个不可微的注意力模型该模型可以使用强化学习方法 :cite:Mnih.Heess.Graves.ea.2014进行训练。
注意力的可视化
平均汇聚层可以被视为输入的加权平均值其中各输入的权重是一样的。 实际上注意力汇聚得到的是加权平均的总和值其中权重是在给定的查询和不同的键之间计算得出的。
import torch
from d2l import torch as d2l为了可视化注意力权重需要定义一个show_heatmaps函数。其输入matrices的形状是要显示的行数要显示的列数查询的数目键的数目。
def show_heatmaps(matrices, xlabel, ylabel, titlesNone, figsize(2.5, 2.5),cmapReds):显示矩阵热图d2l.use_svg_display()num_rows, num_cols matrices.shape[0], matrices.shape[1]fig, axes d2l.plt.subplots(num_rows, num_cols, figsizefigsize,sharexTrue, shareyTrue, squeezeFalse)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(), cmapcmap)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, axaxes, shrink0.6);下面使用一个简单的例子进行演示。在本例子中仅当查询和键相同时注意力权重为1否则为0。
attention_weights torch.eye(10).reshape((1, 1, 10, 10))#
show_heatmaps(attention_weights, xlabelKeys, ylabelQueries)使用 show_heatmaps 显示注意力权重
上方代码中attention_weights 是一个 (10 X10) 的单位矩阵用于表示注意力权重。以下是如何使用 show_heatmaps 函数来可视化这些权重的详细步骤。
代码示例
import torch
import numpy as np
import d2l # 假设d2l库已安装并可用# 创建注意力权重
attention_weights torch.eye(10).reshape((1, 1, 10, 10))# 使用 show_heatmaps 函数显示热图
show_heatmaps(attention_weights, xlabelKeys, ylabelQueries, titles[Attention Weights])代码解析 创建注意力权重: attention_weights torch.eye(10).reshape((1, 1, 10, 10))这里使用 torch.eye(10) 创建一个 (10 X 10) 的单位矩阵然后通过 reshape 改变其形状为 (1, 1, 10, 10)以符合 show_heatmaps 函数的输入要求。 调用 show_heatmaps: show_heatmaps(attention_weights, xlabelKeys, ylabelQueries, titles[Attention Weights])通过传入 attention_weights、x轴和y轴标签以及标题调用 show_heatmaps 函数来绘制热图。
结果
热图: 生成的热图将显示单位矩阵的结构其中对角线上的值为1其他位置的值为0。这表示每个查询Query与其对应的键Key之间的注意力权重关系。 后面的章节内容将经常调用show_heatmaps函数来显示注意力权重。
小结
人类的注意力是有限的、有价值和稀缺的资源。受试者使用非自主性和自主性提示有选择性地引导注意力。前者基于突出性后者则依赖于意识。注意力机制与全连接层或者汇聚层的区别源于增加的自主提示。由于包含了自主性提示注意力机制与全连接的层或汇聚层不同。注意力机制通过注意力汇聚使选择偏向于值感官输入其中包含查询自主性提示和键非自主性提示。键和值是成对的。可视化查询和键之间的注意力权重是可行的。
练习
在机器翻译中通过解码序列词元时其自主性提示可能是什么非自主性提示和感官输入又是什么随机生成一个 10 × 10 10 \times 10 10×10矩阵并使用softmax运算来确保每行都是有效的概率分布然后可视化输出注意力权重。