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的一個重要區別之處還在於引入殘差結構,如圈紅部分所示,能夠較好的提升性能:

模型效果:

 

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