如何評價新提出的RNN變種SRU?

Training RNNs as Fast as CNNs

論文傳送 https://arxiv.org/abs/1709.02755

Simple Recurrent Unit/SRU


SRU是本人和小夥伴@張羽的工作。先感謝一下 @張旭 @天清 等同學的回答。我寫一點對自己工作的理解。

一、動機:

相信搞deep learning NLP 的朋友都遇到過以下問題,

  • RNN的訓練實在是太慢了!這點跑過 RNN CNN的自然懂,無需我多言。
  • 模型的應用性和實驗的可重複性。某模型在某任務A or B上效果很炸。但其他任務呢?模型是否開源?有沒有附上實驗代碼證明可重複性?
  • 網路結構的可解釋性。閱讀到新的網路/模型的時候,是否碰到過「這東西為什麼有效」的疑問 ?舉個栗子,下圖是谷歌利用強化學習找到的循環網路單元NASCell,是不是問號臉(??):

相反很多簡單的東西不僅效果好,並且更具有解釋性,比如殘差(residual)和 注意力機制(attention)。

基於上述三點,SRU及其相關工作旨在提出和探索「簡單快速並更具解釋性的循環神經網路」。我們對SRU進行了較廣泛的測試,同時開源全部代碼。希望得到更多檢驗,甚至幫助找到更有效的模型。

關於可解釋性的一點補充:我對目前常用的RNN的理解是,它們將序列相似度更好的encode在了hidden state中 (they better encode sequence similarity,不太確定怎麼用中文表達),因此能更好的泛化。我的presentation和近期工作有涉及到一些[13, 6], 有時間我會在回答中加入更多討論。。


二、原創性,包括與Quasi-RNN的聯繫:

坦白地說,我們之前並不知道Quasi-RNN的工作。在SRU的報告完成之後,我發給了圈內朋友閱讀並提供修改建議。Yoon Kim 知道Quasi-RNN所以建議我引用這篇工作。於是我在論文出現在arxiv公共平台之前草率的引用了Q-RNN。我們沒有預料到SRU會這麼快在Github / Twitter / Facebook火起來。不到一天的時間就看到Q-RNN作者包括Richard Socher帶有質疑的帖子嚇了一跳 -_-b,現在經過交流雙方算是和解了(想八卦的同學可以翻牆fb,貼子在這裡)。沒有適當引用和比較相關工作是我們的鍋,我們已經修改並提交了第二版本。

回到主題,SRU可以追溯到我和小夥伴們今年ICML 17甚至更早的15年論文 [6,7,8]。因此,我個人並不太贊同SRU就是Quasi-RNN的說法。理由如下,

(1) 網路結構:Quasi-RNN的核心是在 k-gram CNN(文本卷積)的基礎上使用 adaptive gating。在討論k-gram卷積的時候,通常不會使用k=1既 window size 1作為運行參數。這點在包括Q-RNN本身的許多論文中都有體現 [1,2,3,4,5]。SRU中的矩陣變換雖然可以看做 k=1的情況,但這跟聲稱「所有前饋神經網路(fast forward network)都是 k=1 卷積」 或者 「VGG net 和 GoogLeNet 是 AlexNet 改成3*3卷積然後加深度」沒有本質差別。

此外,很多循環/卷積網路變種是殊途同歸的。以"CNN + adaptive weighting"這種思路為例,僅僅本人所知就包括華為實驗室15年的 genCNN [9],我們15年提出的RCNN [8,7],FAIR提出的Gated ConvNet [4] 等等。Q-RNN的作者也承認,很難聲稱誰是「第一」,重要得是去實現和驗證想法

these architectures are so mathematically simple that they』ve been reinvented several times and it』s difficult to be sure exactly who tried them first, but it』s our job as authors to attempt to do it anyway (we certainly failed to include enough discussion of PixelCNN in our arxiv version, but added it in the camera-ready) -- Bradbury

(2) 加速技巧:RNN的加速技巧,包括batched gemm(),element-wise operation fusion等等是由 Nvidia 的研究人員最先提出並開源的 [10,11]。這點我們在論文中講的很清楚,而不像一些同學認為的由Q-RNN提出。由於Q-RNN使用卷積核conv2d,自帶比傳統RNN好很多的加速效果。在SRU中,因為h[t-1]的依賴被去掉,導致可以誇時間維(或者輸入位置)並行加速,這點跟conv2d / Q-RNN是一樣的。

