目的
小结一下WeNet, bidecoder架构下的,
在Train的时候,涉及encoder/decoder/loss的,所有的forward函数。
要好好研究forward函数,需要:
root@1032f8d48655:/# vi +1111 /opt/conda/lib/python3.8/site-packages/torch/nn/modules/module.py增加一行:
importipdb;ipdb.set_trace()
修改torch/nn/modules/module.py,从而可以让forward的调用可以被跟踪。
大的架构图:

训练asr model分成了五个大部分
五个部分:
- encoder
- decoder
- loss from left decoder (KLDivLoss)
- loss from right decoder(KLDivLoss)
- ctc loss
我们分别对encoder和decoder展开看看。三个loss,比较简单,这里不冗述。有兴趣的可以参考:
http://www.speechhome.com/post/1504647222132871168
简单期间,这里只关注forward!!!具体的细节,可以参考前面一些笔记。
1 Encoder
这个分成四个部分:

其一,cmvn,搞下(x-mean) * istd (istd=inverse standard derivation);
其二,subsampling,搞下下采样,把时域和频域的都变少了。。。
其三,编码器,就是12层或者更多层Conformer Encoder Layers了;
其四,是乱入的,就是一个普通的layer normalization。
下采样

下采样里面,一个卷积模块(里面两个2d卷积,同时对时域和频域搞了一些操作),然后点就稀疏起来了。。。
然后是一个线性层,是负责把9728维度映射到512维度的。
最后是embedding了。增加位置编码。
编码器Layer

五个部分:
- FFN macaron module
- mha, multi headed attention module
- conv module
- FFN module
- 乱入的一个layer norm层
编码器Layer前两个部分

没啥好说的。transformer的标配了。
编码器Layer后两个部分

2 Decoder
解码器分成left decoder和right decoder,看其中一个就好了。
一个还是四个部分。

解码器里面,例如left-decoder,也是有四个部分:
其一,embed
其二,循环多层decoder layers,分别搞self attention, cross attention,以及ffn;
其三,after norm, 乱入的layer normalization;
其四,一个线性层(self.output_layer),从512到5502(词表大小)。
embed
是对文字序列搞embedding

DecoderLayer

一个decoder layer包括了经典的三个部分,这个和transformer的decoder layer是一样的。

一个decoder layer中细化的三个子模块
画图花了一些时间。主要是为了复习,方便理解。
其他没啥了。
可以数数,如果是encoder只有一个encoder layer;
decoder只有一个left-decoder,一个right-decoder,而且left-decoder只有一层decoder layer;right-decoder也只有一层decoder layer的时候。最后用到了:
120次对forward()函数的调用。
大概可以看看哪些模块在吃参数:

encoder里面,只有一层conformer encoder layer的时候。

收工。
