注意力提示
⾃经济学研究稀缺资源分配以来,我们正处在“注意⼒经济”时代,即⼈类的注意⼒被视为可以交换的、有限的、有价值的且稀缺的商品。许多商业模式也被开发出来去利⽤这⼀点:在⾳乐或视频流媒体服务上,我们要么消耗注意⼒在⼴告上,要么付钱来隐藏⼴告;为了在⽹络游戏世界的成⻓,我们要么消耗注意⼒在游戏战⽃中,从⽽帮助吸引新的玩家,要么付钱⽴即变得强⼤。总之,注意⼒不是免费的
注意⼒是稀缺的,⽽环境中的⼲扰注意⼒的信息却并不少。⽐如我们的视觉神经系统⼤约每秒收到108位的信息,这远远超过了⼤脑能够完全处理的⽔平。幸运的是,我们的祖先已经从经验(也称为数据)中认识到“并⾮感官的所有输⼊都是⼀样的”。在整个⼈类历史中,这种只将注意⼒引向感兴趣的⼀⼩部分信息的能⼒,使我们的⼤脑能够更明智地分配资源来⽣存、成⻓和社交,例如发现天敌、找寻⻝物和伴侣
1 - 生物学中的注意力提示
注意⼒是如何应⽤于视觉世界中的呢?我们从当今⼗分普及的双组件(two-component)的框架开始讲起:这个框架的出现可以追溯到19世纪90年代的威廉·詹姆斯,他被认为是“美国⼼理学之⽗”[James, 2007]。在这个框架中,受试者基于⾮⾃主性提⽰和⾃主性提⽰有选择地引导注意⼒的焦点
⾮⾃主性提⽰是基于环境中物体的突出性和易⻅性。想象⼀下,假如你⾯前有五个物品:⼀份报纸、⼀篇研究论⽂、⼀杯咖啡、⼀本笔记本和⼀本书,就像 图10.1.1。所有纸制品都是⿊⽩印刷的,但咖啡杯是红⾊的。换句话说,这个咖啡杯在这种视觉环境中是突出和显眼的,不由⾃主地引起⼈们的注意。所以你把视⼒最敏锐的地⽅放到咖啡上,如 图10.1.1所⽰
喝咖啡后,你会变得兴奋并想读书。所以你转过头,重新聚焦你的眼睛,然后看看书,就像 图10.1.2中描述那样。与 图10.1.1中由于突出性导致的选择不同,此时选择书是受到了认知和意识的控制,因此注意⼒在基于⾃主性提⽰去辅助选择时将更为谨慎。受试者的主观意愿推动,选择的⼒量也就更强⼤
2 - 查询、键和值
⾃主性的与⾮⾃主性的注意⼒提⽰解释了⼈类的注意⼒的⽅式,下⾯我们看看如何通过这两种注意⼒提⽰,⽤神经⽹络来设计注意⼒机制的框架
首先,考虑一个相对简单的状况,即只使用非自主性提示。要想将选择偏向于感官输入,我们可以简单地使用参数化的全连接层,甚至是非参数化的最大汇聚层或平均汇聚层
因此,“是否包含⾃主性提⽰”将注意⼒机制与全连接层或汇聚层区别开来。在注意力机制的背景下,我们将自主性提示称为查询(query)。给定任何查询,注意力机制通过注意力汇聚(attention pooling)将选择引导至感官输入(sensory inputs,例如中间特征表示)。在注意力机制中,这些感官输入被称为值(value)。更通俗的解释,每个值都与一个键(key)配对,这可以想象为感官输入的非自主提示。
如图10.1.3所示,我们可以设计注意力汇聚,以便给定的查询(自主性提示)可以与键(非自主性提示)进行匹配,将引导得出最匹配的值(感官输入)
3 - 注意力的可视化
平均汇聚层可以被视为输入的加权平均值,其中各输入的权重是一样的。实际上,注意力汇聚得到的是加权平均的总会值,其中权重是在给定的查询和不同的键之间计算得出的
import torch
from d2l import torch as d2l
为了可视化注意力权重,我们定义了show_heatmaps函数。其输入matrices的形状是(要显示的行数,要显示的列数,查询的数目,键的数目)
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);
下面我们使用一个简单的例子进行演示,在本例中,仅当查询和键相同时,注意力权重为1,否则为0
attention_weights = torch.eye(10).reshape((1,1,10,10))
show_heatmaps(attention_weights,xlabel='Keys',ylabel='Queries')
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FGAWDOcQ-1662988348423)(https://yingziimage.oss-cn-beijing.aliyuncs.com/img/202209122107898.svg)]
在后面的章节中,我们将经常调用show_heatmaps函数来显示注意力权重
4 - 小结
- 人类的注意力时有限的、有价值和稀缺的资源
- 受试者使用非自主性和自主性提示有选择性地引导注意力。前者基于突出性,后者则依赖于意识
- 注意力机制与全连接层或者汇聚层的区别源于增加的自主提示
- 由于包含了自主性提示,注意力机制与全连接的层或汇聚层不同
- 注意力机制通过注意力汇聚使选择偏向于值(感官输入),其中包含查询(自主性提示)和键(非自主性提示)。键和值是成对的
- 我们可以可视化查询和键之间的注意力权重