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

CMU-MOSEI 与 Graph-MFN:从多标签到动态融合图

从标签语义到可验证实现:数据集也是方法的一部分

Zadeh 等 · ACL 2018 · DOI 10.18653/v1/P18-1208 · 学术型 · 核查于2026-10-23

一句话总结

MOSEI 同时提供极性和六类情绪强度;Graph-MFN 用十九个动态边门控制不同阶数的模态组合,并以时序记忆完成预测。

研究背景:数据规模与融合机制必须一起看

CMU-MOSEI 论文有两个贡献:建立更大且主题更丰富的多模态语言数据集,以及提出动态融合图 DFG,并把它嵌入记忆融合网络构成 Graph-MFN。只把它读成一个下载链接,会错过作者如何研究模态之间的交互;只看网络结构,则容易忽略其结论受到英语独白、人工转写和采集筛选的限制。

研究对象是一个人在镜头前讲话的视频片段。文字提供说话内容,声音提供语调与韵律,视觉提供脸部和姿态线索。这三种信号在时间上相关,但采样速率不同,情感信息也未必同步出现。把它们简单拼接,可以学习相关性,却难直接观察模型在什么时候依赖了哪种组合。

原先的小数据集容易把说话者、话题与情感混在一起。例如某人只评价喜欢的电影,模型就可能通过身份或背景预测正向,未必真正理解表达。MOSEI 扩展说话者和话题,目的是让研究更有覆盖面。这里的多样性是采样设计的改进,仍需通过来源独立的评估检验泛化,不能仅凭样本量保证。

本文作者为 Amir Zadeh、Paul Pu Liang、Jonathan Vanbriesen、Soujanya Poria、Edmund Tong、Erik Cambria、Minghai Chen、Louis-Philippe Morency,发表于 ACL 2018。其当时的“largest dataset”有明确时间背景。学习时应记住这是一篇历史基准论文,不把二〇一八年的最大规模或排行榜描述当作今天仍成立的事实。

数据是怎样得到的?

Section 3.1 从 YouTube 收集单人独白,要求说话者面向镜头,排除明显移动相机,并要求上传者提供人工且标点完整的转写。五千条初选视频由十四名评审检查三个月,最后保留三千二百二十八条视频,再按句子划分得到二万三千四百五十三个片段。Table 2 中片段平均长七点二八秒,每条视频平均七点三个句子。

Table 1 和 Table 2 给出的说话者数量为一千,主题二百五十;Section 3.1 说明身份以频道作为代理,因为完整人工身份核验成本过高。因此不能把一千频道严格等同于经过生物身份去重的一千自然人。每个身份限制贡献十到五十个句子、每频道最多收十条视频,目的是避免少数来源占据大部分样本。

Figure 1 是主题词云,评论类占百分之十六点二,辩论与咨询分别百分之二点九和一点八。词云能显示分布,不能代替跨主题测试。若你研究跨场景,要事先定义场景来自题材、拍摄条件还是数据集来源;这些概念会产生不同划分,不能在实验后根据好看的结果任意选择。

标注分为一项情感极性与六项情绪强度。极性在负三到正三上评分,六项情绪为开心、悲伤、愤怒、恐惧、厌恶、惊讶,分别从零到三表示未出现到强烈。三名众包标注者参与判断,工人要求较高历史通过率,并观看短培训视频。它们是基于视频表达的感知标注,不能作为心理健康诊断。

Figure 2 显示情绪不均衡,开心超过一万二千个正样本,恐惧约一千九百。六个标签可以同时出现,所以它们不是一个七分类问题,也没有要求六维概率加起来为一。某片段可以既悲伤又愤怒,整体极性同时为负。把七维标签里的第一个极性值误当第一个情绪类别,会让整个任务定义出错。

$$y_{\mathrm{sent}}\in[-3,3],\qquad\mathbf y_{\mathrm{emo}}\in[0,3]^6$$教学形式化:Section 3.2 的两类标签空间

