LSTM介绍及加速原理
LSTM的公式可以表示如下所示,其中分别表示输入门,输出门,遗忘门。对LSTM还不熟悉的同学可以先阅读:理解LSTM网络或者直接阅读Christopher Olah 的原博文:Understanding LSTM Networks
从上述公式中,我们先来分析公式中各个部分的计算复杂度,记和的大小为,则大小也是,W的大小为:
- 矩阵乘法【即式中标红部分】:次乘法
- 表示两个向量相同位置的元素相乘:h次乘法
- 和tanh表示对向量中每个元素做映射:h次函数映射
从上述分析我们可以看到,在LSTM式子中的矩阵乘法占据模型的主要计算部分,然而参与计算的需要经过序列的迭代产生,需要等待上一步计算完成生成后才可继续下一步的计算,这是LSTM不能并行化的主要原因,为此QRNN和SRU的主要思想都是将占据主要的计算复杂度的矩阵乘法置于RNN的循环之前,在循环计算过程中只考虑使用运算,降低循环过程的等待时间。具体内容如下所示
QRNN(Quasi-Recurrent Neural Networks)
QRNN为LSTM加速算法,模型结构如下:
QRNN与LSTM不同的是,使用k-gram的卷积的操作替代了LSTM在上式中矩阵乘法【公式中圈红部分】,在该计算中,也通过k-gram的卷积,已经包含一定的序列信息,故而弱化了需要序列计算过程中才产生的hidden_state项,RNN的循环过程中只需pairwise的门计算,极大的降低循环过程的计算量。
作者将门计算,抽象为pooling层,与LSTM的门计算无异,qrnn采用fo-pool方法【也就是LSTM中的forget gate和output gate】,具体计算如下:
卷积层:
对于输入X,分别通过三个卷积层和非线性层得到Z, F, O【计算无需序列迭代,提高并行能力】,公式如下:
这里W_z,W_f,W_o为R^{k * n *m}的卷积滤波器,当滤波器宽度为2时,上述公式可以表示如下:
即滤波器的宽度越大.越能计算更高的n-gram特征,因此为了考虑更多时刻的特征,可以适当增加滤波宽度.
pooling层:
f-pooling【forget gate】:
fo-pooling【forget gate+output gate】:
ifo-pooling【input gate + forget gate+output gate】:
也就是与Z、F、O的计算方式相同,作为一个独立的输入
SRU(Simple Recurrent Units)
5-9x速度提升
SRU的思想其实与QRNN类似【甚至刚发表的时候,还被质疑了】,都是考虑将矩阵乘法放在RNN循环之前,实现循环过程的轻计算,不过其并未使用卷积进行矩阵操作,其计算公式如下所示,在公式中可以看到矩阵乘法与h_t无关,只与输入x_t相关,这部分可以在循环前使用全连接层完成,剩下的都是pair_wise的操作,实现起来速度较快。
此外作者文章也表明该结构与QRNN的一个重要区别之处还在于引入残差结构,如圈红部分所示,能够较好的提升性能:
模型效果: