参考文献如下:

(1) Feedforward Sequential Memory Neural Networks without Recurrent Feedback

(2) Feedforward Sequential Memory Networks: A New Structure to Learn Long-term Dependency

注意:!!!
小写字母代表单个标量
大写字母代表矩阵
小写字母头上带个小箭头代表向量

1. 模型结构解析:

       观察图(a),可以发现,在隐藏层的旁边,FSMN挂了一个记忆模块Memory Block,记忆模块的作用与LSTM门结构类似,可以用来记住t时刻输入信息的相邻时刻序列的信息。

       根据记忆模块编码方式的区别,FSMN又可以分为sFSMNvFSMN,前者代表以标量系数编码,后者代表以向量系数编码。

       如图(b)的结构,以记住前N个时刻信息为例,其计算公式如下:

\[
\vec{\tilde{h}_t^l} = \sum_{i=0}^{N}a_i^l\cdot \vec{h_{t-i}^l},in...sFSMN\tag{1}
\]

\[
\vec{\tilde{h}_t^l} = \sum_{i=0}^{N}\vec{a_i^l}\odot\vec{h_{t-i}^l},in...vFSMN\tag{2}
\]

       其中,(1)式代表的标量乘积,(2)式代表的是Hadamard积

       因此,可以得到sFSMN下的编码系数向量和vFSMN下的编码系数矩阵:

\[
\vec{a^l}=\{ a_0^l,a_1^l,...,a_N^l\},in...sFSMN\tag{3}
\]

\[
A^l =\{ \vec{a_0^l},\vec{a_1^l},...,\vec{a_N^l}\},in...vFSMN\tag{4}
\]

       有了这一个隐藏层旁挂着的记忆模块,就要将此记忆模块作为输入传递到下一个隐藏层,如图(a):

\[
\vec{h_t^{l+1}} =f(W^l\vec{h_t^l}+\tilde{W}^l\vec{\tilde{h}_t^l} +\vec{b^l} )\tag{5}
\]

       多出来的权重矩阵和偏置系数向量,都是后续训练模型需要调整的参数。

       以上就是简单的回看式FSMN,也就是说当下的记忆模块只关注了它之前的信息,如果还要关注未来的信息,实现上下文联通,也就是所谓的双向的FSMN,直接在(1)式和(2)式中添加后看的阶数即可,如下:

\[
\vec{\tilde{h}_t^l} = \sum_{i=0}^{N_1}a_i^l\cdot \vec{h_{t-i}^l}+\sum_{j=1}^{N_2}c_j^l\cdot \vec{h_{t+j}^l},in...sFSMN\tag{6}
\]

\[
\vec{\tilde{h}_t^l} = \sum_{i=0}^{N_1}\vec{a_i^l}\odot\vec{h_{t-i}^l}+\sum_{j=1}^{N_2}\vec{c_j^l}\odot\vec{h_{t+j}^l},in...vFSMN\tag{7}
\]

       其中N1和N2分别代表前看和后看的阶数。

2. 在文本段落上的应用

       给定一个包含T个单词的序列X,我们可以构造一个T阶的方阵M

\[
M = \left[ \begin{matrix} a_0 & a_1 & \cdots& a_N&0 & \cdots&0\\ 0 & a_0 &a_1 &\cdots& a_N &\cdots&0 \\ \vdots & \vdots & \ddots &\vdots&&&\vdots \\ 0 & 0 & \cdots & a_0&a_1&\cdots&a_N \\\vdots&\cdots&&&\ddots&&\vdots\\\\0&\cdots&&&&&a_0\\ \end{matrix} \right]_{T\times T}in...sFSMN\tag{8}
\]

\[
M = \left[ \begin{matrix} a_0 & a_1 & \cdots& a_{N_1}&0 & \cdots&\cdots&\cdots&0\\ c_1 & a_0 &a_1 &\cdots& a_{N_1}&\cdots&\cdots&\cdots&0\\c_{N_2}&\cdots&c_1&a_0&a_1&\cdots&a_{N_1}&\cdots&0 \\ \vdots && \vdots & \ddots &\ddots&&&\vdots \\ 0 &\cdots &c_{N_2}& \cdots &c_1& a_0&a_1&\cdots&a_{N_1} \\\vdots&\cdots&&&&&\ddots&&\vdots\\\\0&\cdots&&&&c_{N_2}&\cdots&c_1&a_0\\ \end{matrix} \right]_{T\times T}in...vFSMN\tag{9}
\]

       鉴于上式,我们就有了很美的以下这个公式:

\[
\tilde{H} =HM\tag{10}
\]

       更为推广的,对于给定的K个序列:

\[
L=\{X_1,X_2,...,X_K\}\tag{11}
\]

       一个更美的公式诞生了:

\[
\tilde{H} =\left[
\begin{matrix}H_1,H_2,...,H_K\end{matrix}
\right]\left[
\begin{matrix}M_1&&&\\&M_2\\&&\ddots\\&&&&M_K\end{matrix}
\right]=\bar{H}\bar{M}\tag{12}
\]

