LSTM的加速算法:QRNN和SRU

LSTM介绍及加速原理

LSTM的公式可以表示如下所示,其中i_j^c,o_j^c,f_j^c分别表示输入门,输出门,遗忘门。对LSTM还不熟悉的同学可以先阅读:理解LSTM网络或者直接阅读Christopher Olah 的原博文Understanding LSTM Networks

从上述公式中,我们先来分析公式中各个部分的计算复杂度,记\mathbf{x_j^c}\mathbf{h_j^c}的大小为n \times 1,则i_j^c,o_j^c,f_j^c大小也是n \times 1,W的大小为4h \times 2h

  1. 矩阵乘法【即式中标红部分】:4h \times 2h次乘法
  2. \odot表示两个向量相同位置的元素相乘:h次乘法
  3. \sigma和tanh表示对向量中每个元素做映射:h次函数映射

从上述分析我们可以看到,在LSTM式子中的矩阵乘法占据模型的主要计算部分,然而参与计算的\mathbf{h_j^c}需要经过序列的迭代产生,需要等待上一步计算完成生成\mathbf{h_{j-1}^c}后才可继续下一步的计算,这是LSTM不能并行化的主要原因,为此QRNN和SRU的主要思想都是将占据主要的计算复杂度的矩阵乘法置于RNN的循环之前,在循环计算过程中只考虑使用\odot运算,降低循环过程的等待时间。具体内容如下所示

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】:

i_t也就是与Z、F、O的计算方式相同,作为一个独立的输入

 

SRU(Simple Recurrent Units)

5-9x速度提升

SRU的思想其实与QRNN类似【甚至刚发表的时候,还被质疑了】,都是考虑将矩阵乘法放在RNN循环之前,实现循环过程的轻计算,不过其并未使用卷积进行矩阵操作,其计算公式如下所示,在公式中可以看到矩阵乘法与h_t无关,只与输入x_t相关,这部分可以在循环前使用全连接层完成,剩下的都是pair_wise的操作,实现起来速度较快。

此外作者文章也表明该结构与QRNN的一个重要区别之处还在于引入残差结构,如圈红部分所示,能够较好的提升性能:

模型效果:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章