(3) 殘差鏈接:在我們 ICML-17 [6] 的工作中已經對簡化的RNN結構加入殘差鏈接(highway connection)。SRU的結構極其變種已經出現在第一部分PTB的實驗中([6] Figure 3)。這些工作包括實驗、理論解釋和相關證明實際上在17年前已經完成,並收錄在 17年1月畢業答辯之後的畢業論文中 [12]。在此基礎上,SRU和其加速是為了提高應用性,同時在更多的任務數據集上測試該模型有效性。


最後,無論是SRU、Q-RNN 亦或者是諸如百度出品的 persistent RNN [14] 都是為了更好的推動 deep learning / RNN 的研究與應用。期待有更多的改進出現。

先寫這麼多。。碼字太累睡覺了。。有時間我會在回答中加上關於RNN理論的部分。。

文獻:

[1] [1611.01576] Quasi-Recurrent Neural Networks

[2] [1408.5882] Convolutional Neural Networks for Sentence Classification

[3] [1508.06615] Character-Aware Neural Language Models

[4] [1612.08083] Language Modeling with Gated Convolutional Networks

[5] [1404.2188] A Convolutional Neural Network for Modelling Sentences

[6] [1705.09037] Deriving Neural Architectures from Sequence and Graph Kernels

[7] [1512.05726] Semi-supervised Question Retrieval with Gated Convolutions

[8] Molding CNNs for Text

[9] A Convolutional Architecture for Word Sequence Prediction

[10] Optimizing Recurrent Neural Networks in cuDNN 5

[11] [1604.01946] Optimizing Performance of Recurrent Neural Networks on GPUs

[12] https://people.csail.mit.edu/taolei/papers/phd_thesis.pdf

[13] https://people.csail.mit.edu/taolei/papers/thesis_slides.pdf

[14] baidu-research/persistent-rnn


paperweekly最近上線了社區(內測中,網址paperweekly.site),一個最基礎的功能是分享最新的paper一起來討論。今天有一些童鞋在社區對問題中的paper進行了討論,放幾張截圖,歡迎大家來討論。(除了討論,我們還有很多不錯的功能,歡迎大家來試用。)


總的來說,這篇文章是通過改變 recurrent unit 內部狀態的計算方式來加速RNN模型的速度。文章主要從兩個點來做加速的設計,一個是將內部 gate 和 transformed input 的計算只依賴於當前時間步的輸入,因此這些值的計算在多個時間步上可以並行處理;二是將時間步之間相互依賴的 element-wise 的操作全部通過 CUDA-level 下的優化實現 dimension 之間的並行,做成一個 kernel
function 來加速。然後文章通過五個 NLP 相關的任務來驗證了設計的結構的有效性,並且具有接近CNN的訓練速度。

我們知道現在的深度學習模型動輒就是千萬級別的參數量或者更甚,而且網路除了可訓練參數外還有非常多的超參數需要進行手工調節。因此訓練深度學習模型的過程非常的耗時,像一些作者文中提到的 SOTA 的翻譯或者語音識別的模型 [1,2,3] 或者我們自己在訓練對話模型上的經驗,其訓練時間需要耗費數天或者更長,因此嘗試一些新的模型結構或者手工調節模型的超參數非常的耗時,所以當前在整個設計模型的思路或者深度學習的思路不發生改變的情況下,對深度學習來說,其瓶頸就在於計算。就如作者所說,現在雖然為了加速深度學習模型的訓練過程,使用 GPU 對模型的訓練進行並行加速已經在深度學習中被廣泛採用 [4,5],但是對於典型的 RNN 相關模型,其每一個時間步狀態的計算需要依賴於上一個時間步,而這也是其比較適合用來處理序列類型任務的原因 [6],但是也正是這種特點使得它不能進行並行處理(這裡的並行指的是網路結構上的並行)。我們就拿常用的 LSTM[7] 或者 GRU[8] 單元來說,其每一個時間步中的 gate 以及 transformed input 都需要依賴於上一個時間步的狀態,導致各個時間步狀態的各個維度之間都是相互依賴的,因此必須完全等待上一個時間步計算結束才可以開始當前時間步的計算。

因此在這篇文章中,作者將常見的gated recurrent unit做了如下簡化與改進,將各個時間步的gate和 transformed input 的計算只依賴於當前時間步的輸入,然後在 recurrent layers 之間添加了 skip
connections(嚴格來說是highway connections),所以最後整個單元的結構以及相關的計算如下所示:

