0
本文作者: 奕欣 | 2017-10-08 11:01 |
雷鋒網(wǎng)AI科技評論按:本文為東北大學自然語言處理實驗室(小牛翻譯團隊)成員肖桐、李垠橋為雷鋒網(wǎng)AI科技評論撰寫的獨家稿件,得到了其指點和審核,雷鋒網(wǎng)在此表示感謝。
團隊簡介:東北大學自然語言處理實驗室(小牛翻譯團隊)由姚天順教授于1980年創(chuàng)立,長期從事機器翻譯及語言分析方面的研究。小牛翻譯團隊所研發(fā)的NiuTrans系統(tǒng)開源版和小牛翻譯企業(yè)版已經(jīng)被來自 60 余個國家的2000多個機構(gòu)使用,并支持44種語言的翻譯。團隊在CWMT、NTCIR等評測中取得多項第一、第二的成績,發(fā)表AI、IJCAI、AAAI、ACL等期刊及會議論文40余篇,并于2016年獲得中文信息處理領(lǐng)域最高獎錢偉長中文信息科學技術(shù)獎(一等獎)。
語言作為人類之間進行溝通交流的橋梁,在歷史發(fā)展的長河中扮演著極其重要的角色。而隨著人工智能時代的到來,人們更加希望語言不僅僅能夠在人和人之間進行信息的傳遞,也能讓機器“理解”人所說的話。而在這個過程中十分重要的一個環(huán)節(jié)就是給人所說的語言建立一個科學有效的模型,具體來說就是讓機器有能力從眾多文字序列中找到合適的字符組合表達語義,與人類進行正常的溝通。
上圖的例子中,我們將語言模型作為一個黑盒,它能夠?qū)θ齻€輸入的“句子”進行一個評判,判斷其語言學上的合理性,這便是語言模型要做的工作。具體來說,它通過鏈式法則對整個文字序列作為句子的可能性進行量化,對每個詞語出現(xiàn)在當前位置(指歷史單詞出現(xiàn)后該詞語出現(xiàn))的概率求乘積得到整句話的概率。
那要如何知道每個詞出現(xiàn)時的概率呢?在神經(jīng)語言模型中,其整體結(jié)構(gòu)如上圖所示(圖為循環(huán)神經(jīng)語言模型[1]),輸入層將離散表示的詞匯轉(zhuǎn)化成連續(xù)空間上的詞向量,不同詞匯之間的向量距離能夠反映詞語之間的相似性。隱藏層將輸入層傳遞來的詞向量進行更深層次的表述。輸出層結(jié)合隱藏層所傳遞來的信息對可能出現(xiàn)在下一個位置的詞進行預(yù)測,獲得詞匯表中每個詞的預(yù)測概率,有了它我們就能夠按照鏈式法則對句子的概率進行預(yù)測了。
隨著在語音識別、機器翻譯等領(lǐng)域?qū)φZ言模型性能需求的日益增長,我們迫切地希望能夠進一步改善神經(jīng)語言模型的性能。一般來說使用更大量的訓(xùn)練數(shù)據(jù)來訓(xùn)練更復(fù)雜的模型結(jié)構(gòu)將會獲得更優(yōu)的模型性能,但與此同時帶來的問題在于其訓(xùn)練所花費的時間消耗也相應(yīng)地變長了。面對這種情況,如何有效地減少訓(xùn)練神經(jīng)語言模型占用的時間成為了亟待解決的問題。
那么如何加快神經(jīng)語言模型的訓(xùn)練呢?在處理器的發(fā)展過程中,前期主要通過提升硬件主頻來提升設(shè)備的運算速度,而后期由于受到物理環(huán)境等客觀因素的限制,逐漸將方向轉(zhuǎn)到多核并行上來提升計算速度。類似于該過程,在神經(jīng)網(wǎng)絡(luò)的訓(xùn)練加速中也主要有兩種方法,一種是通過提高硬件的性能來對訓(xùn)練進行加速,另一種是通過增加參與運算的設(shè)備數(shù)量來達到加速的目的。前者就是對目前來說的一種主流思想,這種方法通過逐漸將神經(jīng)網(wǎng)絡(luò)中矩陣運算相關(guān)的操作由CPU向GPU遷移,達到加速的目的。后者是我們要研究的重點,希望能在更多的設(shè)備上對神經(jīng)語言模型進行訓(xùn)練。
面對著更多的訓(xùn)練數(shù)據(jù),我們要如何在多臺設(shè)備上進行網(wǎng)絡(luò)的訓(xùn)練呢?一種常見的方法就是數(shù)據(jù)并行[2],該方法由Jeffrey Dean等人提出,其核心思想就是將訓(xùn)練數(shù)據(jù)分散到多臺設(shè)備上同時進行訓(xùn)練,并維護同一套網(wǎng)絡(luò)參數(shù)。具體的過程為,在網(wǎng)絡(luò)中設(shè)置一個參數(shù)服務(wù)器,用來保存全局的網(wǎng)絡(luò)參數(shù),其余每臺設(shè)備在計算好自己的權(quán)重梯度后將其發(fā)送給參數(shù)服務(wù)器,由參數(shù)服務(wù)器將梯度更新到全局最新的權(quán)重中來,最后將最新的參數(shù)返回給設(shè)備服務(wù)器完成一個minibatch的更新。
上述方法中存在兩種參數(shù)同步的策略,一種是同步地進行參數(shù)更新,另一種為異步。二者的區(qū)別在于參數(shù)服務(wù)器向每個設(shè)備返回更新后的參數(shù)的時機不同。前者需要等待收集到全部設(shè)備上發(fā)送來的梯度后再進行權(quán)重的更新,而后者每當參數(shù)服務(wù)器收到一個梯度后便將其更新到自身權(quán)重中,并把當前權(quán)重值返回給設(shè)備,過程如上圖所示。由于異步的方式加速效果有限,同時會對模型收斂產(chǎn)生一定程度的負面影響,因此在實際情況中一般較少使用。
理想情況下,由于數(shù)據(jù)并行將數(shù)據(jù)分散到了多臺設(shè)備上進行訓(xùn)練,因此系統(tǒng)訓(xùn)練速度應(yīng)該同設(shè)備數(shù)量的增長而線性增大,但實際結(jié)果并不盡如人意。我們在一臺機器上使用多臺GPU設(shè)備對神經(jīng)語言模型進行訓(xùn)練,速度圖像如上圖所示,并沒有達到所期待的幾張卡速度就翻幾倍的現(xiàn)象。造成這個問題的原因是什么呢?
我們可以看到,在數(shù)據(jù)并行的過程中,權(quán)重矩陣以及梯度需要在設(shè)備之間進行頻繁的數(shù)據(jù)傳輸,不論是機器內(nèi)部設(shè)備之間的傳遞還是機器之間的,這部分的傳輸速度相對設(shè)備的計算性能均相去甚遠。也就是說,雖然我們使用了多臺設(shè)備進行協(xié)同訓(xùn)練,成功地將運算分散到多臺設(shè)備上并行執(zhí)行,但是在這個過程中為了維護同一套網(wǎng)絡(luò)參數(shù),反而在設(shè)備間的數(shù)據(jù)傳輸上投入了不小的精力,導(dǎo)致整體的速度提升受到制約。在之前提到的四卡實驗中,數(shù)據(jù)傳輸所花費的時間就占據(jù)了整個訓(xùn)練耗時的50%左右,給系統(tǒng)并行效率造成嚴重的負面影響。針對上述問題,眾多科研人員也紛紛提出各種策略,希望能降低多設(shè)備訓(xùn)練中數(shù)據(jù)傳輸耗時對并行效果造成的不良影響,這里主要介紹三種常見的優(yōu)化方法。
第一種加速策略叫做All-Reduce[3],它將原本中央化的傳輸結(jié)構(gòu)改為環(huán)形,取消了參數(shù)服務(wù)器的設(shè)置,讓設(shè)備和設(shè)備之間以一種有向環(huán)的結(jié)構(gòu)進行數(shù)據(jù)的傳輸,使得系統(tǒng)內(nèi)帶寬的利用率更高,數(shù)據(jù)傳輸更加高效。
第二種方式叫做double-buffering,通過雙緩沖區(qū)協(xié)同工作的方法,將神經(jīng)網(wǎng)絡(luò)訓(xùn)練過程中梯度計算和數(shù)據(jù)傳遞兩部分進行時間上的重疊,使得單位時間能夠執(zhí)行更多的minibatch。
此外還有一種更加簡單粗暴的方式叫做模型平均[4],該方法在每一輪的訓(xùn)練過程中,不進行設(shè)備間的參數(shù)同步,只有當每一輪訓(xùn)練結(jié)束后才進行參數(shù)的平均。這樣做有效降低了數(shù)據(jù)傳輸?shù)念l次從而達到了加速的效果,對于帶寬較低的物理環(huán)境(如設(shè)備處于多臺機器上,使用以太網(wǎng)進行連接)常常使用它對系統(tǒng)進行優(yōu)化。
面對數(shù)據(jù)傳輸在并行中的大量耗時,我們希望能進一步減小這部分所花費的時間。我們知道傳輸時間等于所要傳輸?shù)臄?shù)據(jù)量除以系統(tǒng)中的帶寬,因此在不對數(shù)據(jù)并行模式進行修改的前提下,我們只能通過兩種手段對其進行加速,分別是提升傳輸速度以及減小數(shù)據(jù)傳輸?shù)臄?shù)量。All-Reduce的方法就屬于第一類,通過數(shù)據(jù)傳輸結(jié)構(gòu)的變化提升了傳輸性能。那么我們換一種思想,能否從第二個角度,也就是減少所要傳輸?shù)臄?shù)據(jù)量來對數(shù)據(jù)傳輸時間進行優(yōu)化呢?
我們擁有有限的帶寬,希望能盡可能快地完成權(quán)重梯度的傳遞,那么一種方式就是對所要傳輸?shù)奶荻染仃囘M行采樣,使得需要被傳輸?shù)臄?shù)據(jù)量更少,這樣花費在這部分的時間也會相應(yīng)地降低。定下了整體的優(yōu)化方向之后,接下來的問題就是我們要按照哪種策略來進行采樣呢?
簡單一句話,“集中力量辦大事”。在向參數(shù)服務(wù)器發(fā)送梯度的時候,從完整的梯度矩陣中抽取出對提高神經(jīng)語言模型性能更有幫助的部分進行傳輸,減少傳輸?shù)臄?shù)據(jù)量,從而達到降低時間消耗的目的,如上圖所示。
這種方法針對神經(jīng)語言模型的不同層提出了不同的采樣策略。以輸出層為例,權(quán)重矩陣為W,其大小為 v*h,v 為詞表大小,h為隱藏層節(jié)點數(shù)目。我們可以看到當網(wǎng)絡(luò)在前向傳播的過程中,權(quán)重的每一行都將與隱藏層的輸出向量進行點乘,得到詞匯表中某一詞的預(yù)測概率。也就是說,輸出層權(quán)重的每一行都和詞表中對應(yīng)位次的詞相對應(yīng),這就是我們要對該層權(quán)重進行采樣的一大重要依據(jù)。為了能讓網(wǎng)絡(luò)更快地收斂,我們讓訓(xùn)練集中頻繁出現(xiàn)的詞所對應(yīng)的行向量具有更高的概率被抽取出來,傳遞給參數(shù)服務(wù)器進行更新。具體的選取策略為:
其中,Vbase為在當前minibatch中出現(xiàn)的詞,Vα為從詞匯表中選擇頻繁出現(xiàn)的若干詞,Vβ為從詞匯表中隨機抽取的詞以保證系統(tǒng)具有良好的魯棒性,在測試集上更穩(wěn)定。同樣,在輸入層和隱藏層也有各自不同的采樣策略。
舉個例子,如下圖所示在訓(xùn)練階段,GPU1根據(jù)自身權(quán)重矩陣計算好它的權(quán)重梯度,然后通過采樣的方法從中抽取第一行和第三行傳遞給參數(shù)服務(wù)器,同理GPU2也執(zhí)行了類似的操作,抽取第二和第三行進行傳輸。參數(shù)服務(wù)器GPU3收到兩臺設(shè)備傳遞過來的權(quán)重梯度后對它們按行進行累加,得到最終的梯度矩陣,將其更新到網(wǎng)絡(luò)參數(shù)中。在這個過程中由于兩臺設(shè)備均未采樣到第四行的梯度向量,因此在更新的時候并未對其進行更新。
前述方法中我們使用采樣的方式對需要傳輸?shù)奶荻冗M行抽取,盡可能頻繁地去更新那些對網(wǎng)絡(luò)性能幫助較大的部分。但其實既然我們已經(jīng)決定舍棄掉了這部分梯度,為了進一步獲得速度上的提升,完完全全可以不去計算它們。我們都知道神經(jīng)網(wǎng)絡(luò)的訓(xùn)練需要經(jīng)過前向傳播和反向傳播兩個步驟以獲得權(quán)重的梯度,這里我們?yōu)樗鼈兘商撞煌牟蓸臃绞健?/p>
還是以輸出層為例,在前向傳播的過程中,我們依據(jù)采樣方式A舍棄掉一部分進行計算,接下來在梯度的反向傳輸過程中按照采樣方式B再次舍棄掉部分梯度的傳遞。方式B采樣的方式同數(shù)據(jù)傳輸中的采樣策略相同,使用Vall對行向量進行篩選,而方式A中我們從詞匯表中又隨機抽取出若干單詞加入到Vall中,這種方式在反向傳播過程中引入了一些噪聲詞匯,能夠有效提升模型的魯棒性。
針對上述兩種方法我們在PTB、FBIS以及Xinhua的數(shù)據(jù)集上進行測試,結(jié)果如上圖所示,其中baseline為異步訓(xùn)練的結(jié)果,可以看出加速效果有限。在三個任務(wù)集上對網(wǎng)絡(luò)進行分布式訓(xùn)練,我們可以看到將采樣的方法應(yīng)用到梯度計算中的加速效果最佳,在使用4張卡的情況下,相對異步的方法可提速2.1倍左右,相對單卡可提升4.2倍左右。
在三個數(shù)據(jù)集上訓(xùn)練LSTM語言模型[5]得到的性能如上圖所示(指標為困惑度),我們可以看到在使用了采樣的方式后模型性能與基線相差不大。下圖給出了在Xinhua的數(shù)據(jù)集上,校驗集困惑度隨訓(xùn)練時間變化的曲線圖,其中在4張卡的環(huán)境下使用了采樣的方式后,可以看到其收斂性明顯優(yōu)于基線,在第五輪訓(xùn)練中困惑度得到明顯下降,同時在8-10輪左右的時候收斂。
在本章的開始處我們提到,在不對數(shù)據(jù)并行模式進行修改的前提下數(shù)據(jù)傳輸?shù)募铀俜绞街饕袃煞N,提升傳輸效率以及減少傳輸數(shù)量,二者分別對應(yīng)我們提到的All-Reduce和采樣的兩種方法。我們在實驗中對比了兩種方式的加速效果,如下圖所示,All-Reduce的方式相對基線在四張卡上可提速約25%,在基于采樣的方式下提速比為41%左右。由于二者對于加速策略的出發(fā)點不同,因此理論上可以同時使用兩種方式對系統(tǒng)進行加速。
通過以上幾個實驗我們可以看到,基于采樣的方法在多設(shè)備上訓(xùn)練神經(jīng)語言模型可以有效減少在數(shù)據(jù)傳輸中的時間消耗,為在更多設(shè)備上訓(xùn)練提供了可能。該方法主要包括數(shù)據(jù)傳輸中的采樣以及梯度計算中采樣,在4張GPU設(shè)備上訓(xùn)練,相對異步的方式可提速約2.1倍,相對單卡訓(xùn)練可提速4.2倍左右。該方法已被成功應(yīng)用到小牛翻譯核心引擎中,對于其所支持的包括漢、英、日、韓等44種語言在內(nèi)的翻譯系統(tǒng),多設(shè)備系統(tǒng)的并行訓(xùn)練性能提升明顯。
注:本文主要內(nèi)容參考IJCAI 2017論文Fast Parallel Training of Neural Language Models,部分實驗來自CWMT 2017論文基于數(shù)據(jù)并行的神經(jīng)語言模型多卡訓(xùn)練分析。
[1]Mikolov T, Karafiát M, Burget L, et al. Recurrent neural network based language model[C]// INTERSPEECH 2010, Conference of the International Speech Communication Association, Makuhari, Chiba, Japan, September. DBLP, 2010:1045-1048.
[2] Dean J, Corrado G S, Monga R, et al. Large scale distributed deep networks[C]. International Conference on Neural Information Processing Systems. Curran Associates Inc. 2012:1223-1231.
[3] Wang L, Wu W, Bosilca G, et al. Efficient Communications in Training Large Scale Neural Networks[J]. 2017.
[4] Hansen L K, Salamon P. Neural Network Ensembles[J]. IEEE Transactions on Pattern Analysis & Machine Intelligence, 1990, 12(10):993-1001.
[5] Surhone L M, Tennoe M T, Henssonow S F. Long Short Term Memory[J]. Betascript Publishing, 2010.
雷峰網(wǎng)特約稿件,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。