← 阅读室全部精读正在排版公式与图表…
PAPER ANALYZER · P05 · 共同基础

MulT:不同步的文字、声音与画面怎样交换信息

学术型精读 · 概念、公式、实验、源码与可验收练习

Tsai、Bai、Liang、Kolter、Morency、Salakhutdinov · ACL 2019 · 论文 · 官方代码 a670936824ee

一句话总结

MulT 使用有方向的跨模态注意力,把一种模态的信息写入另一种模态的时间轴;六个方向的交互再经过时序建模,用于情感与情绪任务。

先解释“不对齐”究竟是什么意思

多模态视频中的文字按词出现,声音以较密集的时间片采样,画面又有自己的帧率。它们描述同一个片段,却不一定有相同长度或一一对应的位置。传统方法可能先把声音和画面强制聚合到每个词的时间区间,MulT 则希望直接从不同长度序列中学习跨模态联系。

这里的不对齐仍然要求三个模态来自同一个样本、同一个语义片段。把一个人的文字与另一个视频的声音随意组合,属于配对错误,不是原论文要解决的异步输入。理解这一点可以避免在数据预处理阶段把样本编号混乱误当作模型能够自动纠正的时间错位。

Figure 1 对比对齐与非对齐关系;Figure 2 展示总体网络;Figure 3 展示跨模态块。第一遍阅读应先沿着目标模态的时间轴追踪输入输出,暂时不背所有模块名称。只要知道输出长度跟随查询,就能分清哪条支路在为文字补充声音、哪条支路在为声音补充文字。

有方向的交互为何重要

设文字有五个位置,声音有二十个位置。让文字做查询、声音做键和值,相关性矩阵就是五行二十列,输出仍有五个位置。每个文字位置可以从整个声音序列中提取有用内容,不必预先指定它只对应哪一小段音频。这是“声音流向文字”的含义,不是把文字翻译成声音。

反过来让声音做查询、文字做键和值,输出长度变成二十。两条方向的投影参数也不同,所以不是同一张矩阵简单转置即可替代。一个文字可能需要汇聚多个声学片段,一个声学片段也可能参考多个词,方向决定新表示承载在哪个时间轴上。

查询、键和值先通过各自的线性映射进入可比较的空间。相关分数经 softmax 后用来加权来源模态的值。模型因此可以学习非单调联系,例如稍晚出现的表情帮助解释较早的词,但可访问整个片段也意味着它是离线片段分析,不应直接当成只能使用过去信息的实时系统。

从原始特征到六条支路

原论文主要使用 GloVe 文本特征、FACET 视觉特征和 COVAREP 声学特征。它不是把 BERT、CLIP 与 wav2vec 2.0 的原始输出直接组合。后续用更强编码器替换输入属于合理拓展,但会同时改变特征质量、维度和训练条件,不能把新结果直接归因于跨模态结构本身。

各模态先经过一维卷积投影到共同的特征维度,卷积还提供短范围时间信息。随后加上位置编码。共同维度不等于共同时间长度:卷积与投影让通道能够匹配,但文字、声音、画面仍可保留不同的位置数。检查张量时,应分别写清时间轴和通道轴。

每一对模态有两个方向,三种模态共形成六条方向支路。以文字为目标,会得到“声音补充后的文字表示”和“视觉补充后的文字表示”;把它们在特征轴拼接,再交给目标模态的自注意力记忆网络。最终三个目标模态的结果共同形成预测向量。

跨模态层堆叠时,目标查询不断更新,但来源键和值持续来自该来源模态较低层的表示。这样每一层都可以重新访问原始来源信息。它不是把来源模态也在同一支路中逐层同步改写。阅读代码时要特别看循环中传给键和值的变量是否改变,这比只看到一个 Transformer 类名更有用。

目标模态内部的自注意力负责继续建模时间关系,随后取末端表示供预测。这里的“记忆网络”仍是注意力计算,并非额外维护了一个跨样本数据库。当前实现对序列组织和最后位置的使用有特定约定,若变长批次含有尾部填充,应核查有效长度是否正确处理。

与其他融合方法的差别

简单早期融合通常先把模态特征拼在一起,再交给一个模型;晚期融合则把各自预测或高层表示组合。MulT 的核心差别在于,分类前就让一种模态根据自身需求选择另一种模态的信息。它不是单纯增加几个输入通道,而是在时间位置之间建立可学习的条件关联。

