02|判别器:多周期重排与多尺度观察
波形的相邻样本高度相关,只看几段连续局部波形,未必能有效识别周期统计是否自然。HiFi-GAN 同时使用 MPD 与 MSD:前者按固定周期把相隔的采样点放到同列,后者在不同平滑尺度上看连续结构。
这里的 period 是重排超参数,不是检测出来的基频周期。原方法的五个周期为 2、3、5、7、11。论文 §2.3 · DiscriminatorP / DiscriminatorS
MPD 重排保留全部采样点;MSD 的平均池化会改变所观察的细节尺度。

图 1|周期重排、沿列卷积与波形梯度的对应
1. 一维波形的周期重排与二维卷积
给定波形 x[0...11],周期为 3,重排结果为:
| 行 | 列 0 | 列 1 | 列 2 |
|---|---|---|---|
| 0 | x[0] | x[1] | x[2] |
| 1 | x[3] | x[4] | x[5] |
| 2 | x[6] | x[7] | x[8] |
| 3 | x[9] | x[10] | x[11] |
符号、形状与约定
| 符号 | 解释与例值 |
|---|---|
| 第 n 个波形采样值。 | |
| 固定重排周期,教学例 3。 | |
| 重排后行、列索引;列为原索引对 p 的余数。 | |
| 重排矩阵;带批和通道时形状 [B,1,ceil(L/p),p]。 | |
| 原波形长度及向上取整;末尾不足整行时先 padding。 |
卷积核宽度方向取 1,因此每个局部核不会同时混合相邻余数列。高度方向的相邻元素,在原波形里相差 p 点。例如高度为 3 的核作用于列 1,会读取 x[1],x[4],x[7],原始跨度为 7 点。
这种“按同余位置观察”与每 p 个点只抽一个点不同。前者每列都被处理,所有采样点都有梯度路径;后者会遗漏其余余数类。
2. 非整除长度的反射填充
官方实现先做 reflect padding。长度 10、周期 3 时需要 2 个补点;输入值 0...9 的末尾补 8、7,最后一行是 [9,8,7]。上一轮简单实验的零填充只适合演示矩阵形状,本篇补充更接近官方路径的边界检查。
# x: [B,1,L];极短片段需要先保证 reflect 的长度条件
pad = (-x.shape[-1]) % period
if pad:
x = torch.nn.functional.pad(x, (0, pad), mode="reflect")
folded = x.reshape(x.shape[0], 1, -1, period)
先补齐再 reshape。代码只改变布局和边界,没有提取 F0、没有重采样,也没有把周期 3 理解成每秒 3 Hz。CPU 实验已核对完整重排序列为 0,1,2,3,4,5,6,7,8,9,8,7。

图 2|同一波形的原尺度、二倍与四倍平滑观察
3. MSD 与 MPD 提供互补视角
| 路径 | 输入变化 | 主要保留 | 主要损失 |
|---|---|---|---|
| MSD 原尺度 | 不下采样 | 高频和连续局部形状 | 长距离跨度受层数限制 |
| MSD 较粗尺度 | 平均池化后再卷积 | 更长时间范围的包络、结构 | 部分细微高频 |
| MPD 固定周期 | 重排到余数列 | 多种采样间隔上的统计 | 单个宽度为 1 的核不混合余数列 |
MSD 的三个子判别器观察原波形及逐级池化后的两种尺度。官方第一支使用 spectral normalization,其余使用 weight normalization;这些是训练稳定性实现细节,不是“多尺度”的定义。
4. 局部判别输出与中间特征
每个子判别器通常输出一串局部评分,再在训练损失中平均。多处局部评分迫使生成器改善不同片段,而不是只让一个全局均值看起来正确。判别器还返回中间特征图,供下一篇特征匹配损失使用。
| 返回对象 | 用途 | 典型错误 |
|---|---|---|
| 各子判别器的最终评分 | 最小二乘对抗损失 | 误当作经过 sigmoid 的概率 |
| 每层 feature map | 特征匹配损失 | 在生成器阶段把 fake feature detach |
| 对输入波形的梯度 | 指导生成器改进 | 生成器阶段全程 no_grad |
多判别器增加的是训练反馈;推理只保留生成器,不必执行 MPD 和 MSD。
5. 有区分力的验证方式
先验证重排前后索引一一对应,再检查所有非填充采样点能否接收梯度。比较周期扰动时应保持音频内容、响度和长度一致,否则判别器可能只抓到更容易的响度差异。只看某个判别器分数,不能推出听感更自然。
固定周期并不保证学到正确基频;模型需要数据和损失共同形成有用的统计判别。
继续 损失与梯度路由,把这两组判别器接到训练循环。
正在连接 GitHub 评论…