【像訓練CNN一樣快速訓練RNN】全新RNN實現,比優化後的LSTM快10倍

2020-11-22 和訊

    本文首發於微信公眾號:新智元。文章內容屬作者個人觀點,不代表和訊網立場。投資者據此操作,風險請自擔。

  1新智元報導來源:ArXiv作者:文強

  【新智元導讀】如何有效訓練RNN是一個活躍的研究領域,有很多方法,但還沒有哪種表現出了明顯的優勢,因此也讓今天要介紹的這項工作值得注意。來自ASAPP公司和MIT的兩位研究人員提出了一種名為「簡單循環單元」(Simple Recurrent Unit,SRU)的結構,對現有門控單元做了調整,簡化了狀態計算的過程,從而展現出了與CNN、注意力和前饋網絡相同的並行性。實驗結果表明,SRU訓練速度與CNN一樣,並在圖像分類、機器翻譯、問答、語音識別等各種不同任務中證明了有效性。

  項目已經開源:http://github.com/taolei87/sru

  先看論文摘要,有個大概的了解:

  標題非常直接,也是很多人都想實現的——《像訓練CNN一樣快速訓練RNN》:

  摘要

  RNN因其狀態計算固有的特性難以並行化因而很難擴展。例如,的前向計算要到的計算完成後才能開始,這構成了並行計算的主要瓶頸。在這項工作中,我們提出了一種RNN的替代實現,簡化了狀態計算過程,展現更多的並行性。我們所提出的循環單元,運行速度與卷積層一樣快,比cuDNN優化的LSTM快5-10倍。我們展示了這種循環單元在廣泛應用中的有效性,包括分類、問答、語言建模、翻譯和語音識別。我們開源了在PyTorch和CNTK中的實現。

  簡單循環單元SRU,簡化狀態計算,速度與CNN一樣快

  近來深度學習取得的許多進展都源於模型容量的增加和計算力的相應提升。模型容量增大,通常會涉及使用更大、更深的網絡,而這些網絡又需要複雜的超參數設置和調整。因此,不斷增大的模型和超參數數量也大大增加了訓練時間。

  顯然,計算力已經成為深度學習研究的一大主要瓶頸。作為應對,研究人員開始深入挖掘並行計算的潛力,很多人使用GPU加速訓練來擴展深度學習。不過,雖然諸如卷積和注意力的運算非常適合於多線程/GPU計算,但是循環神經網絡(RNN)仍然不太適合併行化。在典型的RNN實現中,輸出狀態的計算需要等到計算完成後才能開始。這阻礙了獨立計算,並大大減慢了序列處理的速度。

  圖1展示了cuDNN優化後的LSTM和使用conv2d的字級卷積的處理時間。可以看出,兩者區別非常明顯,即使是優化後的LSTM,運行速度也可能慢10倍多。

  圖1:cuDNN優化後的LSTM和使用conv2d的字級卷積的處理時間:即使是優化後的LSTM,運行速度也可能慢10倍多

  於是,作者提出了「簡單循環單元」(Simple Recurrent Unit,SRU),並在論文中表示其計算速度明顯快於現有的循環實現。

  SRU簡化了狀態計算的過程,從而展現出了與CNN、注意力和前饋網絡相同的並行性。

  具體說,雖然SRU的內部狀態ct的更新仍然與前一個狀態ct-1有關,但是在循環步驟中不再依賴於。因此,SRU中的所有矩陣乘法(即gemm)和元素方面的操作可以在不同的維度和步驟中實現並行化。

  SRU實現:增加highway連接和變分dropout

  那麼,SRU是怎麼實現的呢?

  作者指出,當前性能最佳的RNN,比如LSTM和GRU,都使用神經門(neural gate)控制信息流,緩解梯度消失(或爆炸)的問題。

  因此,他們在此基礎上,對門控單元進行了調整。具體說,作者新增加了兩個特徵:首先,他們在循環層之間增加了highway連接,因為此前的研究已經證明,像highway連接這樣的skip connections,在訓練深度網絡時非常有效;

其次,在將RNN正則化時,他們在標準的dropout外,增加了變分dropout,變分dropout在時間步長t與dropout使用相同的mask。

  然後,作者將和步驟t的神經門之間的連接全部丟棄,以這種方法來加速循環計算。相比之下,現有的RNN在實現時是要使用先前的輸出狀態的。

  經過這樣的改善後,對於現有的深度學習庫,SRU已經可以實現超過5倍的加速。接下來,作者還進行了CUDA級的優化,並在一系列不同的基準上進行測試,評估SRU的效果。

  實驗評估結果:圖像分類、語音識別、機器翻譯等任務,實現更好性能的同時,訓練速度更快

  作者還在分類、問答、語言建模、翻譯和語音識別等一系列不同任務中評估了SRU。

  實驗結果證實了SRU的有效性——與這些任務的循環(或卷積)基準模型相比,SRU在實現更好性能的同時,訓練速度也更快。

  圖像分類