原论文还与需要对齐或使用 CTC 辅助处理非对齐的比较方法进行实验。MulT 自身不是用 CTC 把声音强行转成文字时间轴。把比较基线中的 CTC 误写进 MulT,会让方法解释与源码都对不上。对于初学者,先画清本文本身的路径,再单独整理基线差异,最不容易混淆。

看实验时必须盯住标签与指标

CMU-MOSI 与 CMU-MOSEI 包含情感强度任务,原文报告多分类、二分类、平均绝对误差与相关系数等指标。它们描述不同侧面:强度误差小,不保证每个离散类别召回都高;二分类准确率高,也不意味着能够区分细微情绪类型。应按自己的研究问题选择主指标。

Table 1、Table 2 分别给出 MOSI 和 MOSEI 的对齐与非对齐结果。非对齐输入的良好表现支持方法在不显式逐词对齐的情况下工作,但并不表示时间信息完全不重要,也不意味着任意程度的错位都无影响。模态仍然具有各自顺序和样本级配对关系。

Table 4 的模态消融尤其适合学习研究设计:单模态、早期融合、晚期融合、部分方向与完整模型逐步比较。文字单模态已很强,加入其他模态的收益必须在此基础上解释。如果只与很弱的音频单模态比较,就会夸大融合结构的必要性。数据集本身的文字偏向也应纳入讨论。

MOSEI 相关系数在主表与模态消融表的完整模型行有轻微差异,本页表格不混合这两种读数,而只展示一致且能清晰定位的准确率与误差。论文中的多个表可能使用不同实验重复或报告位置,遇到差异应保留来源,不能自行替作者解释成已确认的原因。

Figure 4 与附录 Figure 6 展示跨模态联系的可视化,帮助理解非单调对应。但是注意力关注某段声音不等于那段声音在因果上决定情绪。更可靠的验证是遮挡或替换该段之后观察性能变化,并与随机遮挡对照,避免只选择符合直觉的可视化案例。

代码默认值与论文表格并不完全一致

论文附录 Table 5 报告共同维度、层数、头数、卷积核及训练设置。当前官方仓库却包含不同的默认值:模型文件使用三十维投影,主脚本的层数、头数等默认配置也与论文表格并不逐项相同。因此“直接运行默认命令”不等于严格复现论文,需要显式传入并保存参数。

当前代码中的 lonly 指只保留以语言为目标的融合支路,这个支路仍然可以接收声音与视觉。它不是纯文字单模态模型。若把此开关当作文字基线,消融结论就会错误。单模态基线必须真正移除来自其他模态的信息路径,并检查输入与前向函数。

公开实现使用序列优先的张量布局,而很多新框架默认批次优先。迁移代码时,如果把批次维与时间维交换却没有立即报错,模型仍可能产生形状合法但语义错误的结果。第一轮应使用两个不同长度、可手工辨认的样本检查注意力轴,而不是只看损失能否下降。

细粒度与跨场景路线中的位置

作者的实验显示异步序列及长序列会影响表现,但本文没有专门证明跨数据集、跨语言或缺失模态的稳健性。独立分析还应注意六条交互支路的计算成本、噪声模态传播和文字主导问题。来源模态如果含有背景干扰,跨注意力也可能积极地取回错误信息。

细粒度拓展可以从“哪个方向真正提供短时情绪线索”开始,而不是立刻增加更复杂模块。跨场景拓展可以固定六方向结构,观察目标场景中哪条来源模态贡献变差。先做方向消融、时间遮挡和模态噪声对照,才能决定是否需要可靠性权重、局部窗口或更细的片段建模。

这篇论文与 ALMT 的关系应理解为提供一套跨模态交互基础,而不是学习路线中的模块可以直接串起来。更合适的阅读问题是:两篇方法分别让谁做查询,保留了哪些来源信息,如何控制冗余或不可靠模态,以及输出服务于什么监督目标。把这四项列成表,比仅记住缩写更有价值。

公式逐步读:变量、运算与适用范围

原文式 (1):有方向的跨模态注意力

$$Y_\alpha=\operatorname{softmax}\left(\frac{Q_\alpha K_\beta^\top}{\sqrt{d_k}}\right)V_\beta$$

目标 α 提供查询,来源 β 提供键和值。输出位置数为 Tα,权重矩阵为 Tα 乘 Tβ。

