LightRNN 高效利用記憶體和計算的迴圈神經網路

2021-07-24 07:38:24 字數 3135 閱讀 1879

選自arxiv.org

機器之心編譯

摘要

迴圈神經網路(rnn)已經在許多自然語言處理任務上取得了最出色的表現,比如語言建模和機器翻譯。然而當詞彙量很大時,rnn 模型會變得很大(可能超過 gpu 最大的記憶體能力),這樣訓練將變得很低效。在這項工作中,我們提出一種全新的方法來解決這一挑戰。其中的關鍵思想是使用二分量(2-component(2c))共享的詞表徵的嵌入(embedding for word representations)。

我們將詞彙表中的每乙個詞都分配到乙個**中,其中每一行都關聯了乙個向量,每一列則關聯了另乙個向量。根據乙個詞在表中的位置,該詞可由行向量和列向量兩個維度聯合表示。因為該表中同一行具有相同的行向量,同一列具有相同的列向量,所以我們僅僅需要 2p|v|個向量來表示帶有|v|個詞的詞彙表,這遠遠少於現有的方法所需要的向量數|v|。基於二分量(2-component)共享嵌入的方法,我們設計了一種新的 rnn 演算法,並且使用幾個基準資料集上的語言建模任務對其進行了評估。

結果表明,我們的演算法可以顯著地減少模型的大小,並且能在不犧牲精度的情況下加快訓練速度(它實現了與當前最佳的語言模型相近或更好的困惑度(perplexity))。值得注意的是,在 one-billion-word 基準資料集上,我們的演算法實現了和以前語言模型差不多的困惑度,同時卻將模型的大小減小了 40 到 100 倍、訓練過程也加快了 2 倍。我們將我們提出來的演算法命名為 lightrnn, 這主要是反應它在模型大小上的精簡和很快的訓練速度。

訓練 aclw-french 時的困惑度對比

引言

最近,迴圈神經網路(rnn)已被用於處理多種自然語言處理(nlp)任務,例如語言建模、機器翻譯、情緒分析和問答。有一種流行的 rnn 架構是長短期記憶網路(lstm),其可以通過記憶單元(memory cell)和門函式(gating function)建模長期依賴性和解決梯度消失問題。因為這些元素,lstm 迴圈神經網路在當前許多自然語言處理任務中都實現了最佳的表現,儘管它的方式幾乎是從頭開始學習。

雖然 rnn 越來越受歡迎,但它也存在乙個侷限性:當應用於大詞彙的文字語料庫時,模型的體量將變得非常大。比如說,當使用 rnn 進行語言建模時,詞首先需要通過輸入嵌入矩陣(input-embedding matrix)從 one-hot 向量(其維度與詞彙尺寸相同)對映到嵌入向量。然後為了**下一詞的概率,通過輸出嵌入矩陣(output-embedding matrix)將頂部隱藏層投射成詞彙表中所有詞的概率分布。當該詞彙庫包含數千萬個不同的詞時(這在 web 語料庫中很常見),這兩個嵌入矩陣就會包含數百億個不同的元素,這會使得 rnn 模型變得過大,從而無法裝進 gpu 裝置的記憶體。以 clueweb 資料集為例,其詞匯集包含超過 1000 萬詞。如果嵌入向量具有 1024 個維度並且每個維度由 32 位浮點表示,則輸入嵌入矩陣的大小將為大約 40gb。進一步考慮輸出嵌入矩陣和隱藏層之間的權重,rnn 模型將大於 80gb,這一數字遠遠超出了市面上最好的 gpu 的能力。

即使 gpu 的記憶體可以擴容,用於訓練這樣體量模型的計算複雜度也將高到難以承受。在 rnn 語言模型中,最耗時的運算是計算詞彙表中所有詞的概率分布,這需要疊乘序列每個位置處的輸出嵌入矩陣和隱藏狀態。簡單計算一下就可以知道,需要使用目前最好的單 gpu 裝置計算數十年才能完成 clueweb 資料集語言模型的訓練。此外,除了訓練階段的難題,即使我們最終訓練出了這樣的模型,我們也幾乎不可能將其裝進移動裝置讓它進入應用。

