zoukankan      html  css  js  c++  java
  • FSMN结构快速解读

    参考文献如下:

    (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{ ilde{h}_t^l} = sum_{i=0}^{N}a_i^lcdot vec{h_{t-i}^l},in...sFSMN ag{1} ]

    [vec{ ilde{h}_t^l} = sum_{i=0}^{N}vec{a_i^l}odotvec{h_{t-i}^l},in...vFSMN ag{2} ]

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

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

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

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

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

    [vec{h_t^{l+1}} =f(W^lvec{h_t^l}+ ilde{W}^lvec{ ilde{h}_t^l} +vec{b^l} ) ag{5} ]

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

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

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

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

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

    2. 在文本段落上的应用

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

    [M = left[ egin{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} ight]_{T imes T}in...sFSMN ag{8} ]

    [M = left[ egin{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} ight]_{T imes T}in...vFSMN ag{9} ]

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

    [ ilde{H} =HM ag{10} ]

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

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

           一个更美的公式诞生了:

    [ ilde{H} =left[ egin{matrix}H_1,H_2,...,H_Kend{matrix} ight]left[ egin{matrix}M_1&&&\&M_2\&&ddots\&&&&M_Kend{matrix} ight]=ar{H}ar{M} ag{12} ]

  • 相关阅读:
    Linux
    python 鸢尾花数据集报表展示
    python 词云
    毕业设计回顾
    editor.md
    杂记
    垃圾回收器
    杂记
    随笔
    杂记
  • 原文地址:https://www.cnblogs.com/machine-lyc/p/10572936.html
Copyright © 2011-2022 走看看