# Q2 多模态情感预测:当前两个核心方案 我们目前保留两个主要模型: 1. **方案一:Mask-aware EarlyConcat + BiGRU** - 结构简单; - 参数少; - 是我们的强基线模型。 2. **方案二:MoFE-7 + MLP Router** - 针对 EarlyConcat 在所有位置使用同一融合形式的限制,显式学习不同模态子集的组合权重; - 已按数学方案的 Q2 口径重训;本次单种子结果中,Accuracy 略高,但 Macro-F1、回归指标和缺失情景汇总点估计低于 EarlyConcat。 二者其实是一条很自然的递进路线: > **方案一:把所有可用模态直接交给一个统一模型学习。** > **方案二:先判断当前更适合使用哪一种模态组合,再交给统一模型学习。** --- # 一、数据在进入模型之前是什么样子? 我们使用官方提供的对齐后多模态特征。 每条样本被表示为长度为 50 的有序序列: \[ t=1,2,\dots,50. \] 注意,这里的 50 个位置是 **wordpiece ordered positions(按文本词片顺序排列的位置)**,不是严格意义上的 50 个等长物理时间片。 在每个位置 \(t\),都有三种模态: \[ T_t\in\mathbb{R}^{768} \] 表示文本 BERT 特征; \[ A_t\in\mathbb{R}^{74} \] 表示音频特征; \[ V_t\in\mathbb{R}^{35} \] 表示视觉特征。 同时还有三个 observation mask: \[ M_t^T,\quad M_t^A,\quad M_t^V. \] 它们告诉模型: > 当前位置的 Text / Audio / Vision 到底有没有有效观测。 因此 mask 非常重要。 例如某个 Audio 特征全为 0: - 没有 mask 时,模型不知道这是“真实特征刚好接近 0”; - 有 mask 时,模型知道这是“Audio 当前缺失”。 --- # 二、方案一:Mask-aware EarlyConcat + BiGRU ## 2.1 一句话理解 EarlyConcat 的思想非常直接: > **同一个位置上的文本、音频、视觉特征全部放在一起,然后交给一个 BiGRU,让模型自己学习三种模态之间以及前后位置之间的关系。** 整体流程: \[ \boxed{ T/A/V + Masks \rightarrow Early Concatenation \rightarrow BiGRU \rightarrow Sequence\ Aggregation \rightarrow Classification/Regression } \] --- ## 2.2 第一步:同位置多模态拼接 对于位置 \(t\),我们有: \[ T_t,\quad A_t,\quad V_t. \] 当前实现先分别把三个模态投影到 128 维,再加上位置和模态标记,并用 mask 清零缺失模态: \[ z_t^m=M_t^m\left[\operatorname{LN}(\operatorname{GELU}(W_mX_t^m+b_m))+p_t+e_m\right], \quad m\in\{T,A,V\}. \] 随后拼接投影后的特征和三个 mask,再经过一个融合层: \[ x_t^{\mathrm{fuse}}= \phi([z_t^T;z_t^A;z_t^V;M_t^T;M_t^A;M_t^V]). \] 其中 \(\phi\) 是 Linear、GELU、LayerNorm 和 Dropout。这个工程实现仍属于 EarlyConcat:模态在时序主干前合并,但各自先经过独立投影,并保留 mask。 这里的符号 \[ [\,;\,] \] 表示向量拼接。 也就是说,本来三个模态是三份信息: ```text Text ── T_t Audio ── A_t Vision ── V_t ``` 现在把三个投影后的模态表示和 mask 放到同一个向量: ```text [projected Text | projected Audio | projected Vision | masks] ``` 这就是 **Early Concatenation(早期拼接)**。 之所以叫“Early”,是因为: > 三个模态在进入主要时序模型之前就已经融合。 --- ## 2.3 第二步:BiGRU 建模上下文 融合层处理以后,我们得到长度为 50 的序列 \(x_t^{\mathrm{fuse}}\): \[ x_1^{\mathrm{fuse}},x_2^{\mathrm{fuse}},\dots,x_{50}^{\mathrm{fuse}}. \] 然后送入双向 GRU: \[ H= BiGRU(x_1^{\mathrm{fuse}},x_2^{\mathrm{fuse}},\dots,x_{50}^{\mathrm{fuse}}). \] BiGRU 包含两个方向。 前向 GRU: \[ x_1\rightarrow x_2\rightarrow\cdots\rightarrow x_{50} \] 负责利用前面的上下文; 反向 GRU: \[ x_{50}\rightarrow x_{49}\rightarrow\cdots\rightarrow x_1 \] 负责利用后面的上下文。 因此当前位置的表示可以同时参考: \[ \text{前文信息} + \text{当前位置多模态信息} + \text{后文信息}. \] 这对局部模态缺失尤其有用。 例如位置 \(t\) 的 Audio 缺失了: ```text t-2 t-1 t t+1 t+2 Audio ✓ × ✓ ✓ Text ✓ ✓ ✓ ✓ Vision ✓ ✓ ✓ ✓ ``` 模型仍然可以利用: 1. 当前位置的 Text; 2. 当前位置的 Vision; 3. 前后位置的上下文; 4. mask 告诉模型 Audio 当前缺失。 因此 EarlyConcat + BiGRU 本身就具有一定的**隐式缺失补偿能力**。 --- ## 2.4 第三步:得到整条样本表示 BiGRU 得到: \[ H=(h_1,h_2,\dots,h_{50}). \] 随后按照现有实现对整个序列进行聚合,得到 clip-level representation: \[ h_{\mathrm{clip}}. \] 当前实现对 BiGRU 的位置输出做 masked mean:只平均至少有一个模态观测的位置;如果一条样本全部缺失,则保留一个位置用于产生序列级输出。 --- ## 2.5 第四步:同时预测情感极性和情感强度 模型最终有两个任务: ### 任务 A:情感极性分类 当前分类头预测三类极性: \[ \text{Negative / Neutral / Positive}. \] 得到: \[ \hat y_{\mathrm{cls}}. \] ### 任务 B:情感强度回归 预测连续情感强度: \[ \hat y_{\mathrm{reg}}. \] 因此最终: \[ h_{\mathrm{clip}} \rightarrow \begin{cases} Head_{\mathrm{cls}} \rightarrow \hat y_{\mathrm{cls}}\\ Head_{\mathrm{reg}} \rightarrow \hat y_{\mathrm{reg}} \end{cases} \] 训练时采用交叉熵分类损失与强度回归损失的加权和: \[ \mathcal L = \operatorname{CE}(y_{\mathrm{cls}},\hat y_{\mathrm{cls}}) +0.5\operatorname{SmoothL1}\left(\frac{\hat y_{\mathrm{reg}}}{3},\frac{y_{\mathrm{reg}}}{3}\right). \] 回归头通过 \(3\tanh(\cdot)\) 输出 \([-3,3]\) 范围的强度值。 --- ## 2.6 EarlyConcat 为什么效果不错? 它最大的优点其实是: > **假设非常少。** 它没有提前规定: - Text 一定最重要; - Audio 一定只是辅助; - Vision 应该和 Text 对齐到某个共享语义空间; - 某个模态缺失以后一定应该由另一个模态修复。 而是: \[ \boxed{ \text{保留三个模态的信息,把学习任务交给 BiGRU。} } \] 因此在我们目前只有几千条训练样本的情况下,它是一个非常稳定的强基线。 --- # 三、方案一的问题:所有情况下都采用同一种融合方式 EarlyConcat 的问题也很明显。 无论当前数据是什么情况,它始终做: \[ [T;A;V]. \] 但是实际情况可能是: ### 情况 1:三个模态都很好 可能: \[ T+A+V \] 一起使用最好。 ### 情况 2:Audio 当前质量不好 可能: \[ T+V \] 更好。 ### 情况 3:Vision 缺失 可能: \[ T+A \] 更合理。 ### 情况 4:Text 本身已经非常有信息 可能: \[ T \] 单独使用反而比加入噪声较大的 A/V 更合适。 所以我们进一步提出: \[ \boxed{ \text{为什么所有位置都必须使用同一种融合方式?} } \] 这就产生了第二个方案。 --- # 四、方案二:MoFE-7 + MLP Router ## 4.1 一句话理解 MoFE 的核心思想是: > **不再永远把 T/A/V 一股脑拼起来,而是准备 7 种不同的模态组合方案,再让 Router 根据当前位置的情况决定应该更相信哪些组合。** MoFE 全称: > **Mixture of Fusion Experts** 中文可以称为: > **融合专家混合模型** 我们当前还加入了 availability constraint,因此更完整地可以理解成: > **Availability-aware Mixture of Fusion Experts** 即: > **可用性感知的融合专家混合模型。** --- # 五、为什么恰好是 7 个 Expert? 我们有三个模态: \[ T,\quad A,\quad V. \] 三个模态所有非空组合一共有: \[ 2^3-1=7 \] 种。 因此定义: \[ \boxed{ \mathcal E= \{ E_T,E_A,E_V, E_{TA},E_{TV},E_{AV}, E_{TAV} \} } \] 具体来说: | Expert | 可以看到的信息 | |---|---| | \(E_T\) | Text | | \(E_A\) | Audio | | \(E_V\) | Vision | | \(E_{TA}\) | Text + Audio | | \(E_{TV}\) | Text + Vision | | \(E_{AV}\) | Audio + Vision | | \(E_{TAV}\) | Text + Audio + Vision | 这里最关键的一点是: > **Expert 的分工不是训练以后才希望它自己形成,而是从结构上就已经确定。** 例如: \[ E_{TA} \] 永远不能看 Vision。 而: \[ E_{AV} \] 永远不能看 Text。 因此七个 Expert 天然具有不同的信息来源。 --- # 六、MoFE 的完整算法流程 整体流程可以概括成: \[ \boxed{ T/A/V \rightarrow Private Projection \rightarrow 7\ Fusion\ Experts \rightarrow MLP\ Router \rightarrow Weighted\ Fusion \rightarrow Shared\ BiGRU \rightarrow Emotion\ Prediction } \] 下面逐步解释。 --- ## 6.1 第一步:三个模态分别进行私有投影 原始三个模态维度差异很大: \[ T_t\in\mathbb R^{768}, \] \[ A_t\in\mathbb R^{74}, \] \[ V_t\in\mathbb R^{35}. \] 因此首先分别进行投影: \[ z_t^T=P_T(T_t), \] \[ z_t^A=P_A(A_t), \] \[ z_t^V=P_V(V_t). \] 统一得到: \[ z_t^T,z_t^A,z_t^V\in\mathbb R^{64}. \] 注意: \[ P_T,\quad P_A,\quad P_V \] 是三个**独立的投影网络**。 这里统一到 64 维只是为了方便后面的计算,并不意味着: \[ z_T=z_A=z_V. \] 我们没有强迫三个模态进入所谓的“共享语义空间”。 我们的原则仍然是: \[ \boxed{ \text{保留模态差异,需要交互时再交互。} } \] --- # 七、第二步:构造七个融合 Expert 例如: \[ E_T(t)=f_T(z_t^T), \] \[ E_{TA}(t) = f_{TA}([z_t^T;z_t^A]), \] \[ E_{TV}(t) = f_{TV}([z_t^T;z_t^V]), \] \[ E_{TAV}(t) = f_{TAV}([z_t^T;z_t^A;z_t^V]). \] 其余同理。 所有 Expert 最后都输出: \[ E_S(t)\in\mathbb R^{64}. \] 这里特别需要说明: > **我们的 7 个 Expert 不是 7 个完整的深度网络。** 每个 Expert 只是一个很轻量的 fusion module。 真正参数量较大的时序模型 BiGRU 只有: \[ \boxed{1\text{ 个}} \] 而不是 7 个。 所以结构是: ```text T ─┐ A ─┼─> 7 个轻量 Fusion Experts V ─┘ │ ▼ Weighted Sum │ ▼ 一个 Shared BiGRU ``` 而不是: ```text Expert 1 -> BiGRU 1 Expert 2 -> BiGRU 2 ... Expert 7 -> BiGRU 7 ``` 这对于我们的中小规模数据集非常重要。 --- # 八、第三步:Router 决定当前更应该相信哪些 Expert 这是 MoFE 最核心的一步。 对于每个位置 \(t\),我们使用一个小型 MLP Router。 Router 会根据当前位置的信息产生 7 个分数: \[ s_{t,T}, s_{t,A}, s_{t,V}, s_{t,TA}, s_{t,TV}, s_{t,AV}, s_{t,TAV}. \] 经过 Softmax 后得到: \[ \alpha_{t,T}, \alpha_{t,A}, \alpha_{t,V}, \alpha_{t,TA}, \alpha_{t,TV}, \alpha_{t,AV}, \alpha_{t,TAV}. \] 并满足: \[ \sum_{S\in\mathcal E} \alpha_{t,S}=1. \] 只要当前位置至少有一个模态可用,这些权重就在当前可用的 experts 之间归一化;如果三个模态全缺失,则七个 expert 权重都为 0,并改用 learned missing token。 可以把: \[ \alpha_{t,S} \] 理解成: > **当前位置模型愿意把多少融合权重分配给 Expert \(S\)。** --- # 九、Router 看什么信息? 当前 Router 主要使用: 1. 三个模态的 observation masks; 2. 三个 private projection 的 log-RMS 幅值; 3. 三个模态各自的局部 5-position observed ratio。 因此 Router 的输入为 9 个数值,MLP 结构为 \(9\rightarrow16\rightarrow7\),七个输出对应七种模态子集。 也就是说 Router 不只是知道: > “这个模态有没有。” 它还能获得一些局部状态信息: > “这个模态附近是不是经常缺失?” > “当前 private representation 的幅值状态是什么样?” 然后决定: \[ \boxed{ \text{当前位置更适合使用哪种模态组合。} } \] --- # 十、第四步:Availability-aware Routing 我们还加入一个非常重要的约束: > **如果某个 Expert 所需要的模态不存在,那么这个 Expert 当前不能被选择。** 例如: \[ M_t^A=0. \] 说明当前位置 Audio 缺失。 那么: \[ E_A,\quad E_{TA},\quad E_{AV},\quad E_{TAV} \] 全部依赖 Audio,因此这些 Expert 当前不可用。 我们直接把对应 Router logit 屏蔽: \[ s_{t,S}=-\infty. \] Softmax 后自然得到: \[ \alpha_{t,S}=0. \] 所以 Router 不需要自己慢慢学: > “Audio 没了以后不要用 Audio。” 这个基本事实直接由模型结构保证。 Router 真正需要学习的是: > **在当前仍然可用的 Fusion Experts 中,应该怎样分配权重。** --- # 十一、如果三个模态全部缺失怎么办? 如果某个位置: \[ M_t^T=M_t^A=M_t^V=0, \] 那么 7 个 Expert 全部不可用。 此时模型使用一个学习得到的: \[ e_{\mathrm{missing}} \] 作为 all-missing token。 也就是说模型知道: > “这个位置没有可靠的模态观测。” 然后把这个信息继续交给后面的 BiGRU。 BiGRU 可以根据前后位置: \[ t-1,\quad t+1,\quad\cdots \] 继续进行上下文建模。 --- # 十二、第五步:对七个 Expert 做加权融合 Router 得到权重后: \[ u_t = \sum_{S\in\mathcal E} \alpha_{t,S}E_S(t). \] 例如某个位置可能学到: \[ \alpha_T=0.50, \] \[ \alpha_{TA}=0.25, \] \[ \alpha_{TV}=0.15, \] \[ \alpha_{TAV}=0.10. \] 那么: \[ u_t = 0.50E_T + 0.25E_{TA} + 0.15E_{TV} + 0.10E_{TAV}. \] 所以它不是硬选择: > “只能选一个 Expert。” 而是: > **根据当前情况,动态组合多个 Expert。** --- # 十三、第六步:统一进入 Shared BiGRU 得到: \[ u_1,u_2,\dots,u_{50} \] 以后,当前实现把每个 \(u_t\) 与三个 observation masks 拼接,再经过 \(67\rightarrow128\) 的输入投影层;投影后的序列再统一进入: \[ H= BiGRU(u_1,u_2,\dots,u_{50}). \] 因此整个模型的职责划分非常清楚: ### MoFE 负责 \[ \boxed{ \text{当前位置应该怎样组合不同模态?} } \] ### BiGRU 负责 \[ \boxed{ \text{这些位置之间存在怎样的上下文关系?} } \] 也就是: \[ \boxed{ \text{MoFE 做模态组合选择,BiGRU 做序列上下文建模。} } \] --- # 十四、第七步:完成情感预测 BiGRU 输出经过现有序列聚合方式后,得到 clip-level representation: \[ h_{\mathrm{clip}}. \] 然后同时完成: ### 情感极性分类 \[ h_{\mathrm{clip}} \rightarrow Head_{\mathrm{cls}} \rightarrow \hat y_{\mathrm{cls}} \] ### 情感强度回归 \[ h_{\mathrm{clip}} \rightarrow Head_{\mathrm{reg}} \rightarrow \hat y_{\mathrm{reg}}. \] 训练目标继续与 EarlyConcat 相同: \[ \mathcal L =\operatorname{CE}(y_{\mathrm{cls}},\hat y_{\mathrm{cls}}) +0.5\operatorname{SmoothL1}\left(\frac{\hat y_{\mathrm{reg}}}{3},\frac{y_{\mathrm{reg}}}{3}\right). \] --- # 十五、MoFE 为什么比我们之前的 MoE 更合理? 我们之前也尝试过 MoE,但是旧 Expert 类似: ```text Full Expert Text-dominant Expert AV Expert ``` 问题在于: > Expert 到底应该擅长什么,很大程度上需要模型自己学。 在只有几千条训练数据的情况下: \[ \text{既要学 Expert specialization} + \text{又要学 Router} \] 比较困难。 而现在: \[ T,A,V,TA,TV,AV,TAV \] 七个 Expert 的分工天然存在。 例如: ```text E_T -> 永远只看 Text E_AV -> 永远只看 Audio + Vision E_TAV -> 永远看三个模态 ``` 因此模型不再需要先学习: > “每个 Expert 到底是什么。” 它只需要学习: \[ \boxed{ \text{当前应该如何组合这些已经定义清楚的 Expert。} } \] 这大幅降低了 Router 学习 specialization 的难度。 --- # 十六、MoFE 还可以得到可解释的模态 Utility Router 得到七个权重以后,我们还可以计算每个模态的: > **Task-conditioned Modality Utility** 例如 Text: \[ R_T(t) = \alpha_T + \alpha_{TA} + \alpha_{TV} + \alpha_{TAV}. \] Audio: \[ R_A(t) = \alpha_A + \alpha_{TA} + \alpha_{AV} + \alpha_{TAV}. \] Vision: \[ R_V(t) = \alpha_V + \alpha_{TV} + \alpha_{AV} + \alpha_{TAV}. \] 它表示: > **Router 当前有多少权重分配给了“包含该模态”的融合路径。** 需要注意: \[ R_T,R_A,R_V \] 不是物理意义上的“信号可靠性”。 更准确地说,它们是: \[ \boxed{ \text{Task-conditioned Modality Utility} } \] 即: > **这个模态对于当前情感预测任务有多大的使用价值。** --- # 十七、一个直观例子 假设三个模态都正常。 模型可能认为: ```text Text 重要 Text + Audio 有帮助 Text + Vision 有帮助 TAV 少量补充 ``` 于是: \[ u_t = 0.45E_T + 0.25E_{TA} + 0.20E_{TV} + 0.10E_{TAV}. \] 如果当前位置 Text 缺失: ```text Text × Audio ✓ Vision ✓ ``` 那么所有包含 Text 的 Expert: \[ E_T,E_{TA},E_{TV},E_{TAV} \] 直接不可用。 Router 只能在: \[ E_A,E_V,E_{AV} \] 之间重新分配: \[ u_t = \alpha_AE_A + \alpha_VE_V + \alpha_{AV}E_{AV}. \] 所以模型可以自然地根据模态缺失状态改变融合策略。 --- # 十八、两个方案最核心的区别 | 问题 | EarlyConcat + BiGRU | MoFE-7 + MLP Router | |---|---|---| | 模态如何融合 | 直接全部拼接 | 动态组合 7 种模态子集 | | 是否区分不同融合方式 | 否 | 是 | | 是否显式利用 mask | 是 | 是 | | 模态缺失处理 | 交给 BiGRU 隐式学习 | Availability mask + BiGRU | | 是否有 Router | 否 | 有 | | Expert 数量 | 无 | 7 | | 时序主干 | 1 个 BiGRU | 1 个 Shared BiGRU | | 可解释性 | 一般 | 可以分析 Expert 权重和 Modality Utility | | 复杂度 | 低 | 略高 | | 定位 | 强基线;本次重训点估计较强 | 候选;Accuracy 略高,整体优势未确认 | --- # 十九、用一句话理解两个模型 ## EarlyConcat > **“把三种模态的材料都摆在桌子上,让 BiGRU 自己读。”** 数学上: \[ \boxed{ [T;A;V;M] \rightarrow BiGRU \rightarrow Prediction } \] --- ## MoFE-7 > **“先准备 7 种不同的模态组合方案,让 Router 根据当前位置的模态状态决定更应该参考哪些组合,再交给统一的 BiGRU 建模上下文。”** 数学上: \[ \boxed{ T/A/V \rightarrow 7\ Fusion\ Experts \rightarrow MLP\ Router \rightarrow Weighted\ Fusion \rightarrow Shared\ BiGRU \rightarrow Prediction } \] --- # 二十、按数学方案 Q2 口径重训后的模型性能 本节替换旧的检查点重评结果,报告 2026-09-25 在 GPU 上从头重训两个模型后的结果。官方测试集只在检查点确定后进行一次干净评估;缺失鲁棒性在官方验证集的 42 个固定情景上评估。 ## 20.1 训练与评估设置 - 使用官方 `aligned_50.pkl` 划分:训练 3,395 条 / 1,528 个 source video,验证 728 条 / 239 组,测试 727 条 / 381 组;三份划分的 source video 互不重叠。 - 输入是 50 个有序 wordpiece positions,文本、音频、视觉维度为 768、74、35;不是 Q1 的 50 个物理时间 bins。 - 两模型共享只在官方训练集观测行上拟合的 median/MAD 缩放器、训练掩码、batch 顺序、seed `20260924` 和联合目标。 - 连续块训练缺失率为 0%、10%、30%、50%、70%,模式为 single、sync、partial、async;每个被选模态至少保留 20% 原有观测。 - AdamW:学习率 `3e-4`、weight decay `1e-3`、batch size 64、最多 12 epochs、patience 3。两模型都在第 3 轮选中检查点。 - checkpoint 选择使用官方验证集上 `0.0/none`、`0.3/single`、`0.3/sync`、`0.5/async` 四情景的平均联合损失。 - 保留当前两个模型的输出头和 `CE + 0.5 × SmoothL1` 目标。数学方案 C5 使用的概率 Beta-mixture 损失与当前确定性输出头不兼容,因此没有移植该损失。 - 测试指标为 Accuracy、Macro-F1、MAE、RMSE、Pearson。分类使用 Negative / Neutral / Positive 三类,回归预测裁剪到 \([-3,3]\)。 ## 20.2 官方测试集结果 | 模型 | Accuracy ↑ | Macro-F1 ↑ | MAE ↓ | RMSE ↓ | Pearson ↑ | 参数量 | |---|---:|---:|---:|---:|---:|---:| | EarlyConcat + BiGRU | 0.6740 | **0.6157** | **0.6624** | **0.8897** | **0.6585** | 253,124 | | MoFE-7 + MLP Router | **0.6795** | 0.6049 | 0.6761 | 0.8980 | 0.6427 | 306,523 | 差值均为 MoFE-7 减 EarlyConcat,置信区间来自 1,000 次按测试 source-video ID 成对 Bootstrap: | 指标 | 差值 | 95% Bootstrap 区间 | |---|---:|---:| | Accuracy | +0.0055 | [−0.0259, +0.0339] | | Macro-F1 | −0.0109 | [−0.0475, +0.0216] | | MAE | +0.0137 | [−0.0065, +0.0353] | | RMSE | +0.0083 | [−0.0150, +0.0327] | | Pearson | −0.0159 | [−0.0323, +0.0013] | 五项指标的区间都包含零。MoFE 的 Accuracy 点估计略高;EarlyConcat 的 Macro-F1、MAE、RMSE 和 Pearson 点估计更好。当前是单种子结果,视频组 Bootstrap 反映样本组抽样不确定性,不反映跨随机种子波动。 ## 20.3 验证集 42 个缺失情景 下表中的平均值是对 41 个非 clean 验证情景不加权求平均;worst 是其中 Macro-F1 最低的情景。它们是描述性汇总,不代替 AURC。 | 模型 | Clean Macro-F1 | 41 个缺失情景平均 Macro-F1 | 最差情景 Macro-F1 | 缺失情景平均 MAE | |---|---:|---:|---:|---:| | EarlyConcat + BiGRU | **0.5746** | **0.5655** | **0.5289**(0.3/location_start_T) | **0.6371** | | MoFE-7 + MLP Router | 0.5626 | 0.5513 | 0.5048(0.7/partial) | 0.6453 | 30% 模态缺失的 Macro-F1 / MAE: | 条件 | EarlyConcat | MoFE-7 | |---|---:|---:| | Text | 0.5462 / 0.6386 | 0.5455 / 0.6477 | | Audio + Vision | 0.5817 / 0.6326 | 0.5620 / 0.6350 | | All-modal | 0.5693 / 0.6352 | 0.5617 / 0.6421 | 归一化 AURC-MAE 越低越好。差值为 MoFE-7 减 EarlyConcat,区间按验证 source-video ID 成对 Bootstrap: | 缺失模式 | EarlyConcat | MoFE-7 | 差值及 95% 区间 | |---|---:|---:|---:| | Single | **0.6379** | 0.6494 | +0.0115 [−0.0082, +0.0302] | | Sync | **0.6387** | 0.6461 | +0.0074 [−0.0120, +0.0250] | | Partial | **0.6420** | 0.6527 | +0.0107 [−0.0087, +0.0285] | | Async | **0.6409** | 0.6527 | +0.0119 [−0.0062, +0.0289] | 四种模式下 EarlyConcat 的 AURC-MAE 点估计均较低,但区间均跨零。 ## 20.4 缺失模态类型、缺失率与消融分析 题目要求分析局部缺失的模态类型、位置和持续长度。本节在官方 aligned 验证集上对已选定的两个检查点做受控推理消融,不重新拟合模型,也不读取官方测试集。 ### 实验设计 - 验证集为 728 条样本、239 个 source-video 组;只使用 R03 训练集拟合的同一个 median/MAD scaler。 - 50 个位置是附件提供的有序 wordpiece positions,不是 50 个等长物理时间段。因此下文的 start/middle/end 与缺失比例都指这条 50-position 序列中的位置,不换算成视频秒数。 - 构造 7 种被遮蔽模态集合:T、A、V、TA、TV、AV、TAV;每种分别设 10%、30%、50%、70% 缺失率,共 28 个条件。 - 每个被选模态遮蔽一个居中的连续块,其他模态保持原观测状态。比例按该模态原本有效的位置数计算,至少保留 20% 原有观测。实际平均遮蔽率约为请求值:10% 条件实测 10.0%,30% 为 29.8%,50% 为 49.7%,70% 为 69.5%。两个模型使用完全相同的样本级掩码。 - 下表先对同一缺失率下的 7 种模态集合不加权平均。干净验证集参考值为 EarlyConcat:Accuracy 0.6154、Macro-F1 0.5746、MAE 0.6343、Pearson 0.6095;MoFE:0.6058、0.5626、0.6368、0.6043。 ### 缺失率总体趋势 | 缺失率 | Early Acc | Early Macro-F1 | Early MAE | Early Pearson | MoFE Acc | MoFE Macro-F1 | MoFE MAE | MoFE Pearson | |---:|---:|---:|---:|---:|---:|---:|---:|---:| | 10% | 0.6142 | **0.5736** | **0.6336** | **0.6084** | 0.6032 | 0.5641 | 0.6366 | 0.6042 | | 30% | 0.6126 | **0.5725** | **0.6337** | **0.6024** | 0.6054 | 0.5627 | 0.6384 | 0.6009 | | 50% | 0.6085 | **0.5665** | **0.6416** | 0.5865 | 0.6068 | 0.5390 | 0.6452 | **0.5901** | | 70% | 0.5899 | **0.5470** | **0.6605** | 0.5442 | **0.5907** | 0.5147 | 0.6679 | 0.5558 | 随着遮蔽率从 10% 升到 70%,两模型的平均 Macro-F1 与 Pearson 都下降,MAE 上升。70% 时,EarlyConcat 的平均 Macro-F1 比 clean 低 0.0277、MAE 高 0.0257;MoFE 的 Macro-F1 低 0.0479、MAE 高 0.0310。总体退化在高缺失率更明显,且本轮点估计下 EarlyConcat 对缺失率增加更稳。 ### 哪种模态缺失更有影响? 下表是相对同一模型 clean 验证结果的变化: - \(\Delta F1=F1_{missing}-F1_{clean}\),负值表示 Macro-F1 下降; - \(\Delta MAE=MAE_{missing}-MAE_{clean}\),正值表示回归误差上升。 | 被遮蔽模态 | Early ΔF1(30% / 70%) | Early ΔMAE(30% / 70%) | MoFE ΔF1(30% / 70%) | MoFE ΔMAE(30% / 70%) | |---|---:|---:|---:|---:| | T | −0.021 / −0.080 | +0.003 / +0.060 | −0.037 / −0.128 | +0.019 / +0.103 | | A | +0.015 / +0.027 | −0.002 / −0.003 | −0.012 / −0.006 | +0.001 / +0.006 | | V | +0.001 / +0.002 | −0.003 / −0.002 | 0.000 / +0.011 | −0.005 / −0.010 | | TA | −0.007 / −0.062 | −0.003 / +0.053 | −0.041 / −0.120 | +0.012 / +0.040 | | TV | −0.014 / −0.089 | +0.001 / +0.073 | −0.034 / −0.121 | +0.008 / +0.075 | | AV | +0.009 / +0.010 | −0.003 / −0.003 | +0.009 / +0.023 | −0.006 / −0.006 | | TAV | +0.001 / −0.002 | 0.000 / +0.001 | +0.001 / +0.006 | +0.004 / +0.009 | 文本局部缺失的影响最大,尤其对 MoFE:只遮蔽 70% 的 T 时,Macro-F1 下降 0.128、MAE 上升 0.103;EarlyConcat 分别下降 0.080、上升 0.060。遮蔽 T+A 或 T+V 后也出现明显下降,说明这一训练结果对文本位置包含的信息较敏感。单独遮蔽 A 或 V 的影响较小;EarlyConcat 在 A-only 条件中的 F1 点估计甚至上升。该现象只能说明当前验证集上的局部遮蔽结果,不能据此断言 A/V 对任务无用。TAV 的变化也不呈简单单调关系,反映不同模态组合与上下文仍会影响结果。 ![两模型在七种缺失模态集合下的 Macro-F1 随缺失率变化](outputs/followups/R03_math_protocol_retraining/aligned_missingness_analysis/macro_f1_by_modality_and_rate.png) ![相对 clean 的 Macro-F1 变化热图](outputs/followups/R03_math_protocol_retraining/aligned_missingness_analysis/macro_f1_drop_heatmap.png) ### 位置、连续块长度与跨模态错位 30% 单模态遮蔽的位置控制如下。这里 start/middle/end 是 wordpiece 序列位置: | 模型 | T:start / middle / end | A:start / middle / end | V:start / middle / end | |---|---:|---:|---:| | EarlyConcat + BiGRU | 0.529 / 0.554 / 0.556 | 0.581 / 0.590 / 0.591 | 0.578 / 0.576 / 0.571 | | MoFE-7 + MLP Router | 0.507 / 0.526 / 0.524 | 0.569 / 0.551 / 0.555 | 0.571 / 0.563 / 0.559 | T 的序列开头缺失是两个模型最差的位置;T 在中间或末尾缺失时 Macro-F1 较高。A/V 的位置效应较小且模型间方向不完全一致。 将 30% 缺失做成一个长块或多个短块,没有出现跨模态一致的赢家: | 模型与模态 | 一个长块 Macro-F1 | 多个短块 Macro-F1 | |---|---:|---:| | Early T / A / V | 0.542 / 0.584 / 0.571 | 0.544 / 0.578 / 0.572 | | MoFE T / A / V | 0.518 / 0.557 / 0.573 | 0.522 / 0.564 / 0.566 | T/A/V 同时缺失 30% 时,EarlyConcat 对 sync、partial、async 的 Macro-F1 分别为 0.570、0.568、0.567,差异较小;MoFE 分别为 0.568、0.542、0.567,partial 条件低约 0.025。当前结果提示 MoFE 对多模态缺失区间错位更敏感;单种子验证结果尚不足以确认这种差异能否稳定复现。 ![30% 缺失位置敏感性](outputs/followups/R03_math_protocol_retraining/aligned_missingness_analysis/location_sensitivity.png) ### 消融结论 1. **输入模态局部遮蔽消融:**固定 R03 检查点,逐一遮蔽 T/A/V 及其组合。七种集合、四档缺失率均纳入逐条件 CSV;总体上文本缺失最伤,视觉或音频单独缺失影响较弱。 2. **融合架构消融:**在相同特征、训练掩码和 28 个条件上比较 EarlyConcat 与 MoFE。28 条件 Macro-F1 平均值为 0.5648 vs 0.5384,MAE 为 0.6421 vs 0.6485;参数量分别是 253,124 和 306,523。EarlyConcat 的点估计更好且参数更少,但只有一个 seed,不能将此差异表述为稳定或显著优势。 本节全部因素分析只在官方验证集和单个 seed 上进行,没有对 28 个单项条件逐一做显著性检验。结果适合描述趋势、定位敏感模态和选择后续实验,不应用来声称每个单项差异都具有统计显著性。 ## 20.5 结论与边界 这次重训的点估计整体偏向 EarlyConcat + BiGRU:测试集 Macro-F1 和回归指标更高,验证集缺失情景的平均 Macro-F1、平均 MAE 与四种 AURC-MAE 也更好;MoFE-7 仅在测试 Accuracy 上略高。由于 Bootstrap 区间均跨零,且本次只使用一个 seed,不能声称 EarlyConcat 已被统计上确认优于 MoFE。当前应将 EarlyConcat 视为本轮较强候选,MoFE-7 继续保留比较,不宣称其具有总体优势。 数学汇总文件中的 C5 测试结果为 Accuracy 0.6740、Macro-F1 0.5861、MAE 0.6980、RMSE 0.9674、Pearson 0.6300。C5 的概率输出头与损失函数不同,该结果只作背景参考,不是与本节两个模型的严格同结构消融比较。 ## 20.6 可复现产物 运行入口: ```bash uv run python -m q2.train_math_protocol \ --device auto \ --output-dir outputs/followups/R04_math_protocol_retraining_replica uv run python -m q2.analyze_aligned_missingness --device auto ``` 本次报告、检查点、scaler 和逐条件结果保存在独立目录: - [RESULTS.md](outputs/followups/R03_math_protocol_retraining/RESULTS.md):本次结果和解读; - [official_test_metrics_by_seed.csv](outputs/followups/R03_math_protocol_retraining/official_test_metrics_by_seed.csv):官方测试集指标; - [official_test_paired_bootstrap.csv](outputs/followups/R03_math_protocol_retraining/official_test_paired_bootstrap.csv):测试集配对 Bootstrap; - [controlled_metrics_by_scenario.csv](outputs/followups/R03_math_protocol_retraining/controlled_metrics_by_scenario.csv):42 个验证情景的逐项结果; - [aurc_mae_by_mode_seed.csv](outputs/followups/R03_math_protocol_retraining/aurc_mae_by_mode_seed.csv) 与 [aurc_mae_paired_bootstrap.csv](outputs/followups/R03_math_protocol_retraining/aurc_mae_paired_bootstrap.csv):AURC 与其区间; - [run_manifest.json](outputs/followups/R03_math_protocol_retraining/run_manifest.json):输入特征 hash、数据划分、训练配置、设备和评估规程。 - [aligned_missingness_analysis/modality_rate_metrics.csv](outputs/followups/R03_math_protocol_retraining/aligned_missingness_analysis/modality_rate_metrics.csv):7 种缺失模态组合 × 4 档缺失率的全部指标; - [aligned_missingness_analysis/modality_rate_summary.csv](outputs/followups/R03_math_protocol_retraining/aligned_missingness_analysis/modality_rate_summary.csv):按缺失率跨 7 种模态集合的平均结果; - [aligned_missingness_analysis/architecture_ablation_deltas.csv](outputs/followups/R03_math_protocol_retraining/aligned_missingness_analysis/architecture_ablation_deltas.csv):逐条件的 MoFE − EarlyConcat 差值; - [aligned_missingness_analysis/location_span_synchrony_metrics.csv](outputs/followups/R03_math_protocol_retraining/aligned_missingness_analysis/location_span_synchrony_metrics.csv):位置、长短块和同步方式消融明细; - [analyze_aligned_missingness.py](q2/analyze_aligned_missingness.py):固定 R03 检查点,复现验证集因素分析的入口。 --- # 二十一、目前我们对整个方法的最终理解 我们的模型设计经历了一个很重要的变化。 最开始的问题是: > “怎么把三个模态融合起来?” EarlyConcat 的答案是: \[ \boxed{ \text{直接融合,然后统一学习。} } \] 进一步我们发现,更合理的问题其实是: > **“在不同样本、不同位置、不同模态缺失状态下,究竟应该使用哪一种模态组合?”** 于是 MoFE 的答案变成: \[ \boxed{ \text{不是寻找唯一最优的融合方式, 而是让模型根据当前条件动态选择融合方式。} } \] 因此我们最终的核心思想可以概括为: > **保留不同模态自身的信息结构,不预设某个模态永远最重要;将所有可能的非空模态子集定义为轻量融合专家,再通过可用性感知的 MLP Router 在局部位置动态分配专家权重,最后由共享 BiGRU 统一建模序列上下文。** 最终流程: ```text Text │ ▼ Private Projection │ ├──────────────┐ │ │ Audio ──> Private Projection │ │ │ ├──────────┐ │ │ │ │ Vision -> Private Projection │ │ │ │ │ ▼ ▼ ▼ ┌─────────────────────────────┐ │ 7 Fusion Experts │ │ │ │ T A V TA TV AV │ │ TAV │ └──────────────┬──────────────┘ │ ▼ MLP Router │ Availability Mask │ ▼ Expert Weights α │ ▼ Weighted Expert Mixture │ ▼ Shared BiGRU │ ▼ Sequence Aggregation │ ┌────────┴────────┐ ▼ ▼ Polarity Head Intensity Head │ │ ▼ ▼ 情感极性分类 情感强度回归 ``` 一句话总结: \[ \boxed{ \text{EarlyConcat 是“全部给模型看”, MoFE 是“让模型决定当前应该怎么看”。} } \]