Encoder模块
step1:encoder_embed。对输入特征[N,T_origin,F]进行跳帧操作转换为特征[N,T_origin//subsampling,D]。在下文中为了方便表示,统一将T_origin//subsampling表达为T。D表示映射维度。
step2:encoder_pos。相对位置编码。
step3:encoder_layer。主体框架是Conformer[1] 。包含两层全连接、一层multi-head attention、一层卷积层。并使用残差相连。
step3中模型作者对原Conformer做了如下更新:
将layernorm替换为basicnorm:
\frac{x}{\sqrt{E(x^2)+\varepsilon}}
其中 E() 表示在Channel轴求均值, \varepsilon 表示可学习参数,初始值为0.25,学习的是该参数的log值,用的时候取exp,确保是正数。上述公式具体动机可参考[2]
在引入basicnorm后,无需在每一个全连接、multi-head attention及卷积层后进行norm,可直接在一层encoder的最后进行basicnorm。但是需要在每一层的weight和bias上乘一个可学习参数weight_scale和bias_scale。该参数也是在log域学习,用的时候取exp。
ActivationBalancer
前向时统计激活值的范