FSMN结构快速解读的更多相关文章

  1. DFSMN结构快速解读

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

  2. LC-BLSTM结构快速解读

    参考文献如下: (1) A Context-Sensitive-Chunk BPTT Approach to Training Deep LSTM/BLSTM Recurrent Neural Net ...

  3. 快速解读GC日志(转)

    本文是 Plumbr 发行的 Java垃圾收集手册 的部分内容.文中将介绍GC日志的输出格式, 以及如何解读GC日志, 从中提取有用的信息.我们通过 -XX:+UseSerialGC 选项,指定JVM ...

  4. 快速解读GC日志

    本文是 Plumbr 发行的 Java垃圾收集指南 的部分内容.文中将介绍GC日志的输出格式, 以及如何解读GC日志, 从中提取有用的信息.我们通过 -XX:+UseSerialGC 选项,指定JVM ...

  5. 快速解读linq语法

    在说LINQ之前必须先说说几个重要的C#语言特性 一:与LINQ有关的语言特性 1.隐式类型 (1)源起 在隐式类型出现之前, 我们在声明一个变量的时候, 总是要为一个变量指定他的类型 甚至在fore ...

  6. SqlServer字段说明查询及快速查看表结构

    SqlServer字段说明查询 SELECT t.[name] AS 表名,c.[name] AS 字段名,cast(ep.[value] )) AS [字段说明] FROM sys.tables A ...

  7. 解读Cardinality Estimation<基数估计>算法(第一部分:基本概念)

    基数计数(cardinality counting)是实际应用中一种常见的计算场景,在数据分析.网络监控及数据库优化等领域都有相关需求.精确的基数计数算法由于种种原因,在面对大数据场景时往往力不从心, ...

  8. boot.img格式文件拆解实例结构解析

    以msm8226为例,讲解android源码编译生成boot.img的结构.boot.img包括boot.img header.kernel以及ramdisk文件系统.下面是对boot.img的结构进 ...

  9. Java中系统时间的获取_currentTimeMillis()函数应用解读

    快速解读 System.currentTimeMillis()+time*1000) 的含义 一.时间的单位转换 1秒=1000毫秒(ms) 1毫秒=1/1,000秒(s)1秒=1,000,000 微 ...

随机推荐

  1. Flask最强攻略 - 跟DragonFire学Flask - 第七篇 Flask 中路由系统

    Flask中的路由系统其实我们并不陌生了,从一开始到现在都一直在应用 @app.route("/",methods=["GET","POST" ...

  2. TIdHTTP get参数带中文解决方法--请求报文

    Post 看起来稍微复杂先,暂不讨论.post 目前按照一般方法有中文名也可以. 拼接时:pointname=九记餐厅&begintime=2017-03-01 00:00:00& 有 ...

  3. Linux下的换行符\n\r以及txt和word文档的使用

    Linux doc WINDOWS下记事本编写的文档和LINUX下VIM或者GEDIT等编写的文档的不同! 例如WINDOWS下编写的SH脚本,放到LINUX下执行可能会出错. 解决方法: 原因是:W ...

  4. python中argparse

    python中argparse 在很多编程语言中,运行程序可以直接使用function(a,b,……)运行程序,但是在python中就无法实现,那么我们如何在命令行中传递参数呢?在python的中,有 ...

  5. JavaScript内置对象——Math对象

    这几天在刷leetcode的时候用到了一些Math对象的知识,故作一下总结~ JavaScript中的Math对象也是一个常见的内置对象,然而与String等其它常见对象不同,Math对象没有构造函数 ...

  6. ARMV8 datasheet学习笔记4:AArch64系统级体系结构之编程模型(1)-EL/ET/ST

    1.前言 ARMV8系统级编程模型主要包括异常级别.运行状态.安全状态.同步异常.异步异常.DEBUG 本文主要对系统级编程模型做一个概要介绍 2. 异常级别 2.1 Exception level概 ...

  7. 通过全备+relaylog同步恢复被drop的库或表

    MySQL 中drop 等高危误操作后恢复方法 实验目的: 本次实验以恢复drop操作为例,使用不同方法进行误操作的数据恢复. 方法: 利用master同步 伪master+Binlog+同步 利用b ...

  8. Visual Studio 2017 + Python3.6安装scipy库

    Windows10下安装scipy很麻烦,直接在命令行下使用pip install scipy无法安装,但可以借助VS2017的集成环境来安装. (1)首先在Visual Studio Install ...

  9. maven名词解释

    Maven名词解释 Project:任何你想build的事物,Maven都可以认为它们是工程.这些工程被定义为工程对象模型(POM,Poject Object Model).一个工程可以依赖其它的工程 ...

  10. client模式下对应接口加入桥接出错

    client模式下,响应的接口wlan0 加入桥接时出现如下错误: root@root:~# brctl addif br-lan wlan0brctl: bridge br-lan: Operati ...