zoukankan      html  css  js  c++  java
  • FSMN 及其变种 cFSMN DFSMN pyramidal-FSMN

    原文: https://blog.csdn.net/qq_26778411/article/details/89682447

    也可以参考:  http://vsooda.github.io/2018/03/12/fsmn/

    1.FSMN 综述

         由于 Bi-RNN 较高的成功率需要得到整段语音所有未来信息的支持才能实现,因此会带来较长的硬延时,故 Bi-RNN 不适合作为在线语音识别的模型。故在 2015 年科大讯飞提出了 FSMN(Feedforward Sequential Memory Networks)模型,该模型在很小的延时下,就能取得与 Bi-RNN 一样的效果。
    详见论文:
    (1)Feedforward Sequential Memory Neural Networks without Recurrent Feedback 该篇篇幅较短,只介绍了 FSMN 在 Language Model 的应用。
    (2)Feedforward Sequential Memory Networks: A New Structure to Learn Long-term Dependency 该篇较为详细的描述了 FSMN 的三个变种,在 Acoustic Model 和 Language Model 上的应用。

         在 FSMN 的基础之上,陆陆续续又出现了 cFSMN、DFSMN、pyramidal-FSMN 等 FSMN 的变种。
    (1)cFSMN:Compact Feedforward Sequential Memory Networks for Large Vocabulary Continuous Speech Recognition
    (2)DFSMN:Deep-FSMN for Large Vocabulary Continuous Speech Recognition
    (3)pyramidal-FSMN:A novel pyramidal-FSMN architecture with lattice-free MMI for speech recognition

    2.FSMN

         前面提到了,有两篇论文讲述了 FSMN,这里就选取较为全面的第二篇 Feedforward Sequential Memory Networks: A New Structure to Learn Long-term Dependency 进行讲解。

    FSMN
         FSMN 的结构如上图所示,在图中我们可以看到,FSMN 对比普通的前馈神经网络,最大的区别就是引入了 Memory Block. 该 Memory 的表达式如下:
    h˜t=Ni=0aihtih~tℓ=∑i=0Naiℓ⋅ht−iℓ ilde{mathbf{h}}_{t}^{ell}=sum_{i=0}^{N} a_{i}^{ell} cdot mathbf{h}_{t-i}^{ell} h~t=i=0Naihti
    其中,htiht−iℓ mathbf{h}_{t-i}^{ell} htitit−i t-i ti 时刻ℓ ell 层的 features,aiaiℓ a_{i}^{ell} ai为对应的时不变系数。

         这里可以看出,Memory Block 中储存了NN N Nhtiht−iℓ mathbf{h}_{t-i}^{ell} hti的 “过去记忆”,该 “过去记忆h˜th~tℓ ilde{mathbf{h}}_{t}^{ell} h~t” 会与当前层的 features hthtℓ mathbf{h}_{t}^{ell} ht一起前向传入下一层。

         当然,不难想到,该 Memory Block 也可以通过引入部分延时来存储 “未来的记忆”,改进后的表达式如下:
    h˜t=N1i=0aihti+N2j=1cjht+jh~tℓ=∑i=0N1aiℓ⋅ht−iℓ+∑j=1N2cjℓ⋅ht+jℓ ilde{mathbf{h}}_{t}^{ell}=sum_{i=0}^{N_{1}} a_{i}^{ell} cdot mathbf{h}_{t-i}^{ell}+sum_{j=1}^{N_{2}} c_{j}^{ell} cdot mathbf{h}_{t+j}^{ell} h~t=i=0N1aihti+j=1N2cjht+j
    其中,ht+jht+jℓ mathbf{h}_{t+j}^{ell} ht+jt+jt+j t+j t+j 时刻ℓ ell 层的 features,ciciℓ c_{i}^{ell} ci为对应的时不变系数。

         文章中对 Memory Block 中时不变系数aiaiℓ a_{i}^{ell} aihtiht−iℓ mathbf{h}_{t-i}^{ell} hti的运算 (⋅ cdot ) 进行了分类:
    (1) 若aiaiℓ a_{i}^{ell} ai为一个常数,则该 FSMN 被称为 sFSMN,aiaiℓ a_{i}^{ell} aihtiht−iℓ mathbf{h}_{t-i}^{ell} hti之间的运算为标量相乘。
    (2) 若aiaiℓ a_{i}^{ell} ai是一个与htiht−iℓ mathbf{h}_{t-i}^{ell} hti等长的向量,则该 FSMN 被称为 vFSMN, aiaiℓ a_{i}^{ell} aihtiht−iℓ mathbf{h}_{t-i}^{ell} hti之间的运算为 dot product.

         文章解释了 FSMN 的 Memory Block 可以替代 RNN 中原因:
    Memory Block

    RNN

         如上图所示,RNN 中的循环结构可以看成一个 IIR 滤波器 (z1z−1 z^{-1} z1 为上一时刻导数的 Z 变换),FSMN 中的 Memory 可以看成一个 FIR 滤波器。根据信号与系统的知识我们知道,IIR 滤波器可以通过高阶的 FIR 滤波器逼近表示。所以 FSMN 中的 Memory Block 可以看成是 RNN 中循环结构的近似。由于 FSMN 在同一层中的某时刻的输入不需要依赖上一时刻的输出,所以网络的训练时间对比 RNN 会大大缩短。

    FSMN 的参数更新公式为:
    h˜t=N1i=0aihti+N2j=1cjht+jh~tℓ=∑i=0N1aiℓ⊙ht−iℓ+∑j=1N2cjℓ⊙ht+jℓ ilde{mathbf{h}}_{t}^{ell}=sum_{i=0}^{N_{1}} mathbf{a}_{i}^{ell} odot mathbf{h}_{t-i}^{ell}+sum_{j=1}^{N_{2}} mathbf{c}_{j}^{ell} odot mathbf{h}_{t+j}^{ell} h~t=i=0N1aihti+j=1N2cjht+j

    h+1t=f(Wht+W˜h˜t+b)htℓ+1=f(Wℓhtℓ+W~ℓh~tℓ+bℓ) mathbf{h}_{t}^{ell+1}=fleft(mathbf{W}^{ell} mathbf{h}_{t}^{ell}+ ilde{mathbf{W}}^{ell} ilde{mathbf{h}}_{t}^{ell}+mathbf{b}^{ell} ight) ht+1=f(Wht+W~h~t+b)

    3.cFSMN

         如果使用 FSMN,设该层和下一层的神经元的个数均为nn n n 时,"前向记忆" 的个数为N1N1 N_1 N1,"后向记忆" 的个数为N2N2 N_2 N2,该层的参数个数为:nn+nn+n(N1+N2)n∗n+n∗n+n∗(N1+N2) n*n+n*n+n*(N_1+N_2) nn+nn+n(N1+N2) 个。当nn n n 很大,训练参数就会很多。

         为了解决 FSMN 参数较多的问题,文章 Compact Feedforward Sequential Memory Networks for Large Vocabulary Continuous Speech Recognition 提出了 cFSMN,该文章借鉴了矩阵低秩分解的思路在网络中引入了一个维数较小的 project 层,通过该 project 层进行降维,从而实现减少训练参数个数的目的。

    cFSMN 的结构如下图所示:
    在这里插入图片描述
    cFSMN 的参数更新公式为:
    pt=Vhtptℓ=Vℓhtℓ mathbf{p}_t^{ell}=mathbf{V}^{ell}mathbf{h}_t^{ell} pt=Vht
    p˜t=pt+N1i=0aipti+N2j=1cjpt+jp~tℓ=ptℓ+∑i=0N1aiℓ⊙pt−iℓ+∑j=1N2cjℓ⊙pt+jℓ ilde{mathbf{p}}_{t}^{ell}=mathbf{p}_{t}^{ell}+sum_{i=0}^{N_{1}} mathbf{a}_{i}^{ell} odot mathbf{p}_{t-i}^{ell}+sum_{j=1}^{N_{2}} mathbf{c}_{j}^{ell} odot mathbf{p}_{t+j}^{ell} p~t=pt+i=0N1aipti+j=1N2cjpt+j
    h+1t=f(Up˜t+b+1)htℓ+1=f(Uℓp~tℓ+bℓ+1) mathbf{h}_{t}^{ell+1}=fleft(mathbf{U}^{ell} ilde{mathbf{p}}_{t}^{ell}+mathbf{b}^{ell+1} ight) ht+1=f(Up~t+b+1)

         设 project 层的 features 个数为pp p p, 该层和下一层的神经元的个数均为nn n n, 则 cFSMN 参数的个数为np+p(N1+N2)+npn∗p+p∗(N1+N2)+n∗p n*p+p*(N_1+N_2)+n*p np+p(N1+N2)+np.

    4.DFSMN

         因为每个 cFSMN 层中包含了较多的子层,一个包含 4 个 cFSMN 层,2 个 DNN 层的 cFSMN 网络总共需要 12 层结构。若通过直接增加 cFSMN 层的方法来设计更深的 cFSMN 网络,网络可能会出现梯度消失的问题。

         针对上述问题,文章 Deep-FSMN for Large Vocabulary Continuous Speech Recognition 提出了 DFSMN,该 DFSMN 在 cFSMN 的 Memory Block 之间添加了 skip connection,使低层的 memory 可以直接流入高层的 Memory Block 中。在反向传播的过程当中,高层的梯度也会直接流入低层的 Memory Block 中,这样有助于克服梯度消失的情况。DFSMN 的结构如下图所示:
    DFSMN
    DFSMN 的参数更新公式为:
    pt=Vhtptℓ=Vℓhtℓ mathbf{p}_t^{ell}=mathbf{V}^{ell}mathbf{h}_t^{ell} pt=Vht
    p˜t=(p˜1t)+pt+N1i=0aipts1i+N2j=1cjpt+s2jp~tℓ=H(p~tℓ−1)+ptℓ+∑i=0N1ℓaiℓ⊙pt−s1∗iℓ+∑j=1N2ℓcjℓ⊙pt+s2∗jℓ ilde{mathbf{p}}_{t}^{ell}=mathcal{H}left( ilde{mathbf{p}}_{t}^{ell-1} ight)+mathbf{p}_{t}^{ell}+sum_{i=0}^{N_{1}^{ell}} mathbf{a}_{i}^{ell} odot mathbf{p}_{t-s_{1} * i}^{ell}+sum_{j=1}^{N_{2}^{ell}} mathbf{c}_{j}^{ell} odot mathbf{p}_{t+s_{2} * j}^{ell} p~t=H(p~t1)+pt+i=0N1aipts1i+j=1N2cjpt+s2j
    h+1t=f(Up˜t+b+1)htℓ+1=f(Uℓp~tℓ+bℓ+1) mathbf{h}_{t}^{ell+1}=fleft(mathbf{U}^{ell} ilde{mathbf{p}}_{t}^{ell}+mathbf{b}^{ell+1} ight) ht+1=f(Up~t+b+1)

    (p˜1t)H(p~tℓ−1) mathcal{H}left( ilde{mathbf{p}}_{t}^{ell-1} ight) H(p~t1) 表示低层 Memory Block 与高层 Memory Block 的连接形式。若将低层的 Memory 直接添加到高层的 Memory Block 中,则(p˜1t)=p˜1tH(p~tℓ−1)=p~tℓ−1 mathcal{H}left( ilde{mathbf{p}}_{t}^{ell-1} ight)= ilde{mathbf{p}}_{t}^{ell-1} H(p~t1)=p~t1

    5.pyramidal-FSMN

         pyramidal-FSMN 是云从科技 2018 年刷新 Librispeech 数据集正确率最高记录时使用的模型中的一部分。详情见论文 A novel pyramidal-FSMN architecture with lattice-free MMI for speech recognition

         文章认为在 DFSMN 的结构中,若直接将底层的 Memory Block 的 Memory 直接添加到上层的 Memory Block 中,这将导致上层和底层拥有相同记忆,这么做是非常冗余的。文章提出的 pyramidal-FSMN 结构,它相比于 DFSMN 有两点不一样:第一点改变是底层的 Memory Block 较小,越高层的 Memory Block 依次变大,文章认为这样的结构可以用底层提取音素信息,而用高层提取到语义和语法特征;第二点改变是在 skip connection 连接底层和上层的 Memory Block 时,只有在 Memory Block 的 size 不一样时,才进行连接。

    pyramidal-FSMN 中 Memory Block 的更新公式为:
    xlt=xlmt+Nl1i=0alihlts1i+Nl2j=0blihlt+s2jxtl=xtl−m+∑i=0N1lail⊙ht−s1∗il+∑j=0N2lbil⊙ht+s2∗jl x_{t}^{l}=x_{t}^{l-m}+sum_{i=0}^{N_{1}^{l}} a_{i}^{l} odot h_{t-s_1 * i}^{l}+sum_{j=0}^{N_{2}^{l}} b_{i}^{l} odot h_{t+s_2 * j}^{l} xtl=xtlm+i=0N1lailhts1il+j=0N2lbilht+s2jl

  • 相关阅读:
    python基础--二分查找
    python基础--字典
    python基础--列表和元组
    python基础--基本数据类型的概述
    python基础--循环
    python基础--变量和基础数据类型
    Python2与Python3区别
    project euler之最大的回文产品
    project euler之最大的素因子
    project euler之甚至斐波那契数字(Even Fibonacci numbers)
  • 原文地址:https://www.cnblogs.com/dahu-daqing/p/10837165.html
Copyright © 2011-2022 走看看