# 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 结论与边界 这次重训的点估计整体偏向 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.5 可复现产物 运行入口: ```bash uv run python -m q2.train_math_protocol \ --device auto \\ --output-dir outputs/followups/R04_math_protocol_retraining_replica ``` 本次报告、检查点、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、数据划分、训练配置、设备和评估规程。 --- # 二十一、目前我们对整个方法的最终理解 我们的模型设计经历了一个很重要的变化。 最开始的问题是: > “怎么把三个模态融合起来?” 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 是“让模型决定当前应该怎么看”。} } \]