更小的模型,邁向更快更環保的NLP

寫在前面

越大的模型總是越好嗎? 長期以來,在屠虐各大排行榜的驅動下,NLP players對此問題的答案似乎是肯定的。 從Google於2018年10月發佈BERT(base版本爲1.1億個參數)到Salesforce於2019年9月發佈的CTRL(16.3億個參數),直到微軟最近發佈的T-NLG(170億個參數),語言模型規模的增長似乎勢不可擋。

相反地,NLP社區中也存在推動較小模型發展的趨勢,其中的參與者如Hugging Face於2019年10月發佈了DistilBERT(參數爲0.66億),Google於2019年9月發佈的ALBERT。這不禁讓我們思考,這種"David over Goliath"現象的motivation是什麼?

第一個主要的答案是成本。訓練這些怪獸可能要花費數萬美元,儘管大型科技公司能負擔得起,而小型公司則相反。 在當前對氣候變化的意識提高的前提下,訓練導致的環境成本也是不可忽略的。 第二個同樣非常關鍵的原因是速度,誰想要在Google搜索時等待幾秒鐘? 增加模型大小可能會導致更好的性能,但也會使模型變慢,從而引起用戶的極大不滿。

在這篇博客文章中,我們討論了研究小模型的新趨勢,並詳細介紹了其中的三個

  • DistilBERT from HuggingFace
  • PD-BERT from Google
  • BERT-of-Theseus from Microsoft Asia

彩票假說

語言模型的參數數量之所以增長的原因是,更多的參數將包含更多的信息,這也將導致更好的模型性能。 從這方面考慮,有些人可能會擔心,通過從訓練完好的模型中隨意刪除參數來達到壓縮模型的效果會嚴重損害其性能。 換句話說:對於模型預測效果而言,某些參數是否比其他參數重要?

答案是肯定的,MIT的Jonathan Frankle和Michael Carbin在2018年發表了一篇有趣的論文,The Lottery Ticket Hypothesis: Finding Sparse, Trainable Neural Networks,將其概念化爲彩票假設:在神經網絡初始化期間,爲網絡的參數初始化值時,將隨機定義模型參數。

在這個幸運大轉盤中,網絡的某些部分初始化的值比其他部分更"幸運"。 帶有幸運票的子網絡具有的初始化值使它們可以更有效地進行訓練,即達到最佳參數值,與網絡的其餘部分相比,這些參數值將在更少的時間內產生良好的結果。 該論文表明,甚至可以使用相同的初始化值將這些子網絡與網絡的其餘部分分開訓練,並且在獲得更少參數的同時仍可以達到相似的精度。

模型壓縮實踐

現在我們知道壓縮模型是有道理的,那麼在實踐中我們該如何做呢? 主要有三種常用方法可以做到這一點。

  • 第一個稱爲量化(quantization),其目的是降低參數精度。 舉個例子,當被問及柏林的溫度是多少時,你可以說10攝氏度,但這並不完全準確,但爲了易於使用,我們將數值取整了。 對於神經網絡而言,減少小數位數有助於降低計算和內存需求。
  • 第二種方法稱爲修剪(pruning ),旨在刪除模型的一部分。 例如,它可以用於刪除連接或神經元。
  • 第三種方法稱爲知識蒸餾(knowledge distillation ),它意味着使用現有的預訓練模型(教師模型)來訓練較小的模型(學生模型)來模仿教師模型。 在這種情況下,模型不會被壓縮,但是要獲得更小,更快的模型的目標是相同的。 有關這些方法的更多信息,可以參考閱讀Rasa一篇非常詳盡的博客文章,Compressing BERT for faster prediction

接下來,我們關注於三個上文提及的模型,以舉例說明壓縮模型在實踐中如何應用。

DistilBERT

論文:DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter
代碼: https://github.com/huggingface/transformers

在過去的幾個月中,知識蒸餾受到了極大關注,特別是在Hugging Face於2019年10月發佈了DistilBERT模型之後。作者將知識蒸餾應用於Google開發的著名BERT模型, DistilBERT的架構類似於原始的BERT基本架構,由12個Transformer編碼器構成,但參數減少了40%。

原始的BERT模型經過了兩項任務的預訓練:Masked Language Model(MLM),即遮掩句子中的單詞並要求模型對其進行預測;以及Next Sentence Prediction(NSP),對於兩個句子A和B,預測句子B是否在句子A之後。

對於MLM,我們強制模型爲實際掩蓋的單詞以及所有其他單詞分配接近真實值的單詞概率。 實際上,我們最小化以下MLM損失函數:
w=1Vym,wlog(pm,w)-\sum_{w=1}^{V} y_{m, w} \log \left(p_{m, w}\right)

如果我們只考慮MLM損失,那麼我們基本上只會訓練一個較小的學生模型,但在教師模型和學生模型之間不會有任何學習。 因此,除了MLM損失外,作者還添加了具有此目的的distillation loss。 掩蓋單詞時,它會迫使學生模型模仿教師模型的輸出概率分佈,那麼具體是怎麼做呢?
w=1Vpm,wTlog(pm,wS)-\sum_{w=1}^{V} p_{m, w}^{T} \log \left(p_{m, w}^{S}\right)
其中,pm,wTp_{m, w}^{T}表示由教師模型TT得到的masked token爲詞表中第ww個單詞的概率;pm,wSp_{m, w}^{S}表示由學生模型SS得到的masked token爲詞表中第ww個單詞的概率;

