FSMN结构快速解读

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

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} \\]

人已赞赏
随笔日记

看过太多大厂面试题,其实考的无非是这 3 点能力

2020-11-9 3:56:02

随笔日记

RabbitMQ消息队列

2020-11-9 3:56:04

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索