Files
modeling_zhaocui/deep_learning/Q2/ALGORITHM.md
T

27 KiB
Raw Blame History

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   ── T_t
Audio  ── A_t
Vision ── V_t

现在把三个投影后的模态表示和 mask 放到同一个向量:

[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 缺失了:

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 个。

所以结构是:

T   ─┐
A   ─┼─> 7 个轻量 Fusion Experts
V   ─┘
                │
                ▼
           Weighted Sum
                │
                ▼
          一个 Shared BiGRU

而不是:

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 类似:

Full Expert
Text-dominant Expert
AV Expert

问题在于:

Expert 到底应该擅长什么,很大程度上需要模型自己学。

在只有几千条训练数据的情况下:

[ \text{既要学 Expert specialization} + \text{又要学 Router} ]

比较困难。

而现在:

[ T,A,V,TA,TV,AV,TAV ]

七个 Expert 的分工天然存在。

例如:

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 + Audio    有帮助
Text + Vision   有帮助
TAV             少量补充

于是:

[ u_t

0.45E_T + 0.25E_{TA} + 0.20E_{TV} + 0.10E_{TAV}. ]

如果当前位置 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 可复现产物

运行入口:

uv run python -m q2.train_math_protocol \
  --device auto \\
  --output-dir outputs/followups/R04_math_protocol_retraining_replica

本次报告、检查点、scaler 和逐条件结果保存在独立目录:


二十一、目前我们对整个方法的最终理解

我们的模型设计经历了一个很重要的变化。

最开始的问题是:

“怎么把三个模态融合起来?”

EarlyConcat 的答案是:

[ \boxed{ \text{直接融合,然后统一学习。} } ]

进一步我们发现,更合理的问题其实是:

“在不同样本、不同位置、不同模态缺失状态下,究竟应该使用哪一种模态组合?”

于是 MoFE 的答案变成:

[ \boxed{ \text{不是寻找唯一最优的融合方式, 而是让模型根据当前条件动态选择融合方式。} } ]

因此我们最终的核心思想可以概括为:

保留不同模态自身的信息结构,不预设某个模态永远最重要;将所有可能的非空模态子集定义为轻量融合专家,再通过可用性感知的 MLP Router 在局部位置动态分配专家权重,最后由共享 BiGRU 统一建模序列上下文。

最终流程:

                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 是“让模型决定当前应该怎么看”。} } ]