從上面的圖示以及計算公式(這個繪圖的想法來自於colah的博客[9]),我們可以看到各個時間步的 transformed input、forget gate 以及 reset gate 的值可以並行處理,它們之間已經沒有依賴性,而還存在時間步依賴的計算也只是比較簡單和快速的 element-wise 操作,它們還可以在 dimension 上進行並行,因此這個 RNN 單元現在的計算瓶頸就在三個矩陣乘法了,最後將這三個矩陣乘法可以歸併成一個矩陣乘法。作者為了進一步的加速,將上面的各個時間步之間的 element-wise 的操作優化實現成了 CUDA kernel functions。

在新設計 RNN 單元序列建模的有效性上和表示能力上,作者沒有進行過多書面上的討論,而是通過一系列 NLP 相關的實驗來說明模型在序列建模上的有效性。除了作者在文章中的五個實驗,網上還有同學做了 SRU 在對話生成任務上的實驗[10]。

如果用一句話評價作者提出的 SRU 單元的話,應該說這是一個非常 solid 的工作。提出的結構即簡單明了,又通過充分的實驗證明有效和接近 CNN 的訓練速度,雖說在 idea 上面受到與 Quasi-RNN相似的質疑,但是作者自己已經在上面回答了關於這個問題的討論,所以在這裡不做過多評價。

References:

  1. Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N Gomez, Lukasz Kaiser, and Illia Polosukhin. Attention is all you need. arXiv preprint arXiv:1706.03762, 2017.
  2. Yonghui Wu, Mike Schuster, Zhifeng Chen, Quoc V Le, Mohammad Norouzi, Wolfgang Macherey, Maxim Krikun, Yuan Cao, Qin Gao, Klaus Macherey, et al. Google』s neural machine translation sys- tem: Bridging the gap between human and machine translation. arXiv preprint arXiv:1609.08144, 2016b.
  3. Hasim Sak, Andrew Senior, and Francoise Franc?oise. Long Short-Term Memory Recurrent Neural Network Architectures for Large Scale Acoustic Modeling. In INTERSPEECH, 2014.
  4. Greg Diamos, Shubho Sengupta, Bryan Catanzaro, Mike Chrzanowski, Adam Coates, Erich Elsen, Jesse Engel, Awni Hannun, and Sanjeev Satheesh. Persistent rnns: Stashing recurrent weights on-chip. In International Conference on Machine Learning, pages 2024–2033, 2016.
  5. Priya Goyal, Piotr Dolla?r, Ross Girshick, Pieter Noordhuis, Lukasz Wesolowski, Aapo Kyrola, Andrew Tulloch, Yangqing Jia, and Kaiming He. Accurate, large minibatch sgd: Training imagenet in 1 hour. arXiv preprint arXiv:1706.02677, 2017.
  6. Graves, Alex. Supervised sequence labelling with recurrent neural networks. Vol. 385. Heidelberg: Springer, 2012.
  7. Sak, Ha?im, Andrew Senior, and Fran?oise Beaufays. Long short-term memory recurrent neural network architectures for large scale acoustic modeling. Fifteenth Annual Conference of the International Speech Communication Association. 2014.
  8. Cho, Kyunghyun, et al. Learning phrase representations using RNN encoder-decoder for statistical machine translation. arXiv preprint arXiv:1406.1078, 2014.
  9. Understanding LSTM Networks Understanding LSTM Networks
  10. 乾貨|解讀加實戰:爆款論文SRU在對話生成上的效果 乾貨 | 解讀加實戰:爆款論文 SRU 在對話生成上的效果

本回答來自三角獸研究團隊


給個圖吧

這是LSTM

這是GRU

這是SRU

畫的丑,勉強看


剛剛看完論文,粗淺地發表一下自己的看法。

首先要明白為什麼RNN不好並行。這其實是RNN演算法原理內在的一個瓶頸,因為根據RNN的傳統計算過程,想要計算 h_t 的狀態,要依賴於上一步的狀態值 h_{t-1} 。事實上,如果按照這個計算模式,並行基本不可能有大的作為。因為給你一個序列,你必須像串珍珠一樣一個個的串,不能同時幾個一起串。不過這也是很自然的,RNN是針對序列建模,序列就是存在先後關係的,這種先後關係就是通過這種依賴方式表達出來了。

這篇論文想要做徹底的並行化,丟棄這種依賴於前一個狀態的連接勢在必行。因此可以看到文中計算 h_t 的幾個門的時候,都不再涉及 h_{t-1} ,只涉及當前時間步上的輸入。這樣一來,串珍珠的時候幾個珍珠之間就獨立了,因此也就能並行了。

