跳转至

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 坑

  1. --gpu 参数完全无效 —— train_svd_flow_v4.pymain() 里才设 CUDA_VISIBLE_DEVICES,但顶部 import deepspeedreal_accelerator 已初始化 CUDA。 训练全落到物理卡 0,挤到他人任务上(77.7/81.5 GB,险些 OOM)。 症状:日志在跑但目标卡显存为 0。 已加落卡校验(60 s 内确认不了就自动 kill)。 → 提炼进 方法论 §5.2
  2. train_svd_flow_v4.py 仍带 sai 时代的硬编码模型路径(此前只修了 5 个推理脚本)。
  3. manifest 里的 wav 路径未根治 → 首次评测静默产出 0 条(有 remap() 的脚本能绕过, 没有的直接失败)。已一次性改写 37,042 处。
  4. ls *.jsonl | head -1 按字母序选到了 alpha_ladder_diag.jsonl 而非 ..._manifest.jsonl → 又一次 0 条。显式指定文件名。
  5. 一度误报「训练仍在跑」—— pgrep 匹配到了自己的命令行。
  6. A3 决策的偏离:原定「DTW on token 序列」,但实测平行录音在最优对齐下 只有 5.61% 的 token 完全相同(token 同时编码韵律),符号精确匹配会让代价矩阵 退化成常数、DTW 变成对角线。距离改用 mel,token 的 warp 由 mel 按 \(K=2L\) 导出。

8 引出

M5:既然改变了 \(A\) 却测不出,那 \(A\) 到底是什么结构? → OPEN G1:度量问题升格为最高优先级。