# Q2:缺失模态下的多模态情感识别 本目录包含 Q2 的训练代码、环境配置和后续实验约定。当前只维护两种模型: 1. **EarlyConcat + BiGRU**:将文本、音频、视觉特征和观测掩码拼接后,用双向 GRU 建模有序序列,作为简洁基线。 2. **MoFE-7 + MLP Router**:根据每个位置可用的模态,在七种模态子集专家之间路由,再用共享 BiGRU 建模序列。 旧的模型比较报告、指标表和图表已清理。不要从此 README 推断模型优劣;后续结果应放进独立实验目录并在新报告中解释。 ## 数据与时序表示 训练入口读取项目根目录下 `E题数据/附件2-数据集特征文件/aligned_50.pkl` 的官方训练集和验证集。每个样本包含 50 个有序位置,文本、音频、视觉维度分别为 768、74、35,并带有显式观测掩码。这里的 50 个位置是附件 2 提供的词片位置,**不是 50 个等长物理时间箱**。 Q1 的对齐方法为 Q2 提供了有序的跨模态输入组织方式;Q2 在此基础上处理连续块缺失,不重新提取或改写 Q1 特征。根目录 `math/` 和 `final/Q1/` 中的内容只作只读参考。 标准化参数只从训练集拟合。当前保留的两组模型权重及共享标准化参数位于: ```text outputs/mofe_7experts/ ├── aligned_robust_stats.npz └── models/ ├── baselines/concat/seed_{42,3407,2026}/model_best.pt └── B5_mofe_mlp/seed_{42,3407,2026}/model_best.pt ``` ## 环境 本项目使用 `uv` 管理 Python 环境。进入本目录后同步锁定依赖: ```bash uv sync --locked ``` ## 运行 先用单个种子执行快速检查。每轮运行使用新的目录,避免覆盖保留的参照权重: ```bash uv run python -m q2.train_mofe \ --phase smoke --seeds 42 \ --output-dir outputs/followups/F00_smoke ``` 完整训练和验证示例: ```bash uv run python -m q2.train_mofe \ --phase full --seeds 42 3407 2026 \ --output-dir outputs/followups/F01_local_repair ``` 完整运行会训练两种模型,并在 clean、Text、Audio、Vision、Audio+Vision、All-modal 条件下评估 10%、20%、30% 连续块缺失;结果、检查点和诊断图写入指定目录。默认输出目录是 `outputs/mofe_7experts/`,日常新实验应显式设置 `--output-dir`,避免覆盖保留的权重和标准化参数。 ## 文件索引 - `q2/data.py`:官方特征读取、观测掩码、训练集 robust scaling 和连续块缺失。 - `q2/models.py`:EarlyConcat + BiGRU。 - `q2/mofe.py`:MoFE-7 专家与 MLP 路由器。 - `q2/train_mofe.py`:两种保留模型的训练、验证、统计和可视化入口。 - `q2/task_preference.py`:复用现有 MoFE 权重,比较七个 forced expert 的分类/回归偏好。 - [ALGORITHM.md](ALGORITHM.md):两个保留模型的算法说明和最新验证集重评结果。 - [EXPERIMENT_PROTOCOL.md](EXPERIMENT_PROTOCOL.md):后续实验的固定比较条件与记录要求。 - `outputs/followups/README.md`:新实验目录的命名和存放规则。 Q3 暂不在本目录中开展;待 Q2 后续选型完成后再统一规划。 ## 当前任务偏好诊断 在训练 dual-router 前,先用现有 MoFE-7 检查了七个 forced expert 在分类 Macro-F1 与回归 MAE/Pearson 上的偏好。三个 seed、15 种缺失条件的排名大体一致,没有看到稳定的分类—回归 expert 分工;因此当前不启动 dual-router,仍以 single-router MoFE-7 为活动参照。详见[诊断报告](outputs/followups/D0_task_preference/task_preference_diagnostic.md)及逐条件数据。 可用以下命令复现该诊断: ```bash uv run python -m q2.task_preference \ --seeds 42 3407 2026 \ --output-dir outputs/followups/D0_task_preference ```