时延神经网络(TDNN)相当于CNN的前身,相当于1dcnn即一维CNN,它的共享权重被限制在单一的维度上,并且没有池化层,适用于语音和时间序列的信号处理。TDNN区别于只用了一帧特征的模型结构,是一个能够包含多帧的神经网络,若延时为2,则连续的3帧都能够出现,这里的隐含层用于特征抽取,若输入层每一帧有13维MFCC特征输入,网络有10个隐含层,那么连接的权重数目即为31310=390个。此时延时神经网络相当于把权重延时,隐藏层和输出层之间若采用该方法,这样整体的权重就大大减少,便于训练.
若输入层纵向为经过mel滤波器的16个特征,横向为帧,Input Layer的延时为2,映射对Hidden layer1为16 *3->8,Hidden layer1 8个节点,则权值个数为384。若Hidden Layer1的延时为4,映射到Hidden Layer2的关系是8 *5->3,权值个数则为120。若Hidden Layer2的延时为8,映射到输出层的关系为3 *9->3,权值个数则为81。合计权值为384+120+81=585。TDNN训练方法和传统的反向传播算法一样,具有快速算法,同时网络是多层的,且每层对特征有较强的抽象能力,能够很好的表达语音特征在时间上的关系.根据权值具有时间不变性,学习过程中不要求对所学的标记进行精确的时间定位,此时通过共享权值,方便模型学习训练。
此外在kaldi中,在get_egs.sh和train_dnn.py脚本中,chunk-size的也被称为frames-per-eg,在解码中,我们把它称为frame-per-chunk。当训练TDNN时,每帧都需要左右各10帧的上文和下文,并写入到磁盘中,此时要知道某一帧的左右上下文具体是哪些帧,若不使用chunk,而是用普通的方法生成训练样本时,所需的数据量可能会变成原来的很多倍。这里面的chunk其实就是拼帧后的输入,chunk size即Chunk的大小,是在训练或解码中每个数据块所含(输出)帧的数量。TDNN解码时,输入第一帧时,需要10帧左上文和10帧右下文,而第一帧是没有左上文的,则在输入层处对第一帧拷贝10次,作为其左上文;若10帧的右下文还没来,此时是无法输出第一帧的输出,需要等到第11帧到来时,才能输出第1帧的,等到第12帧到来时,再输出第2帧,因此时延为11* 0.01=0.11秒,且只与右下文有关,如果输出到最后一帧时,没有右下文了,将最后一帧拷贝10次,作为其右下文.
TDNN-F结构与经过SVD分解的TDNN相同,但不同的是TDNN-F的训练开始于随机初始化,在SVD分解后其中一个矩阵被限制为半正定的。具体的为首先将原来的权重矩阵M分解为A矩阵和B矩阵,从而减少层参数,以便利用更深的网络提取表达能力更强的特征,并且限制B矩阵为半正交矩阵,使得参数矩阵随机初始化时训练不至于发散,降低了中间层维数,在减少模型参数的同时,能够保持较好的建模能力。其次跳层连接(skip connections)与残差结构很像,同样是为了减少梯度消失,将之前层输出加到当前层输出作为下一层的输入,每个TDNN-F结构中的跳层连接都发生在1536维度的输出之后(kaldi中的例子swbd和librispeech中,采用的结构为1536X160X1536,中间层维度为160)。最后为了防止过拟合,每个TDNN-F结构中还加了dropout层.
在具体的实践中,Factorized TDNN可以通过三种形式实现,一是31(半正定)->11,二是 21(半正定)->21,三是21(半正定)->21(半正定)->2*1,并且因为多出一个卷积层,时域信息会更宽.在具体的Factorized TDNN参数矩阵更新方面,假设参数矩阵M(rows>cols),定义P=MMT,当P=I时,M为半正定化矩阵;令Q=P-I,则可以通过最小化f=tr(QQT)来使得M趋近于I;那么目标f相对于M、P、Q的偏导数分别为:∂f/∂Q= 2Q,∂f/∂P= 2Q, and∂f/∂M= 4QM;当优化算法为SGD时,设学习率为ν= 1/8,那么得到参数矩阵M的更新公式,ν= 1/8使得目标函数趋近于二次收敛,但当M离标准正交很远时,上述更新的公式容易发散.
ECAPA-TDNN基于传统TDNN模型进行了改进,主要有增加了一维SE残差模块,多层特征融合,通道和上下文相关的统计池化三个方面.SE-Res2Block借鉴了 CV 领域的模型结构, 目的就是"在一层 NN Layer 中尽可能的学习更多的内容", 具体的在Squeeze部分做的事情是把HWC压缩为11C,相当于把HW压缩成一维了,实际中一般是用global average pooling实现的,HW压缩成一维后,相当于这一维参数获得了之前H*W全局的视野,感受区域更广.多特征融合这块其实就是借鉴了 ResNet 和 DenseNet 的思路,将前面的输出cat到最后的输出,统一送到下一层,得到更加鲁棒的 speaker embedding.注意力统计池化采用的是带权重的均值和方差,在最原始的 statistic pooling 中, 没有关注时间维度各 frame 的重要性, 在后面提出了 Soft self-attention.TDNN的改进比较多,包括TDNN-FSMN,TDNN-OPGRU,TDNN-LSTM以及CNN-TDNN等,后续将结合相关论文对上述模型进行理解,并参考这篇"ECAPA-TDNN for Multi-speaker Text-to-speech Synthesis"2022文献继续对ECAPA-TDNN进行理解.