(1) Deep Feed-Forward Sequential Memory Networks for Speech Synthesis网络
(2) Deep FSMN for Large Vocabulary Continuous Speech Recognition函数
有了以前对FSMN结构的了解,如今看cFSMN结构就很简单。因为FSMN须要将记忆模块的输出做为下一个隐层的额外输入,这样就会引入额外的模型参数。而隐层包含的节点越多,则引入的参数越多。编码
基于此,cFSMN结合矩阵低秩分解的思路,经过在网络的隐层后添加一个低维度的线性投影层,而且将记忆模块添加在这些线性投影层上。进一步的,cFSMN对记忆模块的编码公式进行了一些改变,经过将当前时刻的输出显式的添加到记忆模块的表达中,从而只须要将记忆模块的表达做为下一层的输入。这样能够有效的减小模型的参数量,加快网络的训练。具体的,单向和双向的cFSMN记忆模块的公式表达分别以下:spa
\[ \vec{\tilde{p}_t^l} = \vec{p_t^l}+\sum_{i=0}^{N}\vec{a_i^l}\odot \vec{p_{t-i}^l}\tag{1} \]3d
\[ \vec{\tilde{p}_t^l} = \vec{p_t^l}+\sum_{i=0}^{N_1}\vec{a_i^l}\odot\vec{p_{t-i}^l}+\sum_{j=0}^{N_2}\vec{c_j^l}\odot\vec{p_{t+j}^l}\tag{2} \]code
观察结构图能够发现,DFSMN是在cFSMN的基础上,在不一样层之间的记忆模块上添加了跳转连接skip connection
,从而使得低层记忆模块的输出会被直接累加到高层记忆模块里。这样在训练过程当中,高层记忆模块的梯度会直接赋值给低层的记忆模块,从而能够克服因为网络的深度形成的梯度消失问题,使得能够稳定地训练深层的网络。
而且,经过借鉴扩张卷积的思路,DFSMN在记忆模块中引入了一些步幅因子stripe
,具体的计算公式以下:blog
\[ \vec{\tilde{p}_t^l} = H(\vec{\tilde{p}_t^{l-1}})+\vec{p_t^l}+\sum_{i=0}^{N_1^l}\vec{a_i^l}\odot\vec{p_{t-{s_1*i}}^l}+\sum_{j=0}^{N_2^l}\vec{c_j^l}\odot\vec{p_{t+{s_2*j}}^l}\tag{3} \]ip
关于变换H能够是任意的线性或者非线性函数,特别的,若是每一层的记忆模块都是相同维度的,能够直接使用恒等映射:it
\[ H(\vec{\tilde{p}_t^{l-1}}) = \vec{\tilde{p}_t^{l-1}}\tag{4} \]io
至于为何要引入步幅因子,是由于在实际工做处理中,临近单元信息会有大量的冗余,而步幅因子就能够帮助模型适当地消除这种冗余,从而加快模型的训练。