好的,欢迎大家回来。
先快速回顾一下。希望每个人都在推进自己的项目。我已经通过邮件给大家反馈了,也为每个人分配了一位主要助教,请大家开始与我们会面。目标是让你每周轮流与我和主要助教见面,这样每周都有机会同步进展并获得反馈。希望到现在,你们已经基本确定了核心想法,实验框架也搭建好了,包括数据集、模型、基线方法,可能有些基线模型已经跑起来了,自己的新想法也有了一些进展。
下一个检查点是在春假之后。那周的周二,你们的中期报告就要提交了。周四的课上,大家会进行展示,具体时间是春假后那一周的周四。我们还发布了第三次阅读作业,截止时间是明天晚上,为本周四的课堂讨论做准备。这次阅读的主题是多模态对齐,也就是如何在不同模态之间建立统一的表示空间。第一篇是那篇关于对比学习的论文,展示了如何做到这一点,并做了很漂亮的分析。第二篇论文叫“Plating Representations”,讲的是一个非常有趣的现象:即使不强制对齐,仅仅通过扩大模型规模并独立训练,某种对齐和相似性也会自然涌现,并可能收敛到一种统一的相似表示。这也是个很值得探讨的现象。这两篇论文都留下了许多开放问题,希望我们能在周四进行讨论。
好,今天我们来看多模态融合。之前我们已经介绍了多模态学习导论,讲了对齐。今天深入探讨融合,也就是当不同模态存在时,如何把它们融合在一起。一般定义是:给定两个模态,学习一个联合表示,能够捕捉这些模态如何交互、信息从何而来,以及这些信息如何结合。我们会在一节课里概览多模态融合的整个图景,目标是让大家了解不同的思路,形成一个谱系认识。与你自己项目最相关的方法,可以再深入去看具体的论文。
融合可以看作一个谱系。一端是先用预训练模型从原始模态中提取抽象特征,然后对这些抽象特征做简单的融合。因为抽象后的表示在语义上更接近,融合的工作量就变小了。另一类范式是从原始数据开始,原始数据的模态差异更大、更异构,维度不同,离散连续空间不同,元素各异。这时就要较早地进行融合,让融合模型承担更多工作。所以,一边是先独立提取特征再简单融合,另一边是不提取特征,从原始数据开始,让融合做更重的活。这同样是一个连续谱系,方法可以从一个极端延伸到另一个极端。
融合的核心目标,就是捕捉模态之间的交互——这些模态是以某种方式组合信息的。我们上一节课提过,多模态交互是多模态数据之所以独特的三个关键原则之一。直观地说,就是这些模态如何结合起来提供新信息。我们讨论过几种交互类型。第一种是冗余,也就是共有信息。比如你说着高兴的话,同时露出高兴的表情,两者都在强化“这个人很喜欢这部电影”这个信息。我们也看过对齐方法,比如对比学习,它本质上是学习独立的表示,然后用相似函数或对比函数把它们拉在一起。实际上,这种方法学到的很可能就是模态之间的共同信息。所以,对齐方法与冗余之间有一种直观的联系:基于对齐的方法主要捕获的是模态之间冗余的共享信息。当然,这些都还是直觉,并没有严格的证明。如果你的数据主要是冗余的,你想捕获的是共同信息,那么基于对齐的对比学习方法就值得探索。
另外两种交互类型是唯一性和协同。唯一性是指信息只存在于一个模态中,另一个模态没有。比如你嘴上说着积极的话,但面部表情是中性的。这种情况下,基于对齐的对比学习方法只会学到共同的部分,会把独特的信息丢掉。所以我们今天看的一些方法,就是关于如何更好地捕捉这种独特信息。第三种是协同,这种信息既不共同存在于两者,也不单独存在于某一方,只有当你把模态融合在一起时才会出现。比如你嘴上说着正面的话,但脸上带着愤怒或沮丧,结合起来你就能推断出这个人在说反话。基于对齐的方法同样捕捉不到这种信息。所以,多模态融合的整体思路,就是要捕捉这些不同类型的信息以及它们组合的方式。
先看对抽象模态做融合的情况,也就是先用预训练模型提取特征,再做简单的融合。比如用图像模型提取图像表示,用语言模型提取语言表示。这些编码器的核心思想是从原始数据中提取更具语义的抽象特征,这样它们在语义上更相似,融合时的工作量就小了。这也对应了有些人所说的早期融合和晚期融合。早期融合是将数据以某种方式直接合并,然后送入模型,让融合模型承担更多工作。晚期融合则在另一个极端:你可以分别用模态A和模态B做预测,然后把预测出的标签用某种方式组合起来得到最终结果。比如集成方法,当你有多个模态时,取多数票作为最终标签。这些都是晚期融合的例子。
这只是方法的一个采样。我们从简单开始,先介绍融合的基本概念。思路是建模跨模态的交互,也就是这两个模态是如何相互作用的。我们只从一维的情况看起:模态X_A是一维,X_B是一维,标签也是一维。
引入融合概念的一个非常简单的方法是看线性情况:训练线性函数,用数据预测标签。你们应该都熟悉线性回归:标签y等于截距w0加上w1乘以X_A,再加上w2乘以X_B。然后有一个有趣的项:w3乘以X_A和X_B的乘积。前两项是加性项,每个模态独立贡献,权重1乘以第一个模态,权重2乘以第二个模态。这额外的一项是乘性项,也叫乘性交互——先将两个模态相乘,再决定权重w3,这对预测标签很有用。
看一个实际例子。假设你要对书评做预测。有两个输入:第一个模态是人们在谈论这本书时微笑的时间百分比,可以是全程微笑,也可以完全不笑,这是一个连续值。第二个模态是一个指示变量,表示这个人是不是专业书评人。专业书评人以评论书为生,非专业的就是像我们一样的普通人。标签Y是书的实际评分,比如烂番茄那种评分。你可能会先感兴趣的是,微笑的时间百分比是否能够预测评分好坏?这是一个单模态的假设,只考察X_A如何影响Y。第二个假设就更有趣了:微笑的影响是否取决于职业身份?这就是在问交互效应了。当我是非专业书评人,只是爱好评论时,我的微笑对于书的评分意味着什么?对比我是专业书评人时,微笑又意味着什么?你可以做基本分析,只用微笑来训练线性回归,会得到一条斜率为正的直线,微笑与评分正相关。如果同时加入微笑和职业身份两个变量,因为职业身份是0或1的指示变量,你会得到两条斜率相同但截距不同的直线。非专业书评人的线整体更高一些,专业书评人的线向下平移,说明专业书评人可能更苛刻。这就是线性回归中,第二个模态只引入上下平移的情况。
如果再加入乘性项w3乘以X_A和X_B,函数就更有表达力了,能捕捉到斜率不同的函数对。你可以这样理解:对于非专业书评人,微笑越多评分越高;对于专业书评人,微笑的影响被放大了——他们微笑时,更喜欢这本书;不微笑时,则更不喜欢这本书,表现得比普通人更极端。这就回答了假设:是的,斜率确实发生了变化,微笑与评分的关系在是否专业上有所不同。这也就是为什么人们要在模型中考虑乘性交互。
从一维可以推广到高维。一种常见方法是逐元素相乘来捕捉交互。如果你有4维的X_A和4维的X_B,你可以通过逐元素相乘得到一个融合表示z,这样每个维度上都是X_A和X_B相应元素的乘性交互。还可以更有表达力:你可以构建一个4×4的矩阵,也就是双线性矩阵,把X_A的每一个元素和X_B的每一个元素都相乘,得到所有特征对之间的乘性交互。这种双线性融合可能会让你们想起上周看过的多模态Transformer:同样是两个向量,通过某种外积得到成对的矩阵。现代Transformer架构正是受到了这些早期双线性池化思想的启发,核心都是考察一组特征与另一组特征的所有成对组合。
多模态Transformer的做法类似,但有一些细微差别。你可以有第一个模态的数据,比如人说的几个词,维度是3×D。第二个模态的数据,比如面部或声音表情,维度是4×D。序列长度可以不同。你计算它们的外积,得到一个3×4的权重矩阵,然后除以维度的平方根,做softmax,使值可解释为概率,再与第二个模态的实际特征相乘,从而为语言学习到一组新特征。三个词各对应一个新特征,每个新特征都利用了与四个表情的注意力交互。最后用这些特征去预测是否为讽刺等标签。
这就是多模态Transformer的思路,与之前展示的双线性乘积本质相同:多组特征之间考察成对的交互。两者的区别在于表达力:逐元素相乘只能让同一维度的特征交互,而外积矩阵允许任意维度间的交互,具体取决于特征本身和问题需求。你还可以通过追加常数1的方式,在交互矩阵中保留单模态项和截距项。
当然,还可以推广到三个或更多模态。三个模态时,你会得到一个三维张量,比如4×4×4的立方体,其中包含了三阶交互、两两交互、单模态项和截距项。你可以不断增加表达力,但问题在于效率。双模态时矩阵参数还算合理,三个四个模态后张量会变得非常大,权重矩阵过大。为了提高效率,出现了低秩近似方法。例如那个4×4的交互矩阵不算太大,但当你把它连到下一层,比如10类的softmax,需要一个4×4×10的权重矩阵,这就非常昂贵了。低秩近似的做法是不学习完整的4×4×10矩阵,而是假设这个矩阵具有低秩结构,可以近似为几个更小矩阵的组合。直观理解是,一个10×10的矩阵有100个参数,但如果某些维度相关,它可以近似为若干个10×10外积的和,参数大幅减少。视觉上,就是把大立方体分解为有限个外积之和,通过限制求和数量来降低参数,同时保持足够的近似能力。
这样,我们就看到了从简单向量开始,逐步构建越来越复杂的乘性交互的过程:从二维、三维到更高阶,还可以加入多项式因子,理论上让模型更具表达力,更能学习复杂的模态交互。但始终面临过拟合的风险,所以需要用交叉验证来监控泛化能力。
目前看到的方法中,融合权重都是静态的,对所有数据点都一样。而另一类称为门控或动态的方法,其融合权重会根据数据本身而变化。就像注意力机制那样:给定当前模态,学习一组对自己的注意力权重,也给另一模态学习注意力权重。这些权重随数据点不同而变化。有时某个模态信息很有用,权重就大;有时用处不大,权重可能接近0,信息就被过滤掉。这非常像Transformer中的自注意力。你可以把固定的权重看作特殊的注意力函数,而动态权重可以通过门控机制实现,门控可以是软注意力(0到1连续值),也可以是硬注意力(离散0/1选择)。硬注意力更可解释,但训练更困难。
到目前为止,我们主要讨论的是对称融合,即两个模态地位相等。但在很多情况下,我们有先验知识知道某个模态更重要,另一个是次要的。比如人类交流中,90%靠语言,只有10-20%的情况才需要看面部表情或语音。这时你可能不想用对称融合,而希望以主要模态为核心,次要模态只做微调。一类方法就是让视觉和音频学习一个门控函数,决定哪些特征通过、哪些被阻断,然后用它们来调制主要模态(语言)的表示。这可以看作以语言嵌入为中心,次要模态只对其进行小幅偏移。这样做也更高效,因为次要模态的融合模型可以做得更小。
我们刚才经历了一个从简单到复杂的融合方法谱系。另一个极端是早期融合:直接将X_A和X_B拼接起来,让一个更大的模型F自己学会如何融合,而不需要太多人工特征工程。这在过去非常常见。
现在,很多模型使用Transformer进行融合,但相似的理念依然存在。比如文本作为序列,图像也作为序列,Transformer编码器本质上就是在学习成对的乘性交互。同时,也不难看到残差结构的影子:保留图像独有的路径和文本独有的路径,类似于可加的、单模态部分,再加上中间的乘性交互部分。这些模型还有一个趋势,就是把对齐和融合一起做。我们上周讲对齐,今天讲融合,你看这些论文,总能看到一个对齐目标。比如词与图像块的对齐,用对比学习来优化;还有一个更全局的对齐目标,考虑整个图像和整个描述。全局的对比损失很好定义,因为你有正例对(图像与正确描述)和负例对。但细粒度对齐的困难在于没有单词与图像块级别的标注。最优传输方法就是用来解决这个问题的:在只有全局配对的情况下,自动找到最佳的单词与图像块匹配。
有人问能否组合不同粒度的对齐。是的,比如短语级别的对齐就很有用。因为仅靠单词级对齐,无法区分“人站在车前面”和“车站在人前面”这样的组合关系。这也是现代模型仍在挣扎的地方。所以融合和对齐可以相互配合,学习到强大的图像-文本表示,同时实现细粒度的对齐可视化。
不过,所有这些都是建立在两个模态有大量信息重叠(冗余)的基础上,比如图像和描述反映的是同一个现象,所以基于对齐的目标才有效。如果存在更多独特或协同信息,它们就有被对比损失丢弃的风险。
也并非一切都完美。这些模型有时也会失败。比如在视频活动识别中,融合了RGB、光流和音频等多个模态,但有时组合起来的表现反而更差,至少没有提升。花了很多时间收集数据、训练更大的模型,结果却不如单模态模型。原因之一就是单模态偏差。再比如视觉问答:你训练时总看到黄色香蕉,所以模型不看图像,只看到问题“香蕉是什么颜色?”就回答“黄色”。哪怕给它看一个绿色香蕉,它还是说黄色。这还涉及公平性问题:图像描述模型总是盯着电脑就假设是“男人”在办公,或者看到网球拍就假设是某个性别。这些都是单模态偏差的例子,某个模态信息太强,导致优化困难。
缓解的方法包括:重新平衡数据集(如VQA 2.0为每个问题都提供两张可能回答的图片),添加额外的训练目标让梯度均衡地流向各个模态,以及应对模态学习速度不同的问题。有些模态学习快,过早开始过拟合,而其他模态还没学好。一种解决思路是在训练多模态模型的同时,跟踪单模态模型的泛化速度作为基线,根据比较结果动态调整多模态模型的学习速度。这个想法很好,但缺点是现在要训练三个模型,代价变高。这些都是开放问题。
总结一下,我们看了多模态融合。核心是接收不同模态的数据,学习一个联合表示,捕捉模态如何交互:是共有信息、独特信息,还是需要更复杂交互来建模的协同信息。我们看了从更同质的(或通过特征提取变得同质的)到更异构的模态的融合谱系。关键要点是:越同质,越可以用晚期融合这样的简单方法;我们也看了加性融合,但加性函数的表达力不如乘性交互。双模态时是矩阵,三模态时变成三维张量,还可以到更高阶多项式。这些都需要通过低秩近似等方法提高效率。我们还看了动态权重的方法,以及早期融合、优化中的挑战等。
这就是今天的快速介绍。与你们项目相关的部分,可以进一步阅读提供的论文和参考文献。最后提醒一下,继续推进项目,阅读作业明天截止,为周四的讨论做准备。谢谢大家。
热门跟贴