DFSMN结构快速解读
参考文献如下:
(1) Deep Feed-Forward Sequential Memory Networks for Speech Synthesis
(2) Deep FSMN for Large Vocabulary Continuous Speech Recognition
1. cFSMN结构解析

有了之前对FSMN结构的了解,现在看cFSMN结构就很简单。由于FSMN需要将记忆模块的输出作为下一个隐层的额外输入,这样就会引入额外的模型参数。而隐层包含的节点越多,则引入的参数越多。
基于此,cFSMN结合矩阵低秩分解的思路,通过在网络的隐层后添加一个低维度的线性投影层,并且将记忆模块添加在这些线性投影层上。进一步的,cFSMN对记忆模块的编码公式进行了一些改变,通过将当前时刻的输出显式的添加到记忆模块的表达中,从而只需要将记忆模块的表达作为下一层的输入。这样可以有效的减少模型的参数量,加快网络的训练。具体的,单向和双向的cFSMN记忆模块的公式表达分别如下:
\[
\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}
\]
\[
\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}
\]
2.DFSMN结构解析

观察结构图可以发现,DFSMN是在cFSMN的基础上,在不同层之间的记忆模块上添加了跳转链接skip connection,从而使得低层记忆模块的输出会被直接累加到高层记忆模块里。这样在训练过程中,高层记忆模块的梯度会直接赋值给低层的记忆模块,从而可以克服由于网络的深度造成的梯度消失问题,使得可以稳定地训练深层的网络。
并且,通过借鉴扩张卷积的思路,DFSMN在记忆模块中引入了一些步幅因子stripe,具体的计算公式如下:
\[
\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}
\]
关于变换H可以是任意的线性或者非线性函数,特别的,如果每一层的记忆模块都是相同维度的,可以直接使用恒等映射:
\[
H(\vec{\tilde{p}_t^{l-1}}) = \vec{\tilde{p}_t^{l-1}}\tag{4}
\]
至于为什么要引入步幅因子,是因为在实际工作处理中,临近单元信息会有大量的冗余,而步幅因子就可以帮助模型适当地消除这种冗余,从而加快模型的训练。
DFSMN结构快速解读的更多相关文章
- FSMN结构快速解读
参考文献如下: (1) Feedforward Sequential Memory Neural Networks without Recurrent Feedback (2) Feedforward ...
- LC-BLSTM结构快速解读
参考文献如下: (1) A Context-Sensitive-Chunk BPTT Approach to Training Deep LSTM/BLSTM Recurrent Neural Net ...
- 快速解读GC日志(转)
本文是 Plumbr 发行的 Java垃圾收集手册 的部分内容.文中将介绍GC日志的输出格式, 以及如何解读GC日志, 从中提取有用的信息.我们通过 -XX:+UseSerialGC 选项,指定JVM ...
- 快速解读GC日志
本文是 Plumbr 发行的 Java垃圾收集指南 的部分内容.文中将介绍GC日志的输出格式, 以及如何解读GC日志, 从中提取有用的信息.我们通过 -XX:+UseSerialGC 选项,指定JVM ...
- 快速解读linq语法
在说LINQ之前必须先说说几个重要的C#语言特性 一:与LINQ有关的语言特性 1.隐式类型 (1)源起 在隐式类型出现之前, 我们在声明一个变量的时候, 总是要为一个变量指定他的类型 甚至在fore ...
- SqlServer字段说明查询及快速查看表结构
SqlServer字段说明查询 SELECT t.[name] AS 表名,c.[name] AS 字段名,cast(ep.[value] )) AS [字段说明] FROM sys.tables A ...
- 解读Cardinality Estimation<基数估计>算法(第一部分:基本概念)
基数计数(cardinality counting)是实际应用中一种常见的计算场景,在数据分析.网络监控及数据库优化等领域都有相关需求.精确的基数计数算法由于种种原因,在面对大数据场景时往往力不从心, ...
- boot.img格式文件拆解实例结构解析
以msm8226为例,讲解android源码编译生成boot.img的结构.boot.img包括boot.img header.kernel以及ramdisk文件系统.下面是对boot.img的结构进 ...
- Java中系统时间的获取_currentTimeMillis()函数应用解读
快速解读 System.currentTimeMillis()+time*1000) 的含义 一.时间的单位转换 1秒=1000毫秒(ms) 1毫秒=1/1,000秒(s)1秒=1,000,000 微 ...
随机推荐
- php RSA非对称加密 的实现
基本概念 加密的意义 加密的意义在于数据的传输过程中,即使被第三方获取到传输的数据,第三方也不能获取到数据的具体含义. 加密方式分为对称加密和非对称加密 什么是对称加密? 对称加密只使用一个秘钥,加密 ...
- C++类有继承时,析构函数必须为虚函数
C++类有继承时,析构函数必须为虚函数.如果不是虚函数,则使用时可能存在内在泄漏的问题. 假设我们有这样一种继承关系: 如果我们以这种方式创建对象: SubClass* pObj = new SubC ...
- String 中intern
首先贴上源码中的注释 在一个String类上调用这个方法的时候如果常量池中存在和这个String对象相同的对象的时候,直接返回常量池中的常量,如果常量池中不存在这个对象,就直接将其将其加入常量池,并且 ...
- 694. Number of Distinct Islands 形状不同的岛屿数量
[抄题]: Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land ...
- Git-git push -u为何第二次不用指定-u?
1,如果当前分支只有一个追踪分支,那么主机名都可以省略,如:git push origin 将当前分支推送到origin主机的对应分支 2,$ git push 如果当前分支与多个主机存在追踪关系,那 ...
- PHP 实现单链表
数据结构是计算机存储.组织数据的方式,结构不同那么数据的检索方式和效率都不一样, 常用的数据结构有 数组 .栈 .队列 .链表 .树.堆 今天讲下单链表,单链表是一种链式存取的数据结构, 跟顺序链表 ...
- Python开发——数据类型【字符串格式化】
字符串格式化之——% # 字符串格式化 msg = 'I am %s , My hobby is %s'%('yuan','play') print(msg) # I am yuan , My hob ...
- grafana add custom dashboard
grafana-dashboard-json prometheus-operator helm 中的grafana dashboard 扩展的时候,需要转换下载(https://grafana.com ...
- IP、TCP、DNS协议
·······················································IP协议························· 位于网络层,作用是把数据包传送 ...
- 201621123002《JAVA程序设计》第三章学习总结
1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词,如类.对象.封装等 关键词:类 对象 封装 构造函数 this,static,final 1.2 用思维导图或者Onenote或 ...