第一项是一个数,后一项是六个可以同时非零的数。实际公开特征包可能保留标注均值而出现小数,也可能只保存极性;读取时必须查看标签字段和列顺序,而不是用数组长度猜任务。本文的标签范围描述原始标注,具体训练所用的阈值和归一化需要由实验协议补充。

$$b_k=\mathbb 1[y_k>0],\quad p_k=\sigma(z_k),\quad L_{\mathrm{BCE}}=-\sum_{k=1}^6\{b_k\log p_k+(1-b_k)\log(1-p_k)\}$$教学目标示例:存在性二值化与多标签 BCE,并非原文编号公式

k 是情绪索引,z 是预测头输出的实数,sigmoid 单独把每个输出映射到零至一。该式展示一种可用于后续实验的存在性识别方式;它不恢复零到三的强度,也不表示原论文所有实验都采用这个损失。必须把原始标签、训练目标、评估阈值三件事分别记录。

预备知识:对齐、隐状态与模态组合

原始论文文字使用 GloVe,音频用 COVAREP,视觉涉及 FACET、OpenFace、关键点及脸部表示等工具。它并非使用 BERT 或 CLIP 的论文。今天的特征包常换编码器,模型结果因此改变并不奇怪;比较时先列出特征来源、维度、采样与归一化,再讨论融合器。

Section 3.3 先利用 P2FA 对齐词语与音频,再把视听信号对齐到词语时间区间。对齐是建立共同时间参照;如果把几帧平均到一个词,某些瞬间表情信息可能被压缩。原文认为英文词较短时信息损失较小,这是一项具体条件下的假设,不是任意语言和视频上都可直接套用的结论。

LSTM 的隐状态是对截至当前时刻信息的向量摘要。Graph-MFN 让每种模态各自更新状态,再查看相邻时刻的变化,把它们送入 DFG。这里的图节点代表模态集合的表示,而不是人脸关键点或视频中人物;理解节点语义之后,才容易解释图的边为什么这么连接。

DFG 方法:哪些组合值得在当前时刻读取?

原文 Figure 3 展示三种单模态节点 l、v、a,三种双模态节点 lv、la、va,以及一个三模态节点 lva,最后有输出节点 T。七个非空模态子集加输出,共八个节点。如果节点 i 所代表的集合是节点 j 的真子集,才允许从 i 向 j 传信息;这保证组合由较简单层次形成。

$$\mathcal V=\{S:\varnothing\ne S\subseteq\{l,v,a\}\}\cup\{T\},\qquad i\to j\ \Longleftrightarrow\ i\subsetneq j$$教学重写:Section 4.1 的集合节点与内部连边规则;T 另接所有子集

符号 S 表示一种模态集合,真子集表示包含关系且两者不相等。例如文字节点可以连到文字音频节点,文字音频节点可以连到三模态节点;文字视觉不能连到文字音频,因为两者互不包含。所有非空子集还各自连向 T,因此输出能够同时读取不同阶数的交互。

每条边有一个 efficacy,记为 α,控制这个输入被缩放的程度。原文将其描述为 sigmoid 激活的概率神经元;它是内部计算门值,训练目标并没有直接告诉模型哪条边应该代表真实因果贡献。门值由当前三种单模态节点一起预测,因此同一个连接在不同片段、不同时间可以有不同强度。

$$\boldsymbol\alpha_t=\sigma(D_\alpha([l_t;v_t;a_t])),\quad h_{S,t}=D_S\!\left(\mathop{\mathrm{concat}}_{\varnothing\ne U\subsetneq S}\alpha_{U,S,t}h_{U,t}\right)$$教学重写:Section 4.1 的门控与子集融合;非原文编号公式

中括号与 concat 都表示沿特征维拼接,D 是可学习网络。先给每个来源向量乘对应标量门值,再拼接后转换为目标节点表示。这里不要求同一节点的门值之和为一;sigmoid 允许多个来源同时较强,也允许同时较弱。这与按行归一化的注意力 softmax 有不同约束。

