来源于新一代Kaldi,作者NGK编辑部
本文介绍新一代 Kaldi 中的RandomCombiner: 相关代码: https://github.com/k2-fsa/icefall/blob/master/egs/librispeech/ASR/pruned_transducer_stateless5/conformer.py
1. 残差连接

2. RandomCombiner 方法介绍
为了训练深层模型,如 18 或者 24 层的 Conformer,利用残差连接的思想设计了 RandomCombiner 模块,其核心操作为:
在训练的过程中,RandomCombiner 会随机结合不同的层以及最后一层的输出,作为模型的最终输出;因此,损失函数的梯度可以直接传递到浅层网络,稳定训练过程。
在解码的过程中,RandomCombiner只返回最后一层的输出。
使用 RandomCombiner 时, 以某个周期选择用于结合的层数,如每 3 层选择一层。
随机结合机制
one-hot 策略,参考函数 _get_random_pure_weights


加权求和策略,参考函数
_get_random_mixed_weights


最后,对于每一帧,随机选择上述两种结合策略中的其中一种,即one-hot或者加权求和,可参考函数
_get_random_weights:

值得注意得是,上述策略独立地应用于不同的 batch 中,即不同的 batch 会生成不同的随机数。
3. 实验结果
Reworked Conformer 中的 model-level warmup,同样采用了残差连接方式来稳定训练过程。
没有使用 RandomCombiner
| parameters | encoder layers | feedforward dim | heads | encoder dim | greedy search | modified beam search | fast beam search | comment |
|---|---|---|---|---|---|---|---|---|
| 87.8M | 24 | 1536 | 8 | 384 | 2.48/5.80 | 2.45/5.72 | 2.45/5.71 | --epoch 34 --avg 19 |
| 30.5M | 18 | 1024 | 4 | 256 | 2.82/6.99 | 2.78/6.82 | 2.77/6.91 | --epoch 39 --avg 6 |
| 116.55M | 18 | 2048 | 8 | 512 | 2.42/5.77 | 2.39/5.73 | 2.39/5.73 | --epoch 39 --avg 13 |
使用 RandomCombiner
| parameters | encoder layers | feedforward dim | num heads | encoder dim | greedy search | modified beam search | fast beam search | comment |
|---|---|---|---|---|---|---|---|---|
| 88.98M | 24 | 1536 | 8 | 384 | 2.41/5.70 | 2.41/5.69 | 2.41/5.69 | --epoch 31 --avg 17 |
| 30.9M | 18 | 1024 | 4 | 256 | 2.88/6.69 | 2.83/6.59 | 2.83/6.61 | --epoch 39 --avg 17 |
| 118.13M | 18 | 2048 | 8 | 512 | 2.39/5.57 | 2.35/5.50 | 2.38/5.50 | --epoch 39 --avg 7 |
4. 总结
本文介绍新一代 Kaldi 中的 RandomCombiner,欢迎大家在训练深层模型时简单尝试。
参考资料
ResNet: https://arxiv.org/pdf/1512.03385.pdf
