你给AI看一张照片:一个女孩在草地上扔飞盘。AI要输出一句描述:“一个女孩在草地上扔飞盘。”但你想过没有,它在说“女孩”的时候,眼睛(如果它有的话)应该盯在哪里?说“飞盘”的时候呢?

一张图片被压缩成一个向量时,空间信息就已经死了
早期的图像描述模型是闭着眼睛生成句子的。它们用CNN把整张图片压缩成一个几百维的向量,然后交给RNN一个词一个词地憋。图片里的猫在左边还是右边,狗是大是小,全被平均进一个向量里了。模型偶尔分不清主体和背景,就是因为空间细节在压缩过程中被抹掉了。
如果你用过CNN做分类,你会习惯性地取全连接层的输出作为图片的“语义向量”。但在生成任务里,这个向量有两个缺陷。第一,它丢失了位置:全连接层把空间网格拉平,猫在左在右不再重要。第二,它丢失了尺度:图片中的大物体和小物体在同一个长度内被压缩,小物体的痕迹容易消失。
2015年,Show, Attend and Tell这篇论文换了一个思路:不压缩整张图,而是保留每个小区域的特征;每生成一个词之前,模型先自己决定“现在该看哪”。这就是图像描述中的注意力机制。
保留卷积特征图,图片被拆成196个格子
卷积层的输出是保留二维网格结构的。Show, Attend and Tell直接取VGG-16的第四层卷积特征图,尺寸是14x14x512。14×14意味着图片被分成196个网格,每个网格对应原图的一个方形区域,每个网格用一个512维向量描述。有了这个特征图,模型就能在生成时指定“看第几行第几列”。
注意力计算其实只有三步
注意力计算涉及的数学并不复杂。以下是论文中的做法:
- 把解码器上一个时间步的隐藏状态 ht-1 与第 i 个网格的特征 ai 拼接,一起输入一个多层感知机,得到一个分数 eti,表示“当前要生成的内容与该网格的相关程度”。
- 对全部196个分数做 softmax,得到权重 αti,所有权重之和为1。
- 用这些权重对网格特征做加权求和,得到上下文向量 zt = Σ αti ai。
注意,这里的权重不是固定的。模型在生成“girl”时,人物所在的网格权重高;在生成“frisbee”时,手边区域的权重高。权重由LSTM的隐藏状态决定,而隐藏状态编码了“我已经说过什么、接下来可能说什么”,所以机制是动态的。
软注意力和硬注意力:加权平均,还是抽签?
上面的三步是软注意力:所有区域都被使用,只是权重不同。梯度可以穿透加权和直接反向传播,训练稳定。
论文还提出了硬注意力。硬注意力不做事先的加权和,而是把权重 αt 当做一个多项分布,从中采样一个网格,只用那个网格的特征。这种机制与人类的视线跳跃更接近,但采样不可导,无法通过标准反向传播训练。论文用强化学习(REINFORCE)来估计梯度。
| 对比项 | 软注意力 | 硬注意力 |
|---|---|---|
| 使用区域 | 所有区域按权重融合 | 按权重采样一个区域 |
| 是否可导 | 是,端到端 | 否,需强化学习 |
| 训练稳定性 | 稳定 | 方差较大 |
| 推理效率 | 每个时间步处理全部网格 | 只取一个网格,更快 |
| 论文中的表现 | 作为主模型 | 仅作为对比实验 |
看到这个表格,你可能会想:既然软注意力又稳定效果又好,为什么还要硬注意力?因为硬注意力更接近人类注视的生理机制,而且在推理时省计算。它代表了一种“稀疏选择”的思路,后来被很多强化学习类注意力模型沿用。
一个正则项,逼着模型看全整个画面
训练时,论文在交叉熵损失之外加了一项正则化:对每个网格 i,把所有时间步上的注意力权重加起来,如果这个总和不接近1,就惩罚。公式上写作 λ Σ_i (1 – Σ_t αti)²。
这个约束的直觉是:一张图里值得看的物体应该至少被注意到一次,但不需要反复看同一个地方。它让模型“均匀地瞟一遍”,而不是盯着一个高亮点。论文称它为双重随机注意力正则化。我当时看完觉得,这是全文最有品位的设计——把“看全”这个隐含需求直接变成一个可微的损失项。
热力图让我第一次相信模型“真的在看”
论文里展示了一些注意力可视化结果。生成“A girl is throwing a frisbee”这张图时,每个词上方都叠着一个14×14权重矩阵放大后的热力图。在生成“girl”时,热力点集中在人物的脸上;在生成“frisbee”时,光照集中的地方变成女孩的手。
我第一次看到这种图时真的很感慨:模型不是在机械地背训练数据,它似乎学会了一种“看”的策略。更关键的是,这个策略不是人类手工指定的,而是通过梯度自动涌现的。这让我意识到,注意力机制本质上不是为了让模型“看到什么”,而是为了让模型“在正确的时间看到正确的东西”。
我当年把注意力误解成了静态显著性检测
读完论文很久后,我还是有一个错误印象:注意力权重可能对应着图像上的“显著性图”,哪里醒目哪里权重就会高。直到我看了实现代码,才意识到自己错得离谱。
同一个网格,在生成“girl”时权重可能最高,但在生成“frisbee”时权重可能变成零。注意力的权重不是由图像本身决定的,而是由图像特征和当前语言上下文共同决定的。它是条件概率,不是边缘概率。这个误解解除后,我再看其他多模态注意力模型,就变得流畅多了。
均匀网格和顺序生成:这套机制的天然局限
Show, Attend and Tell自然不是终点。它的第一个局限是网格太“机械”。14×14的网格是均匀分布的,物体不会恰好对齐网格边界,小的物体可能只占据半个网格。之后一些工作尝试用目标检测器先生成高质量的候选区域,再在这些区域上做注意力,也就是bottom-up attention。
第二个局限是误差累积。LSTM按顺序生成,每一步依赖上一步的输出,如果某一步注意力选错了区域,后续所有词都会被带偏。Transformer的自注意力通过并行计算所有位置的两两关系,一定程度上缓解了这个问题,但它不再有“顺序”的概念,需要靠位置编码来补充。
即便有这些局限,这篇论文在历史上的地位仍然很清晰:它是最早把注意力机制成功应用到图像描述上的工作之一,也证明了注意力不是NLP专属,而是跨模态的通用工具。
回到开头的问题:模型在说“女孩”时看哪里?在说“飞盘”时看哪里?Show, Attend and Tell给出的答案是:它自己学会的。它可能不像人眼那样光滑地转动,但它的选择具有同样的含义——将有限的注意力资源,投入到决策最关键的地方。
这也许是注意力机制最迷人的地方:它没有增加模型的表达能力,却给了模型一个“选择视野”的旋钮。而这个旋钮,最终改变了整个AI领域讲故事的方式。
原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/543.html