Files
modeling_zhaocui/deep_learning/Q2/ALGORITHM.md
T

1368 lines
27 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 是“让模型决定当前应该怎么看”。}
}
\]