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)随机生成一个 10 × 10 10\times 10 10×10 矩阵并使用 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')