這樣,通過最小化這種損失,學生模型的概率分佈將趨向於來自老師的模型。最後的訓練目標是MLM loss和distillation loss的線性組合。

關於訓練數據的選擇,DistilBERT是在BERT基礎訓練集中的子集上進行訓練的。 然而,谷歌最近發表的一篇論文表明,即使教師給出無意義的句子(隨機單詞列表)進行訓練也足以使學生獲得良好的表現,因爲教師模型通過其輸出概率分佈所提供的信息足夠強大。 例如,如果訓練句子是“love trash guitar”,而被掩蓋的單詞是“trash”,則訓練後的模型可能會預測“playing”,而不是“trash”,這是學生模型將學習的合理預測結果。 需要注意,這僅適用於蒸餾損失,而不適用於MLM損失,因爲對於後者,這等同於訓練模型使其無意義。

PD-BERT

論文:Well-Read Students Learn Better: On the Importance of Pre-training Compact Models
代碼: https://github.com/google-research/bert

DistilBERT很好地說明知識蒸餾可以幫助構建性能令人滿意的小模型。 但是,這是否意味着廢棄BERT之類良好的舊式預訓練模式? 並不,根據谷歌最近的一篇論文,直接對小模型進行預訓練而無需從較大模型進行初始化會帶來較好的效果,並顯著提高速度。

作者稱之爲 pre-trained distillation(PD)的新方法過程如下。 像大模型一樣,對BERT模型的小版本進行隨機初始化和訓練,並使用上述的MLM方法。 然後,作者以與DistilBERT相同的方式應用知識蒸餾,以幫助較小的模型向較大的模型學習。 最後可以根據標記的數據集對生成的學生模型進行微調,從而使其專注於特定任務(例如情感分析)。 本文的價值還在於,比較了不同的方法(使用和不使用蒸餾的預訓練和微調)。 作者表明,雖然較小模型的經典預訓練和微調已經比DistilBERT產生了更好的結果,但在預訓練和微調之間添加蒸餾有助於達到更好的結果。

學生模型未使用教師部分初始化的原因是使模型大小具有更大的靈活性。 作者總共發佈了4個模型,所有模型均小於BERT基準。 其中最小的模型,即BERT Tiny,僅有440萬個參數,比DistilBERT小15倍,比BERT-base小25倍。
在這裏插入圖片描述
與諸如BERT Large之類的大型體系結構相比,這可以將訓練時間加速多達65倍,並且我們可以想象到,儘管作者沒有提及,推理速度也會優化很多。

BERT-of-Theseus

論文:BERT-of-Theseus: Compressing BERT by Progressive Module Replacing
代碼:https://github.com/JetRunner/BERT-of-Theseus

如果不是讓學生模型在老師模型學習之後進行模仿,而是讓學生和老師同時學習,並且讓學生逐步取代老師,會怎麼樣? 這是微軟亞研院於2020年2月發佈的最新模型BERT-of-Theseus的設想。
在這裏插入圖片描述
研究者受到著名哲學思想實驗「忒修斯之船」的啓發:如果船上的木頭逐漸被替換,直到所有的木頭都不是原來的木頭,那這艘船還是原來的那艘船嗎?

該方法逐步將 BERT 的原始模塊替換成參數更少的替代模塊。研究者將原始模型叫做「前輩」(predecessor),將壓縮後的模型叫做「接替者」(successor),分別對應 KD 中的教師和學生。工作流程如下圖 1 所示:首先爲每個前輩模塊(即前輩模型中的模塊)指定一個替代(接替者)模塊;然後在訓練階段中以一定概率用替代模塊隨機替換對應的前輩模塊,並按照新舊模塊組合的方式繼續訓練;模型收斂後,將所有接替者模塊組合成接替者模型,進而執行推斷。這樣,就可以將大型前輩模型壓縮成緊湊的接替者模型了。
在這裏插入圖片描述

輕量化、快速化

這是一份不同模型的時間對比,
在這裏插入圖片描述
從性能上看,DistilBERT保留了BERT-base性能的97%,而參數卻減少了40%,而Theseus-BERT保留了98.35%,參數也減少了40%。 關於推理速度,就推理速度而言,DistilBERT和Theseus-theseus的速度分別比BERT基於基礎的速度高1.6倍和1.94倍。 Theseus-BERT提供了一些其他優點。 像PD-BERT一樣,它與模型無關,也可以應用於其他基於神經網絡的模型。 訓練更快,成本更低,因爲它僅依賴於微調,這比DistilBERT所需的從頭開始進行預訓練要便宜得多。

最後,Theseus的BERT似乎是一個明顯的贏家,儘管必須指出,它是在DistilBERT之後4個月和PD-BERT之後6個月出版的。 值得一提的是DistilBERT,它也是該研究領域的先驅模型之一,專注於較小的模型,並且很有可能會影響研究人員朝這個方向探索。

隨便嘮嘮

在這篇文章中,我們介紹了三個最近的模型,分別是DistilBERT,PD-BERT和Theseus-BERT,這些模型比其原始的BERT-base模型小,並且速度顯著提高,在大多數任務上的表現都差不多。 回到文章開篇我們討論的話題,由於目標不同,兩種研究趨勢(大模型和小模型)並存的可能性更高,大型科技公司將繼續努力使用大量資源尋求最佳模型,而其他較小的公司及其研究團隊將更多地關注可用於解決業務問題的較小模型。 在理想的世界中,我們甚至可以設想較小的模型比大型模型的性能要好,Google的ALBERT就是一個例子。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章