斯坦福SQuAD文本處理

語言建模

語音識別

機器翻譯

論文地址:http://arxiv.org/pdf/1709.02755.pdf

  Github地址:http://github.com/taolei87/sru

  說明:論文未經同行評議,這裡有更多討論:http://www.reddit.com/r/MachineLearning/comments/6zduh2/r_170902755_training_rnns_as_fast_as_cnns/

    文章來源:微信公眾號新智元

(責任編輯:婁在霞 HN151)

相關焦點

  • 入門| CNN也能用於NLP任務,一文簡述文本分類任務的7個模型
    作者建議用 1/10 的數據進行測試,其餘數據用於訓練。 data = pd.read_csv( '. RNN 是一系列神經網絡的模塊,它們彼此連接像鎖鏈一樣。每一個都將消息向後傳遞。強烈推薦大家從 Colah 的博客中深入了解它的內部機制,下面的圖就來源於此。
  • 使用Tensorflow實現RNN-LSTM的菜鳥指南
    我們將從數據集中獲取10,000個示例(整個數據的0.9%)並將其用作訓練數據,並使用1,038,576個示例中的其餘部分作為測試數據。num_hidden = 24 cell = tf.nn.rnn_cell.LSTMCell(num_hidden,state_is_tuple = True)對於我們初始化的每個LSTM單元,我們需要為隱藏維度提供值,或者像某些人喜歡稱之為LSTM單元格中的單元數量。它的價值取決於您,過高的值可能導致過度擬合,或者非常低的值可能會產生極差的結果。
  • LSTM實現詳解
    前言在很長一段時間裡,我一直忙於尋找一個實現LSTM網絡的好教程。它們似乎很複雜,而且在此之前我從來沒有使用它們做過任何東西。在網際網路上快速搜索並沒有什麼幫助,因為我找到的都是一些幻燈片。幸運地是,我參加了Kaggle EEG 競賽,而且我認為使用LSTM很有意思,最後還理解了它的工作原理。
  • 用純NumPy碼一個RNN、LSTM:這是最好的入門方式了
    大多數開發者對底層運行機制,尤其是如何使用純 NumPy 實現神經網絡變得比較陌生。以前機器之心曾介紹過如何使用 NumPy 實現簡單的卷積神經網絡,但今天會介紹如何使用 NumPy 實現 LSTM 等循環神經網絡。一般使用純 NumPy 實現深度網絡會面臨兩大問題,首先對於前向傳播,卷積和循環網絡並不如全連接網絡那樣可以直觀地實現。
  • 用RNN和TensorFlow創作自己的《哈利波特》小說
    本文將介紹了我為實現它而編寫的完整代碼。各位巫師可以在這裡直接找到github代碼並自己運行它:https://github.com/amisha-jodhani/text-generator-harry-potter當你閒來無事時,它可以向無聊施一個驅逐咒。背景RNN是什麼?
  • 教程| 如何使用TensorFlow構建、訓練和改進循環神經網絡
    這些模型可以被簡化或通過音素關聯數據的訓練變得更準確,但那是一些乏味的手工任務。因為這個原因,音素級別的語音轉錄在大數據集的條件下相比單詞級別的轉錄更難以實現。因為自然語言的語音不是獨立的,它們與字母也不是一一對應的關係,我們可以通過訓練神經網絡在聲音數據上的重疊窗口(前後 10 毫秒)來捕捉協同發音的效果(一個音節的發音影響了另一個)。以下代碼展示了如何獲取 MFCC 特徵,以及如何創建一個音頻數據的窗口。
  • 小升級大變動,易用性更強,支持自定義RNN
    用TorchScript優化CUDA遞歸神經網絡Pytorch添加的一個新特性是更好地支持帶有TorchScript (PyTorch JIT)的快速自定義遞歸神經網絡(fastrnns)。RNN是一種流行的模型,在各種NLP任務上都表現出了良好的性能。PyTorch可以實現許多最流行的變體,例如Elman RNN、GRU和LSTM,以及多層和雙向變體。
  • 教程 | 如何使用TensorFlow構建、訓練和改進循環神經網絡
    這些模型可以被簡化或通過音素關聯數據的訓練變得更準確,但那是一些乏味的手工任務。因為這個原因,音素級別的語音轉錄在大數據集的條件下相比單詞級別的轉錄更難以實現。因為自然語言的語音不是獨立的,它們與字母也不是一一對應的關係,我們可以通過訓練神經網絡在聲音數據上的重疊窗口(前後 10 毫秒)來捕捉協同發音的效果(一個音節的發音影響了另一個)。
  • 用金庸、古龍群俠名稱訓練LSTM,會生成多麼奇葩的名字?
    http://magicly.me/2017/04/07/rnn-lstm-generate-name/?utm_source=tuicool&utm_medium=referralMagicly:之前翻譯了一篇介紹RNN的文章,一直沒看到作者寫新的介紹LSTM的blog,於是我又找了其他資料學習。
  • 能實現比TensorFlow更好的深度學習嗎?
    第一個模型方法(imdb_bidirectional_lstm.py)使用了雙向 LSTM(Bidirectional LSTM),它通過詞序列對模型進行加權,同時採用向前(forward)傳播和向後(backward)傳播的方法。
  • 代碼詳解:用Pytorch訓練快速神經網絡的9個技巧
    7. 16位混合精度訓練。8. 轉至多GPU(模型複製)。9. 轉至多GPU節點(8+GPUs)。10. 有關模型加速的思考和技巧Pytorch-Lightning文中討論的各種優化,都可以在名為Pytorch-Lightning 的Pytorch圖書館中找到。
  • 在 TensorFlow 上使用 LSTM 進行情感分析
    Word2Vec 模型根據數據集中的每個句子進行訓練,並且以一個固定窗口在句子上進行滑動,根據句子的上下文來預測固定窗口中間那個詞的向量。然後根據一個損失函數和優化方法,來對這個模型進行訓練。這個訓練的詳細過程有點複雜,所有我們這裡就先不討論細節方面的事。但是,對於深度學習模型來說,我們處理自然語言的時候,一般都是把詞向量作為模型的輸入。
  • MXNet 宣布支持 Keras 2,可更加方便快捷地實現 CNN 及 RNN 分布式...
    Keras 是用 Python 編寫的高級神經網絡 API,以快速簡單的 CNN 和  RNN 原型而聞名。Keras 開發人員現在可以使用高性能 MXNet 深度學習引擎進行 CNN 和遞歸神經網絡 RNN 的分布式訓練。通過更新幾行代碼,Keras 開發人員可以使用 MXNet 的多 GPU 分布式訓練功能來提高訓練速度。保存 MXNet 模型是該發行版本一個極具價值的功能。
  • 貌離神合的RNN與ODE:花式RNN簡介
    zeros = K.zeros((K.shape(inputs)[0],                         self.steps,                         K.shape(inputs)[1]))                                                       outputs = K.rnn
  • Mask R-CNN官方實現「又」來了!基於PyTorch,訓練速度是原來2倍
    曉查 發自 凹非寺量子位 報導 | 公眾號 QbitAI來自官方的Mask R-CNN實現終於「又」來了!PyTorch官方Twitter今天公布了一個名為Mask R-CNN Benchmark的項目。10個月前Facebook曾發布過名叫Detecron的項目,也是一款圖像分割與識別平臺,其中也包含Mask R-CNN。
  • 從基礎到 RNN 和 LSTM,NLP 取得的進展都有哪些?
    本文嘗試解釋自然語言處理的基礎知識,以及隨著深度學習和神經網絡的發展,自然語言處理所取得的快速進展。在我們深入研究之前,有必要了解一些基礎知識。語言是什麼?一種語言,基本上是一個由人類社會共享的固定的詞彙表,用來表達和交流他們的思想。這個詞彙表作為他們成長過程的一部分被世代相傳,並且大部分保持不變,每年會增加很少的部分作為補充。
  • 從R-CNN到YOLO,一文帶你了解目標檢測模型(附論文下載)
    https://github.com/apple2373/chainer-simple-fast-rnnhttps://github.com/zplizzi/tensorflow-fast-rcnn這裡還有一個利用對抗學習改進目標檢測結果的應用:http://abhinavsh.info/papers/pdfs/adversarial_object_detection.pdf
  • CNN vs RNN vs ANN——3種神經網絡分析模型,你pick誰?
    有了深度學習,我們就可以實現特徵工程自動化了!機器學習和深度學習間的比較既然我們已經了解了深度學習的重要性,以及它為何能超越傳統的機器學習算法,那麼接下來就讓我們進入本文的關鍵部分。我們將討論在解決深度學習問題時會用到的不同類型的神經網絡。