$$|E|=3\times2+6+7=19$$教学计数:双模态节点六条、三模态六条、输出七条

三个双模态节点各接两个单模态,共六条;三模态节点接三个单模态和三个双模态,共六条;输出接七个子集,得到十九个门值。你应该能不用代码画出来并数对。如果推广到更多模态,子集数量按指数增长,所以论文强调相对张量融合的参数效率,不意味着模态数量增加时开销仍是常数。

Figure 4 展示 DFG 如何接入 Graph-MFN。三个 LSTM 分别建模文字、声音、视觉;相邻隐状态拼接后经过网络得到图的三个输入。DFG 输出一方面生成多视图记忆的候选更新,另一方面参与后续表示更新。最终用最后时刻的三种隐状态和共享记忆进行预测。因此 DFG 是时序系统的一部分,不能只做一次静态图计算就宣称复现完整模型。

$$\hat u_t=D_u(T_t),\qquad u_t=\gamma_{1,t}\odot u_{t-1}+\gamma_{2,t}\odot\hat u_t$$教学形式化:Section 4.2 的保留门、更新门与多视图记忆

u 是共享记忆,候选记忆带帽,γ 分别决定保留旧内容与加入新内容,圆点乘表示逐元素乘。两个门可以是向量,不能与 DFG 的十九个标量边门混为一谈。完整记忆网络的细节原论文指向 MFN,若追求严格复现,需要同时核验该引用中的定义及实际实现。

Figure 5 画出门值随时间变化的热力图。作者观察语言与声音组合经常较强,视觉在有意义时参与更多融合。这能说明模型内部计算在样本间发生变化;要证明它识别了某种人类心理机制,仍需更强控制。特别是门值大小也受来源向量尺度及下游权重影响,低门值并不直接等于信息完全无用。

flowchart LR
 L[Language LSTM] --> D[Dynamic fusion graph]
 A[Acoustic LSTM] --> D
 V[Visual LSTM] --> D
 D --> U[Shared memory update]
 D --> G[19 edge efficacies]
 U --> O[Prediction]
 L --> O
 A --> O
 V --> O

源码:官方入口现状与可核验的第三方实现

论文链接指向作者 CMU Multimodal Data SDK。此次尝试访问并浅克隆历史 A2Zadeh/CMU-MultimodalSDK 地址失败,网页返回四〇四;这只能说明该历史入口本次不可获取,不能断言作者从未发布。作者 MFN 仓库 README 也把 Graph-MFN 指向该 SDK。为提供可读源码,本文采用已克隆的 MMSA Graph_MFN.py,并明确它是第三方统一实现。

MMSA · src/MMSA/models/singleTask/Graph_MFN.py:95–113

    def fusion(self, in_modalities):

        outputs = {}
        for modality, index in zip(in_modalities, range(len(in_modalities))):
            outputs[tuple([index])] = modality
        efficacies = self.efficacy_model(torch.cat([x for x in in_modalities], dim=1))
        efficacy_index = 0
        for key in self.powerset[self.num_modalities:]:
            small_power_set = list(chain.from_iterable(combinations(key, r) for r in range(len(key) + 1)))[1:-1]
            this_input = torch.cat([outputs[x] * efficacies[:, efficacy_index + y].view(-1, 1) for x, y in
                                    zip(small_power_set, range(len(small_power_set)))], dim=1)
            
            outputs[key] = self.networks[key](this_input)
            efficacy_index += len(small_power_set)

        small_power_set.append(tuple(range(self.num_modalities)))
        t_input = torch.cat([outputs[x] * efficacies[:, efficacy_index + y].view(-1, 1) for x, y in
                                zip(small_power_set, range(len(small_power_set)))], dim=1)
        t_output = self.t_network(t_input)

