M4 · 时间归一化重训¶
| 状态 | ⚠️ 无法判定(技术成功,下游测不出) |
| 日期 | 2026-08-15 |
| 一句话 | 训练期把平行对拉到同一时间轴,截断彻底归零、A 能量占比掉 3.2 倍,但下游指标纹丝不动 |
| 上游 | ← M3:推理期对齐有效,那训练期能否根治? |
| 下游 | → F8:指标分辨不了 → OPEN G1 |
1 动机¶
M3 证明推理期的内容对齐有效。自然的问题是: 能否在训练期就把问题消掉,让 \(A\) 从定义上就是帧对齐的?
顺带可以修掉训练里 \(L_{\text{ortho}}\) 的截断(逐对中位 12.4%、最坏 49.6%)。
2 假设¶
把情感样本重采样到同 key 中性样本的时长后重训,\(A\) 逐帧良定义。
预测:结果会变差 —— 归一化抹掉了时长这一维情感,且按决策 不另设时长旋钮,故这部分情感无法找回。本实验因此是消融对照而非候选方案。
3 设计¶
| 自变量 | 训练数据是否经时间归一化 |
| 控制量 | 训练脚本一行未改,仅 --feature_dir 换指向;同超参 / 同步数 / 同种子 |
| 对照 | 重跑的 v4 基线(非引用历史数字 —— 历史报告是同分布测试集且 CER 未修复) |
| 判据 | P6 held-out 中文的 mono / delta;辅以 CER / SECS / UTMOS |
| n | 84 条/模型(12 组 × 7 个 α) |
归一化目标 = 中性录音时长;DTW 距离用 mel(见 §7)。
4 运行¶
emo/exp/A_timenorm_retrain/align_features.py 对齐预处理,33,620 文件
emo/exp/A_timenorm_retrain/preflight.py 6 项数据预检
bash emo/exp/A_timenorm_retrain/launch_train.sh 1 53,700 步,卡 1,~1.5 h
bash emo/exp/A_timenorm_retrain/run_eval_A.sh 2
outputs/A_timenorm/(5 ckpt + 84 wav)、outputs/v4_baseline/p6_zh/(84 wav)
5 结果¶
预检(开训前,6 项全过)¶
| 检查 | 结果 |
|---|---|
| 文件数 | 33,620 = 源 |
| 逐对等长 | 1200/1200 ← 本方案的全部意义 |
| K=2N | 1200/1200 |
| NaN/Inf | 0 |
| mel 量级 | 源 [-11.51, 0.93] vs 对齐后 [-11.51, 0.90] |
| 内容保真 | 0.0087 σ ← warp 只改帧数,不造内容 |
训练侧 —— 影响真实¶
| v4 | 时间归一化 | |
|---|---|---|
cos_A_target |
0.959 | 0.880 |
A_energy_share |
21.8% | 6.8% |
1074 个日志点全部 \(K_{\text{emo}} \equiv K_{\text{neu}} \equiv K_c\) —— 截断彻底归零。
下游 —— 测不出差别(同管线,各 84 条)¶
| 指标 | v4 基线 | 时间归一化 | 变化 |
|---|---|---|---|
| mono | 0.6389 | 0.6389 | 0.0000 |
| delta | 0.4539 | 0.5632 | +0.1093 |
| CER ↓ | 0.0428 | 0.0524 | +0.0096 |
| SECS ↑ | 0.7241 | 0.7202 | −0.0039 |
| UTMOS ↑ | 2.9478 | 2.9227 | −0.0251 |
那个 +0.109 不能当作「更好」。 按稳健口径重算逐组(n=12 组):
| v4 | 时间归一化 | |
|---|---|---|
| 受控组数(delta>0.5) | 6/12 | 6/12 |
| 失控组数(|delta|<0.02) | 5 | 3 |
| delta 为负的组数 | 2 | 2 |
真正衡量「控得住」的数完全相同。 delta 均值的差异全部来自 2 个原本近零的组 漂到 0.2~0.3 —— n=12 且分数呈双峰,属噪声。
6 结论¶
无法判定。预测(会变差)未被证实,「更好」也未被证实。
- ✅ 时间归一化在技术上完全成功:截断归零、内容无损、训练收敛正常
- ✅ 对表示的影响真实存在:\(A\) 的能量占比 21.8% → 6.8%
- ❌ 但这个影响在下游测不出来 —— 不是「没影响」,是指标分辨不了
边界:本实验既不能作为候选方案、也不能作为消融证据。 它实际证明的是:把时长信息从 \(A\) 里拿掉 3.2 倍,读数纹丝不动 —— 这更像尺子的问题,而不是模型的结论。
要让它变成有效证据,前提是先解决 G1。原始 wav 与逐条报告已保留, 换尺子可直接重测,无需重训。
7 坑¶
--gpu参数完全无效 ——train_svd_flow_v4.py在main()里才设CUDA_VISIBLE_DEVICES,但顶部import deepspeed时real_accelerator已初始化 CUDA。 训练全落到物理卡 0,挤到他人任务上(77.7/81.5 GB,险些 OOM)。 症状:日志在跑但目标卡显存为 0。 已加落卡校验(60 s 内确认不了就自动 kill)。 → 提炼进 方法论 §5.2。train_svd_flow_v4.py仍带 sai 时代的硬编码模型路径(此前只修了 5 个推理脚本)。- manifest 里的 wav 路径未根治 → 首次评测静默产出 0 条(有
remap()的脚本能绕过, 没有的直接失败)。已一次性改写 37,042 处。 ls *.jsonl | head -1按字母序选到了alpha_ladder_diag.jsonl而非..._manifest.jsonl→ 又一次 0 条。显式指定文件名。- 一度误报「训练仍在跑」——
pgrep匹配到了自己的命令行。 - A3 决策的偏离:原定「DTW on token 序列」,但实测平行录音在最优对齐下 只有 5.61% 的 token 完全相同(token 同时编码韵律),符号精确匹配会让代价矩阵 退化成常数、DTW 变成对角线。距离改用 mel,token 的 warp 由 mel 按 \(K=2L\) 导出。
8 引出¶
→ M5:既然改变了 \(A\) 却测不出,那 \(A\) 到底是什么结构? → OPEN G1:度量问题升格为最高优先级。