0. 前言
Conformer是Google在2020年提出的语音识别模型,基于Transformer改进而来,主要的改进点在于Transformer在提取长序列依赖的时候更有效,而卷积则擅长提取局部特征,因此将卷积应用于Transformer的Encoder层,同时提升模型在长期序列和局部特征上的效果,实际证明,该方法确实有效,在当时的LibriSpeech测试集上取得了最好的效果。
Wenet是出门问问语音团队联合西工大语音实验室开源的一款面向工业落地应用的语音识别工具包,该工具用一套简洁的方案提供了语音识别从训练到部署的一条龙服务,Wenet目前在github上获得了上千个stars,其易用性深受用户好评。
本文将首先分析Conformer的原始论文,然后基于Wenet框架分析工程代码实现。
1. Conformer模型
Conformer模型在输入的时候,首先通过一个卷积网络进行下采样,然后接上一系列的conformer模块,基本结构如下:

Conformer encoder model architecture
其中,conformer模块包含以下几个部分:Feedforward module,Multi-head self attention Module和Convolution Module共三个模块组成,注意其中两个Feedforward输出都乘以了1/2。
1.1 Multi-Headed Self-Attention Module
首先应用了一个来自于Transformer-XL的multi-headed self-attention (MHSA),具体来说是一个相对正弦位置编码(relative sinusoidal positional encoding),它能让self-attention模块在变长输入上有更好表现,所得到的编码器对语音长度的变化具有更强的鲁棒性。此外应用了pre-norm残差模块,如下图所示:

Multi-Headed Self-Attention Module
1.2. Convolution Module
卷积模块之前,会先增加一个由逐点卷积和线性门控单元(gated linear unit,GLU)组成的门控机制,其后接一个一维的深度分离卷积,然后增加一个Batchnorm来帮助训练更深的模型。整个卷积模块如下所示:

Convolution Module
1.3. Feed Forward Module
Transformer模型在MHSA层之后接了一个由两层线性变换和一个非线性激活函数组成的前馈模块(Feed Forward Module)。整个前馈模块中,在normalization之后增加了残差连结。
本文的模型中,采用了pre-norm残差单元,并且在残差单元和第一层线性变换的输入之前增加normalization层,同时应用了Swish激活函数和Dropout,该部分结构如下:

Feed Forward (FFN) module
1.4. Conformer Block
如前所述,Conformer模块包含两个Feed Forward Module,其间再夹着一个Multi-Headed Self-Attention module和一个Convolution module。

其中FFN是Feed forward module,MHSA是Multi-Head Self-Attention module,Conv是Convolution module。
下文所示的消融实验中表明,上文所用的结构对Conformer架构中单个前馈模块有重大改进,此外,本文发现convolution module叠在self-attention module之后的结构在语音识别任务上效果最好。
2. 实验
2.1 数据
本文在有970小时标注数据的LibriSpeech上评估模型,同时用了额外的800M文本数据训练语言模型。声学特征部分采用了80维的Fbank,窗长是25ms,帧移10ms。同时用了SpecAugment方法,掩码参数设为F=27,同时最大时域掩码覆盖率为Ps = 0.05,表示最大时域掩码的长度是音频时长的Ps倍。
2.2. Conformer Transducer
首先定义了小、中、大三种模型,模型参数分别是10M,30M和118M,通过网络深度、模型维度、attention heads数量的不同组合,并在模型参数大小的约束下选择性能最好的一个,下表描述了不同模型的参数设置:


用了一个每层有4096个节点,共三层的LSTM网络作为语言模型 (language model,LM),并且在LibriSpeech960h上进行训练,最终模型在LibriSpeech 960h上的词级困惑度(word-level perplexity)为63.9。
2.3. Results on LibriSpeech
下图展示了模型在LibriSpeech的test-clean/test-other测试集上同一些当前最好模型的对比结果,它们包括:ContextNet, Transformer transducer, QuartzNet等。

在不增加语言模型时,当前中型模型能在test-clean/test-other测试集上达到2.3/5.0的WER,已经能与最好的Transformer、LSTM等模型旗鼓相当。如果加上语言模型,当前模型能在所有模型中取得最好的效果。
2.4. 消融实验(Ablation Studies)
2.4.1. Conformer Block vs. Transformer Block
Conformer 模块相对于Transformer 模块有很多地方的改动,下面的实验展示了在保持模型参数不变的情况下,逐个改变各模块带来的影响:

上图中可以看到,卷积层是最重要的改变,采用Macaron-style FFN也比相同参数的单个FFN更高效,同时用swish替换Relu使得训练收敛的更快。
2.4.2. Combinations of Convolution and Transformer Modules
作者尝试了很多种将multi-headed self-attention (MHSA) module和convolution module组合的方式。首先,将depthwise convolution替换成一种更轻量级的lightweight convolution,但是看到模型在dev-other数据集上效果急剧下降。然后尝试将卷积层置于MHSA之前,模型在dev-other数据集上也有0.1的下降。最后,作者尝试将输入接入多个并行的MHSA,然后将它们的输出拼接在一起后送入卷积层,最后的结果还是会导致模型变差,所有的结果如下表所示:

2.4.3. Macaron Feed Forward Modules
与Transformer模型中用单个feed-forward module (FFN)不同,Conformer用来一对macaron-like Feed forward modules,此外,Conformer中的残差网络还乘以了0.5的权重,对此的对比效果如下图所示:

可以看到,Conformer的两种设置都有正向的提升作用。
3.4.4. Number of Attention Heads
在self-attention模块中,每个attention都关注在不同的输入上,下面的实验对比了从4个attention heads到32个attention heads数目时的模型效果:

可以看到,模型在attention heads增长到16个时都有改善,超过之后模型则会变差。
2.4.5. Convolution Kernel Sizes
下面的实验研究了在大模型上,卷积层的卷积核为{3,7,17,32,65}时模型的效果:

可以看到,模型在卷积核增长到32时会持续变好,但是之后模型会变差。
3. 结论
本文中,作者将CNN和Transformer结合而成Conformer,并通过实验对比了各个改进的效果,最终模型在LibriSpeech test/testother测试集上获得了1.9%和3.9%的WER,是当时最好的结果。
文章来源知乎,文章作者:蘑菇炖提莫