代码先由输入拼接预测 efficacies,再枚举目标集合的所有非空真子集,给每个来源乘门值后拼接。它确实对应子集图的数据流,但该版本 efficacy_model 末尾是线性层,fusion 中也没有 sigmoid。不能把这些输出直接称作零到一的概率。原文公式解释与代码行为存在差异,复现时应明确选择保留实现还是恢复论文约束。

MMSA · src/MMSA/models/singleTask/Graph_MFN.py:54–72

            chain.from_iterable(combinations(range(self.num_modalities), r) for r in range(self.num_modalities + 1)))[1:]
        
        # initializing the models inside the DFG
        self.input_shapes = {tuple([key]): value for key, value in zip(range(self.num_modalities), in_dimensions)}
        
        self.networks = {}
        self.total_input_efficacies = 0 # total_input_efficacies: for alpha list size = [batch_size, total_input_efficacies].
        
        # loop over n-modal node (n >= 2)
        for key in self.powerset[self.num_modalities:]:
            # connections coming from the unimodal components
            unimodal_dims = 0
            for modality in key:
                unimodal_dims += in_dimensions[modality]
            multimodal_dims = ((2 ** len(key) - 2) - len(key)) * out_dimension
            self.total_input_efficacies += 2 ** len(key) - 2
            # for the network that outputs key component, what is the input dimension
            final_dims = unimodal_dims + multimodal_dims
            self.input_shapes[key] = final_dims

powerset 用组合函数枚举子集,内部网络却保存进普通 Python 字典 self.networks。一般而言,PyTorch 只有 ModuleDict 或已注册的子模块才会自动纳入 parameters、state_dict 和设备迁移;该写法需要实际检查是否遗漏优化这些网络。本文不把阅读代码当成已经运行原版训练,通过参数注册检查之前不建议长跑。

本次已实际运行一个不含数据和训练的诊断:三路各二维、两个样本,得到十九个门值和二乘三输出。内部节点网络的十六个参数张量全部未出现在 net.parameters() 中;把最后门值线性层权重置零、偏置设为二后,输出门值全为二,验证此实现没有 sigmoid 范围约束。后者是人为控制的诊断条件,不是自然输入下的统计结果。诊断结果与检查脚本均可下载;对声明版本的仓库运行 python graph_registration_probe.py --repo 你的MMSA目录。

该实现配置要求模型与数据对齐,MOSEI 配置中 LSTM 隐层为六十四、十六、六十四,共享记忆三百维,内部图节点一百二十八维。这些都是当前 MMSA 配置,不能用来填补原文未详细列出的超参数,更不能把当代 BERT 特征接进去后与二〇一八年 GloVe 协议直接比较。

实验数据怎样读才有意义?

Table 3 的 SOTA1 与 SOTA2 按各指标分别选择先前最优和次优方法,行内的符号对应不同模型,因此整行不是一套能实际运行的统一基线。下表保留情感分析的原始数值;二分类等为百分数,MAE 按原量纲。原表特意注明结果截至二〇一八年五月十一日,本文同样把它当历史对照。

Table 3A2 ↑F1 ↑A7 ↑MAE ↓相关 r ↑
SOTA2(逐指标)76.076.044.60.720.52
SOTA1(逐指标)76.476.444.70.720.52
Graph-MFN76.977.045.00.710.54

Graph-MFN 二分类比原表逐指标最优高零点五个百分点,MAE 降低零点零一,相关系数提高零点零二。它说明图融合在该设置下具有竞争力,增幅并不支持“全面大幅领先”的措辞。没有跨种子标准差与显著性检验时,也不能仅凭零点几个百分点判断所有训练条件下都稳定更强。

Table 3 情绪Graph-MFN WA ↑Graph-MFN F1 ↑此前最佳 WA ↑
Anger62.672.860.5
Disgust69.176.667.0
Fear62.089.960.0
Happy66.366.366.5
Sad60.466.959.2
Surprise53.785.554.3

