目的

小结一下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分成了五个大部分

五个部分:

  1. encoder
  2. decoder
  3. loss from left decoder (KLDivLoss)
  4. loss from right decoder(KLDivLoss)
  5. ctc loss

我们分别对encoder和decoder展开看看。三个loss,比较简单,这里不冗述。有兴趣的可以参考:

http://www.speechhome.com/post/1504647222132871168

简单期间,这里只关注forward!!!具体的细节,可以参考前面一些笔记。

1 Encoder

这个分成四个部分:


encoder是分成了四个部分

其一,cmvn,搞下(x-mean) * istd (istd=inverse standard derivation);

其二,subsampling,搞下下采样,把时域和频域的都变少了。。。

其三,编码器,就是12层或者更多层Conformer Encoder Layers了;

其四,是乱入的,就是一个普通的layer normalization。

下采样


下采样的细节

下采样里面,一个卷积模块(里面两个2d卷积,同时对时域和频域搞了一些操作),然后点就稀疏起来了。。。

然后是一个线性层,是负责把9728维度映射到512维度的。

最后是embedding了。增加位置编码。

编码器Layer


一个编码器层,包括了五个大的部分

五个部分:

  1. FFN macaron module
  2. mha, multi headed attention module
  3. conv module
  4. FFN module
  5. 乱入的一个layer norm层

编码器Layer前两个部分


前两个部分的细节网络结构

没啥好说的。transformer的标配了。

编码器Layer后两个部分


后两个部分,conv module和ffn的基本网络结构

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


embed的细节,是关于token embedding和位置编码的

DecoderLayer


一层三个部分,self-attention, cross-attention,以及ffn

一个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的时候。


encoder里面,12层conformer encoder layer的时候。

收工。