原文: 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 对比普通的前馈神经网络,最大的区别就是引入了 Memory Block. 该 Memory 的表达式如下:
h˜ℓt=∑Ni=0aℓi⋅hℓt−ih~tℓ=∑i=0Naiℓ⋅ht−iℓ \tilde{\mathbf{h}}_{t}^{\ell}=\sum_{i=0}^{N} a_{i}^{\ell} \cdot \mathbf{h}_{t-i}^{\ell}

h~tℓ​=i=0∑N​aiℓ​⋅ht−iℓ​
其中,hℓt−iht−iℓ \mathbf{h}_{t-i}^{\ell}

ht−iℓ​为t−it−i t-i

t−i 时刻ℓℓ \ell

ℓ层的 features,aℓiaiℓ a_{i}^{\ell}

aiℓ​为对应的时不变系数。

这里可以看出,Memory Block 中储存了NN N

N 个hℓt−iht−iℓ \mathbf{h}_{t-i}^{\ell}

ht−iℓ​的 “过去记忆”,该 “过去记忆h˜ℓth~tℓ \tilde{\mathbf{h}}_{t}^{\ell}

h~tℓ​” 会与当前层的 features hℓthtℓ \mathbf{h}_{t}^{\ell}

htℓ​一起前向传入下一层。