开心 WA 为六十六点三,略低于此前六十六点五;惊讶也低于此前最佳。恐惧 F1 达八十九点九却不等于少数正类识别率同样高,必须检查 F1 的具体加权和正负分布。原文为处理不平衡报告 weighted accuracy,不能直接与今天常报的整体 accuracy 或 macro-F1 混用。

本文 Table 1 的数据规模对比和 Table 3 的预测对比承担不同证据作用。前者说明覆盖数量,后者说明模型在给定协议下的表现。Figure 5 只是若干样本的机制可视化,没有提供移除门控、固定门值、只保留某些子图等完整因子消融。因此读者应把可视化解释看作有依据的观察,同时保留替代解释。

从一个字段检查开始的学习任务

第一步建立标签字典:打开你实际获得的可信特征包,只打印 split 名称、样本数、标签数组形状、各列最小最大值和列名。手工核对五个 ID 的文字、音视频和标签是否同属一个片段。验收产物为 schema.json 与五条样本表。若包里只有回归标签,就先做极性任务,不凭空补出六维情绪。

第二步写双任务教学预测头:一个线性层输出极性标量,一个线性层输出六维 logits。用自拟小批次分别计算 L1 和 BCE,确认 sigmoid 后各维独立,且某条标签可同时有两种情绪。把极性与多标签的指标分别打印;验收是形状、范围、手算结果一致。这一教学练习不是原 Graph-MFN 的完整复现。

第三步实现三模态子集枚举,只用 Python 标准库列出七个集合和十九条边。对每条内部边验证真子集关系,对每个双模态节点验证入度二,对三模态验证入度六。接着用小向量和固定门值完成一次融合,关闭一条边后检查对应来源是否减少;这能帮助理解计算影响,但仍不是因果解释实验。

第四步核查第三方实现的参数注册:列出 named_parameters,逐个查 self.networks 字典中的层是否出现,再比较优化器参数集合;同时打印 efficacies 范围,检查是否超出零到一。验收日志必须展示注册检查和门值检查结果,之后才决定如何修复并运行短程对照。本文没有执行 MOSEI 下载或训练,学习任务与已完成实验分别标注。

跨场景扩展可以先用既有特征做来源隔离划分,并固定特征和预测头比较普通微调与领域适应。若采用 DANN,说明目标域无标签数据是否进入训练;若采用持续学习,说明旧域数据是否可回放。来源、标签、选模规则缺一项,结果即使更高也很难解释。先提交划分清单和协议,再安排耗时训练。

局限与下一步研究

作者在 Section 3.1 明确承认使用频道近似身份,并依赖高质量人工转写与固定镜头筛选;Section 3.3 的对齐也建立在短英文词假设上。原文没有独立的 Limitations 章节,这里引用的是方法中作者直接说明的约束,不能假装作者已经进行了跨文化、跨语言或真实多人会话验证。

独立判断:门值热力图让内部计算更容易观察,却不自动满足因果解释。相同预测可能通过不同参数尺度产生不同门值;数据中的话题、语言内容和情绪标签也可能相关。可以固定输入其余部分进行遮蔽、替换和对照,检验所解释的模态是否真的改变预测,并谨慎处理干预导致的分布偏移。

独立判断:数据包含更多话题仍可能以英语网络独白为主,六种基本情绪标签不能覆盖所有细腻社会情绪。研究细粒度时可从强度回归、共现与少数类开始;研究跨场景时先检验来源差异。把这些任务拆开并建立共同的可复查协议,比在同一个模型里一次增加多个模块更有助于形成可信结论。

原文、实现与短引语

ACL 2018 出版页 · 全文 PDF:Figure 1–5、Table 1–3 · 作者 MFN 仓库及 Graph-MFN 历史入口 · 本文核验的第三方实现。原文短引语:“asynchronous coordinated sequences”“Dynamic Fusion Graph”“efficacies”,对应异步序列、动态融合结构和边门控。

自己的解释与验收记录

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