wikiAudio03|Tacotron 2 与说话人迁移:声学接口的形成03|声学训练:帧反馈、残差修正与停止判断
8 分钟
0 次观看

03|声学训练:帧反馈、残差修正与停止判断

Tacotron 2 的训练看起来只是回归 mel,实际至少包含三个相互牵制的任务:保持正确内容对齐,预测下一帧频谱,判断什么时候结束。仅报告总 loss 下降,会掩盖“频谱越来越平滑,但自由生成开始重复”的问题。

本文区分原论文设计、开源实现选择与教学损失。论文采用单帧解码、prenet 信息瓶颈、post-net 残差以及停止概率;NVIDIA 的复现代码在循环结构、正则化和标签处理上有自己的具体实现。论文 · 复现代码

训练时输入真实上一帧,推理时输入自己的预测;网络相同,输入分布与停止条件不同。

图 1|teacher forcing、自由生成与 post-net 的职责

图 1|teacher forcing、自由生成与 post-net 的职责

1. 教师强制与帧反馈偏移

解码步训练输入监督目标推理输入
0全零 GO 帧真实帧 0同一 GO 帧
1真实帧 0真实帧 1预测帧 0
2真实帧 1真实帧 2预测帧 1

当前目标不能直接作为当前解码器输入,否则模型可能学到复制。teacher forcing 也不等于所有帧完全并行:LSTM 状态和注意力仍沿解码时间递推,只是历史 mel 不必等待采样结果。

prenet 把上一帧压缩成较小表示,降低网络仅依靠局部频谱惯性的机会。论文在推理时仍对 prenet 使用 dropout;因此把模型设为 eval 后是否彻底关闭所有随机性,必须按实现确认,不能凭框架习惯推断。

2. post-net 的残差修正机制

设解码器先产生粗 mel,再由卷积 post-net 阅读整段粗结果,输出残差。它可利用相邻帧,补充局部细节;这与继续运行一次文字注意力是不同操作。

Y^post=Y^dec+P(Y^dec).\hat Y^{\rm post}=\hat Y^{\rm dec}+P(\hat Y^{\rm dec}).
符号、形状与约定
符号解释与例值
Y^dec\hat Y^{\rm dec}解码器粗频谱;教学轴顺序为 [B,T,F]。
PPpost-net 卷积网络,其输出与输入形状一致。
Y^post\hat Y^{\rm post}粗频谱加残差后的最终频谱。
B,T,FB,T,F批大小、声学帧数、mel 频带数;例 [2,4,80]。
Y^,dec,post\hat{\phantom Y},\rm dec,\rm post帽子表示预测;上下标是阶段名称,不是乘方。

例如某帧两频带的粗预测是 [-2,-1],残差 [0.2,-0.1],修正结果为 [-1.8,-1.1]。post-net 能修正谱值,但不能保证把已跳过的整段文字补回来,因此对齐与频谱质量必须分别验证。

3. 有效帧损失与停止标签

下面定义教学版有效元素平均 MSE,明确分母;不同实现若包含 padding,会得到不同损失尺度。

Lmel=∑b,t,fmb,t[(Y^b,t,fdec−Yb,t,f)2+(Y^b,t,fpost−Yb,t,f)2]F∑b,tmb,t.\mathcal L_{\rm mel}=\frac{\sum_{b,t,f}m_{b,t} [(\hat Y^{\rm dec}_{b,t,f}-Y_{b,t,f})^2+ (\hat Y^{\rm post}_{b,t,f}-Y_{b,t,f})^2]}{F\sum_{b,t}m_{b,t}}.
符号、形状与约定
符号解释与例值
b,t,fb,t,f批内样本、声学帧与 mel 频带的索引。
YY真实 mel 标签,与两路预测使用完全相同的变换。
mb,tm_{b,t}有效帧取 1,padding 取 0。
FF频带总数;乘有效帧数得到有效标量数。
∑,Lmel\sum,\mathcal L_{\rm mel}对所有指定索引求和;该损失同时训练粗预测与残差修正。

两个样本分别有 2、4 个有效帧,每帧 2 个频带;若两路预测都比标签多 1,分母为 2×(2+4)=12,分子为 12×(1+1)=24,损失为 2。补齐帧即使出现极大误差,也不应贡献这份 mel 损失。

停止头输出 sigmoid 概率,通常用二元交叉熵训练。论文在首次超过 0.5 时停止;具体复现如何给末帧及 padding 区域设置停止标签,要看数据整理代码。停止头与 mel 回归的 mask 不一定相同。

图 2|真实长度、mel 有效区与停止监督的区分

图 2|真实长度、mel 有效区与停止监督的区分

4. 损失代码与实测边界

图 1 的两路 mel 预测在损失节点汇合。调用方提供真实长度;函数只负责生成 mask、计算两路差值并按有效标量数平均。

def acoustic_loss(before, after, target, lengths):
    # All mel tensors [B,T,F]; normalize by valid scalar elements.
    mask = torch.arange(target.shape[1])[None,:] < lengths[:,None]
    mask = mask.to(target.device).unsqueeze(-1).expand_as(target)
    if not mask.any(): raise ValueError('empty mel target')
    return ((before-target).square()[mask].mean()
            +(after-target).square()[mask].mean())

实际 CPU 检查得到损失 2,短样本 padding 的梯度全为零。这个检查能捕获常见的无效帧泄漏,却不能替代完整训练中的自由生成验证。

验证集必须同时保存 teacher-forced loss、自由生成对齐图、停止步数和固定试听样本。

5. 长句与异常终止

情况检查动作为什么有用
短句正常、长句循环分段对比,检查注意力尾部区分局部声学能力与累积状态错误
过早停止记录停止 logits、标签末帧查标签错位或末尾静音处理
永不停止设置最大步数并记录触发原因限制死循环,同时保留失败证据
训练好、推理崩溃相同输入切换 teacher forcing暴露预测历史带来的分布偏移

最大解码步数是保护边界,不能把被强制截断的结果算成正常结束。

接下来在 声学接口与混合 Logistic 输出中连接波形生成。

专题导航:TTS 总目录 · 上级章节 · 实验代码与实测记录

正在连接 GitHub 评论…