深層次討論一下,這樣做為什麼可行,因為計算的控制信息流動的門結構都不依賴上一時刻的狀態值,看上去效果很難保證。但是目前論文中報告說,SRU在各個經典RNN任務中都取得了不錯的效果。我認為這可能和他加入的額外部件——殘差連接有莫大關係。

縱觀全文不難看出,SRU唯一能指導門結構建模序列前後關係的一個信息通道就是這個跨時間步的殘差連接。雖然論文對這個部件一筆帶過,但我認為還是很重要的。我也做過相關的是實驗發現RNN加入殘差連接可以加快收斂速度,也可以達到複雜門結構(LSTM,GRU)神經網路的效果。其實我之前也在想這個問題,有了跨時間步的殘差連接,是否還需要時間步之間帶有權重的轉換。沒想到這篇論文已經做出來了。

至於cuda-level的優化基本實現RNNs的常用技巧,在此並不算是重點。

如果這篇論文結果經得起考驗,那麼這次對於RNN系的網路來說,無疑是打開了新世界的大門。

一點淺見,歡迎討論。


我來強答一發,借別人電腦簡寫

其實這個結構之所以exciting,是因為它提高了GPU並行計算效率,實現了RNNs演算法的加速。

演算法的效果精度現在不好評價,簡單談一下加速原理。

有些媒體就是愛搞大新聞!SRU結構並沒有捨棄 h_{t-1} ,實現所謂的不依賴t-1。 h_t 還是依賴 c_{t-1} 的,還是要沿時間步循環的。

但是h和c的計算不再是LSTM式的矩陣乘法(Matrix multiplication

而是Hadamard乘積,即兩個形狀相同矩陣逐元素相乘。

對GPU來說顯然後者要快許多(歡迎補充對比)

熟悉LSTM的知道,LSTM每個門都要和x_t和h_t-1做矩陣乘法。對於GPU來說,將多個小矩陣相乘合併為大矩陣相乘要比串列循環計算多個矩陣乘法快很多。所以LSTM的一種優化加速方案就是將多個門合併進行運算。摘自我之前寫的一個demo框架QuantumLiu/matDL,和cuDNN的加速原理基本一致(沒有層間優化),也可以參考cudnn5.1的相關說明。

同時,x相關的計算因為每個時間步的想已知,所以可以在開始一次性計算。

其中,最大的時間開銷就是矩陣乘法(回家補性能分析)

而element-wise的操作(乘法,加法),速度非常的快。

簡單地說,SRU高明的地方就是他把矩陣乘法放在了串列循環外,用全部x進行兩次大矩陣乘法(合併 f,r ),而把快速的element-wise放在了串列循環內!

以上就是我對SRU加速原理的解讀,匆匆寫成,歡迎補充~


SRU不僅是Training fast,而且Inference also fast。先上圖供大家對比:

SRU

LSTM

Train fast

  1. gate( f_{t} , r_{t} , 	ilde{x_{t}} )的計算不在依賴 h_{t-1}
  2. c_{t}h_{t} 的計算通過CUDA level的element-wise快速算出.

Inference fast

『』在Inference的時候,因為模型已經訓練好了,參數矩陣W、W_f、W_t已經固定了,而每個詞的詞向量x_t也固定了,那就可以提前算好W*x_t, W_f * x_t、W_t * x_t,從而只需要查表就行了,只需要做剩下的向量element-wise乘積就好了,也就是說可以省掉SRU中的矩陣運算。『』引用@楊勇

補充一點:

Model Compression

相比LSTM,SRU在模型大小上也有所減少。

後面就需要結合自己的業務及具體數據集做實驗了。祝大家好運,大吉大利。


1. SRU圖形應該是這個樣子的,(c並未輸出)

2. 加速用的是cuda的矩陣運算,是基於cuda編程實現的。(並非基於Pytorch)

3. 和Quasi-RNN真沒什麼關係。


為什麼沒有跟QRNN的比較?QRNN在公司業務中效果很好,好像百度也採用了。有必要比較下吧?


大致像gru的再減化,去除了本身的前狀態項做激活,記憶狀態全放門裡。。。


推薦閱讀:

AlphaGo 在下棋時知道自己在幹嘛么?
如何評價德國計算機神經網路科學家發表的這篇可以讓電腦模仿任何畫家的風格作畫的論文?
NIPS 2015有什麼值得關注的亮點?
有人說機器學習近些年的發展只是依賴於「大數據」和「高計算」,在演算法上並沒有突破,這是在影射深度學習么?
CNN(卷積神經網路)是什麼?有入門簡介或文章嗎?

TAG:人工智慧 | 機器學習 | 自然語言處理 | 神經網路 | 深度學習(Deep Learning) |