参考文献如下:
(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又可以分为sFSMN
和vFSMN
,前者代表以标量系数编码,后者代表以向量系数编码。
如图(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}
\]