天天看點

Facebook通過10億單詞建構有效的神經網絡語言模型

由于在語言識别、機器翻譯和語言模組化等領域表現出了優異的性能,為序列預測而設計的神經網絡最近再次引起了人們的興趣,但是這些模型都是計算密集型的,成本非常高。比如在語言模組化領域,最新的成果依然需要在大規模gpu叢集上訓練幾周的時間,雖然效果不錯,但是這些計算密集型的實踐對大規模計算基礎設施的依賴性非常強,這限制了其在學術和生産環境中的研究速度與應用。

針對這一計算瓶頸,facebook ai 研究院(fair)設計了一個新的、幾乎是為gpu量身定制的softmax函數,能夠非常有效地通過大規模詞庫訓練神經網絡語言模型。該函數名為自适應softmax,它能根據不均衡的單詞分布建構叢集,使計算複雜度最小化,避免了對詞庫大小的線性依賴。同時能夠在訓練和測試階段充分利用現代架構的特點和多元向量運算進一步降低計算消耗。與分層softmax、nce以及重要性抽樣等之前的、大部分為标準cpu設計的方法相比,該方法更适合gpu。

此外,fair還開發并開源了一個名為torch-rnnlib 的類庫,該類庫允許研究者設計新的遞歸模型,并以最小的努力在gpu上測試這些原型。最近edouard grave、justin chiu 和armand joulin在facebook的網站上發表了一篇文章,介紹了使用者如何通過該類庫設計新的遞歸網絡。

使用torch-rnnlib建構遞歸模型

1. 什麼是語言模組化?

語言模組化就是通過給定詞典中的單詞序列學習其機率分布,根據單詞過去的機率計算其條件分布。t個單詞序列(w1,..., w[t])的機率可以表示為: 

p(w1,..., w[t])) = p(w[t]|w[t-1],..., w1)...p(w1) 

該問題通常通過非參數化的計數統計模型來解決,但是目前基于遞歸神經網絡的參數化模型已經被廣泛應用于語言模組化。

2. 如何使用torch-rnnlib建構标準模型

torch-rnnlib為遞歸神經網絡的建構提供了三種不同的接口: 

1). nn.{rnn, lstm, gru} 接口,用于建構所有層具有相同數量隐藏單元的遞歸網絡。

Facebook通過10億單詞建構有效的神經網絡語言模型

  2). rnnlib.recurrentnetwork接口,用于建構任意形狀的遞歸網絡。

Facebook通過10億單詞建構有效的神經網絡語言模型

3). nn.sequencetable 接口,用于将各種計算有效地連結到一起。nn.recurrenttable 構造器僅是一個輕量級的包裝器,它會随着時間的遷移克隆遞歸子產品。要注意的是,這是最底層的接口,必須調用rnnlib.setuprecurrent(model, initializationfunctions) 設定遞歸隐藏狀态行為。

Facebook通過10億單詞建構有效的神經網絡語言模型

  3. 建構自己的遞歸模型

可以通過定義cell函數或者cell狀态初始化函數來建立自己的模型。下面的代碼展示了如何從零開始建構一個rnn:

Facebook通過10億單詞建構有效的神經網絡語言模型

  4. 在gpu上訓練torch-rnnlib

因為torch-rnnlib遵循nn子產品接口,是以調用模型的:cuda()方法就能将其拉到gpu上執行。rnnlib的目的就是讓使用者能夠靈活地建立新的cell函數或者使用快基線。

此外,無論使用前面提到的第一個還是第二個接口建構遞歸網絡,都能非常容易地使用cudnn來加速網絡。對于第一個接口,通過usecudnn = true來調用構造函數:

Facebook通過10億單詞建構有效的神經網絡語言模型

對于第二個接口,将rnnlib.makerecurrent替換成rnnlib.makecudnnrecurrent,然後将cell函數修改為cudnn接口中的cellstring。例如:

Facebook通過10億單詞建構有效的神經網絡語言模型

這樣模型的遞歸部分通常會有至少兩倍的速度提升。但是這并不是說整個模型會提速至少兩倍,特别是當主要計算工作并不在遞歸部分的時候,此時提升會更小一些。

Facebook通過10億單詞建構有效的神經網絡語言模型

圖:torch-rnnlib及其他torch類庫随着隐藏層數量的增加其運作時間的折線圖

5. 自适應softmax

在處理語言模型等大規模輸出空間的時候,分類器可能是模型的計算瓶頸。過去提出的很多解決方案通常都是針對标準cpu而設計的,很少充分利用gpu所特有的能力。

facebook開發的、新的自适應softmax能夠根據資料的分布情況調配計算資源。它能通過加快常用類的通路速度,提供更多計算資源,來實作更好近似值和更快運作時間之間的平衡。更确切地說,它實作了一種k-way 分層softmax,能夠根據gpu的架構,通過動态規劃算法實作計算資源的有效配置設定。為了進一步降低分類器的計算負擔,自适應softmax還使用了一些技巧:使用淺樹(shallow trees)避免順序計算;為每個叢集設定類數量的最小值,避免浪費gpu的并行計算能力。

正如圖表1所展示的那樣,自适應softmax的性能與完整softmax的性能幾乎不相上下,但是訓練時間非常短。

Facebook通過10億單詞建構有效的神經網絡語言模型

  圖表1:基于text8的性能。 ppl越低越好。

Facebook通過10億單詞建構有效的神經網絡語言模型

  圖:不同softmax近似函數語言模型的收斂性。該資料基于lstm。

測試結果

facebook兩個模型的參數配置如下:小模型使用了有2048個單元的單層lstm,大模型使用了每層有2048個神經元的雙層lstm。訓練模型使用adagrad,權重調整使用l2。批處理大小為128,反向傳播視窗大小為20。

Facebook通過10億單詞建構有效的神經網絡語言模型

  圖表2:基于10億單詞進行訓練後的模型複雜度(越低越好)的比較。

如圖表2所示,小模型經過幾天的訓練複雜度達到了43.9,大模型經過6天的時間複雜度達到了39.8。目前最佳複雜度是由jozefowicz et al.在2016年實作的30.0,但是jozefowicz et al.達到這一數值使用了32顆gpu,花了3周多的時間;而facebook僅用1顆gpu花了幾天時間。

本文轉自d1net(轉載)

繼續閱讀