pytorch微调bert_小版BERT也能出奇迹:最火的预训练语言库探索小巧之路
選自Medium
作者:Victor Sanh
機(jī)器之心編譯
參與:魔王
過去一段時(shí)間,大模型層出不窮。在大家紛紛感嘆「大力出奇跡」的時(shí)候,作為調(diào)用預(yù)訓(xùn)練語言模型最流行的庫,HuggingFace 嘗試用更少的參數(shù)量、更少的訓(xùn)練資源實(shí)現(xiàn)同等的性能,于是知識(shí)蒸餾版 BERT——DistilBERT 應(yīng)運(yùn)而生!近日,HuggingFace 發(fā)布了 NLP transformer 模型——DistilBERT,該模型與 BERT 的架構(gòu)類似,不過它僅使用了 6600 萬參數(shù)(區(qū)別于 BERT_base 的 1.1 億參數(shù)),卻在 GLUE 基準(zhǔn)上實(shí)現(xiàn)了后者 95% 的性能。
在過去 18 個(gè)月中,基于大規(guī)模語言模型的遷移學(xué)習(xí)顯著提升了自然語言處理任務(wù)的 SOTA 成績。這些預(yù)訓(xùn)練語言模型通常基于 Vaswani 等人提出的 Transformer 架構(gòu),這些模型的規(guī)模越來越大,訓(xùn)練數(shù)據(jù)集的規(guī)模也越來越大。最近英偉達(dá)提出的預(yù)訓(xùn)練語言模型擁有 83 億參數(shù):是 BERT-large 參數(shù)量的 24 倍、GPT-2 參數(shù)量的 5 倍。而 Facebook AI 最近提出的 RoBERTa 模型在 160GB 文本上訓(xùn)練得到。
社區(qū)中的一些人質(zhì)疑訓(xùn)練越來越大 Transformer 的必要性,尤其是考慮到訓(xùn)練的資金成本和環(huán)境成本時(shí)。該圖展示了部分近期大模型及其參數(shù)量。
Hugging Face 直接體會(huì)到這些模型的流行度,因?yàn)槠漕A(yù)訓(xùn)練語言庫(包含這些模型中的大部分)在近幾個(gè)月的安裝量超過 40 萬次。
- NLP 庫地址:https://github.com/huggingface/pytorch-transformers
然而,盡管這些模型被更大的 NLP 社區(qū)接受,一個(gè)重要且有挑戰(zhàn)性的問題出現(xiàn)了。如何將這些龐然大物投入到生產(chǎn)中?如何在低延遲約束下使用這些大模型?我們需要用(昂貴的)GPU 服務(wù)器執(zhí)行大規(guī)模服務(wù)嗎?
為了構(gòu)建更尊重隱私的系統(tǒng),Hugging Face 注意到在邊緣設(shè)備上運(yùn)行機(jī)器學(xué)習(xí)系統(tǒng)的需求在不斷增長,而不是調(diào)用云 API,將隱私數(shù)據(jù)發(fā)往服務(wù)器。在智能手機(jī)等設(shè)備上運(yùn)行的模型需要是輕量級、響應(yīng)快和能源利用率高的!
最后但同樣重要的一點(diǎn),Hugging Face 越來越擔(dān)憂這些大模型所需的指數(shù)級計(jì)算成本增長。
有很多技術(shù)可以解決前述問題。最常見的工具是量化(使用更小精度逼近全精度模型)和權(quán)重剪枝(移除網(wǎng)絡(luò)中的部分連接)。想了解更多,可以查看這篇關(guān)于 BERT 量化的精彩博客:https://blog.rasa.com/compressing-bert-for-faster-prediction-2/。
Hugging Face 的研究者決定把重點(diǎn)放在知識(shí)蒸餾(distillation)上。蒸餾即,將較大模型(教師模型)壓縮成較小模型(學(xué)生模型)的方法。
知識(shí)蒸餾:遷移泛化能力
知識(shí)蒸餾是一種模型壓縮方法,又叫師生學(xué)習(xí)(teacher-student learning)。它訓(xùn)練一個(gè)小模型,使之復(fù)制大模型(或模型集成)的行為。知識(shí)蒸餾由 Bucila 等人提出,幾年后被 Hinton 等人推廣(參見論文《Distilling the Knowledge in a Neural Network》)。Hugging Face 研究者使用的是 Hinton 等人的方法。
在監(jiān)督學(xué)習(xí)中,分類模型通常用于預(yù)測類別,它利用對數(shù)似然信號(hào)最大化類別概率。在很多案例中,高性能模型預(yù)測的輸出分布中,正確的類別具備高概率,而其他類別的概率則接近于零。
例如,desk chair(辦公椅)可能會(huì)被誤分類為 armchair(扶手椅),但通常不會(huì)被誤認(rèn)為是 mushroom(蘑菇)。這種不確定性被稱為「暗知識(shí)」。
理解蒸餾的另一種方式是,它阻止模型對預(yù)測結(jié)果過于自信(類似于標(biāo)簽平滑)。
以下是一個(gè)實(shí)踐示例。在語言建模過程中,我們通過觀察詞匯分布,可以輕松發(fā)現(xiàn)這種不確定性。下圖展示了 Bert 對電影《卡薩布蘭卡》中某句著名臺(tái)詞的 top 20 補(bǔ)全結(jié)果:
BERT_base 對被遮蔽 token 的 top 20 補(bǔ)全結(jié)果。該語言模型確定了兩個(gè)概率較高的 token(day 和 life)。
如何復(fù)制暗知識(shí)?
在師生訓(xùn)練中,我們訓(xùn)練學(xué)生網(wǎng)絡(luò)來模擬教師網(wǎng)絡(luò)的完整輸出分布(它的知識(shí))。
我們使學(xué)生網(wǎng)絡(luò)和教師網(wǎng)絡(luò)具備同樣的輸出分布,從而使學(xué)生網(wǎng)絡(luò)實(shí)現(xiàn)同樣的泛化。我們不對硬目標(biāo)類別(正確類別的 one-hot 編碼)使用交叉熵來進(jìn)行訓(xùn)練,而是對軟目標(biāo)類別(教師網(wǎng)絡(luò)的概率)執(zhí)行交叉熵,從而將教師網(wǎng)絡(luò)的知識(shí)遷移到學(xué)生網(wǎng)絡(luò)。這樣訓(xùn)練損失函數(shù)就變成了:
其中 t 表示教師網(wǎng)絡(luò)的 logit 值,s 表示學(xué)生網(wǎng)絡(luò)的 logit 值。該損失函數(shù)具備更豐富的訓(xùn)練信號(hào),因?yàn)檐浤繕?biāo)類別比單個(gè)硬目標(biāo)類別提供更多約束。
為了進(jìn)一步揭示類別分布的多樣性,Hinton 等人提出了 softmax-temperature:
其中T 表示溫度參數(shù),當(dāng) T → 0 時(shí),分布接近于 one-hot 目標(biāo)向量,當(dāng) T →+∞ 時(shí),則得到均勻分布。在訓(xùn)練過程中對教師網(wǎng)絡(luò)和學(xué)生網(wǎng)絡(luò)使用同樣的溫度參數(shù),進(jìn)而為每一個(gè)訓(xùn)練樣本提供更多信號(hào)。在推斷時(shí),T 被設(shè)置為 1,恢復(fù)標(biāo)準(zhǔn)的 Softmax 函數(shù)。
PyTorch 動(dòng)手實(shí)踐:壓縮 BERT
Hugging Face 研究者想利用知識(shí)蒸餾壓縮大型語言模型。對于蒸餾,研究者使用 KL 散度作為損失函數(shù),因?yàn)樽顑?yōu)化過程與交叉熵是等價(jià)的:
在計(jì)算 q(學(xué)生網(wǎng)絡(luò)的分布)的梯度時(shí),得到了同樣的梯度。這允許研究者利用 PyTorch 實(shí)現(xiàn)執(zhí)行更快速的計(jì)算:
使用教師網(wǎng)絡(luò) BERT 的監(jiān)督信號(hào),研究者訓(xùn)練得到較小的語言模型——DistilBERT。(研究者使用的是 Bert 的英語 bert-base-uncased 版本)。
按照 Hinton 等人的方法,訓(xùn)練損失是蒸餾損失和遮蔽語言建模損失的線性組合。學(xué)生模型是 BERT 的較小版本,研究者移除了 token 類型的嵌入和 pooler(用于下一句分類任務(wù)),保留了 BERT 的其余架構(gòu),不過網(wǎng)絡(luò)層數(shù)只有原版的 1/2。
備注 1:為什么不減少隱藏層大小呢?將它從 768 減少到 512 即可將參數(shù)總量減少約 1/2。但是,在現(xiàn)代框架中,大部分運(yùn)算是經(jīng)過高度優(yōu)化的,張量最后一維(隱藏維度)的變化對 Transformer 架構(gòu)中使用的大部分運(yùn)算影響較小。在研究者的實(shí)驗(yàn)中,相比隱藏層大小,層數(shù)才是推斷階段的決定性因素。
研究者的早期實(shí)驗(yàn)表明,在該案例中,交叉熵?fù)p失會(huì)帶來更好的性能。因此,他們假設(shè)在語言建模設(shè)置中,輸出空間(詞匯)要比下游任務(wù)輸出空間的維度大得多。而在 L2 損失中,logit 可能會(huì)相互抵消。
訓(xùn)練子網(wǎng)絡(luò)不僅僅關(guān)乎架構(gòu),它還需要找出子網(wǎng)絡(luò)收斂的合適初始化(例如彩票假設(shè)論文《The Lottery Ticket Hypothesis: Finding Sparse, Trainable Neural Networks》)。因此,研究者基于教師網(wǎng)絡(luò) Bert 對學(xué)生網(wǎng)絡(luò) DistilBERT 進(jìn)行初始化,將層數(shù)減半,對學(xué)生網(wǎng)絡(luò)使用與教師網(wǎng)絡(luò)一樣的隱藏層大小。
研究者還使用 RoBERTa 論文中的一些訓(xùn)練 trick,這篇論文證明 Bert 的訓(xùn)練方式對最終性能有著重要影響。遵循 RoBERTa 的訓(xùn)練方式,研究者利用梯度累積以非常大的批次(每個(gè)批次多達(dá) 4000 個(gè)樣本)訓(xùn)練 DistilBERT,訓(xùn)練使用了動(dòng)態(tài)遮擋(dynamic masking),并移除了下一句預(yù)測目標(biāo)。
該訓(xùn)練設(shè)置主動(dòng)接受資源方面的限制。研究者在 8 塊 16GB V100 GPU 上訓(xùn)練 DistilBERT,訓(xùn)練時(shí)長接近三天半,訓(xùn)練數(shù)據(jù)為 Toronto Book Corpus 和英文維基百科(與原版 BERT 的訓(xùn)練數(shù)據(jù)相同)。
DistilBert 的部分代碼來自于 Facebook XLM 的代碼,部分代碼來自 Google AI BERT 的 Hugging Face PyTorch 版本。這些代碼可在 Hugging Face 的 NLP 庫中獲取,該庫還包含多個(gè) DistilBert 訓(xùn)練版本和微調(diào)版本,及其復(fù)現(xiàn)代碼。
模型性能:DistilBERT 測試
研究者在 GLUE 基準(zhǔn)的開發(fā)集上對比了 DistilBERT 和兩個(gè)基線模型的性能,基線模型分別是 BERT base(DistilBERT 的教師模型)和來自紐約大學(xué)的強(qiáng)大非 transformer 基線模型:ELMo + BiLSTMs。研究者使用紐約大學(xué)發(fā)布的 ELMo 基線 jiant 庫和 BERT 基線模型的 PyTorch-Transformers 版本。
如下表所示,DistilBERT 在參數(shù)量分別是基線模型的 1/2 和 1/3 的情況下,性能可與后者媲美。在 9 項(xiàng)任務(wù)中,DistilBERT 的性能通常等同于或優(yōu)于 ELMo 基線(在 QNLI 任務(wù)上的準(zhǔn)確率超出后者 14 個(gè)百分點(diǎn))。令人驚訝的是,DistilBERT 的性能堪比 BERT:在參數(shù)量比 BERT 少 40% 的情況下,準(zhǔn)確率達(dá)到了后者的 95%。
在 GLUE 基準(zhǔn)開發(fā)集上的模型對比結(jié)果。ELMo 的性能結(jié)果來自原論文,BERT 和 DistilBERT 的性能結(jié)果是使用不同種子進(jìn)行 5 次運(yùn)行后的中位數(shù)。
至于推斷性能,DistilBERT 的推斷速度比 BERT 快 60%,規(guī)模也比后者小;DistilBERT 的推斷速度比 ELMo+BiLSTM 快 120%,規(guī)模也比后者小很多。
為了進(jìn)一步調(diào)查 DistilBERT 的加速/規(guī)模權(quán)衡(speed-up/size trade-off),研究者對比了每個(gè)模型的參數(shù)量和在 STS-B 開發(fā)集上使用一塊 CPU、批大小為 1 的情況下完成一個(gè)完整 pass 的推斷時(shí)間,如上表所示。
下游任務(wù):蒸餾和遷移學(xué)習(xí)
研究者進(jìn)一步研究了在高效推斷約束下,DistilBERT 在下游任務(wù)上的應(yīng)用。研究者對緊湊的預(yù)訓(xùn)練語言模型 DistilBERT 進(jìn)行微調(diào),用于分類任務(wù)。這是結(jié)合蒸餾預(yù)訓(xùn)練和遷移學(xué)習(xí)的絕妙方式!
研究者使用 IMDB 評論情感分類數(shù)據(jù)集,該數(shù)據(jù)集包含 5 萬條英文評論(被標(biāo)注為積極或消極):其中 2.5 萬條作為訓(xùn)練數(shù)據(jù),另外一半作為測試數(shù)據(jù)(均類別均衡)。研究者使用一塊 12GB K80 GPU 進(jìn)行訓(xùn)練。
首先,在數(shù)據(jù)集上訓(xùn)練 bert-base-uncased。該模型達(dá)到了 99.98% 的準(zhǔn)確率(3 次運(yùn)行的平均值),幾乎完美!
然后使用同樣的超參數(shù)訓(xùn)練 DistilBERT。該模型達(dá)到了 99.53% 的準(zhǔn)確率(3 次運(yùn)行的平均值),在延遲降低 60%、規(guī)模減少 40% 的情況下,DistilBERT 的性能僅比原版 BERT 低 0.5%!
少即是多:小模型也能出奇跡
Hugging Face 對 DistilBERT 的潛力非常看好。DistilBERT 只是個(gè)開始,它也提出了許多問題:使用知識(shí)蒸餾技術(shù),我們可以把大模型壓縮到什么程度?這些技術(shù)可用于進(jìn)一步探索和洞察大模型中存儲(chǔ)的知識(shí)嗎?在壓縮過程中損失了語言學(xué)/語義學(xué)的哪些方面?……
目前,HuggingFace 的這項(xiàng)研究已經(jīng)開源,并進(jìn)行知識(shí)共享。他們認(rèn)為這是每個(gè)人參與 NLP 進(jìn)展,并收獲最新進(jìn)展果實(shí)的最快和最公平的路徑。
- GitHub 地址:https://github.com/huggingface
- Medium 頁面:http://www.medium.com/huggingface
總結(jié)
以上是生活随笔為你收集整理的pytorch微调bert_小版BERT也能出奇迹:最火的预训练语言库探索小巧之路的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php new static 效率,PH
- 下一篇: 桥梁在线计算机监测系统,桥梁在线监测系统