Merged code repo (CompanionGuard-RL) into single project-level git. Reorganized root: docs/, reference/, experiments/, tmp/active|archives/. Gitignored: data/, checkpoints/, .venv, experiment logs, tmp/archives. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
20 KiB
多模态情感模型优化研究执行方案
文档作用:本文是本课题唯一主工作文档,记录“当前有效方案”。它应当能直接指导后续实验执行、代码开发、基线选择、结果验收与论文写作。历史判断、废弃方案和变更原因只写入变更日志,不在本文反复展开。
当前版本:v3.1
更新日期:2026-04-24
当前主线:D2 RL 对话图结构优化为主要贡献;D1 RL 自适应模态融合作为辅助实验、鲁棒性分析和负结果讨论保留。
当前限制:本轮只修文档和代码口径,不启动 GPU 训练。
1. 研究目标
本课题研究多模态情感识别中的动态决策问题。核心问题不是简单把文本、音频、视觉拼接起来,而是在不同样本、不同噪声、不同对话上下文下,让模型学会“当前应该信任哪种模态、应该参考哪些历史发言”。
最终论文建议围绕一个统一叙事组织:
Reinforcement Learning for Adaptive Multimodal Emotion Recognition: From Modality Fusion to Conversation Graph Topology
中文表述:
面向多模态情感识别的强化学习动态决策框架:从模态融合权重到对话图拓扑优化。
两个技术层次:
- D1 话语级动态融合:RL agent 根据每路模态的可靠性动态分配 text/audio/vision 权重。
- D2 对话级动态图结构:RL agent 根据当前发言状态动态选择上下文窗口、历史发言边权重和说话人关系。
当前优先级:
| 方向 | 定位 | 当前状态 | 优先级 |
|---|---|---|---|
| D1 RL 自适应模态融合 | 辅助实验、鲁棒性分析、负结果讨论 | bug 已修,待 GPU 空闲后重跑 | 中 |
| D2 RL 对话图结构优化 | 主贡献、主实验、论文核心 | 等待 COGMEN 依赖与公平基线 | 高 |
2. 当前资源与目录
服务器:
| 项目 | 内容 |
|---|---|
| SSH | ssh -p 20083 root@10.82.3.180 |
$ZSY |
/root/siton-data-2849d4ce327c4ccfb233ce33868fe7fe/zsy |
| 项目目录 | $ZSY/multimodal_affect |
| 环境 | $ZSY/envs/multimodal_affect |
| 数据盘 | 1TB,当前约 788GB 可用 |
| GPU | 4 x RTX 5090,当前暂不占用 |
本地目录:
| 项目 | 路径 |
|---|---|
| 本地研究目录 | D:\Myresearch\多模态情感模型优化 |
| 主方案 | 2026-04-22-研究执行方案.md |
| 变更日志 | 2026-04-24-变更日志.md |
服务器数据状态:
| 数据 | 当前状态 | 用途 | 注意事项 |
|---|---|---|---|
| IEMOCAP 预提取特征 | data/iemocap,GloVe 300 + COVAREP 74 + FACET 35 |
D1 修复后重跑 | 扁平特征,不适合 D2 图结构 |
| IEMOCAP 原始数据 | data/raw/IEMOCAP_full_release,已解压 Session1-5 |
D2 重建对话级样本、必要时提取新特征 | 不覆盖现有 data/iemocap |
| COGMEN IEMOCAP 4 类数据 | baselines/COGMEN/data/iemocap_4 |
D2 公平基线首选入口 | 需要 PyG 等依赖 |
| MELD CSV | data/meld,当前主要是文本/标签 |
后续 D2 泛化实验 | 已解压 MELD.Raw,可补音频/视频 |
| MELD.Raw | data/raw/MELD/MELD.Raw,已解压 |
后续多模态特征 | 暂不运行耗时提取 |
| MOSI | data/mosi |
D1 或补充实验 | audio 中有少量 -inf,使用前必须清洗 |
| IEMOCAP noisy | data/iemocap_noisy |
D1 鲁棒性实验 | 已重新生成三模态噪声文件 |
3. 当前代码状态
已修复内容:
| 模块 | 文件 | 修复内容 | 状态 |
|---|---|---|---|
| 噪声生成 | scripts/preprocess/generate_noise.py |
统一输出 *_vision.npy,兼容 visual 配置别名 |
已同步本地与服务器 |
| 数据加载 | src/data/dataset.py |
noisy variant 加载 text/audio/vision,缺失文件回退 clean 同索引模态 | 已同步服务器 |
| D1 训练 | scripts/train_d1_fixed.py、服务器 scripts/train/train_d1.py |
噪声 batch 使用同一索引加载 text/audio/vision/labels | 已同步 |
| D1 评测 | scripts/run_eval_ablation.py、服务器 scripts/eval/eval_d1.py |
噪声评测替换三模态,修复最后 batch 索引 | 已同步 |
| 噪声数据 | 服务器 data/iemocap_noisy |
8 个变体均含 train/val/test 的 text/audio/vision/labels | 已验证 |
已完成检查:
- 本地相关 Python 文件
py_compile通过。 - 服务器相关 Python 文件
py_compile通过。 - 服务器噪声数据形状检查通过。
- 未启动任何训练。
旧结果使用规则:
| 结果 | 是否可用于论文正式表格 | 用途 |
|---|---|---|
| 修复前 D1 Stage A/B 数值 | 否 | 仅用于说明 bug 发现前的诊断过程 |
| 修复前 D1 噪声鲁棒性数值 | 否 | 视觉噪声相关结果无效 |
| 修复后重新训练结果 | 待产生 | 可作为正式 D1 结果 |
| COGMEN 论文引用数值 | 不能作为主表唯一基线 | 可放 Related Work 或参考表 |
| 本地复现 COGMEN-Ours | 待产生 | D2 主基线 |
4. 总体技术路线
整体路线分为两个层次:
输入:text / audio / vision 多模态情感数据
D1:话语级动态融合
预提取特征 -> 模态 projector -> 置信度/不确定性状态 -> RL fusion agent -> 分类
目标:验证 RL 是否能在噪声/缺失模态下优于固定融合
D2:对话级动态图结构
对话序列 -> COGMEN 基线图 -> RL window/topology agent -> 动态 GNN -> ERC 分类
目标:学习“该看哪些历史发言”和“边权重应该多强”
研究策略:
- 先保证 D1 训练和评测口径正确,重跑后决定其论文位置。
- D2 必须先跑通 COGMEN-Ours,建立公平基线。
- D2 先做小动作空间的
RL-Window,再做完整RL-Topo-Soft。 - 最终论文以 D2 主结果为核心,D1 作为辅助实验或 analysis 章节。
5. D1 方案:RL 自适应模态融合
5.1 任务定义
输入为单条 utterance 的三模态特征:
| 模态 | 当前特征 | 维度 |
|---|---|---|
| Text | GloVe 平均/预提取文本特征 | 300 |
| Audio | COVAREP | 74 |
| Vision | FACET | 35 |
输出为 4 类 IEMOCAP 情感分类。
当前 D1 不声称使用 BERT/Wav2Vec2/ResNet。若未来要写“大模型特征提取”,必须另做特征提取与重跑。
5.2 当前模型结构
text/audio/vision feature
-> modality projector: low-dim feature -> 1024-d shared space
-> confidence estimator: 每个模态输出一个置信度
-> RL fusion agent: 输出三路融合权重
-> weighted fusion
-> MLP classifier
Stage A:监督预训练。
- 使用均匀融合训练 projector、confidence estimator、classifier。
- 训练时注入噪声。
- 置信度目标按实际噪声模态设置:被污染模态为 0.1,干净模态为 0.9。
Stage B:PPO 融合权重学习。
- encoder 冻结。
- agent 根据状态输出三路权重。
- classifier 可轻量刷新。
- 该版本作为
RL-Decoupled,用于验证两阶段 RL 的局限。
5.3 D1 状态、动作、奖励
当前状态:
s = [conf_text, conf_audio, conf_vision, noise_est]
动作:
a = [w_text, w_audio, w_vision], sum(a)=1
当前奖励:
R = alpha * (-CE) + beta * consistency(weights, confidence) - gamma * instability
后续增强状态候选:
| 状态项 | 说明 |
|---|---|
| 三路 confidence | 现有 |
| 三路单模态预测熵 | 衡量每个模态自身不确定性 |
| 三对跨模态 cosine similarity | 衡量模态一致性 |
| 三路 feature norm / variance | 检测异常特征 |
| 分模态 noise estimate | 替代单一 audio.std |
目标是从 4 维状态扩展到 12-16 维状态,前提是 RL-Decoupled 重跑后仍有继续价值。
5.4 D1 噪声实验
当前 IEMOCAP 噪声变体:
| 变体 | 噪声设计 | 应影响模态 |
|---|---|---|
gaussian_light |
轻度高斯噪声 | text/audio/vision |
gaussian_heavy |
重度高斯噪声 | text/audio/vision |
missing_audio |
音频全置零 | audio |
missing_visual |
视觉全置零 | vision |
text_word_drop_30 |
文本 30% dropout 或特征置零 | text |
audio_masking_50 |
音频 50% 维度遮蔽 | audio |
realistic_mixed |
文本轻度损坏 + 音频噪声 + 视觉遮挡 | text/audio/vision |
audio_time_mask |
音频样本级时间遮蔽 | audio |
验收要求:
- 每个变体必须有
train/val/test的text/audio/vision/labels。 - 评测时 noisy 文件存在就替换对应模态;不存在才回退 clean 同索引模态。
- 不允许 batch 内跨样本替换模态。
5.5 D1 对比基线
D1 不以 COGMEN 为主基线。建议基线:
| 类别 | 方法 |
|---|---|
| 基础融合 | concat + MLP、Fixed-Equal、Fixed-Learned-Weight |
| 动态融合 | Attention Fusion、Gated Fusion |
| 多模态情感经典方法 | TFN、LMF、MFN、MulT、MISA、Self-MM |
| 鲁棒/缺失模态 | GCNet、MMIN、M2R2、GSDNet 或同类方法 |
| 本方法 | RL-Decoupled、RL-Joint、RL-Joint-16dim |
最小可执行矩阵:
| 变体 | 必做 | 说明 |
|---|---|---|
| Stage-A-Only | 是 | 修复后监督基线 |
| Fixed-Equal | 是 | 固定融合 |
| Gated-Fusion | 是 | 非 RL 动态融合 |
| RL-Decoupled | 是 | 当前两阶段 RL |
| RL-Joint | 视结果 | 如果 decoupled 仍弱,做联合训练 |
| RL-Joint-16dim | 视结果 | 状态增强版本 |
5.6 D1 后续执行顺序
触发条件:GPU 空闲。
- 确认
data/iemocap_noisy三模态文件完整。 - 重跑 Stage A。
- 重跑 Stage B
RL-Decoupled。 - 重新运行修复后的
eval_d1.py。 - 汇总 clean 与 8 种噪声下的 WF1/Acc。
- 判断是否进入
RL-Joint。
D1 成功标准:
- clean test 不显著低于 Stage-A-Only。
- 至少在多数噪声场景中优于 Fixed-Equal 或 Gated-Fusion。
- 若无法达成,D1 写为负结果与设计反思,不作为主贡献。
6. D2 方案:RL 对话图结构优化
6.1 任务定义
D2 是论文主线。目标是在多模态对话情感识别中,让 RL agent 动态决定当前发言应参考哪些历史发言。
输入为一个 dialogue:
u1, u2, ..., ut
每个 ui 有 text/audio/vision feature、speaker id、label
输出为每个 utterance 的情感类别。
核心问题:
固定图结构:每个当前发言使用固定窗口或固定全局连接
改进目标:根据当前语义、说话人、历史情绪变化,动态选择上下文边
6.2 D2 与 COGMEN 的关系
COGMEN 是 D2 的直接前身,不跳过。
当前策略:
- 先跑官方 COGMEN
iemocap_4,得到COGMEN-Ours。 - 在同一数据、同一 split、同一指标下实现固定窗口变体。
- 再加入 RL window selector。
- 最后实现 soft topology agent。
不能只引用 COGMEN 论文表格,因为:
- 论文数值和当前本地环境、特征、依赖版本可能不同。
- D2 的改进必须建立在可复现同口径基线上。
- 后续固定窗口和 RL 图结构需要直接改 COGMEN 图构建逻辑。
6.3 D2 环境依赖
当前阻塞:
| 依赖 | 状态 |
|---|---|
torch_geometric |
未安装 |
torch_scatter |
未安装 |
torch_sparse |
未安装 |
sentence_transformers |
未安装 |
comet_ml |
未安装 |
解决方案:
- 优先离线安装与
torch 2.7.1+cu128兼容的 PyG wheels。 - 如果 PyG wheel 不好配,先用 COGMEN 官方预处理数据做评测脚本适配,减少训练依赖。
comet_ml只作为日志依赖,必要时 stub 或禁用。sentence_transformers若只评测官方 pkl,可避免重新提取 SBERT 特征;若训练流程强依赖则离线安装。
6.4 D2 阶段一:COGMEN-Ours
目标:跑通本地 COGMEN 4 类 IEMOCAP。
任务:
- 阅读并定位 COGMEN 图构建逻辑:
cogmen/model/COGMEN.pycogmen/model/GNN.pycogmen/Dataset.pypreprocess.py
- 确认官方
data_iemocap_4.pkl与IEMOCAP_features_4.pkl的结构。 - 安装或绕过缺失依赖。
- 跑原始评测,记录 WF1/Acc。
- 保存基线结果到
outputs/results/d2_cogmen_ours.json。
验收:
- 可以在服务器上复现实验。
- 有固定 random seed。
- 有完整命令、日志和结果文件。
6.5 D2 阶段二:固定窗口基线
目的:确认 COGMEN 固定图结构中上下文窗口的影响。
实验:
| 变体 | 描述 |
|---|---|
COGMEN-Ours |
原始 COGMEN |
FixedWin-3 |
只连接历史 3 句 |
FixedWin-5 |
只连接历史 5 句 |
FixedWin-7 |
只连接历史 7 句 |
FixedWin-All |
全历史连接 |
输出:
- 每个窗口的 WF1/Acc。
- 不同对话长度下的性能分组。
- 后续 RL action space 的依据。
6.6 D2 阶段三:RL-Window
这是最小可行创新版本。
状态设计:
s_t = concat(
h_t, 当前发言表示
mean(h_1...h_{t-1}), 历史均值
speaker_embedding, 说话人嵌入
delta(h_t, h_{t-1}) 情绪变化估计
)
动作空间:
a_t in {3, 5, 7, all}
奖励:
R = task_reward + lambda_sparse * sparsity_bonus + lambda_stable * stability_bonus
可实现版本:
| 奖励项 | 实现 |
|---|---|
| task_reward | batch-level -CE 或 validation WF1 改善 |
| sparsity_bonus | 窗口越短越稀疏,但不能牺牲任务性能 |
| stability_bonus | 相邻 utterance 的窗口选择不要剧烈抖动 |
验收:
RL-Window超过COGMEN-Ours或超过最优固定窗口。- 至少有 3 个对话案例显示 RL 选择了不同窗口。
- 若没有提升,分析是否状态信息不足或奖励过稀疏。
6.7 D2 阶段四:RL-Topo-Soft
完整版动态图结构。
动作:
对当前 utterance u_t,输出每条历史边 e_{i,t} 的连续权重 w_{i,t} in [0,1]
为什么用 soft topology:
- 硬 0/1 边不可导,PPO 信号稀疏。
- soft edge 可以让分类 loss 通过消息传递影响边权。
- 可解释性仍保留:边权可视化即可。
模型候选:
history/current sequence
-> transformer/state encoder
-> edge scorer
-> weighted graph message passing
-> classifier
奖励:
R = alpha * task_reward
+ beta * sparsity
+ gamma * emotion_coherence
- eta * graph_instability
解释性输出:
- 每个 utterance 选择的 top-k 历史边。
- 同说话人/不同说话人边权统计。
- 情绪转折点前后的图结构变化。
- 噪声 utterance 是否被降低边权。
6.8 D2 主基线矩阵
论文主表建议至少覆盖:
| 类别 | 方法 | 必要性 |
|---|---|---|
| 经典 ERC | DialogueRNN | 基础对话上下文基线 |
| 图 ERC | DialogueGCN | 图结构基础基线 |
| 多模态图 | MMGCN | 多模态 ERC 图基线 |
| 直接前身 | COGMEN | 必做 |
| 近年图方法 | M3Net | 建议 |
| 近年图方法 | AdaGIN | 建议 |
| 近年图方法 | DER-GCN | 建议 |
| 直接竞争 | DGODE | 必做 |
| 补充竞争 | GASMER | 可做 |
| 本文 | FixedWin / RL-Window / RL-Topo-Soft | 主结果 |
R1-Omni、AffectGPT-R1、EMO-RL、AffectAgent 放 Related Work,不强行放主表,除非任务设置、数据集、指标完全对齐。
7. 数据集与指标
7.1 数据集
| 数据集 | 用途 | 当前策略 |
|---|---|---|
| IEMOCAP 4-class | 主数据集 | D1 用扁平特征;D2 用 COGMEN 对话级数据 |
| MELD | 泛化验证 | 先补齐音频/视频或使用已有对话结构 |
| CMU-MOSI | D1 可选补充 | 使用前清洗 audio 的 -inf |
7.2 指标
主指标:
- Weighted F1
- Accuracy
辅助指标:
- Macro F1
- per-class precision/recall/F1
- 噪声场景下相对下降率
- 多 seed 均值与标准差
- paired t-test 或 bootstrap confidence interval
实验规范:
- 主结果至少 3 个 seed。
- IEMOCAP 必须明确 4-class 或 6-class。
- 所有表格必须标明特征来源和 split。
- COGMEN 论文引用数值和本地复现数值分开写。
8. 当前时间线
已完成
| 阶段 | 内容 | 状态 |
|---|---|---|
| P0 | 环境搭建、数据上传、初步特征整理 | 完成 |
| P0-data | IEMOCAP/MELD 原始数据解压 | 完成 |
| P1-fix | D1 噪声生成、训练采样、评测 bug 修复 | 完成 |
| P1-check | 本地/服务器语法检查、噪声数据形状检查 | 完成 |
下一阶段
| 阶段 | 内容 | 触发条件 | 预计耗时 |
|---|---|---|---|
| P1-rerun | D1 修复后 Stage A/B 重跑 | GPU 空闲 | 0.5-1 天 |
| P2-env | 安装/适配 COGMEN 依赖 | CPU/环境窗口 | 0.5-1 天 |
| P2-base | 跑 COGMEN-Ours | 依赖就绪 | 0.5 天 |
| P2-win | 固定窗口与 RL-Window | COGMEN-Ours 完成 | 2-4 天 |
| P2-topo | RL-Topo-Soft | RL-Window 有效 | 1-3 周 |
| P3 | 多 seed、消融、可视化、写作 | 主结果稳定 | 3-4 周 |
9. 后续命令草案
仅在 GPU 空闲后执行。
D1 重跑:
cd $ZSY/multimodal_affect
export ZSY=/root/siton-data-2849d4ce327c4ccfb233ce33868fe7fe/zsy
export PYTHONPATH=$ZSY/multimodal_affect
export WANDB_MODE=offline
$ZSY/envs/multimodal_affect/bin/python scripts/preprocess/generate_noise.py \
--config configs/noise_configs.yaml \
--data_dir data/iemocap \
--out_dir data/iemocap_noisy
$ZSY/envs/multimodal_affect/bin/python scripts/train/train_d1.py \
--stage supervised \
--dataset IEMOCAP \
--config configs/d1/stage_a.yaml \
--output outputs/checkpoints/d1_stageA_fixed \
--gpus 0
$ZSY/envs/multimodal_affect/bin/python scripts/train/train_d1.py \
--stage rl \
--dataset IEMOCAP \
--checkpoint outputs/checkpoints/d1_stageA_fixed/best.ckpt \
--config configs/d1/stage_b.yaml \
--output outputs/checkpoints/d1_stageB_fixed \
--gpus 0
D2 COGMEN-Ours:
cd $ZSY/multimodal_affect/baselines/COGMEN
# 依赖就绪后:
$ZSY/envs/multimodal_affect/bin/python eval.py \
--dataset iemocap_4 \
--modalities atv
注意:以上命令是草案,执行前先检查 GPU 占用和依赖状态。
10. 风险与应对
| 风险 | 概率 | 影响 | 应对 |
|---|---|---|---|
| D1 修复后仍无收益 | 中 | D1 不能作为贡献 | 写作中定位为负结果和设计反思 |
| COGMEN 依赖安装困难 | 中 | D2 延迟 | 离线 wheels、禁用 comet、优先评测路径 |
| RL-Window 不超过固定窗口 | 中 | 创新不足 | 调整状态与奖励;分析对话长度分组 |
| RL-Topo-Soft 训练不稳定 | 中 | 主结果风险 | 从 RL-Window 热启动,先做 soft edge supervised pretrain |
| MELD 多模态特征提取耗时 | 中 | 泛化实验延迟 | 先 IEMOCAP 完整,MELD 作为补充 |
| 基线过多导致时间失控 | 高 | 写作延期 | 先确保 COGMEN、DGODE、DialogueGCN、MMGCN |
11. 论文结构草案
1. Introduction
- 多模态情感识别中的动态选择问题
- 模态噪声与对话上下文冗余
- RL 作为动态决策机制
2. Related Work
- Multimodal sentiment/emotion recognition
- Emotion recognition in conversation
- Graph-based ERC
- RL for affective computing
3. Method
- Overview
- D1: RL adaptive fusion
- D2: RL graph topology optimization
- Training objective and reward design
4. Experiments
- Datasets and metrics
- Baselines
- Main results on IEMOCAP
- Generalization on MELD
- Ablation study
- Robustness under noise/missing modality
- Visualization and case study
5. Analysis
- Why two-stage D1 is limited
- How RL graph policy changes with dialogue context
- Error analysis by emotion class and speaker dynamics
6. Conclusion
12. 当前执行原则
必须遵守:
- 主方案只维护本文;变更原因只进日志。
- 旧 D1 结果不进入论文正式结果表。
- 不覆盖
data/iemocap预提取特征。 - 不用扁平
data/iemocap训练 D2 图模型。 - 不只拿 COGMEN 论文数值做主对比。
- GPU 忙时只做文档、代码、CPU 检查、依赖准备。
下一步最优先事项:
- 等 GPU 空闲后重跑 D1 修复版,确认辅助实验结论。
- 准备 COGMEN 依赖,跑通
COGMEN-Ours。 - 实现
FixedWin与RL-Window,尽快拿到 D2 第一组可写结果。