Files
CompanionGuard-RL/旧方向信息/2026-04-22-研究执行方案.md
zhangsiyuan bd1f51c496 chore: initial commit — unified project repo
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>
2026-05-14 11:28:42 +08:00

618 lines
20 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.

# 多模态情感模型优化研究执行方案
> 文档作用:本文是本课题唯一主工作文档,记录“当前有效方案”。它应当能直接指导后续实验执行、代码开发、基线选择、结果验收与论文写作。历史判断、废弃方案和变更原因只写入变更日志,不在本文反复展开。
>
> 当前版本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
中文表述:
> 面向多模态情感识别的强化学习动态决策框架:从模态融合权重到对话图拓扑优化。
两个技术层次:
1. D1 话语级动态融合RL agent 根据每路模态的可靠性动态分配 text/audio/vision 权重。
2. 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
输入text / audio / vision 多模态情感数据
D1话语级动态融合
预提取特征 -> 模态 projector -> 置信度/不确定性状态 -> RL fusion agent -> 分类
目标:验证 RL 是否能在噪声/缺失模态下优于固定融合
D2对话级动态图结构
对话序列 -> COGMEN 基线图 -> RL window/topology agent -> 动态 GNN -> ERC 分类
目标:学习“该看哪些历史发言”和“边权重应该多强”
```
研究策略:
1. 先保证 D1 训练和评测口径正确,重跑后决定其论文位置。
2. D2 必须先跑通 COGMEN-Ours建立公平基线。
3. D2 先做小动作空间的 `RL-Window`,再做完整 `RL-Topo-Soft`
4. 最终论文以 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
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 BPPO 融合权重学习。
- encoder 冻结。
- agent 根据状态输出三路权重。
- classifier 可轻量刷新。
- 该版本作为 `RL-Decoupled`,用于验证两阶段 RL 的局限。
### 5.3 D1 状态、动作、奖励
当前状态:
```text
s = [conf_text, conf_audio, conf_vision, noise_est]
```
动作:
```text
a = [w_text, w_audio, w_vision], sum(a)=1
```
当前奖励:
```text
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 空闲。
1. 确认 `data/iemocap_noisy` 三模态文件完整。
2. 重跑 Stage A。
3. 重跑 Stage B `RL-Decoupled`
4. 重新运行修复后的 `eval_d1.py`
5. 汇总 clean 与 8 种噪声下的 WF1/Acc。
6. 判断是否进入 `RL-Joint`
D1 成功标准:
- clean test 不显著低于 Stage-A-Only。
- 至少在多数噪声场景中优于 Fixed-Equal 或 Gated-Fusion。
- 若无法达成D1 写为负结果与设计反思,不作为主贡献。
## 6. D2 方案RL 对话图结构优化
### 6.1 任务定义
D2 是论文主线。目标是在多模态对话情感识别中,让 RL agent 动态决定当前发言应参考哪些历史发言。
输入为一个 dialogue
```text
u1, u2, ..., ut
每个 ui 有 text/audio/vision feature、speaker id、label
```
输出为每个 utterance 的情感类别。
核心问题:
```text
固定图结构:每个当前发言使用固定窗口或固定全局连接
改进目标:根据当前语义、说话人、历史情绪变化,动态选择上下文边
```
### 6.2 D2 与 COGMEN 的关系
COGMEN 是 D2 的直接前身,不跳过。
当前策略:
1. 先跑官方 COGMEN `iemocap_4`,得到 `COGMEN-Ours`
2. 在同一数据、同一 split、同一指标下实现固定窗口变体。
3. 再加入 RL window selector。
4. 最后实现 soft topology agent。
不能只引用 COGMEN 论文表格,因为:
- 论文数值和当前本地环境、特征、依赖版本可能不同。
- D2 的改进必须建立在可复现同口径基线上。
- 后续固定窗口和 RL 图结构需要直接改 COGMEN 图构建逻辑。
### 6.3 D2 环境依赖
当前阻塞:
| 依赖 | 状态 |
|---|---|
| `torch_geometric` | 未安装 |
| `torch_scatter` | 未安装 |
| `torch_sparse` | 未安装 |
| `sentence_transformers` | 未安装 |
| `comet_ml` | 未安装 |
解决方案:
1. 优先离线安装与 `torch 2.7.1+cu128` 兼容的 PyG wheels。
2. 如果 PyG wheel 不好配,先用 COGMEN 官方预处理数据做评测脚本适配,减少训练依赖。
3. `comet_ml` 只作为日志依赖,必要时 stub 或禁用。
4. `sentence_transformers` 若只评测官方 pkl可避免重新提取 SBERT 特征;若训练流程强依赖则离线安装。
### 6.4 D2 阶段一COGMEN-Ours
目标:跑通本地 COGMEN 4 类 IEMOCAP。
任务:
1. 阅读并定位 COGMEN 图构建逻辑:
- `cogmen/model/COGMEN.py`
- `cogmen/model/GNN.py`
- `cogmen/Dataset.py`
- `preprocess.py`
2. 确认官方 `data_iemocap_4.pkl``IEMOCAP_features_4.pkl` 的结构。
3. 安装或绕过缺失依赖。
4. 跑原始评测,记录 WF1/Acc。
5. 保存基线结果到 `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
这是最小可行创新版本。
状态设计:
```text
s_t = concat(
h_t, 当前发言表示
mean(h_1...h_{t-1}), 历史均值
speaker_embedding, 说话人嵌入
delta(h_t, h_{t-1}) 情绪变化估计
)
```
动作空间:
```text
a_t in {3, 5, 7, all}
```
奖励:
```text
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
完整版动态图结构。
动作:
```text
对当前 utterance u_t输出每条历史边 e_{i,t} 的连续权重 w_{i,t} in [0,1]
```
为什么用 soft topology
- 硬 0/1 边不可导PPO 信号稀疏。
- soft edge 可以让分类 loss 通过消息传递影响边权。
- 可解释性仍保留:边权可视化即可。
模型候选:
```text
history/current sequence
-> transformer/state encoder
-> edge scorer
-> weighted graph message passing
-> classifier
```
奖励:
```text
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 重跑:
```bash
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
```bash
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. 论文结构草案
```text
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 检查、依赖准备。
下一步最优先事项:
1. 等 GPU 空闲后重跑 D1 修复版,确认辅助实验结论。
2. 准备 COGMEN 依赖,跑通 `COGMEN-Ours`
3. 实现 `FixedWin``RL-Window`,尽快拿到 D2 第一组可写结果。