為了應對這些挑戰,在本研究中我們提出了將二分量(2-component)共享的嵌入用於迴圈神經網路中詞表徵的方法。我們將詞彙表中的所有詞放入乙個表中,每一行都與乙個向量關聯,每一列都與另乙個向量關聯。這樣我們就能夠通過兩個元件來表示乙個詞:對應的行向量和列向量。因為該表中同一行具有相同的行向量,同一列具有相同的列向量,所以我們僅僅需要 2p|v|個向量來表示帶有|v|個詞的詞彙表,這樣可以大幅度減少模型體積(相比而言,vanilla 方法需要|v|個不同的向量)。同時,由於模型尺寸的減小,rnn 模型的訓練速度將會顯著加快。因此,我們將這一新演算法稱為 lightrnn,以表示模型的小尺寸和極高的訓練速度。這種方法的最大技術難題是如何將詞合適地分配到表中。

lightrnn(左)對比常規 rnn(右)

為了這個目的,我們提出乙個引導框架:(1)首先隨機初始化詞分配(word allocation),並訓練 lightrnn 模型。(2)解決訓練了的嵌入向量(對應為**中的行和列向量),然後細化分配來最小化訓練損失(training loss),這是圖論(graph theory)最小權重完美匹配問題,我們能夠有效地解決。(3)重複第二步,直到滿足確切的終止標準。

我們使用在多個基準資料集進行語言建模任務來評價 lightrnn。實驗表明,在困惑度(perplexity)上面,lightrnn 實現了可與最先進的語言模型媲美或更好的準確度。同時還減少了模型大小高達百倍,加快了訓練過程兩倍。請注意,對於高度緊湊的模型來說這個可預見的(沒有準確性下降)。

首先,這使得將 rnn 模型運用到 gpu 甚至是移動裝置成為了可能。其次,如果訓練資料很大,需要執行分布式資料平行訓練時,聚合本地工作器(worker)的模型所需要的交流成本會很低。通過這種方式,我們的方法使先前昂貴的 rnn 演算法變得非常經濟且規模化了。因此,它將會對用於人工自然語言處理(nlp)任務的深度學習有深遠的影響。

結論和未來的方向

在本研究中,我們提出了乙個全新的演算法 lightrnn,該演算法可用於自然語言處理任務。通過用於詞表徵的二分量共享的嵌入(2-component shared embedding for word representations),lightrnn 在模型尺寸和執行時間上都取得了高效的表現,特別是在具有大詞彙量的語料庫中。在未來,這種演算法有很多方向可以進一步研究。首先,我們計畫將 lightrnn 應用於更大的語料庫中,如 clueweb 資料集——傳統的 rnn 模型還不能將其裝進乙個現代的 gpu 中。第二,我們會將 lightrnn 應用於機器翻譯和問答等其它自然語言處理任務中。第三,我們會探索 k-分量分享嵌入(k>2)並研究 k 在權衡效率和有效性之間的作用。最後,我們將會整理我們的**,以便在近期通過 cntk 將其發布出來。

python3高效利用記憶體,提高訪問效率

本文介紹通過使用itertools工具包高效利用記憶體,提高訪問效率 通過兩個例子,直觀比較記憶體的使用情況 通過sys.getsizeof函式檢視變數占用的記憶體大小 例子一 通過普通切片方法取list裡面的值 def test func1 value list i for i in range ...

記憶體池 高效實現

記憶體池主要分為三個部分 class buffer t,class bufferpool t,class mempool t 1.class mempool t 記憶體開闢與釋放的介面,既可以通過記憶體池開闢釋放或者在超過記憶體池最大記憶體分配大小時,通過系統進行開闢與釋放。2.class buff...

高效利用百度

中的東西吧?這樣有幾個好處 1 搜尋越來越注重 每天晚上到3點多我還在更新,別說他們這些大型 是夠 的,深夜還在更新,我靠 不過也正是如此這一片文章給我每天帶來了1300多的ip所以以後我變更加堅定我的想法。實在大多數情況下,登入搜尋引擎可不是宣傳和推廣你 的唯一手段。要取得真正的成功,你還需要使用...