前几天组里做论文分享,我把这篇MOON 2.0从头到尾捋了一遍,说实话信息量挺大。它不只是换了个更大的Backbone或者是堆了几个Loss,而是把电商场景下这套多模态表征的底层逻辑重新理了一遍。核心就一句话:从任务统一走到模态协同。
做电商多模态的朋友应该有同感,我们之前在业务里搭的那套东西,本质上还是“各模态各算各的,最后拉个向量拼接完事”,任务上勉强统一了,但模态之间的信息是各说各话,没有任何交互。这个工作等于直接把方向扭过来了——让文本、图像、视频这些模态在训练过程中主动对话,而不是等到下游任务里才被迫见面。这对做搜索、做推荐、做内容理解、做商品治理的团队,都有很直接的参考价值。
这篇博文我会从技术动机、模型结构、训练细节、效果评估和工程落地几个维度展开,尽量把我理解到的设计逻辑和背后踩过的坑都讲透,适合正在做多模态表征或者准备往这个方向转的同学参考。就算你现在不做电商,这套“任务统一到模态协同”的演进思路,放到任何一个多模态业务场景里都成立。
1. 先捋清楚背景:电商多模态表征到底卡在哪个环节
很多团队一上来就奔着“搞一个大一统模型”去,结果做着做着就发现,问题根本不在模型容量,而在对业务痛点的理解不够精确。MOON 2.0第一个值得学习的地方,就是它把问题定义得非常清晰。
1.1 电商内容形态的三个割裂现状
电商场景里的商品数据,天然是多模态的:标题是一段文本,封面图是一张图,详情页里有长图,还有短视频和直播切片。这些内容每时每刻都在生产,也在被用户消费。但我实际做业务时发现,大多数系统对它们的处理是割裂的。
第一个割裂是来源割裂。文本来自商家填写,图像来自美工或者供应链素材库,视频来自运营拍摄,三个内容的生产流程完全不同,导致同一个商品的不同模态在信息表达上经常“各说各话”。标题说的是“纯棉透气”,图片可能只拍了一个模特上身图,视频里全是氛围感,细节信息根本对不上。
第二个割裂是特征层面的割裂。传统的做法通常是图像模型出一个向量,文本模型出一个向量,然后直接拼接或者分别建索引。到了检索和排序阶段,这些向量各算各的相似度,再人工加权合并。这种方案表面上用了多模态,实际上每个模态的表征空间还是独立的,模态之间没有对齐,也没有做信息互补。
第三个割裂是任务层面的割裂。商品分类、属性识别、相似商品检索、违规内容识别、同款比价,这些任务各自训练各自的模型,特征不共享,迭代节奏也不一致。表面看每个任务都能单独优化,实际上整个系统被人为地切成了很多个小岛,每个小岛上的数据都是局部的,学到的特征也长不成一个全局通用的形态。
1.2 单模态强模型不等于多模态强系统
这里有个特别容易踩的误区。很多团队觉得,图像模型用更大的Backbone、更强的预训练权重,文本模型也换成大规模预训练语言模型,多模态的效果就应该水涨船高。但我实测下来完全不是这么回事。
原因不复杂。单模态模型各自学到了各自空间里的规律,比如图像模型学到的是像素分布和视觉纹理的规律,文本模型学到的是词汇共现和语法结构的规律。它们俩各自在自己的空间里排序排得挺好,但一旦要把两个空间的向量放到同一个空间里做相似度计算,就全靠后天的“强制对齐”了。而简单的拼接或者线性映射,根本承担不起这个对齐的复杂度。
还有个问题是数据尺度失衡。电商场景里,文本和图像的样本量往往差好几个数量级。图像那边可能几十亿张,文本那边清洗之后可能只剩几个亿条,视频更是少一个量级。你在这种不均衡的数据上做单模态预训练,得到的是三个“发育程度”完全不一致的模态表征。这就像三个人从三个不同的起点跑向同一个终点,跑得快的人已经到地方了,跑得慢的还在半路,你要硬把它们拉到一个位置上,必然有人得多走很多冤枉路。
MOON 2.0的处理思路是把模态协同放到模型架构和训练目标里,而不是等下游任务去“填坑”。这个出发点我认为是对症下药的。
2. MOON 2.0是怎么设计的:从任务统一到模态协同
MOON 1.0的路线,当时解决的是“任务统一”的问题,也就是把分类、检索、匹配这些任务收拢到一个统一的表征框架里。到了2.0,作者团队明显意识到更深的瓶颈是模态之间的关系没有被建模,所以整个架构设计都围绕“协同”两个字展开。
2.1 模型骨架:共享的塔,独立的门
整个模型的主干结构是典型的双塔变体,但细节上做了不少文章。先说共享的部分——文本塔和图像塔用的是同一个基础编码器的两个分支,也就是说它们共享底层的参数,只是在往上走的过程中逐渐分离出各自模态的专用层。这里的设计意图很好理解:底层的共性规律(比如边缘、纹理、词根、句法)可以完全共享,浪费不到哪去;高层的语义规律各模态差异大,必须分家。
但这个共享设计有个经典问题,不同模态的梯度方向经常是冲突的。文本任务想让某个特征维度往A方向走,图像任务想让同一个维度往B方向走,来回拉扯,训练就很难收敛。MOON 2.0的处理方式是在共享编码器之上挂了模态感知门控,也就是每个模态在特征提取的每个阶段都有一个可学习的门控向量,用来控制共享参数对本模态特征的贡献权重。
门控的好处是它给了模型一个自由调节的旋钮。某个模态信息量大的阶段,门控可以放大共享特征的影响;某个模态的私有信息更重要的时候,门控又可以把共享特征压一压。我理解这个设计有点像团队里同一个资源池给不同项目组分配算力——平时大家共享,但每个项目组手里有自己可以动态调节的配额,避免一个组的任务把公共资源带偏。
2.2 模态协同的核心机制:协同路由和跨模态注意力
这是MOON 2.0里我最欣赏的一部分。他们不只是把三个模态的特征拿到一个Transformer里拼一下,而是设计了一条“协同路由”路径:每个模态的特征在进入主干网络的过程中,会同时走两条路,一条是模态自身的处理路径,另一条是与其他模态进行信息交换的协同路径。
协同路径的核心是跨模态注意力模块。图像特征会以Key-Value的形式暴露给文本特征,文本特征也会以同样的方式暴露给图像特征,同时视频特征作为一个独立的序列参与交互。因为引入了可学习的路由Token,模型可以动态决定每个模态从其他模态那里“提取”多少信息。举个例子,当模型判断一个商品的图像信息量不足时,路由Token会让文本模态的输出更大程度地影响图像特征;反过来,如果图像信息足够丰富,这个交互权重就会被压小。
这个机制的实际效果,和图像超分的注意力有点类似——它不是让信息在模态之间“广播式”传播,而是让信息按需流动,每次只流动当前阶段最应该互补的那部分。
还有个细节值得单独说:位置编码。电商场景的图文视频在语义上是有对应关系的,比如视频的某一帧正好对应标题里的某个卖点。MOON 2.0在跨模态注意力里引入了语义对齐感知的位置编码,用CLIP式的弱监督信号做辅助约束。这个细节很多团队会忽略,但在短视频商品这种场景里,语义位置对齐真的能带来肉眼可见的增益。
2.3 训练目标:不只对比,还有均衡
看过很多多模态论文的同学应该对InfoNCE整体家族很熟悉了。MOON 2.0用的训练目标分三层:
第一层是跨模态对比损失。批次内互为对应的样本对为正样本,其他样本对为负样本。这一层解决的是让不同模态的特征空间拉近,保证相似商品的图文视频在表征空间里靠在一起。
第二层是模态均衡损失。这个损失本质上是在约束不同模态特征分布的“尺度”要一致。如果文本特征的标准差天然比图像特征大,那么在计算相似度的时候,文本对相似度结果的支配力就会更强,图像特征再怎么对齐也白搭。这个损失的加入,是让模型学习每批样本里各模态特征的分布参数,然后约束它们尽量一致。
第三层是任务自适应损失。因为一个电商表征模型要服务很多下游任务,MOON 2.0做了一个梯度动态加权,按照各任务在验证集上的不确定度来自动调整任务损失的比重。任务还没收敛的时候就多给点权重,任务已经饱和了就减少权重,避免某个简单任务主导了整个训练方向。
三套损失合在一起,我自己的理解是:对比损失负责“把大家拉到一起”,均衡损失负责“拉的时候注意别让谁把谁带偏”,任务自适应损失保证“拉到一起之后还能同时把每个任务做好”。层与层之间的目标不冲突,配合得挺顺。
3. 实操复盘:训练这套模型,有哪些关键细节和坑
只看论文结构,很多细节是想象不出来的。我结合自己的实操经验,把几个最容易翻车的地方拆开讲。
3.1 数据准备:别小看“样本对”的构造
多模态表征训练,样本对的质量几乎决定了模型上限的一半。MOON 2.0在数据侧做了三件很关键的事:
第一件,粒度对齐。电商场景里,光有“这个商品标题对应这张主图”粗粒度对齐还不够。MOON 2.0还对详情页的长图进行了区域分割,把图片按语义区域切开,再和标题里的属性词做细粒度匹配,保证正样本对里图文的语义粒度是一致的。这个操作直接影响跨模态注意力的对齐质量,否则你让文本去“看”图片,它看到的是一堆不相关的背景区域,交互等于在学噪声。
第二件,难负样本挖掘。如果负样本全是不同商品之间的图文对,模型很快会发现规律,训练起不到区分效果。他们用粗筛的相似商品图文做难负样本,也就是同一个品类里外观接近但实际不同款的商品互作负样本。这个策略把模型的判别能力逼出来了,否则学到的是一个“只要能对得上就是相似”的宽松关系。
第三件,模态缺失的模拟。真实线上环境里,很多商品没有视频,有些商品主图也很糊。训练的时候,他们按一定概率随机丢弃某个模态的输入,让模型学会在模态缺失的情况下依然保持表征稳定。这是我在实际业务里踩过的最大的坑——线上数据一缺模态,模型效果直接崩,就是因为训练时没有做这种缺失模拟。
3.2 训练策略:分阶段、控制尺度、大batch
整个训练过程是分阶段推进的。第一阶段,用大规模弱对齐图文数据预训练跨模态注意力模块,这个阶段冻结塔的大部分参数,只训练新加的路由Token和跨模态注意力层。第二阶段,解冻塔的全部参数,加入任务自适应损失,做端到端联合训练。这个设计和我跑深度学习模型的习惯很一致——先让新模块在固定特征尺度下收敛稳定,再放开全量参数,不然一开始就联合训练,新模块很容易把预训练特征带崩。
batch size这块,对比学习的大batch要求大家都知道,但这里有个组合拳值得记录:他们把单卡batch控制在合理范围的同时,用队列缓存历史特征来扩充负样本池。队列的长度做到数万级别,既节省了显存,又给模型提供了足够多的负样本。如果你做类似方案,显存不够的话,这个技巧真的能救急。
还有一个容易被忽视的点是混合精度训练时的损失缩放。跨模态注意力模块对数值精度非常敏感,直接用默认的FP16混合精度训练,经常出现loss突然飙高然后不收敛的问题。我当时排查了很久,最后是关闭了特定层的FP16计算,把这些敏感层保留FP32,问题才解决。这个坑在复现MOON 2.0结构时大概率会遇到,提前打个预防针。
3.3 推理侧:两个必须考虑的现实约束
线下训练再漂亮,上线的时候总会遇到资源限制。MOON 2.0这种多模态协同架构,推理开销天然比单塔模型大。我自己在工程优化上总结了两条可行路径:
第一条,模态分级触发。线上的商品不是每个都需要跑完整的双模态协同。可以先用成本低的单模态塔做一个粗筛,只有粗筛置信度不高的样本才走完整的跨模态协同路径。这样大部分请求都能用便宜路径搞定,只有难样本才付出高成本。吞吐量能省不少。
第二条,特征缓存分层。因为跨模态注意力输出的是一组序列特征,不是简单的向量。全量保存序列特征代价很高,我的做法是只缓存最后几层可学习的路由Token输出的汇总特征,把中间层的特征丢弃。这样线上存储开销可控,而且大多数下游任务用不到那些中间层信息。
提示:如果你在下游任务里需要用到细粒度对齐信息(比如“标题里哪个词对应图片哪个区域”),建议保留最后一层跨模态注意力的注意力权重。这个可是做可解释性分析时最省事的材料,丢了之后想重新导出要离线重跑全量,成本很高。
4. 效果评估:怎么验证一个通用表征真的“通用”
很多论文在效果评估上都会刻意挑对自己有利的数据集,MOON 2.0的评估思路相对值得信任,因为它把评测分成了三个层次。
4.1 基础检索评估
第一层是常规的多模态检索评估。用文本检索图像、用图像检索文本、用图像检索视频,保证表征在跨模态检索任务上的基本盘。这个评估关心的是Recall@K,但有一点要注意:不能只看排名指标,还得查一下检索失败案例的分析。MOON 2.0在这个层面展现出的优势,很大程度来自跨模态注意力带来的细粒度对齐——比如它能用“纯棉透气”这个文本描述,精准找回应有对应属性的商品主图,而不是肤浅地匹配到标题里带“纯棉”但其实没拍到材质细节的商品。
4.2 下游任务迁移评估
第二层是迁移到具体任务上的效果。这里有意思的在于“探测协议”——固定表征层的参数,只训练下游轻量分类头,看各项任务的指标提升。常用任务包括:
- 商品类目预测
- 属性识别(颜色、材质、风格等)
- 同款判定
- 违规内容识别
我看到的几个公开结果里,MOON 2.0在类目和属性识别任务的提升比较明显,同款判定提升则更依赖难负样本挖掘的效果。这说明它的表征确实是“迁移友好”的,几乎没有因为模态协同引入负面效应。
4.3 长尾场景的评估
第三层是我最看重的——长尾场景的鲁棒性评估。电商商品里,头部商品的图文质量都很好,模型表现自然不差;真正拉开差距的是那些长尾商品:图像模糊、文本缺失、视频片段错位。MOON 2.0因为做了模态缺失模拟训练,在这类样本上的掉点幅度明显比单模态基线小。
这个层面很多时候比常规指标重要得多。商业系统里长尾数据带来的问题,往往会把整体KPI拉低好几个点。如果你的多模态项目没有评估长尾场景,建议现在就补上。
5. 从技术到业务:这套表征能用在哪些场景
算法工程师看论文,最关心的其实是“我拿这个能干什么”。MOON 2.0这套东西,落到业务上,我认为有四个典型场景。
5.1 跨模态检索与商品图谱构建
最直接的应用就是跨模态检索。用户拍一张图,系统要找到对应的商品或者相似款;运营拿一段视频,系统要找出相同商品的图文详情页。有了统一的模态协同表征,这些检索可以端到端完成,不用再分别跑图像检索和文本检索再合并相似度。另一个扩展是商品图谱构建——同款识别、SKU归并、商品关系挖掘,都可以直接复用这套表征。
5.2 多模态内容审核与一致性校验
电商平台每天有海量新发布的商品内容,审核团队需要核对标题、图片、视频是否一致。比如标题写“材质是棉”,但主图显示的是皮衣,这种货不对板的情况要靠人去审工作量巨大。用MOON 2.0这样的协同表征,可以直接算图像和文本的语义一致性得分,把差异过大的样本自动挑出来走人工审核队列。这个场景不吃绝对的精度,更考验召回率,也就是“该挑出来的必须挑得出来”,协同表征比单模态特征在这个任务上优势明显。
5.3 统一特征服务化
传统做法是图像特征一个服务、文本特征一个服务、视频特征一个服务,三个接口分别调用,回来再拼。MOON 2.0一旦落地,可以只输出一个统一特征服务,下游所有需要向量检索的团队都调它,输入侧支持任意模态组合,输出侧是一个通用向量。这对工程基建的简化力度非常大,运维成本和新场景接入成本都会明显下降。
5.4 多任务联合训练底座
很多团队在搭建多任务学习框架时,各任务共用一个特征层,经常被梯度冲突搞得头大。MOON 2.0里做的路由Token和任务梯度动态加权,本身就是一个多任务协同的成熟组件,可以直接抽出来复用。如果你们的多任务框架目前还停留在机械加权Loss的阶段,这套机制能帮你省掉不少调参的痛苦。
6. 个人心得:复现这套方案,踩过哪些坑才跑通
最后这部分我想聊聊自己在实际复现和业务适配过程中的一些真实体会,这些东西论文里不会写,但每个做实操的人都会遇到。
6.1 不要一上来就端到端
我自己犯过的最大错误,就是拿到这个结构之后迫不及待地端到端全量训练,结果两周过去了,验证指标纹丝不动。后来老老实实按论文的分阶段策略来——先训练跨模态注意力模块,再逐步解冻塔,最后才端到端,训练过程才顺畅起来。原因是预训练特征和随机初始化的协同模块之间尺度差异太大,强行联合训练初期梯度方向基本被预训练特征主导,新模块根本学不到东西。
6.2 对比学习的“负样本”决定下限
负样本的质量直接决定了下限。用了MOON 2.0的难负样本挖掘策略之后,同款判定的线上指标涨了不止一个点。这里面有个细节,难负样本不能太“难”,如果负样本和正样本过于相似,甚至会干扰模型学习到真正的判别信息。最开始我把难负样本挖得太狠,A/B测出来效果反而回退,后来把难负样本比例控制在总量的一半左右,效果才稳定向上。
6.3 模态均衡正则要多加观察
模态均衡损失听起来很美,但调试的时候要小心。它在小batch下极其不稳定,因为特征分布的统计量需要足够多样本才能估准。我建议在batch size低于某个阈值的时候暂时关掉这个损失,把batch推到足够大再启用,或者直接用EMA维护的特征统计量做估计,能缓解不少问题。
6.4 从业务效果看,离线指标提升不等于线上KPI提升
最后也是最重要的一点。MOON 2.0在离线检索指标上的提升非常可观,但在线上业务KPI上的表现,要看你接的场景是什么。如果场景是“找相似商品”,表征的改善直接转化为点击和转化提升,效果很明显。如果场景是“类目预测”,很多样本本来就能分对,表征的提升只会带来边际改善。所以落地优先级很重要——先接对位置敏感的场景,再慢慢覆盖其他任务。
根据我个人经验,做多模态表征项目,最大的坑往往不是模型本身,而是团队对“多模态”这三个字期望值的错位。很多人以为只要上了多模态,所有任务的指标都应该齐刷刷往上涨,实际根本不是。多模态的价值在于“原本缺失的信息被补上了”,如果一个任务在单模态下信息已经足够充分,那么多模态不会带来额外收益。先把任务分成三类——强依赖跨模态信息的、弱依赖的、几乎不依赖的——再决定方案投入,这才是MOON 2.0最值得借鉴的业务方法论。
如果你也想在业务场景里复现这套方案,我的建议是:先别急着复现整个结构,拿你们的业务数据跑一个小规模的文本图像协同训练,把跨模态注意力替换成简单的联合注意力,对比一下和纯拼接方案在难负样本上的差距。如果这个差距显著存在,那说明你们的业务确实存在模态协同的价值空间,这时候再上完整版MOON 2.0也不迟。做多模态表征,最重要的永远是先确认问题存在,再决定方案投入。