《动手学深度学习 Pytorch版》 10.1 注意力提示
10.1.1 生物学中的注意力提示
“美国心理学之父” 威廉·詹姆斯提出的双组件(two-component)框架:
-
非自主性提示:基于环境中物体的突出性和易见性
-
自主性提示:受到了认知和意识的控制
10.1.2 查询、键和值
-
注意力机制与全连接层或汇聚层区别开来的元素:是否包含自主性提示
-
在注意力机制的背景下:
-
自主性提示被称为查询(query)。
-
给定任何查询,注意力机制通过注意力汇聚(attention pooling) 将选择引导至感官输入(sensory inputs),例如中间特征表示。
-
在注意力机制中,这些感官输入被称为值(value)。更通俗的解释,每个值都与一个键(key)配对,这可以想象为感官输入的非自主提示。可以通过设计注意力汇聚的方式,便于给定的查询(自主性提示)与键(非自主性提示)进行匹配,这将引导得出最匹配的值(感官输入)。
-
10.1.3 注意力的可视化
import torch
from d2l import torch as d2l
平均汇聚层可以被视为输入的加权平均值,注意力汇聚得到的是加权平均的总和值。下面的 show_heatmaps 函数,其输入 matrices 的形状是(要显示的行数,要显示的列数,查询的数目,键的数目)
#@save
def show_heatmaps(matrices, xlabel, ylabel, titles=None, figsize=(2.5, 2.5),
cmap='Reds'):
"""显示矩阵热图"""
d2l.use_svg_display()
num_rows, num_cols = matrices.shape[0], matrices.shape[1]
fig, axes = d2l.plt.subplots(num_rows, num_cols, 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)) # 生成对角线全1,其余部分全0的二维数组
show_heatmaps(attention_weights, xlabel='Keys', ylabel='Queries') # 仅当查询和键相同时,注意力权重为1,否则为0。
练习
(1)在机器翻译中通过解码序列词元时,其自主性提示可能是什么?非自主性提示和感官输入又是什么?
自主性提示可能是上下文信息之类的
非自主性提示可能是指在机器翻译过程中使用的其他信息,比如语言学习或人工翻译的知识。
感官输入可能是指输入方式、
(2)随机生成一个 矩阵并使用 softmax 运算来确保每行都是有效的概率分布,然后可视化输出注意力权重。
attention_weights = d2l.F.softmax(torch.rand((10, 10)), dim=1).reshape((1, 1, 10, 10))
show_heatmaps(attention_weights, xlabel='Keys', ylabel='Queries')
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了