《动手学深度学习 Pytorch版》 10.1 注意力提示

发布时间 2023-10-23 12:07:57作者: AncilunKiang

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。

image

练习

(1)在机器翻译中通过解码序列词元时,其自主性提示可能是什么?非自主性提示和感官输入又是什么?

自主性提示可能是上下文信息之类的

非自主性提示可能是指在机器翻译过程中使用的其他信息,比如语言学习或人工翻译的知识。

感官输入可能是指输入方式、


(2)随机生成一个 \(10\times 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')

image