当然,不难想到,该 Memory Block 也可以通过引入部分延时来存储 “未来的记忆”,改进后的表达式如下:
h˜ℓt=∑N1i=0aℓi⋅hℓt−i+∑N2j=1cℓj⋅hℓt+jh~tℓ=∑i=0N1aiℓ⋅ht−iℓ+∑j=1N2cjℓ⋅ht+jℓ \tilde{\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=0∑N1​​aiℓ​⋅ht−iℓ​+j=1∑N2​​cjℓ​⋅ht+jℓ​
其中,hℓt+jht+jℓ \mathbf{h}_{t+j}^{\ell}

ht+jℓ​为t+jt+j t+j

t+j 时刻ℓℓ \ell

ℓ层的 features,cℓiciℓ c_{i}^{\ell}

ciℓ​为对应的时不变系数。

文章中对 Memory Block 中时不变系数aℓiaiℓ a_{i}^{\ell}

aiℓ​和hℓt−iht−iℓ \mathbf{h}_{t-i}^{\ell}

ht−iℓ​的运算 (⋅⋅ \cdot

⋅) 进行了分类:
(1) 若aℓiaiℓ a_{i}^{\ell}

aiℓ​为一个常数,则该 FSMN 被称为 sFSMN,aℓiaiℓ a_{i}^{\ell}

aiℓ​和hℓt−iht−iℓ \mathbf{h}_{t-i}^{\ell}

ht−iℓ​之间的运算为标量相乘。
(2) 若aℓiaiℓ a_{i}^{\ell}

aiℓ​是一个与hℓt−iht−iℓ \mathbf{h}_{t-i}^{\ell}

ht−iℓ​等长的向量,则该 FSMN 被称为 vFSMN, aℓiaiℓ a_{i}^{\ell}

aiℓ​和hℓt−iht−iℓ \mathbf{h}_{t-i}^{\ell}

ht−iℓ​之间的运算为 dot product.

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

如上图所示,RNN 中的循环结构可以看成一个 IIR 滤波器 (z−1z−1 z^{-1}

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

FSMN 的参数更新公式为:
h˜ℓt=∑N1i=0aℓi⊙hℓt−i+∑N2j=1cℓj⊙hℓt+jh~tℓ=∑i=0N1aiℓ⊙ht−iℓ+∑j=1N2cjℓ⊙ht+jℓ \tilde{\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=0∑N1​​aiℓ​⊙ht−iℓ​+j=1∑N2​​cjℓ​⊙ht+jℓ​

hℓ+1t=f(Wℓhℓt+W˜ℓh˜ℓt+bℓ)htℓ+1=f(Wℓhtℓ+W~ℓh~tℓ+bℓ) \mathbf{h}_{t}^{\ell+1}=f\left(\mathbf{W}^{\ell} \mathbf{h}_{t}^{\ell}+\tilde{\mathbf{W}}^{\ell} \tilde{\mathbf{h}}_{t}^{\ell}+\mathbf{b}^{\ell}\right)

htℓ+1​=f(Wℓhtℓ​+W~ℓh~tℓ​+bℓ)

3.cFSMN

如果使用 FSMN,设该层和下一层的神经元的个数均为nn n

n 时,"前向记忆" 的个数为N1N1 N_1

N1​,"后向记忆" 的个数为N2N2 N_2

N2​,该层的参数个数为:n∗n+n∗n+n∗(N1+N2)n∗n+n∗n+n∗(N1+N2) n*n+n*n+n*(N_1+N_2)

n∗n+n∗n+n∗(N1​+N2​) 个。当nn n

n 很大,训练参数就会很多。

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

cFSMN 的结构如下图所示:

cFSMN 的参数更新公式为:
pℓt=Vℓhℓtptℓ=Vℓhtℓ \mathbf{p}_t^{\ell}=\mathbf{V}^{\ell}\mathbf{h}_t^{\ell}

ptℓ​=Vℓhtℓ​
p˜ℓt=pℓt+∑N1i=0aℓi⊙pℓt−i+∑N2j=1cℓj⊙pℓt+jp~tℓ=ptℓ+∑i=0N1aiℓ⊙pt−iℓ+∑j=1N2cjℓ⊙pt+jℓ \tilde{\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=0∑N1​​aiℓ​⊙pt−iℓ​+j=1∑N2​​cjℓ​⊙pt+jℓ​
hℓ+1t=f(Uℓp˜ℓt+bℓ+1)htℓ+1=f(Uℓp~tℓ+bℓ+1) \mathbf{h}_{t}^{\ell+1}=f\left(\mathbf{U}^{\ell} \tilde{\mathbf{p}}_{t}^{\ell}+\mathbf{b}^{\ell+1}\right)

htℓ+1​=f(Uℓp~​tℓ​+bℓ+1)

设 project 层的 features 个数为pp p

p, 该层和下一层的神经元的个数均为nn n

n, 则 cFSMN 参数的个数为n∗p+p∗(N1+N2)+n∗pn∗p+p∗(N1+N2)+n∗p n*p+p*(N_1+N_2)+n*p

n∗p+p∗(N1​+N2​)+n∗p.

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 的参数更新公式为:
pℓt=Vℓhℓtptℓ=Vℓhtℓ \mathbf{p}_t^{\ell}=\mathbf{V}^{\ell}\mathbf{h}_t^{\ell}

ptℓ​=Vℓhtℓ​
p˜ℓt=ℋ(p˜ℓ−1t)+pℓt+∑Nℓ1i=0aℓi⊙pℓt−s1∗i+∑Nℓ2j=1cℓj⊙pℓt+s2∗jp~tℓ=H(p~tℓ−1)+ptℓ+∑i=0N1ℓaiℓ⊙pt−s1∗iℓ+∑j=1N2ℓcjℓ⊙pt+s2∗jℓ \tilde{\mathbf{p}}_{t}^{\ell}=\mathcal{H}\left(\tilde{\mathbf{p}}_{t}^{\ell-1}\right)+\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~​tℓ−1​)+ptℓ​+i=0∑N1ℓ​​aiℓ​⊙pt−s1​∗iℓ​+j=1∑N2ℓ​​cjℓ​⊙pt+s2​∗jℓ​
hℓ+1t=f(Uℓp˜ℓt+bℓ+1)htℓ+1=f(Uℓp~tℓ+bℓ+1) \mathbf{h}_{t}^{\ell+1}=f\left(\mathbf{U}^{\ell}\tilde{\mathbf{p}}_{t}^{\ell}+\mathbf{b}^{\ell+1}\right)

htℓ+1​=f(Uℓp~​tℓ​+bℓ+1)

ℋ(p˜ℓ−1t)H(p~tℓ−1) \mathcal{H}\left(\tilde{\mathbf{p}}_{t}^{\ell-1}\right)

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

H(p~​tℓ−1​)=p~​tℓ−1​。

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=xl−mt+∑Nl1i=0ali⊙hlt−s1∗i+∑Nl2j=0bli⊙hlt+s2∗jxtl=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​=xtl−m​+i=0∑N1l​​ail​⊙ht−s1​∗il​+j=0∑N2l​​bil​⊙ht+s2​∗jl​

FSMN 及其变种 cFSMN DFSMN pyramidal-FSMN的更多相关文章

  1. cFSMN和FSMN参数规模对比分析

    1. FSMN参数规模分析        (1)分析前提: 假设隐藏层单元规模都为n 只分析前向t个时刻的结构,即暂时不考虑双向的结构 只分析向量系数编码,即vFSMN,暂时不考虑sFSMN     ...

  2. FSMN结构快速解读

    参考文献如下: (1) Feedforward Sequential Memory Neural Networks without Recurrent Feedback (2) Feedforward ...

  3. DFSMN结构快速解读

    参考文献如下: (1) Deep Feed-Forward Sequential Memory Networks for Speech Synthesis (2) Deep FSMN for Larg ...

  4. 分布式系统理论进阶 - Paxos变种和优化

    引言 <分布式系统理论进阶 - Paxos>中我们了解了Basic Paxos.Multi Paxos的基本原理,但如果想把Paxos应用于工程实践,了解基本原理还不够. 有很多基于Pax ...

  5. 48. 二叉树两结点的最低共同父结点(3种变种情况)[Get lowest common ancestor of binary tree]

    [题目] 输入二叉树中的两个结点,输出这两个结点在数中最低的共同父结点. 二叉树的结点定义如下:  C++ Code  123456   struct BinaryTreeNode {     int ...

  6. Paxos变种和优化

    分布式系统理论进阶 - Paxos变种和优化 引言 <分布式系统理论进阶 - Paxos>中我们了解了Basic Paxos.Multi Paxos的基本原理,但如果想把Paxos应用于工 ...

  7. R树空间索引及其变种

    1.R树及其变种:百度百科 2.R树详介:http://blog.csdn.net/jazywoo123/article/details/7792745 3.R树及变种小结 R树:叶子节点或中间节点都 ...

  8. Nim游戏变种——取纽扣游戏

    (2017腾讯实习生校招笔试题)Calvin和David正在玩取纽扣游戏,桌上一共有16个纽扣,两人轮流来取纽扣,每人每次可以选择取1个或3个或6个(不允许不取),谁取完最后的纽扣谁赢.Cavin和D ...

  9. <路径算法>哈密顿路径变种问题(2016华为软件精英挑战赛初赛)

    原创博客,转载请联系博主! 前言:几天前华为的这个软件精英(算法外包)挑战赛初赛刚刚落幕,其实这次是我第二次参加,只不过去年只入围到了64强(32强是复赛线),最后搞到了一个华为的一顶帽子(感谢交大l ...

随机推荐

  1. Ubuntu安装sysv-rc-conf配置开机启动服务

    ubuntu下chkconfig的替代方案: 第一步:在终端键入sudo apt-get install sysv-rc-conf安装sysv-rc-conf服务. 第二步:检查设置系统开机自启动服务 ...

  2. ServletRequest与HttpServletRequest

    ServletRequest 解析:代表来自客户端的请求.当Servlet容器接收到客户端的要求访问特定Servlet的请求时,容器先解析客户端的原始请求数据,把它包装成一个ServletReques ...

  3. 【Tools】HP/惠普v285w 量产工具

    前段时间朋友说自己u盘坏了,让帮忙看看.看下图是这个u盘. 坏的问题:往里面复制东西,提示:请去掉写保护或使用另一张磁盘.但是能正常从里面读取出来数据. 无论更换电脑,还是使用网上的修改注册表等方式皆 ...

  4. python爬虫2

    学习任务 获取去哪儿网的出发地列表 获取旅游景点列表 获取景点产品列表 存储数据 1 获取出发地站点 (1)访问touch.qunar.com (2)按F12,单击自由行,在自由行页面点击搜索框 (3 ...

  5. python面试题300道

    本文截取了一些面试题及解决方案: Python 基础 文件操作 模块与包 数据类型 企业面试题 Python 高级 设计模式 系统编程 Python 基础 什么是 Python?根据Python 创建 ...

  6. 在ensp上VLAN基础配置以及Access接口

    什么是VLAN? 早期的局域网技术是基于总线型的结构,也就是说所有主机共享一条传输线路.这就带来了很多问题:冲突域和安全问题.为了避免冲突域,我们使用二层交换机.但想想,一台计算机在总线上传输数据的时 ...

  7. Educational Codeforces Round 71

    https://www.cnblogs.com/31415926535x/p/11460682.html 上午没课,做一套题,,练一下手感和思维,,教育场的71 ,,前两到没啥,,后面就做的磕磕巴巴的 ...

  8. Docker简易安装及命令实例

    docker ~ ~ ~ Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中, ...

  9. 数据分析——matplotlib的用法

    Matplotlib是一个强大的Python绘图和数据可视化的工具包.数据可视化也是我们数据分析的最重要的工作之一,可以帮助我们完成很多操作,例如:找出异常值.必要的一些数据转换等.完成数据分析的最终 ...

  10. Latex局部字体大小设置

    tex 设置字体大小命令由小到大依次为: \tiny \scriptsize \footnotesize \small \normalsize \large \Large \LARGE \huge \ ...