原文式 (2):模态投影

$$\widehat X_m=\operatorname{Conv1D}(X_m,k_m)$$

卷积核 k 控制局部时间范围,同时投影通道。共同通道维度与序列对齐是不同概念。

原文式 (3):加入位置

$$Z_m^{[0]}=\widehat X_m+PE(T_m,d)$$

位置编码的长度分别匹配各模态时间轴,不需要先让三个模态具有同样位置数。

原文式 (4) 的教学展开:堆叠交互

$$Z_{\beta\to\alpha}^{[i]}=\operatorname{Block}^{[i]}(Z_{\beta\to\alpha}^{[i-1]},Z_\beta^{[0]})$$

这里把原文递推压缩为块函数以强调查询更新、来源保持低层输入;块内包含归一化、注意力、残差与前馈,不应误解成一次纯矩阵乘法。

附录位置编码的教学合写

$$PE_{p,2j}=\sin(p/10000^{2j/d}),\quad PE_{p,2j+1}=\cos(p/10000^{2j/d})$$

这是附录正弦位置机制的合写,不另造原文公式编号。时间位置仍然存在,所以非对齐不等于忽略序列顺序。

实验读数:先固定协议,再比较数值

原文 Table 1:MOSI,准确率越高、MAE 越低越好
模型与设置Acc-7Acc-2MAE
MulT 对齐40.083.00.871
MulT 非对齐39.181.10.889
晚期融合非对齐33.777.60.988
CTC+MCTN 非对齐32.775.90.991
原文 Table 4:非对齐 MOSEI 消融
输入或结构Acc-7Acc-2MAE
文字单模态46.577.40.653
声音单模态41.465.60.764
视觉单模态43.566.40.759
晚期融合47.978.60.636
声音和视觉流向文字50.580.10.605
完整 MulT50.781.60.591

计算流程图

flowchart LR
A[Language sequence] --> D[Convolution and position]
B[Audio sequence] --> D
C[Visual sequence] --> D
D --> E[Six directional cross attention paths]
E --> F[Concatenate paths with same target]
F --> G[Three target memory networks]
G --> H[Concatenate final states and predict]

沿图逐条检查箭头:每个箭头传递的是张量或监督信号,并不代表额外的数据集;训练目标旁的分支在部署时未必保留。建议先在纸上填入批大小、序列长度、通道数,再阅读下面的源码。一个模块即使名字相同,只要输入轴、掩码或输出使用方式改变,也不能直接视作同一个实验。

论文方法与固定版本源码对照

src/models.py:108–116

        if self.lonly:
            # (V,A) --> L
            h_l_with_as = self.trans_l_with_a(proj_x_l, proj_x_a, proj_x_a)    # Dimension (L, N, d_l)
            h_l_with_vs = self.trans_l_with_v(proj_x_l, proj_x_v, proj_x_v)    # Dimension (L, N, d_l)
            h_ls = torch.cat([h_l_with_as, h_l_with_vs], dim=2)
            h_ls = self.trans_l_mem(h_ls)
            if type(h_ls) == tuple:
                h_ls = h_ls[0]
            last_h_l = last_hs = h_ls[-1]   # Take the last output for prediction

以语言为目标的两条跨模态支路先分别计算,再在特征轴拼接,并送入语言记忆网络。lonly 仍包含这两条跨模态信息,不能当作纯文本实验。

src/models.py:138–146

        if self.partial_mode == 3:
            last_hs = torch.cat([last_h_l, last_h_a, last_h_v], dim=1)
        
        # A residual block
        last_hs_proj = self.proj2(F.dropout(F.relu(self.proj1(last_hs)), p=self.out_dropout, training=self.training))
        last_hs_proj += last_hs
        
        output = self.out_layer(last_hs_proj)
        return output, last_hs

三种目标的最终表示拼接后,经过残差前馈与输出层。复制代码时要连同前文张量布局与维度定义一起核对,不能只迁移最后几行。

代码核查固定在提交 a670936824ee722c8494fd98d204977a1d663c7a。这里展示的是公开仓库的实际文件,不把重新写的教学代码冒充作者实现。仓库后续可能包含新版本、工程兼容选项和不同默认参数;本文只将已核实的语句对应到论文机制。下载权重成功、模型能够前向传播、复现论文最终指标是三个不同的验收层级。

从读懂到能够独立实现:可执行学习任务

