跳转至

M10 · 训推一致重训(提案)

状态 📝 提案(未跑)· 2026-08-26
一句话 训练阶段复刻推理的条件结构,使 \(A\) 在两个阶段成为同一数学对象
上游 ← Paper Audit P1–P4
下游 → \(\mathcal{L}_{\text{ortho}}\) 的形式消融(M11)

TL;DR

结论:H1 通过、H2 证伪。 训推一致做到了(截断归零),但 \(\mathcal{L}_{\text{ortho}}\) 依然无效。

  • ✅ H1:125/125 日志点 \(K_{\text{emo}}\equiv K_{\text{neu}}\equiv K_g\)(v4 为 96.3% 不等、截断中位 12.8%)
  • ❌ H2:λ=0.01 vs λ=0 的 A_energy_share 差 0.00007(相对 0.2%),五项指标全 <2σ; 且 λ=0 组的 L_ortho 自行降到同一水平 —— 该项随 FM 损失自然下降
  • 🔑 意义:此前可辩解「无效是因为 \(A\) 定义错了」,M10 修好定义后仍无效, 退路被堵死 → Paper Audit P4 升级为决定性证据,触发 M11(正则形式消融)
  • 📈 附带:受控组数 6/12→7/12,delta 为负的组 2→0;但这来自共享骨架/噪声,与 λ 无关
  • ⚠️ 代价:CER +55%、SECS −0.06、α=0 的 UTMOS 3.74→3.2(DTW 合成目标的后果)
  • 🚨 口径警告:emotion2vec 输出几乎二值化且沿 α 不单调,delta 退化成 0/1 指示量 —— 受控组数的小幅改善不可靠,可靠的只有「方向性错误归零」(见 §8.5 口径警告)
  • 📊 规模:特征 25,207 条 · 训练 2×12,590 步 · 下游 252 条 wav · 探针 2×72 次测量

1 问题陈述

推理阶段的情感方向定义为

\[A \;=\; v_\theta\bigl(x_t,\,t,\,\mu,\,c_{\text{emo}}\bigr)\;-\;v_\theta\bigl(x_t,\,t,\,\mu,\,c_{\text{neu}}\bigr)\]

其中 \(x_t\)、\(t\)、骨架条件 \(\mu\) 三者在两次求值间共享,仅参考前缀 \(c\) 不同。

现行训练(train_svd_flow_v4.py)中,对应量为

\[A_{\text{train}} \;=\; v_\theta\bigl(x^{e}_{t_e},\,t_e,\,\mu_e,\,\mathbf{0}\bigr)\;-\;v_\theta\bigl(x^{n}_{t_n},\,t_n,\,\mu_n,\,\mathbf{0}\bigr)\]

四项条件(\(x_t\)、\(t\)、\(\mu\)、噪声 \(\epsilon\))全部不共享,且 \(c\equiv\mathbf 0\)。 实测 1074 个训练日志点中 \(K_{\text{emo}}=K_{\text{neu}}\) 仅 40 例(3.7%), \(\mathcal{L}_{\text{ortho}}\) 被迫在 \(K_c=\min(K_{\text{emo}},K_{\text{neu}})\) 上求值, 逐点截断中位 12.8%、最大 47.3%。

2 假设

H1 共享骨架、\(t\)、\(\epsilon\) 后,\(K_{\text{emo}}\equiv K_{\text{neu}}\), \(A_{\text{train}}\) 与 \(A\) 定义一致。

H2 在定义一致的 \(A\) 上,\(\lambda_{\text{ortho}}\in\{0,\,0.01\}\) 两组训练的 A_energy_share、cos_A_B 出现可测差异(现行设置下二者无差别)。

3 方法

3.1 记号

符号 含义 形状
\(s^{e}, s^{n}\) 情感 / 中性录音的 speech token \((N_e,)\),\((N_n,)\)
\(p^{e}, p^{n}\) 前缀录音的 speech token(同说话人、异文本) \((N_{p_e},)\),\((N_{p_n},)\)
\(m^{e}, m^{n}\) 前缀录音的 mel \((2N_{p_e},80)\),\((2N_{p_n},80)\)
\(x^{e}_1, x^{n}_1\) 目标 mel \((80,K_g)\)
\(r\) token_mel_ratio \(=2\)
\(K_g\) 生成段帧数 \(=2N_e\)

3.2 数据构造

骨架共享。 两支的生成段 token 均取情感录音的 \(s^{e}\),与推理端 gen_token 由情感参考驱动 LLM 生成、中性支复用之的结构一致。

目标对齐。 中性 mel 经 DTW 重采样至情感时长:

\[\tilde x^{n}_1 \;=\; \mathrm{DTW\_warp}\bigl(x^{n}_1 \to K_g\bigr),\qquad \tilde x^{n}_1\in\mathbb{R}^{80\times K_g}\]

对齐路径由 \(\mathrm{DTW}(x^{n}_1,\,x^{e}_1)\) 在 mel 空间求得 (复用 emo/exp/A_timenorm_retrain/align_features.py,方向取反)。 情感支目标 \(x^{e}_1\) 不作改动。

条件构造。 对分支 \(b\in\{e,n\}\):

\[ \begin{aligned} \text{token}^{b} &= \bigl[\,p^{b}\;\|\;s^{e}\,\bigr] && (N_{p_b}+N_e,)\\ h^{b} &= \mathrm{repeat\_interleave}\bigl(\mathrm{PreLookahead}(\mathrm{Emb}(\text{token}^{b})),\,r\bigr) && (K^b_{\text{tot}},1024)\\ \mu^{b} &= h^{b\top} && (80,K^b_{\text{tot}})\\ c^{b}[:,\,:K_{p_b}] &= m^{b\top},\qquad c^{b}[:,\,K_{p_b}:] = \mathbf 0 && (80,K^b_{\text{tot}})\\ \sigma^{b} &= W_{\text{spk}}\,\mathrm{normalize}\bigl(\mathrm{xvec}(b)\bigr) && (80,) \end{aligned} \]

其中 \(K_{p_b}=r\,N_{p_b}\),\(K^b_{\text{tot}}=K_{p_b}+K_g\)。 两支的生成段长度恒为 \(K_g\);前缀段长度可不同,该段不参与损失。

3.3 前向

采样单份 \(t\sim\mathcal U[0.05,0.95]\) 与单份生成段噪声 \(\epsilon_g\sim\mathcal N(0,I)\in\mathbb{R}^{80\times K_g}\), 前缀段噪声各分支独立(该段被 mask,不影响损失):

