做视觉问答VQA相关研究或者复现过经典模型的人多半都听过注意力机制是VQA的灵魂这句话。但在2017年之前大部分模型的注意力用法还很朴素要么对图像做一次空间注意力要么对问题做一次文本注意力一次定位完就进入答案预测不再回头审视。今天要聊的SAAA堆叠多层注意力的VQA网络ArXiv 2017开源有代码属于早期把多层注意力堆叠这一思路系统化的代表工作之一。这篇论文给我的感觉是它没有堆砌特别复杂的结构却把从粗看到细看这个直觉贯彻得很彻底。这篇文献阅读笔记我会从论文动机、架构拆解、实验解读、代码复现体验和后续影响几个维度展开争取让你读完既能理解SAAA的精髓也能直接上手跑通它的实现。1. 为什么要读这篇论文VQA会看不会想的时代背景1.1 VQA任务的两大难点跨模态对齐与推理路径VQA的本质是让模型同时理解图像和自然语言并给出一个简洁、合理的答案。听起来只是看图说话但真正实现时有两个硬骨头。第一个硬骨头是跨模态对齐。图像是高维连续信号一句话是离散符号序列两者没有天然的一一对应关系。比如问题问画面里最靠左的物体是什么颜色模型首先得知道最靠左对应图像中的哪个区域然后再去理解颜色这个属性。如果模型没有对齐能力它只能靠统计答案分布瞎猜这在存在长尾目标的场景下几乎必然翻车。第二个硬骨头是推理路径。很多VQA问题不是一步就能回答的需要多步推理。图中有几个红色的球看似简单但模型要先定位红色物体再筛选出球类最后数数。这一步一步的链条单靠一次注意力是建立不起来的。在2017年前后大多数VQA模型都倾向于一次性问题建模图像特征、问题特征各自被编码拼接后直接接分类器期望一步到位。这种做法的局限性很明显——它把推理压缩进了一个全连接层本质上是模式匹配而非推理。SAAA这种堆叠多层注意力的设计瞄准的就是第二个痛点用多次注意力的迭代把定位-筛选-验证的推理链条显式展开。读这篇论文的过程其实是看作者如何用简单的组件拼出一个可解释的推理阶梯。1.2 从空间注意力到问题注意力2017年前的常规套路在具体讲SAAA之前有必要回顾一下当时注意力在VQA里的主流用法。2015-2016年的经典VQA工作比如基于CNNLSTM的基线基本是先用VGG或者ResNet抽取图像特征用LSTM编码问题然后直接把两个向量拼接或按元素相乘送到softmax分类器输出答案。后来有人发现并不是图像所有区域都对回答某个问题有用于是引入了空间注意力模型根据问题向量对图像网格上的每个位置计算一个权重权重高的区域对最终答案预测贡献更大。这就是单层空间注意力的雏形。同样的思路也能用在问题上——对问题词序列做注意力突出对当前视觉推理最关键的词。单层注意力的通病是一锤定音。模型只做一次权重计算如果这一步定位错了后面没有纠正机会。打个比方一个人刚走进房间扫了一眼就回答房间里有沙发吗但如果沙发被桌子挡住第一眼可能看不到真正合理的做法是先听到沙发这个词再确认房间深处、桌子后面的模糊轮廓最后才下结论。单层注意力没有再看一眼的能力多层堆叠恰恰补上了这一环。1.3 SAAA的切入点把看一遍变成看几遍SAAA的核心思路用一句话可以概括在不同抽象层次上反复让问题与图像特征交互每次交互都是一次注意力计算并利用上一层的输出精化下一层的注意力分布。这种设计借鉴了人类认知中的凝视-聚焦-确认过程第一轮快速定位候选区域第二轮在候选区域里做更精细的判别第三轮再验证答案与问题的契合度。这里要提一个容易混淆的点。很多人会把SAAA和同年出现的堆叠注意力网络SAN混为一谈。两者的确共享堆叠思想但SAAA更强调多层注意力之间的信息融合方式它会在每个注意力层内部同时更新图像的加权表示和问题的语义表示相当于每一层都在做一次双向的对话而不是单方面对图像做注意力。这个细微的差别决定了它在处理复杂问题时的表达能力上限。读这篇论文还有一个现实价值作者开源了完整代码和训练配置这对研究者太友好了。无论是想复现论文结论、把SAAA当基线对比自己的方法还是拿它的注意力可视化做教学演示都能省下从零实现的时间。这篇博文后面会专门讲代码层面的实操笔记。2. SAAA架构拆解从单层提问到逐步聚焦的注意力堆叠2.1 双通道特征抽取视觉基础与问题编码SAAA的第一层是标准的双通道特征抽取。视觉通道方面论文采用预训练的深度卷积网络在实验里使用的是VGG系列这也是当时VQA模型的标配提取图像特征。具体做法是把一张图像缩放后送入CNN取最后一个卷积层的输出作为图像的空间特征。该特征是一个三维张量形状为通道数×高度×宽度。论文会把它展平成一组空间向量假设特征图大小为H×W通道数为C那么图像可以被理解为H×W个维度为C的局部区域特征向量。这些向量保留了空间顺序后面的注意力计算就是对这H×W个位置分配权重。问题通道方面论文使用LSTM编码问题句子。每个单词先映射成词向量依次送入LSTM取最后一步的隐状态作为问题整体表征。不过为了支撑多层注意力SAAA的做法更细致它不仅保存最后的隐状态还会利用每个时间步的隐状态来构建问题在不同阶段的表示。这样在后续每一层注意力中模型都能拿到问题在不同语义粒度上的编码而不是把一句话压缩成一个固定向量后就不再变化。这里有个实操中很容易忽略的细节LSTM的隐状态维度与CNN区域特征的维度通常不一致常见如512维对2048维。SAAA在实现时会对两个模态的向量做维度对齐一般通过一个全连接层将视觉特征投影到与问题相同的嵌入空间。维度对齐的质量直接决定了后续注意力权重计算的稳定性如果两路特征尺度差异过大点积结果会偏向某个模态注意力退化成一侧恒为一。2.2 单层注意力模块问题与图像的一次互问互答SAAA的每一层注意力模块可以抽象为三个子步骤。第一步是生成注意力分布。给定图像区域特征集合V{v1,v2,...,vk}kH×W和问题特征q计算每个区域vi与q的相关性得分。相关性的计算方式论文里采用点积或加性注意力s_i w^T * tanh(W_v * v_i W_q * q)。在实践中用点积再乘一个缩放因子也常见但对早期模型而言加性注意力带tanh激活的表达能力更强因为它能在计算相关性之前先对两个模态做一次非线性变换缓和模态差异。第二步是加权汇总。得到s_i后经过softmax归一化成权重α_i然后对图像区域特征加权求和得到与当前问题最相关的图像摘要向量v_hat Σ α_i * v_i。这个向量把图像中与问题无关的部分压缩掉只保留关键线索相当于模型当前看到的内容。第三步是更新问题表示。SAAA与原版SAN的差异体现在这里它会再把v_hat和原问题向量q做一次融合例如拼接后过一个全连接层或者逐元素相加生成更新后的问题向量q。这个新的q会被送入下一层注意力继续计算新的注意力分布。换句话说问题在每一层都会根据当前视觉证据被修正——如果上一轮发现图像里有猫而问题提到宠物下一轮模型就会更偏向关注与猫相关的区域。我试着用一个生活化的例子来说明这个过程。假设你问这个戴帽子的人手里拿着什么第一层注意力可能把权重分散在人和帽子上图像摘要向量同时包含人脸和帽檐的信息。带着这个混合信息去更新问题表示问题向量的语义可能偏向人的动作。第二层注意力再用这个更新后的问题向量去计算相关度就会更聚焦人手部附近的区域从而定位到物体本身。这种层层精化就是堆叠注意力的核心收益。2.3 多层堆叠方式残差连接的雏形与信息流动SAAA一共堆叠了几层注意力论文里给出了不同层数的对比实验常见的配置是2层或3层。这里要注意并非层数越多越好。随着层数增加参数量上升、训练难度加大更重要的是如果每层的问题表示更新方式设计不当错误信息会在层间累积放大——第一层把注意力放在了错误区域第二层拿到被污染的视觉摘要会继续强化这个错误。论文里通过实验验证3到4层之后性能不再提升甚至下降这其实是个很经典的过深注意力现象。为了缓解信息在多层之间的损失SAAA在更新图像摘要向量时采用了一个值得注意的细节它会把每一层加权汇总得到的图像摘要向量拼接起来而不是只保留最后一层的结果。这样做的好处是最终答案预测模块可以同时利用“第一层粗定位”和“后续层细定位”的信息相当于给分类器提供了多尺度的视觉证据。这种收集每层输出用于最终预测的思路在后来的很多多模态模型中被反复使用可以作为从这篇论文里提炼出的一个通用设计原则。顺带一提如果只保留最顶层的摘要向量模型的注意力分布必须一步比一步准才有效而拼接每层输出相当于给了最终分类器反悔的机会——即使某个中间层定位失误其他层的正确信息依然存在。这个设计极大提升了训练稳定性尤其在小规模数据集上效果差异非常明显。2.4 答案预测模块多模态融合与目标函数经过多层堆叠注意力后SAAA拿到一组图像摘要向量每层一个以及最终更新过的问题表示。接下来要做的是把这些信息压缩成一个候选答案上的概率分布。常见做法是把每层的图像摘要向量与最终问题向量分别拼接过一层全连接映射到一个公共空间再对所有拼接结果做逐元素相加或取均值得到综合特征向量。之后接一个或多个全连接层最后用softmax在候选答案集合上输出概率。训练目标用多分类交叉熵候选答案集合来自训练集统计中出现频率足够高的答案通常覆盖率达到85%以上。这个训练设置里有一个VQA领域绕不开的操作答案归一化。一个简单问题比如这是什么颜色训练集中可能出现红色、红、红色等不同写法如果不做归一化模型会把同义表达当作不同类别导致分类空间过大且样本稀疏。论文和代码里都采用了把标点去掉、全部转换为小写等预处理方式并在统计答案词频时把多种形态合并到同一个标准答案下。这个细节直接影响最终准确率几个百分点复现时千万不能省。3. 论文的实验设计与结论怎么证明多看一眼有用3.1 实验数据集与评估指标VQA竞赛标准怎么用论文实验主要在大规模VQA数据集上进行这是该领域第一次有了大规模、标准化的公开评测基准。数据集的构造方式为人类标注员针对COCO数据集中的图像提出自然语言问题并给出答案构成图像-问题-答案三元组。与之配套的评估指标是VQA准确率对同一个问题模型输出的答案与10位人类标注员的答案进行比对计算的公式可以理解为一个加权匹配分数完全一致得满分同义改写按比例折算分数。实测下来更贴近VQA竞赛的做法是分为是/否、数字、其他三组分别统计准确率再取平均。SAAA论文在汇报结果时也遵循了这个口径。值得留意的是是/否类问题的准确率通常远高于其他类因为是/否类问题存在很强的语言先验比如有没有类问题回答是的概率本身就有70%以上。所以在看论文的对比表格时不要被整体平均分数迷惑两手抓才是完整的信息一手抓住大类别上的表现差异一手抓模型在其他类问题上的推理能力——后者往往是注意力机制真正发挥作用的地方。3.2 对比基线的设置逻辑为什么要和这些模型比SAAA在实验对比中选了一组有代表性的基线。第一类是没有注意力的模型图像特征和问题特征直接拼接后接分类器这个基线用来验证注意力本身是否起作用。第二类是单层注意力模型只对图像做一次空间注意力这个基线用来验证堆叠多层是否比单层更强。第三类是当时已有的其他注意力机制模型用来做横向对比。我在复现时特别喜欢这种渐进式基线的对照方式。它把有没有注意力和有多少层注意力两个问题解耦了。如果一个论文只报告模型最终精度最高却不说明它比单层注意力强多少你很难分辨性能提升来自结构设计还是来自调参运气。SAAA论文的实验表格清晰展示了从无注意力到单层注意力准确率有几个百分点的提升从单层到多层堆叠又有两个点左右的提升继续增加到更多层则出现饱和甚至下降。3.3 看图说话注意力可视化直观验证推理过程论文实验部分还展示了大量的注意力可视化结果这是我个人觉得最有说服力的部分。图像被网格化注意力权重以热力图形式叠加在对应网格上。以这个人穿的是什么颜色衬衫这类问题为例第一层注意力的热力图通常覆盖人的上半身及背景中的相似颜色区域分布比较发散第二层注意力收缩到衣服区域第三层基本只集中在衬衫主体上。这种逐层聚焦的可视化效果比任何数字指标都更直观地回答了堆叠为什么有效。当然可视化也有局限性。注意力权重反映的是模型在计算过程中的内部倾向并不等同于因果解释——高权重区域不一定是模型做出正确决策的原因。不过作为论文的辅助证据它确实能说明网络学到的行为模式与设计意图一致。3.4 消融实验给我的启示不是所有的多都更好论文的消融实验包含几个维度注意力层数、问题表示是否逐层更新、图像摘要是否每层保留。我的理解是这些实验的核心结论有三条。第一逐层更新问题表示带来的增益是显著的。这证明双向对话的设计确实有效如果只是固定问题向量去对图像做多次注意力效果会差一截相当于每层用同一句话重新看一遍图却没有从上一轮吸取经验。第二拼接每层图像摘要比只使用最后一层效果好。这个前面已经解释过——多尺度信息互补同时缓解了逐层误差累积。第三层数不是越多越好。论文在3到4层时达到峰值更多层数时性能下降。下降原因可能是过拟合参数量增加和梯度消失的组合效应。这个结论给后续研究者提了个醒在注意力深度和模型容量之间存在一个平台期需要针对自己的数据集规模单独调试。4. 代码复现与实操笔记从公式到可以跑的模型4.1 源码结构与数据预处理流程因为是年代较早的开源项目代码结构相对简洁读起来负担不大。整个项目大致分为四个模块数据加载与预处理、模型定义、训练脚本、评估脚本。图像预处理流程是读取图像→缩放至合适尺寸比如448×448或224×224视所用CNN而定→减去均值后标准化→输入CNN提取特征。论文配套代码里通常会提供离线特征提取脚本把VGG对每张图像的特征提前算好、存成二进制或HDF5文件避免训练时反复跑CNN。这种做法在当时的显存条件下几乎是必须的——直接端到端训练整张图会让显存瞬间爆炸。问题文本的预处理也有不少细节。第一步是分词按空格切分并转小写。第二步是构建词汇表一般只保留出现频率不低于5次或10次的词其余替换为特殊标签。第三步是统一问题长度大部分问题在20个词以内把长度不足的用占位符补齐。经过这三步问题变成等长的词索引序列方便LSTM批量处理。4.2 超参数配置与显存占用实测复现SAAA时一组可用的默认超参数大致如下。超参数推荐取值说明图像特征VGG-16/19最后一个卷积层输出空间特征保留位置信息推荐提前离线提取LSTM隐状态维度512与视觉投影后的维度保持一致注意力层数2起步/ 3最优超过4层收益下降Batch Size128特征已提取若端到端训练需降到32以下学习率初始0.01每若干轮衰减配合SGD优化器答案词表大小2000-3000按覆盖率85%左右截断由于图像特征是离线提取的整个训练过程实际只跑LSTM注意力分类器显存占用不高在当时的单卡如8GB显存上就能完成训练。训练时间取决于数据集规模和轮数通常需要数小时到十几个小时。个人经验是训练初期先跑少量轮数观察训练集准确率能否快速上升如果训练集准确率一直不涨优先排查维度对齐问题或学习率设置。4.3 复现中容易踩的坑从数据对齐到随机种子我复现这个模型时遇到过不少问题挑几个典型的分享一下。第一个坑是数据对齐错误。训练样本图像特征、问题、答案来自不同文件时如果不检查顺序是否一致等到训练中期会发现loss不降反升。这个检查看起来低级但在处理大规模数据时很容易踩。解决方式是保存数据时用统一索引加载时反复验证索引对应关系。第二个坑是答案映射表的构建。如果答案是先按出现频次排序再截断阈值设太高会导致很多训练样本的答案不在映射表里被当成忽略项或错误项。建议统计答案覆盖率的代码单独写一个脚本先观察覆盖率曲线再决定词表大小。第三个坑是权重初始化与随机种子。多层注意力模块涉及多个全连接层如果使用默认高斯初始化而方差设置过大训练初期softmax容易出现饱和输出权重几乎均匀分布导致注意力失去区分度。建议对全连接层使用较小的初始方差并固定随机种子保证实验可复现。第四个坑是LSTM长句截断。有些训练数据里的问题特别长如果草率地把超过20个词的句子全部截断可能切掉关键信息尤其对包含关系从句的复杂问题影响更大。一个折中方案是把长度上限设为30并且在截断时选择保留末尾部分因为LSTM的最终状态接近句子尾部保留尾部信息能减少语义损失。4.4 注意力可视化把模型的想法画出来复现完模型后最好做一步可视化验证这也是论文里最有成就感的部分。具体实现分三步。首先把测试集的一张图像提取成H×W个区域特征。其次加载训练好的模型对模型输入对应问题在注意力层内部把softmax之前的权重矩阵截取出来。最后把权重矩阵归一化后reshape成H×W的尺寸配合原图的热力图叠加显示。截图代码需要留意的是VGG最后一个卷积层输出的空间尺寸较小可视化的热力图比较粗糙如果你想得到像素级平滑的热力图可以对权重矩阵做一次双线性插值上采样。另一种更细腻的做法是使用类似CAM的思路把某一层输出向量与全连接层权重结合生成类激活图但这就偏离原论文的语义了作为延伸尝试就好。可视化结果如果出现第一层注意力就精准锁定目标的样例可以拿到论文里说的堆叠有效的对比例子。如果发现注意力几乎均匀分布说明模型已经退化成了无注意力模式这时候优先检查训练是否收敛、问题表示是否被正确传入多层模块。5. 这篇论文的思考余味注意力堆叠对后续工作的影响5.1 一个设计思路的传播从显式堆叠到隐式迭代SAAA最大的遗产是把迭代精化这个概念在VQA领域烙下了一个清晰印记。此后不久许多工作开始用它作为对标基线而对比模型往往在注意力如何交互上做出改进有的引入双线性注意力让模态交互更细粒度有的借助自注意力机制跨图像区域传递信息有的基于图神经网络显式建模对象间关系。回头看这些方法的共同点都可以被理解为多层注意力堆叠在某种程度上的变体它们只是把交互方式从简单的点积/加性注意力升级成了更复杂的算子。另一个值得关注的方向是隐式深度。SAAA通过堆叠多层注意力来增加网络的推理深度而后续的一些工作开始探索让单层注意力变得更强大的路径——通过几次迭代更新同一个向量来模拟多层效果或者引入循环结构来共享层间参数。这两种方向的取舍本质上是在参数效率与推理灵活性之间做权衡。SAAA选择了一条最直观的路线给后来的探索树立了坐标系。5.2 批判性反思堆叠注意力的边界在哪作为一个文献阅读者我觉得SAAA论文本身的局限也值得认真对待。第一它的注意力层之间的信息交互相对简单。每层只是用上一层的问题向量重新计算图像权重并没有显式建模当前已经关注过哪些区域的历史信息。这导致了同一个缺陷模型在多层注意力中可能反复聚焦同一块区域产生冗余计算。后来的论文启发的ReASON机制和反注意力思想就是试图解决这个问题——让模型学会回避已经看过的区域。第二它用的视觉特征来源于整图卷积特征区域之间没有对象级别的语义边界。对图中左边第二个人这种需要空间关系推理的问题网格状区域特征的表达能力有限。这也是后来基于检测器提取对象级特征成为主流的原因之一。第三答案预测本质上是个封闭分类问题只能从预定义答案集合里选一个。对于需要输出短语甚至句子的开放式问题它的能力边界非常明显。这不算缺陷但读者需要意识到它的适用范围。5.3 如果我想基于它做改进会从哪里入手站在复现者和研究者的角度如果我需要基于SAAA做一个可发表级别的改进我会优先考虑三个方向。方向一增强层间注意力交互。在每一层加入已关注区域掩码或注意力记忆使后续层能够有意识地关注与前面层不同的区域。这个思路实现成本低却能直接补上SAAA的短板。方向二引入对象级视觉特征。用检测模型提取VQA任务中有意义的目标框按目标框区域做注意力替换原始网格区域。这更符合人类注意物体而非注意像素块的直觉在多物体场景下的提升非常明显。方向三把问题表示更新从拼接融合改成门控融合。用门控机制决定视觉证据对问题向量更新的影响幅度抑制噪声信息传播。这个改动只增加少量参数但对复杂问题的鲁棒性有益。关于要不要做端到端训练的选择我也多说一句。SAAA默认离线提取视觉特征训练快速且省显存但代价是CNN与上层任务之间存在语义割裂——上层网络只能在固定特征下寻找答案无法反过来引导特征提取器去关注更细的纹理或边缘信息。如果你想把它作为自己工作的baseline建议至少尝试微调最后一两层卷积层常常能在颜色和计数类问题上收获额外提升。这篇论文读到这里其实还能延伸出很多话题注意力机制的可解释性和因果性、VQA与视觉定位的融合、开放式生成式VQA……但作为一篇文献笔记核心价值还是把SAAA的堆叠多层注意力这个设计讲透。论文本身不复杂却是一个少有的、从动机到实验到代码都能闭环的关键节点。如果你刚好在做VQA或者多模态检索相关的工作花一个周末把代码跑通再对照论文重新看一遍实验表格收益会比单纯读十篇综述更实在。
阅读完成 · 觉得有帮助?