《语音识别原理与应用》洪青阳 第10章 DNN-HMM TDNNF推导过程

TDNNF推导过程

《语音识别原理与应用》洪青阳 P215

2018 年,著名的语音学者 Daniel Povey对TDNN 网络做了进一步的改进提出了因子分解的 TDNN,即带有半正交矩阵的TDNN-F,TDNN-F建立在奇异值分解 ( Singular Value Decomposition, SVD)的基础上。作为最著名的矩阵分解方法,SVD 是减少已训练的模型大小的一种有效方法,因为通过SVD我们可以将每个权重矩阵分解为两个因子矩阵,通过丟弃相对更小的奇异值,优化网络参数。

TDNNF 特点:

  • 通过奇异值分解(SVD) ,把每个权重矩阵因子分解为两个更小的矩阵,减少神经网络参数。
  • TDNN-F限定其中一个矩阵为半正交的(semi-orthogonal)。
  • 类似残差网络,TDNN-F采用跳层连接,减少梯度的消失。

TDNN-F 的内部结构与经过SVD压缩的 TDNN 是相同的。虽然经过 SVD 压缩的 TDNN 在随机初始化后,直接训练带有瓶颈层的模型会更高效,但是训练不稳定的问题时有发生。为了避免这种情况,TDNN-F 会在进行完SVD 分解后,将两个分解因子矩阵中的一个约束为半正交矩阵。这种做法既符合 SVD 的要求和特点,也不会损失网络的建模能力。

我们来看具体的推导过程。TDNN-F 把一个权重矩阵M分解为两个矩阵A和B,并限定其中B为半正交的矩阵。
$$
M=AB
$$
迭代优化M如下:
$$
M^{\prime} \leftarrow M-\varepsilon \Delta M
$$
定义
$$
P=M M^{\top}
$$
TDNN-F的限制条件是使 $P=I$,定义
$$
Q=p-I
$$
TDNN-F 的优化目标等价于使用最小化函数
$$
f=\operatorname{tr}\left(Q Q^{\top}\right)
$$
对Q、P、M求偏导,分别得到
$$
\begin{aligned}
& \frac{\partial f}{\partial Q}=2 Q \
& \frac{\partial f}{\partial P}=2 Q \
& \frac{\partial f}{\partial M}=4 Q M
\end{aligned}
$$
因此,可如下迭代优化权重矩阵M:
$$
\begin{gathered}
\Delta M=\nabla_N f=\frac{\partial f}{\partial M}=4 Q M \
M^{\prime} \leftarrow M-4 \varepsilon Q M
\end{gathered}
$$
其中, $\varepsilon$ 是学习率。

假如原来 $M$ 是 $128 \times 128$ 矩阵, 通过因子分解,得到的 $A$ 为 $128 \times 32$ 矩阵, $B$ 为 $32 \times 128$ 矩阵, 其中 32 是中间瓶颈层的节点数。这样网络参数量从 $128 \times 128$ 个减 少到 $128 \times 32 \times 2$ 个, 即从 16384 个减到 8192 个, 权重运算量也会大为诚少。

随着网络的加深, 为了减少梯度消失的情况, 在 TDNN-F 网络中还增加了跳层连接, 即将之前层的输出加上当前层的输出作为下一层的输入。这种构造与残差结构类似, 目的都是为了减少梯度消失的情况。同时, 为了防止模型过拟合, 在每个 TDNN-F 的单元结构中还㴛加了 dropout 层。

kaldi中的TDNN-F

参考Kaldi 的配置文件,采用40 维FBank特征,则 TDNN-F 的结构如下表所示。我们解释一下tdnnf-layer的参数

  • l2-regularize:设置L2 正则系数。
  • dropout-proportion:设置丢弃(dropout)的比例。
  • bypass-scale:设置跳连接时针对上一层输出节点的尺度,默认值为 0.66,不应该大于1。当设为0时,则不进行跳连接操作。
  • time-stride :控制时间维度拼接,time-stride=1表示在线性层使用Append(-1,0),在仿射变换时使用 Append(0.1)。设置当time-stride 为负数时,如-1,则表示先使用右偏置,再使用左偏置。
  • bottleneck-dim:设置分解矩阵后的维度。

TDNN-F 网络结构信息表:

tdnnf-layer name=tdnnf2 12-regularize=0.01 dropout-proportion=0.0 bypass-scale=0.66 dim=1536 bottleneck-dim=160 time-stride=1

第一个隐藏层的输出是1536 维的特征。第二个隐藏层接收上层的输人。先进行因子分解,因为 time-strde=1,所以在线性变换时输入的特征是当前帧与左偏移一帧的拼接帧。通过线性变换将特征维度减少到瓶颈节点数,不同于普通的线性变换,这里限制B矩阵为半正交矩阵,同时使用了 L2 正则系统。接着经过 1536x160 (time-stride=1,仿射变换时的输入是当前帧与右偏移一帧的拼接帧)权重矩阵计算,并进行仿射变换得到 1536 维的输出。上面两生完成了增加中间层、减少参数数量的操作。再使用 ReLU 两数作为激活函数,进行批处理规整(batchnorm)计算,然后再根据 dropout-proportion 的值进行dropout。 最后由于 bypass-scale=0.66 不为0,所以要进行跳连接,将第一个隐藏层的output 和第二个隐藏层的 output 相加作为第三个隐藏层的输人。

TDNN-F与CNN结合:CNN提取局部频域特征,TDNN-F提取上下文时域特征。