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>
This commit is contained in:
2026-05-14 11:28:42 +08:00
commit bd1f51c496
85 changed files with 20568 additions and 0 deletions

View File

@@ -0,0 +1,617 @@
# 多模态情感模型优化研究执行方案
> 文档作用:本文是本课题唯一主工作文档,记录“当前有效方案”。它应当能直接指导后续实验执行、代码开发、基线选择、结果验收与论文写作。历史判断、废弃方案和变更原因只写入变更日志,不在本文反复展开。
>
> 当前版本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 第一组可写结果。