第一步,用五个文字位置和二十个声音位置手写一个跨注意力。验收:文字查询时输出五个位置,声音查询时输出二十个位置;能画出两张不同方向的权重矩阵,并说清每一行的含义。

第二步,检查真实缓存中的样本编号、三个模态长度及标签。验收:随机抽查十个样本的模态属于同一片段,保留不同时间长度;任何丢失模态与补齐策略都写入清单,不能静默用其他样本代替。

第三步,先建立真正的文字单模态、以文字为目标的双来源融合、完整六方向三组模型。验收:检查前向图确认信息路径,而不是仅依赖开关名称;结果表记录参数量和可训练输入来源。

第四步,仅对声音增加已记录强度的噪声,比较三组模型变化。验收:同时报告原始输入与噪声输入的指标,识别噪声通过哪条方向传播,不把一个随机种子的差值当作确定规律。

第五步,记录当前仓库默认配置与论文附录配置的差异,再完成一次极小批次前向和反向检查。验收:保存解析后的参数、固定提交和张量形状,并明确当前运行是教学兼容基线还是论文协议复现。

建立可检查的实验记录

开始第一轮实验前,建立四份小文件:数据清单记录样本编号、来源、标签与划分;配置文件记录预处理、随机种子、模型名称和冻结范围;结果表记录验证指标、选中轮次与最后测试指标;错误清单保存预测错误的样本编号及观察理由。这些文件比一张最高准确率截图更能说明你真正控制了实验条件,也能让后续细粒度或跨场景拓展沿用同一条证据链。

对视频、语音或多模态情绪数据,必须优先检查主体、会话和视频来源是否跨集合重复。同一原始视频切出的多个片段高度相关,随机按片段划分可能让模型记住说话人、背景或录制设备。跨场景问题至少要明确源域训练集、源域验证集和目标域测试集;若使用目标域标签选择提示词或超参数,就不应再把它描述为完全未见目标域的泛化结果。

为避免把实现错误误认为研究发现,先运行一个极小批次,打印输入输出形状、数值范围、有效长度以及损失是否有限。随后在少量训练样本上尝试拟合,验证模型确实能够更新指定参数。如果极小训练集都学不会,优先检查标签编码、掩码方向、归一化、学习率和冻结设置;此时直接扩大数据量通常只会延长排查时间,而不能证明模型本身不适合任务。

消融实验一次只改变一个关键因素,其他预处理、划分、优化预算和选择规则保持一致。第一轮以发现实现问题为目标,只用一个种子;确认代码与趋势合理之后,再增加多个种子并保留每次独立结果。均值用于概括趋势,标准差用于展示训练波动,但都不能替代对样本泄漏和评价口径的检查。不同论文中的最优数字不能在协议不明时直接相减。

解释实验失败时,先区分三层原因:实现层是否正确地执行了计算;优化层是否在给定预算内学到了信号;数据层是否提供了任务需要的信息。比如文本缺少反讽语调、静态图像看不到表情变化、音频包含录音噪声,这些问题不能仅靠增加网络深度解决。把失败样本分组后再提出修改,每项修改应能对应一个可观察的问题和一个预先规定的验证指标。

学习笔记采用“论文本身说了什么—源码实际做了什么—我在本地验证了什么”三栏记录。第一栏附页码或图表编号,第二栏附固定提交与行号,第三栏附命令、环境和输出。本文已完成原文及源码核对,未宣称在你的机器上重训原论文。下面的练习属于待执行计划;只有真正运行并保存结果后,才能把相应项目改为“已完成”。

短引语与阅读定位

原文短语 Unaligned Multimodal Language Sequences(标题):样本配对存在,但模态时间位置不要求一一对应。

原文短语 crossmodal attention(摘要):利用一个模态的查询选择另一个模态的信息。

原文短语 Multimodal Transformer(标题):用多个方向组织模态之间的信息交互。

参考资料与核验边界

论文摘要与版本信息;完整论文 PDF;作者公开仓库固定版本。公式中标注“教学整理”的表达用于显式说明原文的计算步骤,不声称具有原文公式编号。所有实验数字均指原论文报告结果,不是本次新训练得到的结果。英文短引语合计不超过二十五个词。

自己的解释与验收记录

写出一条输入到输出的链路、一个关键公式的含义,以及你完成的最小检查。笔记仅保存在当前浏览器,可从主站「我的学习笔记」导出。