参考论文:Semi-Orthogonal Low-Rank Matrix Factorization for Deep Neural Networks(半正交低秩矩阵分解DNN)
一.TDNN-F与TDNN的区别?
1.增加中间层
将原来的权重矩阵M分解为A矩阵和B矩阵,并且限制B矩阵为半正交矩阵,降低中间层维数,在减少模型参数的同时,依然保持很好的建模能力。kaldi中的例子swbd和librispeech中,采用的结构为1536X160X1536,中间层维度为160。
2.增加跳层连接
跳层连接(skip connections)与残差结构很像,同样是为了减少梯度消失,将之前层输出加到当前层输出作为下一层的输入,每个TDNN-F结构中的跳层连接都发生在1536维度的输出之后。
3.增加dropout
这个比较好理解,如图3,为了防止过拟合,每个TDNN-F结构中还加了dropout层。
二.TDNN-F模块的训练?
前边我们讲TDNN-F是将原来的权重矩阵M分解为两个矩阵A和B,并将B约束成半正交的,那么加了半正交约束的TDNN-F是如何训练的呢?下面我们结合论文和代码着重理解一下这块。论文中提到,通过scale化M矩阵或采用L2正则项都可以控制各层参数变化的快慢,之前的chain-model只是将L2正则项用到最后一层,因为batchnorm层和dropout层的原因,将L2用到隐层作用不是很明显,通过加"floating"半正交约束,可以将L2用到每个TDNN-F中。(这段不是很理解,可能翻译的也不对)
论文链接:http://www.danielpovey.com/files/2018_interspeech_tdnnf.pdf
代码:kaldi/src/nnet3/nnet-utils.cc
模型结构:kaldi/egs/swbd/s5c/local/chain/tuning/run_tdnn_7q.sh