\[\epsilon^{b} = \bigl[\,\epsilon^{b}_{p}\;\|\;\epsilon_g\,\bigr],\qquad x^{b}_1{}' = \bigl[\,m^{b\top}\;\|\;x^{b}_1\,\bigr]\]

插值与目标速度按标准 CFM 构造(\(\sigma_{\min}=10^{-6}\)):

\[y^{b} = \bigl(1-(1-\sigma_{\min})t\bigr)\epsilon^{b} + t\,x^{b}_1{}',\qquad u^{b} = x^{b}_1{}' - (1-\sigma_{\min})\epsilon^{b}\]

两次前向(共享权重 \(\theta\)):

\[v^{b} = f_\theta\bigl(y^{b},\,t,\,\mu^{b},\,\sigma^{b},\,c^{b}\bigr),\qquad b\in\{e,n\}\]

3.4 损失

重建项(各分支独立,仅生成段计入;\(M^b\) 为生成段 mask):

\[\mathcal{L}^{b}_{\text{FM}}=\frac{\bigl\|(v^{b}-u^{b})\odot M^{b}\bigr\|_F^2}{80\cdot\lvert M^{b}\rvert}\]

正交项(生成段,两支等长 \(K_g\),无截断、无 padding):

\[A=v^{e}_{g}-v^{n}_{g},\quad B=v^{n}_{g}\;\in\mathbb{R}^{80\times K_g}\]
\[\hat A_i=\frac{A_i}{\lVert A_i\rVert+\varepsilon},\qquad \mathcal{L}_{\text{ortho}}=\frac{1}{80^2}\sum_{i=1}^{80}\sum_{j=1}^{80}\bigl(\hat A_i\!\cdot\!\hat B_j\bigr)^2\]

总目标:

\[\mathcal{L}=\mathcal{L}^{e}_{\text{FM}}+\mathcal{L}^{n}_{\text{FM}}+\lambda_{\text{ortho}}\mathcal{L}_{\text{ortho}}\]

3.5 与现行实现的差异

v4 M10
生成段 token 各支自有 共享 \(s^{e}\)
\(t\) 各支独立 单份共享
生成段 \(\epsilon\) 各支独立 单份共享
\(c\)(参考前缀) \(\mathbf 0\) 异文本同说话人录音的 mel
中性目标 原始 mel DTW 对齐至 \(K_g\)
\(K_{\text{emo}}\) vs \(K_{\text{neu}}\) 96.3% 不等 恒等
\(\mathcal{L}_{\text{ortho}}\) 截断 中位 12.8% 零
前向次数 / 步 2 2

4 实现变更

文件 变更
align_features.py 对齐方向反转:中性 → 情感时长
新增 build_m10_cache.py 为每条目标录音配一条同说话人异文本前缀,抽 token/mel/xvec
dataset.py 返回 prefix_token/prefix_feat;生成段共用 \(s^{e}\)
train_svd_flow_v4.py → train_m10.py ①cond 写入前缀 mel ②单份 \(t\)、\(\epsilon_g\) ③生成段 mask ④L_ortho 去掉 \(K_c\) 逻辑

超参与 v4 对齐:epochs=5、batch_size=2、lr=1e-5、AdamW、grad_clip=1.0、 seed=1234、fp32、无 warmup、无 LR 调度。

5 评测协议

训练侧(每 50 步记录):\(K_{\text{emo}}\)、\(K_{\text{neu}}\)、\(K_g\)、 A_energy_share、cos_A_B、cos_A_target、L_ortho、grad_norm。

下游:P6 held-out 中文(p6_test_zh),\(\alpha\in\{0,.25,.5,.75,1,1.25,1.5\}\), eval_suite.py 原口径(emotion2vec / Paraformer-zh CER / campplus SECS / UTMOS), 与 v4 基线同管线对比。

表示侧:M5 探针复用,测 \(A\) 的有效秩与帧间一致性, 对比 F6 的 27.5 / 10.5%。

成对训练:\(\lambda_{\text{ortho}}\in\{0.01,\,0\}\) 各一次,否则 H2 不可判定。

6 成本与风险

项 值
特征重建 ~1.5 h(CPU,24 核并行)
训练 × 2 2 × ~3 h(单卡)
推理 + 评测 ~1 h
# 风险 量化 处置
~~R1~~ ~~序列长度增加~~ ✅ 已排除:实测 \(K_{\text{tot}}\) 最大 666 帧,batch 24 仅用 52.5/79 GiB(§8.3) —
R2 中性目标经插值 DTW 重采样引入非原始帧 M4 预检口径复用(内容保真 0.0087 σ)
R3 训练无 / 推理有的残留不一致 前缀内容与目标文本无关(训练)vs 无关(推理)—— 一致;但训练前缀取自数据集,推理取自用户 不处置,记录
R4 H2 被证伪 — 转 M11:正则形式消融(对角项 / 能量加权)
R5 前缀选取随机性 同说话人多条候选 固定 seed=1234,选中的 utterance 记入 manifest

7 判据

假设 通过条件
H1 训练日志 \(K_{\text{emo}}\equiv K_{\text{neu}}\equiv K_g\),1074/1074
H2 两组 \(\lambda\) 的 A_energy_share 差异 > 训练内波动的 2σ
— 下游指标不低于 v4 基线(不作为通过条件,作为可用性下界)

8 结果

待填。 本节的每个小节都预先定义了「产出什么、多少条、判据是什么」, 跑完直接填数,不事后追加指标。

8.1 前置:DTW 对齐的听感验证

状态:✅ 完成 —— 音频已产出,听感判定已回(2026-08-26)

把中性 mel 按 DTW 对齐到情感时长后直接过 HiFT,检验对齐是否破坏音频结构。

产出:4 档形变 × 3 条 × 3 版本 = 36 条 wav,跨 8 个说话人,拉伸与压缩兼有。 每条三版本按序听:1_neu_orig(内容参照)→ 2_neu_warp(被检验对象)→ 3_emo_orig(节奏参照)。

已测客观量——谱通量(相邻帧 L2 差的中位数),衡量帧间变化被抹平的程度:

档位 形变 warp/原始 比值 判读
A <5% 1.05 / 0.99 / 0.97 无变化
B 10–20% 0.85 / 0.89 / 1.00 轻微
C 25–35% 0.81 / 0.86 / 0.78 明显
D >40% 0.60 / 0.70 / 0.66 掉到 2/3

存在剂量效应:形变越大,帧间变化被抹得越平 —— 线性插值过度平滑的典型特征。

全量形变分布(n=1600):中位 13.4%、75% 分位 23.5%、90% 分位 34.8%、95% 分位 42.9% → 约 1/4 训练样本落在 C 档及以上,约 5% 落在 D 档。

听感判定(2026-08-26):

档 结论
A / B / C(<40%) ✅ 可用
D(≥40%) ❌ 不可用,剔除

处置:build_cache.py 加 --max_dev 0.40,剔除 \(|N_e/N_n-1|\ge 0.40\) 的样本。 代价极小 —— 全量 26,896 条中剔除 1,689 条,保留率 93.7%; 剔除后形变分布收敛为 中位 12.3% / 95% 34.1% / 最大 40.0%。

产物:outputs/m10_dtw_probe/(含 README.md、metrics.json)· 打包 outputs/_package/M10_DTW_validation.tar.gz

8.2 特征构建

已完成(2026-08-26):data/m10_cache/

实测
输入 26,896 条(6,724 组 × 4 情感)
保留 25,207 条(93.7%)
形变跳过 1,689
失败 0
耗时 144 s(32 进程,远低于估计的 1.5 h)
磁盘 4.6 GB
生成段 \(K_g\) 中位 140 · 95% 216 · 最大 358
情感支 \(K_{\text{tot}}\) 中位 282 · 95% 418 · 最大 666
中性支 \(K_{\text{tot}}\) 中位 282 · 95% 402 · 最大 578

前缀映射记于 data/m10_cache/prefix_map.json(seed=1234 可复现)。

8.3 显存与 batch 上限

冒烟测最坏长度(\(K_{\text{tot}}\) 最大值)下的峰值显存。

已完成(2026-08-26):H100 80 GiB,最坏序列 630 帧,两次前向 + 反传。

batch 峰值显存 单步
2 8.2 G —
4 14.7 G 0.56 s
8 22.3 G 0.56 s
12 29.9 G 0.72 s
16 37.4 G 1.69 s
24 52.5 G 1.18 s

结论:batch 可达 24,风险 R1 不成立。 v4 用 batch=2 是历史约束, 本实验不受此限。但为与 v4 可比,正式训练仍取 batch_size=2; batch 的影响另行消融。

8.4 训练侧(成对:\(\lambda_{\text{ortho}}\in\{0.01,\ 0\}\))

H1 判据:\(K_{\text{emo}}\equiv K_{\text{neu}}\equiv K_g\) 在全部日志点成立。

各 12,590 步(5 epoch × 20,145 条 ÷ batch 8),单卡约 70 min。

H1 ✅ 通过

λ=0.01 λ=0
日志点 125 125
\(K\) 三值不等的违例 0 0

对比 v4:96.3% 的步 \(K_{\text{emo}}\neq K_{\text{neu}}\),逐点截断中位 12.8%、最大 47.3%。 M10 截断归零 —— \(A\) 首次在训练中与推理同定义。

H2 ❌ 证伪

后 10% 均值:

指标 λ=0.01 λ=0 差异 判定
A_energy_share 0.03658 0.03651 +0.00007 <2σ
cos_A_B −0.18973 −0.19100 +0.00127 <2σ
loss 0.92098 0.92639 −0.00541 <2σ
L_fm_emo 0.45865 0.46137 −0.00272 <2σ
L_fm_neu 0.46067 0.46502 −0.00436 <2σ

A_energy_share 的相对差仅 0.2%,五项全部低于两组后 10% 合并标准差的 2 倍。

这次证伪堵死了原有的退路

此前可辩解「\(\mathcal{L}_{\text{ortho}}\) 无效是因为训练里的 \(A\) 定义错了」 (四重错配,见 §1)。M10 恰好修好了那个问题(H1 通过),它依然无效。

旁证:λ=0 组的 L_ortho 自行下降到同一水平

轨迹(前 10% → 后 10%) λ=0.01 λ=0
loss 0.9606 → 0.9210 0.9524 → 0.9264
L_ortho 0.1975 → 0.1664 0.1991 → 0.1686
A_energy_share 0.0415 → 0.0366 0.0415 → 0.0365
cos_A_B −0.2589 → −0.1897 −0.2611 → −0.1910
grad_norm 6.00 → 2.70 5.57 → 3.53

λ=0 组根本没有 \(\mathcal{L}_{\text{ortho}}\) 的梯度,其值却与 λ=0.01 组几乎重合。 → 该项随两个 FM 损失自然下降,那 0.01 的权重不改变任何东西。

训练本身是健康的

loss 0.96 → 0.92、grad_norm 6.0 → 2.7,是正常的收敛特征。 对比 v4 全程平坦(线性趋势 +0.004,标准差 0.15)—— 条件结构修正后,模型确实有可学的东西。

训练曲线

8.5 下游(P6 held-out 中文,α 阶梯)

起点混淆(2026-08-28 补记)

M10 两臂从 v4_epoch5.pt 继续训——本节「vs v4」的比较(如受控 7/12 vs 6/12) 混入了额外训练量这一变量。修正见 M14。

规模:12 组(4 情感 × 3 样本)× 7 个 α = 84 条 wav / 模型, 共 3 个模型(v4 基线 / M10-λ0.01 / M10-λ0)= 252 条。

口径:eval_suite.py 原样,emotion2vec / Paraformer-zh CER / campplus SECS / UTMOS。

指标 v4 基线 M10 λ=0.01 M10 λ=0
n_wavs 84 84 84
情感 mono 0.6389 0.6944 0.7639
情感 delta 0.4538 0.5675 0.5790
受控组数(delta>0.5) 6/12 7/12 7/12
失控(|Δ|<0.02) 5/12 5/12 5/12
delta 为负 2/12 0/12 0/12
CER 0.0428 0.0667 0.0660
SECS 0.7240 0.6629 0.6602
UTMOS 2.9477 2.9201 2.8532
α=0 的 UTMOS 3.7435 3.2214 3.1725

读法:

  • 情感可控性小幅改善:受控组数 6→7,且「delta 为负」从 2 组降到 0 组 —— v4 里有两组的情感分随 α 增大反而下降,M10 消除了这个反向。mono 0.639→0.694/0.764。
  • 但 λ=0.01 与 λ=0 之间仍无实质差异(受控组数同为 7/12,delta 0.5675 vs 0.5790), 与 §8.4 的 H2 结论一致。
  • 可懂度与音色有代价:CER 0.043→0.066(+55%),SECS 0.724→0.663。 归因于训练引入了前缀结构而 v4 没有,两者的推理配置不再等价。
  • ⚠️ α=0 的 UTMOS 从 3.74 掉到 3.22/3.17 —— 这正是 §8.1 预留的风险出口:中性支的训练目标是 DTW 重采样的合成 mel, α=0 时输出纯由中性支决定,合成目标的代价在此暴露。 形变过滤(<40%)减轻了但未消除该问题。

!!! example "定性:音频全量对照"

**[→ M10 音频全量对照](m10-audio.md)** —— 4 种情绪 × 3 句 × 7 个 α × 3 个模型 = **252 条**,
按情绪分节、按 α 分行、按模型分列。同一行的三条除 ckpt 外全部相同
(同文本、同参考音频、同 LLM 种子、同 `gen_token`),可直接左右对拍。

每格附 `emo`(emotion2vec 后验)与 `MOS`(UTMOS)两个数,每组末尾给 Δ 与单调步比例。

离线包:`outputs/_package/M10_listening.tar.gz`;原始 WAV 在 `outputs/m10_eval/`。

指标口径警告:emotion2vec 的输出几乎是二值的

逐条查看 84 条 wav 的 emo_score 后发现,取值高度集中在 0.000 与 1.000 两端, 中间值极少。于是 delta = score(α=1.5) − score(α=0) 实际退化成 「α=1.5 有没有把分类器翻过去」的 0/1 指示量,而不是强度的连续度量。

更麻烦的是它沿 α 不单调。例如 0002_text00120/Angry 在 λ=0.01 下的序列是

α    0.00  0.25  0.50  0.75  1.00  1.25  1.50
emo  0.000 0.000 0.000 0.002 0.000 1.000 0.027

这不是「强度随 α 上升」的形状,是阶跃加噪声。

因此 6/12 → 7/12 这个改善不应被当作可靠证据——它可能只是一两组样本 在分类器边界上抖动的结果。真正稳的是 delta<0 的组从 2 个降到 0 个 (方向性错误消失),以及 α=0 端不再被误判成满情感 (0010_text00310/Happy 在 v4 下 α=0 就已经 emo=1.000,M10 降到 0.000)。

这条同时回过头削弱了此前所有依赖 delta/mono 的横向比较, 已登记为 G1 的新证据。

8.6 表示侧(M5 探针复用)

规模:6 句(同说话人)× 4 情感 × 3 个 \(t\) = 72 次测量 / 模型。

指标 v4 M10 λ=0.01 M10 λ=0
帧间方向一致性 0.3670 0.2115 0.2313
有效秩(上限 80) 27.51 31.67 30.76
逐帧范数变异 0.3886 0.3867 0.3894
‖A‖/‖v_emo‖ 0.1053 0.1167 0.1263
子空间 同情感/异句 0.1935 0.2648 0.2920
子空间 同句/异情感 0.2027 0.2611 0.3036

读法:

  • \(A\) 没有被正则压垮,反而略微变大:能量占比 10.5% → 11.7%/12.6%, 有效秩 27.5 → 31.7/30.8。λ=0.01 与 λ=0 的差异同样在噪声内(11.67% vs 12.63%), 再次印证 H2。
  • 帧间一致性下降(0.367 → 0.21–0.23):\(A\) 沿时间变化得更剧烈了。 合理 —— 共享骨架后两支在同一时间轴上,差异更集中于逐帧的韵律细节。
  • 情感专一性仍未出现:同情感/异句(0.265/0.292)与同句/异情感(0.261/0.304) 依旧几乎相等,与 F6 在 v4 上的结论一致 —— 主子空间不承载情感身份这一点,不是训练条件错配造成的。

8.7 结论

项 结论
H1 ✅ 通过。125/125 日志点 \(K_{\text{emo}}\equiv K_{\text{neu}}\equiv K_g\),截断归零。训推一致的设计目标达成
H2 ❌ 证伪。五项指标全部 <2σ,A_energy_share 相对差仅 0.2%;λ=0 组的 L_ortho 自行降到同一水平
与 F11 的关系 ⚠️ F11 已挂起(M9 重新设计中)。M10 自身的结论「正交正则不需要」不依赖 F11,仍然成立;但「v4 训练的净收益不在情感可控性上」这句要等 M9-R
对 Paper Audit P4 的影响 升级为决定性证据。原表述「λ=0 消融证明 L_ortho 无效」可被辩解为 \(A\) 定义错误;M10 修正定义后仍无效,该辩解不再成立
是否触发 M11 ✅ 触发,但先做剂量再做形式。λ=0.01 时该项只占总损失 0.19%(0.0017/0.9075)—— 一个从未获得权重的正则项,失效不能归因于形式。M11a = λ 扫描({0, 0.1, 0.5, 2.0}),门槛判据是 \(\mathcal{L}_{\text{ortho}}\) 能否压到 λ=0 轨迹之下;M11b = 形式消融,仅在 M11a 全落空时才有意义。见 G8

附带产出

  • 情感可控性小幅改善:受控组数 6/12 → 7/12,delta 为负的组从 2 个降到 0 个。 但这是共享骨架 + 共享噪声带来的,与 \(\mathcal{L}_{\text{ortho}}\) 无关(两个 λ 表现一致)。
  • 代价:CER +55%、SECS −0.06、α=0 的 UTMOS 3.74 → 3.2。 后者是 DTW 合成目标的直接后果(§8.1 预留的风险出口)。
  • \(A\) 未被压垮:能量占比 10.5% → 11.7%/12.6%,有效秩 28.8 → 31.7/30.8。

    更正:\(\mathcal{L}_{\text{ortho}}\) 不可能把 \(A\) 推到 0

    代码是 An = A / A.norm(dim=-1),沿时间轴归一化, 故该项对 \(A\) 的尺度完全不变 —— 缩小 \(A\) 降不低它。 此前文档写的「正则在推 \(A\to 0\)」是错的。 真正的逃逸路径是降秩:要 \(L=0\) 需 \(\mathrm{rank}(A)+\mathrm{rank}(B)\le K_g\), 而实测 \(K_g\) 均值 148、\(A\) 与 \(B\) 各 80 行 —— \(K_g<160\) 时满秩下无解,必有一方降秩。 \(\mathcal{L}_{\text{FM}}\) 护着 \(B\)(它是速度场主体),所以该降的是 \(A\)。 λ 扫描要盯的主指标因此是 \(A\) 的有效秩,不是 A_energy_share。

    • 情感专一性依旧缺席:子空间「同情感/异句」≈「同句/异情感」, 与 v4 一致 → F6 的结论不是训练条件错配造成的。

遗留问题

  1. α=0 的音质回退未解决。可选:对 \(\mathcal{L}^n_{\text{FM}}\) 按形变降权; 或改用三次前向(中性支用自然目标,代价 3× 算力)。
  2. CER/SECS 的回退未归因。怀疑与前缀结构引入有关,需 ablate「有前缀 vs 无前缀」。
  3. batch=8 与 v4 的 batch=2 不同,严格可比性受影响(但 H2 是组内对照,不受此限)。

9 附:λ_ortho 剂量扫描(M11a)

一个问题:\(\lambda\) 能不能显著影响情感程度?答案:不能。

9.1 设置

除 --lambda_ortho 外与 §8.4 完全相同:同 data/m10_cache(train 20,145 条)、 同起点 _incoming/v4_epoch5.pt、--epochs 5 --batch_size 8 --lr 1e-5 --seed 1234,各 12,590 步; 下游同 P6 held-out 中文 α 阶梯(84 条/臂)。

\(\lambda \in \{0,\ 0.01,\ 0.1,\ 0.5,\ 2.0\}\) —— 前两个复用 M10,后三个新跑(卡 0/1/2,各约 70 min)。 脚本 emo/exp/M10_parity/run_lambda_sweep.sh,汇总 analyze_sweep.py。

9.2 结果

\(\lambda\) \(\mathcal{L}_{\text{ortho}}\) 相对 λ=0 \(\mathcal{L}_{\text{FM}}\) A_share cos_A_B delta 受控 负向 CER MOS MOS@α=0
0 0.1714 — 0.9138 0.03757 −0.2213 0.579 7/12 0 0.066 2.85 3.17
0.01 0.1698 −0.9% 0.9058 0.03757 −0.2195 0.568 7/12 0 0.067 2.92 3.22
0.1 0.1608 −6.2% 0.9381 0.03688 −0.2084 0.581 7/12 0 0.104 2.90 3.18
0.5 0.1166 −32% 0.9408 0.03567 −0.1654 0.584 7/12 0 0.105 2.91 3.12
2.0 0.0443 −74% 0.9888 0.03296 −0.1056 0.584 7/12 0 0.088 2.98 3.34

delta = emo(α=1.5) − emo(α=0) 的全组均值;受控 = delta>0.5 的组数;负向 = delta<0 的组数。

定性:λ 扫描音频对照

→ M11a λ 扫描音频对照 —— 5 个 \(\lambda\) × 4 情绪 × 3 句 × 7 个 \(\alpha\) = 420 条。 行 = \(\alpha\),列 = \(\lambda\)(从左到右增大 200 倍),同一行除 ckpt 外全部相同。 用来耳朵复核「\(\lambda\) 变了但情感强度没变」这个结论。

9.3 读法

门槛通过 —— 这一项完全可优化。 λ 从 0 到 2.0,\(\mathcal{L}_{\text{ortho}}\) 单调降到原来的 26%,cos_A_B 同步从 −0.221 走向 −0.106(更正交)。 所以 §8.4 里 λ=0.01 的「毫无反应」确实只是剂量不足 (\(\lambda\mathcal{L}_{\text{ortho}}\) 仅占总损失 0.19%), 既非梯度消失,也非形式不可优化。

但情感程度纹丝不动。 λ 跨 200 倍,delta 只在 0.568–0.584 之间浮动(幅度 0.016), 受控组数恒为 7/12、负向组数恒为 0。

代价是实打实的:\(\mathcal{L}_{\text{FM}}\) 涨 8.2%(0.9138 → 0.9888),CER 从 0.066 涨到 0.088–0.105。

这个结论比 §8.7 更强

M10 只能说「\(\mathcal{L}_{\text{ortho}}\) 没起作用」。M11a 说的是:

它精确地起了它声称的作用(正交性提升近 4 倍),而这个作用与情感可控性无关。

因此 Paper Audit P4 的「剂量不足」辩解也被排除,该条闭合。 同时 G8 的 M11b(形式消融)失去动机 —— 问题不在这个正则写得对不对,而在「正交 ⇒ 情感解耦」这个前提本身不成立, 与 F6「主子空间不承载情感身份」一致。

9.4 表示侧:降秩预测被证伪

§8.7 的更正框预测「高 λ 会逼 \(A\) 降秩,因为 \(\mathcal{L}_{\text{FM}}\) 护着 \(B\)」。 在 λ=2.0 上跑 M5 探针(3 句 × 4 情感 × 3 个 \(t\) = 36 次测量):

ckpt \(\lambda\) rank_A rank_vneu ‖A‖/‖v_emo‖ 帧间 cos_A
v4 — 28.84 40.17 0.1080 0.3254
m10_lam0 0 30.76 44.65 0.1263 0.2313
m10_lam001 0.01 31.67 43.86 0.1167 0.2115
m11a_lam20 2.0 31.91 39.26 0.1018 0.1668

预测反了。 \(A\) 的有效秩不降反升(30.76 → 31.91),降秩的是 \(B\)(44.65 → 39.26,−12%)。 实际让路的是另外两样:\(A\) 的相对能量 −19%(0.1263 → 0.1018)、 \(A\) 的帧间方向一致性 −28%(0.2313 → 0.1668,更像时间轴上的噪声)。

尺度不变性本身没错,错的是由它推出的预测

\(\mathcal{L}_{\text{ortho}}\) 对 \(A\) 的尺度不变(§8.7)仍然成立 —— 该项的梯度确实不奖励把 \(A\) 缩小。但 \(A\) 还是缩小了 19%,这是间接后果: 要让 \(\hat A\) 的行与 \(\hat B\) 的行正交,\(A\) 只能转向与语音包络不对齐的方向, 而那些方向在速度场里本就是低能量、低时间相关的。所以 \(A\) 变小、变碎, 不是因为损失奖励它变小。

情感专一性依旧缺席:子空间「同情感/异句」0.2469 < 「同句/异情感」0.2842, 差值 −0.037,与 v4(−0.058)、λ=0(−0.012)同号 —— λ 加到 2.0 也没把它拉正。

9.5 训练曲线:L_FM 为什么被抬高

λ 扫描的训练曲线

五组同种子、同数据序(125/125 个日志点的 K_g 逐点相同),所以曲线可以逐步对拍。

先纠正一个前提:不是「λ 大了 L_FM 训不动」

\(\lambda\) 步 0–1k 6–8k 11–12.6k 全程降幅 后半降幅
0 0.9867 0.9331 0.9059 0.0808 0.0272
0.01 0.9911 0.9403 0.8975 0.0936 0.0428
0.1 0.9969 0.9647 0.9258 0.0711 0.0389
0.5 0.9933 0.9679 0.9327 0.0606 0.0352
2.0 1.0606 1.0310 0.9805 0.0800 0.0505

λ=2.0 后半段的降幅(0.0505)是五组里最大的,斜率没问题。 而且 λ=0 自己的降幅也只有 0.0808,同时 L_FM 的振幅(p95−p5)高达 0.3163 —— 振荡由 batch 难度主导,是全体共有的,与 λ 无关。

真正变的是水平位移:五条曲线近似平行,λ=2.0 整体抬高约 0.07。

位移在第 1 个日志点就存在。 全部从同一个 v4_epoch5.pt 出发, step 100 时 λ=2.0 已是 1.1361 而 λ=0 是 1.0958(+0.040)。100 步就付清了大部分代价。

而且位移会自己收窄(图 ④):

\(\lambda\) 0–1k 1–3k 3–6k 6–9k 9–12.6k
0.1 +0.0102 +0.0216 +0.0265 +0.0310 +0.0212
0.5 +0.0066 +0.0154 +0.0259 +0.0315 +0.0268
2.0 +0.0739 +0.1012 +0.1085 +0.0915 +0.0719

两条机制

(a) 真实的目标冲突。 λ=2.0 把 \(\mathcal{L}_{\text{ortho}}\) 从 0.196 压到 0.043(−0.153), 代价是 \(\mathcal{L}_{\text{FM}}\) +0.072。两个目标共用同一组权重: 正交约束逼 \(A\) 转向与语音包络不对齐的方向(§9.4 里帧间一致性 −28%), 而那些方向拟合速度场本来就更差。这是 Pareto 交换,不是优化失败。

(b) ~~grad_clip=1.0 压缩了 FM 分量的有效步长~~ —— 这条我写错了,见下方更正。

\(\lambda\) grad_norm 中位 均值 被裁剪的步
0 4.03 5.24 100%
0.01 3.66 4.84 100%
0.1 7.59 12.21 100%
0.5 7.00 9.25 100%
2.0 4.10 8.79 100%

更正(2026-08-27):AdamW 会吸收掉均匀的梯度缩放

我原本写「阈值 1.0 而 grad_norm 中位 3.7–7.6,所以有效步长 \(=\text{lr}/\lVert g\rVert\), λ 抬高 \(\lVert g\rVert\) 就等比压缩 FM 分量」。这个推理对 SGD 成立,对 AdamW 不成立。

优化器是 torch.optim.AdamW。更新量是 \(m/(\sqrt{v}+\epsilon)\), 把梯度整体乘以常数 \(c\) 会让 \(m \to cm\)、\(\sqrt{v} \to c\sqrt{v}\),比值不变。 裁剪正是一个均匀标量缩放,所以 λ 造成的 \(\lVert g\rVert\) 整体抬升被 Adam 基本吸收。

裁剪 100% 生效仍然是事实,它的真实作用是拉平不同步之间的梯度幅度差异 (大梯度步被相对压低),而不是整体降低学习率。 因此「λ=0.1 的有效步长只剩 53%」这个说法作废。

剩下的解释只有 (a)。 而 (a) 本身就够:\(\mathcal{L}_{\text{ortho}}\) 的梯度 把权重拉离 FM 最优点,正则项一旦收敛,这个拉力就消失。

裁剪仍值得单独查一次

grad_clip=1.0 对 grad_norm 常态 4–12 的训练来说确实很紧,所有实验(含 v4)都是 100% 裁剪。 Adam 吸收了其中的均匀部分,但「每步都被拉平」是否影响收敛速度,没有直接证据。 这不影响 M11a 的组间对照(五组同样受此约束),仍登记为 G9 待验。

讨论