廣告行業中那些趣事系列19:工業場景超實用的線上推理FastBERT

導讀:本文是“資料拾光者”專欄的第十九篇文章,這個系列將介紹在廣告行業中自然語言處理和推薦系統實踐。本文主要分享基於BERT實現線上推理服務的FastBERT模型。對BERT線上推理服務感興趣的小夥伴可以一起了解下FastBERT模型。

歡迎轉載,轉載請註明出處以及連結,更多關於自然語言處理、推薦系統優質內容請關注如下頻道。

知乎專欄:資料拾光者

公眾號:資料拾光者

廣告行業中那些趣事系列19:工業場景超實用的線上推理FastBERT

最新最全的文章請關注我的微信公眾號:資料拾光者。

摘要:本篇主要分享基於BERT實現線上推理服務的FastBERT模型。首先講了下為啥要用FastBERT模型。因為NLP資料集中不同樣本的識別難度不同,厚重的模型會存在過度計算的問題,而輕量模型則很難識別複雜樣本,FastBERT模型提出了一種根據樣本複雜度動態調整使用Transformer層數的樣本自適應機制(sample-wise adaptive mechanism),從而可以又快又好的提供線上推理服務;然後重點分析了FastBERT模型的來龍去脈,包括FastBERT模型的引入和最佳化思路、模型整體結構、模型訓練和推理流程以及FastBERT論文重要的實驗結論,從理論到實驗論證了FastBERT模型可以又快又好的提供線上推理服務的原理;最後基於作者開源的程式碼實戰了FastBERT。對BERT線上推理服務感興趣的小夥伴可以一起了解下FastBERT模型。

下面主要按照如下思維導圖進行學習分享:

廣告行業中那些趣事系列19:工業場景超實用的線上推理FastBERT

01 為啥要學習FastBERT

1。1 基於BERT文字分類任務的離線和線上服務

目前我們實際專案中主要使用BERT來做文字分類任務,提供文字分類服務主要分成線下服務和線上推理兩種方式:

線下服務其實是透過離線的方式,可以是一次性或者按一定頻度來提供文字分類服務,比如我們現在按日度構建的pipline流來對使用者搜尋query進行文字分類,從而獲取行業標籤詞包。這種方式的典型特點是

對模型預測速度不敏感

,只要在一定的時間內給我返回文字的分類結果就可以,但是需要模型的文字分類效果要好。

線上推理服務則和線下服務差別很大。線上推理服務是得到一條文字資料需要立即返回文字分類的結果,

重點是要快

,比如現在我們拿到使用者搜尋後需要理解使用者的搜尋意圖,同時返回對應的行業標籤,這一整套流程需要在10ms內搞定。所以線上推理服務的典型特點是

對模型的inference速度要求非常高,在使用者可感知的時間內立即返回對應的文字分類的結果,同時對文字分類的效果有一定要求

。俗話說魚和熊掌不可兼得,既然要求線上推理的速度非常高,所以在滿足這個最重要的前提下可能就會在模型的分類效果上允許有一些輕微的損失。

1。2 傳統線上推理服務的方式及缺點

因為使用BERT做文字分類中線下服務和線上推理各自的目標是不同的,所以各自的研究方向也是不同的。先說說線下服務。我目前在團隊裡主要負責的就是線下服務。因為對模型預測速度不會要求很高,重點目標是文字分類的效果,所以我可以使用各種最佳化操作來提升模型的文字分類效果指標。之前也嘗試過一些基於BERT文字分類的最佳化,有興趣的小夥伴可以去看看之前寫的這篇文章《廣告行業中那些趣事系列16:NLPer一定要知道的BERT文字分類最佳化策略及原理》(這篇是持續更新的,有啥最佳化方法都會實時更新到文章中),其中一個重點的研究方向就是對預訓練模型進行折騰,

使用更多的資料,更大的模型

。對於預訓練模型,這些最簡單樸實的操作效果確是驚人的;而線上推理服務主要的目的是保證一定的分類效果的前提下線上推理速度足夠快。對於BERT這種厚重的預訓練模型來說,分類效果是沒問題的,但是推理速度足夠快則讓寶寶頭疼。

廣告行業中那些趣事系列19:工業場景超實用的線上推理FastBERT

頭疼的原因也好理解,因為BERT是基於Transormer的預訓練模型,本身就是“厚重”的模型。谷歌原生基礎版本的BERT預訓練權重有300多M,模型網路引數有上億個,在這樣的大模型下要求線上推理速度快的確是有點難。針對線上推理要求速度快的問題,主要有剪枝、蒸餾、量化操作等方法。剪枝就是對模型的網路進行修剪,比如減掉多餘的頭(因為Transformer使用多頭注意力機制),或者直接粗暴的使用更少的Transformer層數。這種方法直接會降低模型的擬合能力;模型蒸餾其實是把大模型或者多個模型ensemble學到的知識想辦法遷移到一個輕量級的小模型上去,線上部署這個小模型就可以了。之前在分析美團基於BERT進行搜尋實踐的文章中看到模型蒸餾的效果是要好於剪枝的。蒸餾的缺點是存在不確定性,因為你永遠無法知道同樣一個老師能教出如何千奇百怪的學生;量化操作則是以精度換速度。總體來說,剪枝、蒸餾以及量化操作等大模型減肥提速的方法都或多或少的降低模型的分類效果。

02 FastBERT詳解

2。1 FastBERT的引入和最佳化思路

FastBERT是北大+騰訊+北師大在ACL2020提出的一篇論文《FastBERT: a Self-distilling BERT with Adaptive Inference Time》。這篇文章從工業實踐的角度提出了一種又快又好的使用BERT提供線上推理服務的方法FastBERT。簡單通俗的理解FastBERT

可以根據樣本的複雜程度來自適應的調節使用Transformer的層數,從而以最低的精度損失最大化提升線上推理的效率

。要講解FastBERT模型的最佳化原理,我們需要明確以下幾個事實:首先,FastBERT作者發現NLP資料集中樣本識別難易程度是不同的;然後,模型線上推理主要耗時在Transformer層;最後,原生基礎版本的BERT是有十二層Transformer。

瞭解了上面三個事實,然後來看下常規方法存在的問題:

FastBERT的作者發現厚重的模型會對簡單樣本進行過度的計算,而輕量模型可能無法處理複雜樣本

。比如對於原生基礎版本的BERT來說,不管樣本複雜還是簡單都會經過十二層Transformer才會給出結果。也就是說如果有一條簡單樣本,可能只需要前面幾層Transformer就可以得到分類結果,但是厚重模型還是會按照流程走完十二層,這自然是增加了多餘的推理時間。針對這個問題,

FastBERT模型提出了一種根據樣本複雜度動態調整使用Transformer層數的樣本自適應機制(sample-wise adaptive mechanism)

,通俗的理解就是簡單樣本可能只需要過前面幾層Transformer層就能得到分類結果,那麼就不需要再過後面的層,自然就節約了線上推理的時間,對於複雜的樣本可能才需要經過完整的十二層Transformer。這就是FastBERT能又快又好的提供線上推理服務的原因。其實想想這完全是合情合理的。假如你是公司的老闆,能用幾個人搞定的工作何必要讓所有人都去參與?

2。2 模型整體結構

FastBERT模型整體結構如下圖所示:

廣告行業中那些趣事系列19:工業場景超實用的線上推理FastBERT

圖2 模型整體結構

FastBERT模型結構主要由骨幹Backbone和分支Branch組成。骨幹Backbone主要由embedding層、Transformer組成的編碼器以及老師分類器三部分組成,這個結構和常規的BERT文字分類器結構很相似。Embedding層主要將文字資料轉化成三層embedding,分別是詞embedding、句子對關係embedding和位置embedding,然後將三者相加得到最終的embedding表示;Transormer組成的編碼器則扮演特徵抽取器的角色,底層的Transformer的結果作為上一層Transformer的輸入,不斷積累;有區別的是最後的老師分類器。常規的是將Transformer得到的[CLS]向量再經過一層全連線層得到分類的結果。這裡的老師分類器會將提取到的特徵分別經過一個768縮小到128的全連線層、一個向量大小不變但是有自注意力機制self-attention的全連線層和一個將向量投射到分類數目N的帶softmax函式的全連線層。

上面講到FastBERT透過樣本自適應機制來調整使用Transformer的層數來又好又快的進行線上推理,具體做法是透過自蒸餾self-distillation給每一層的Transformer後面再加入一層分類器。這裡每層加入分類器就對應模型結構中的Branch分支。咱們對應原生基礎BERT模型來說,原生基礎BERT有十二層Transformer,那麼就會有十一個學生分類器Student-Classifier,最後一個則是老師分類器Teacher-Classifier。

FastBERT透過不確定性來評估樣本的複雜程度。

如果樣本比較難識別,那麼不確定性就高。咱們對應模型結構圖透過例子詳細說明。模型結構圖中左下角有四條樣本,其中兩條樣本非常簡單,所以它們的不確定性就低,經過第一個學生分類器就可以識別分類了,我們就可以給出這兩條樣本的預測結果,那麼自然就不需要再經過剩下的十一層Transformer了,這對於線上推理的速度提升非常大;還有一條樣本稍微複雜點,在經過第二個學生分類器時不確定性比較低,所以可以得到預測結果;只有最後一條樣本非常複雜,經過完整的十二層Transformer後才最終被識別,基本上推理時間和常規模型是一樣的。透過這麼一個形象的例子咱們可以理解FastBERT是如何提升線上推理的速度。

這裡咱們需要理解FastBERT中為啥叫自蒸餾self-distillation。通常的蒸餾是把大模型或者多個模型ensemble學到的知識想辦法遷移到一個輕量級的小模型上,一般情況下大模型和小模型可能是不同的。但是FastBERT將主幹作為老師模型,然後每層Transformer後新增一個分類器作為學生模型,最後讓學生模型去學習老師模型的知識。因為歸根結底老師模型和學生模型都來自一個模型,所以叫自蒸餾。這裡小夥伴可能有疑問了,為啥不簡單幹脆點,直接用訓練語料去學習學生分類器呢?FastBERT的作者透過實驗證明自蒸餾得到的學生分類器比直接用訓練語料得到的分類器效果好。下面是實驗對比結果:

廣告行業中那些趣事系列19:工業場景超實用的線上推理FastBERT

圖3 實驗對比自蒸餾和直接用訓練語料得到的學生分類器效果

要解讀上面的實驗結論,這裡需要明白論文中的speed概念。FastBERT透過調整引數speed值來動態調整線上推理的速度。Speed值越小,說明調整線上推理的速度越慢。這裡透過極端例子說明,如果我們設定speed值為0,那麼相當於我們調整線上推理速度最慢,其實就相當於使用原生的BERT模型來進行文字分類,也就是每條樣本都會經過全部的Transformer層。反過來speed值越大,那麼我們就希望線上推理的速度快一點,也就是說我們希望樣本儘量經過更少的Transformer層。FastBERT透過調節speed值來自動調整線上推理的速度就是這個原理。從這個例子中咱們得到這樣一個關聯: speed值越小經過的Transformer層數越多,相反speed越大經過的Transformer層越少。明白了speed值的含義,在Book review資料集上設定speed值為0。2時自蒸餾的準確率為86。98%,沒有自蒸餾的準確率僅為86。22%。其他資料類似,透過這個實驗證明自蒸餾的方式的確能提升模型的效果指標。

小結下,

FastBERT模型更像是一種一個師傅帶十一個徒弟守關的任務

。有文字資料來會分別經過前面十一個徒弟的關卡和最後的師傅關卡。簡單的資料可能直接被守在前面的徒弟搞定,稍微複雜的可能被中間或者後面的徒弟攔截,只有最難的資料才會由師傅親自處理。這樣相比於厚重模型需要經過全部的Transformer層和輕量模型無法解決複雜資料來說的確能又好又快的提升模型線上推理能力。

2。3 模型訓練和推理流程

上面分析了FastBERT模型的整體結構,下面看看它是如何進行模型訓練和推理的。總體來說主要分成以下幾個步驟:

預訓練Pre-training。這和BERT模型是一樣的。對大多數人來說直接把谷歌、Facebook等大廠訓練好的預訓練權重拿來用就好。這裡推薦中文文字分類場景下使用RoBERTa-wwm-ext模型,具體原因分析可以檢視我之前寫的這篇文章:

資料拾光者:廣告行業中那些趣事系列18:RoBERTa-wwm-ext模型為啥能帶來線上效果提升?

主幹精調Fine-tuning for backbone。使用下游任務的訓練資料對模型進行微調,獲得一個效果儘可能好的老師分類器。你訓練的老師分類器效果有多牛基本上能決定學生分類器的能力;

分支自蒸餾Self-distillation for branch。上面兩個步驟其實和常規BERT文字分類是一樣的,而分支自蒸餾步驟則是FastBERT的不同之處。自蒸餾的時候可以使用無標註的資料,主要目的是把老師分類器學到的知識傳授給學生分類器。使用KL散度衡量分佈距離, KL散度公式如下所示:

廣告行業中那些趣事系列19:工業場景超實用的線上推理FastBERT

圖4 KL散度公式

同時使用所有分支分類器和主幹分類器的KL散度之和作為損失函式loss,具體公式如下:

廣告行業中那些趣事系列19:工業場景超實用的線上推理FastBERT

圖5 Loss損失函式

最後是自適應推理Adaptive inference。根據樣本的複雜度來自適應的調整使用Transformer的層數,簡單的樣本淺層的分支分類器直接給出結果,複雜的樣本則繼續流入深層的分支分類器。FastBERT用預測結果的熵來衡量不確定性指標,具體公式如下所示:

廣告行業中那些趣事系列19:工業場景超實用的線上推理FastBERT

圖6 不確定性指標計算公式

公式中的N代表分類數量,Ps(i)代表分支分類器預測為類別i的機率。

2。4 FastBERT中重要的實驗結論

(1)不確定性和模型效果的關係

因為FastBERT的自適應推理基於LUHA假設,LUHA假設認為不確定性越低,那麼準確性就會越高。這個假設也比較好理解,不確定性越低,證明模型越有把握,那麼得到的結果準確率應該越高。為了驗證這個假設,FastBERT論文中得到了如下的實驗結果:

廣告行業中那些趣事系列19:工業場景超實用的線上推理FastBERT

圖7 不確定性和模型效果的關係

上圖中發現無論是老師分類器還是學生分類器不確定性較低時模型的準確率較高,相反不確定性較高時模型的準確率較低,相當於證明了

不確定性越低準確性越高

這個LUHA假設。但是透過上圖很容易讓我們產生一個誤解:老師分類器的準確率還不如學生分類器,因為相同的不確定性老師分類器的準確率比學生分類器低。針對這個問題,FastBERT透過下圖說明老師分類器的效果是優於學生分類器的:

廣告行業中那些趣事系列19:工業場景超實用的線上推理FastBERT

圖8 不同speed下各層的不確定性分佈情況

上圖是不同speed下不同層的不確定性分佈情況。咱們詳細解讀下這個實驗。前面說過,speed值越低,說明使用的Transformer層數越多,如果使用原生基礎BERT模型,設定speed為0時就使用全部十二層Transformer,其實就對應FastBERT中的老師分類器,對應上面左上角的a圖。可以看出老師分類器中樣本在前兩層的不確定性均勻分佈,但是後面的層中基本分佈在不確定性較低的區間內,也就是說分類器的效果較好。但是當speed值為0。8時,使用的Transformer層數較少,各學生分類器樣本基本分佈在不確定性較高的區間內,整體分類的效果較差。所以透過上面兩個圖得到兩個重要的結論:老師分類器的效果是優於學生分類器的,不確定性越低準確率越高。

(2)FastBERT線上推理耗時分析

FastBERT相比於常規BERT在每層Transformer後面添加了學生分類器,這裡需要驗證Transformer的運算量要比分類器大的多。下圖是對比FastBERT不同操作下的FLOPS值:

廣告行業中那些趣事系列19:工業場景超實用的線上推理FastBERT

圖9 對比FastBERT不同操作下的FLOPS值

首先需要明確FLOPS是啥。FLOPS(Floating-point operations)是一種度量模型複雜度的指標,表示模型在單個過程需要執行的浮點運算量。通俗的理解就是FLOPs值越大,需要計算的量越大,推理的時間就越長。上圖中發現一個Transformer的總FLOPS是1809。9M,而分類器的總FLOPS僅為46。1M,Transformer運算量基本上是分類器的39倍。透過這個實驗說明

模型線上推理的耗時主要還是在Transformer上

,所以根據樣本複雜度來動態調整需要經過的Transformer層數的確可以有效的提升線上推理的速度。

(3)不同speed對線上推理速度的影響

FastBERT透過調節speed值來動態的調整模型的線上推理速度。下圖是對比Book review資料集下不同speed下各層處理的樣本比例:

廣告行業中那些趣事系列19:工業場景超實用的線上推理FastBERT

圖10 不同speed下各層處理的樣本比例

從上圖中發現speed設定為0。8時,也就是使用更少的Transformer層數,第一個學生分類器就處理了將近60%的樣本。而speed值為0。3時,第一個學生分類器只處理了25%左右的樣本。這個對應到咱們線上推理服務時,當我們需要線上推理的速度非常快,那麼我們會設定FastBERT的speed值很高,同時相當於告訴模型可用的Transformer層數很少,前面的學生分類器能處理的儘量處理掉,這樣需要經過多層Transformer的樣本數量就會少一點,那麼線上推理的速度就會提升了。

(4)不同speed對模型分類效果的影響

這個實驗需要驗證不同speed對模型分類效果的影響。Speed值越大,模型的線上推理速度越快,FastBERT會讓模型儘量在低層的學生分類器儘量把樣本處理了,經過的Transformer層數少了,對應的效果可能會差一點。下面是實驗對比圖:

廣告行業中那些趣事系列19:工業場景超實用的線上推理FastBERT

圖11 對比不同speed下模型的分類效果

上圖中紅色方框內是對比了不同資料集下設定不同speed值對FastBERT模型效果的影響和運算量,可以發現

speed值越小,FastBERT模型的分類效果越好,同時計算量越大

(5)自蒸餾對FastBERT準確率和推理速度的影響

自蒸餾是FastBERT的關鍵步驟,也是最核心的創新點。作者透過下面的實驗證明了自蒸餾可以有效提升模型的線上推理速度,具體如下圖所示:

廣告行業中那些趣事系列19:工業場景超實用的線上推理FastBERT

圖12 自蒸餾可以有效提升FastBERT的線上推理速度

FastBERT在Book review資料集上首先進行三輪微調,然後進行五輪自蒸餾。從圖中可以發現

隨著微調模型的準確率有巨大提升,同時隨著自蒸餾模型的計算量大幅降低。

透過這個實驗可以說明FastBERT中的自蒸餾可以有效提升模型線上推理速度。

小結下,因為NLP資料集中樣本的識別難易程度是不同的,所以需要經過Transformer的層數也不同。厚重模型對簡單樣本進行過度計算,而輕量模型無法識別複雜樣本。針對這些問題,

FastBERT模型提出了一種根據樣本複雜度動態調整使用Transformer層數的樣本自適應機制(sample-wise adaptive mechanism),訓練階段使用自蒸餾機制在每層Transformer後新增學生分類器,線上預測時透過設定speed值可以動態調整模型推理速度,從而最終達到了以更少的精度損失獲得更高效的推理效率的目的

。因為在工業場景中可以根據實際情況自行調整speed值從而調整線上推理的速度,所以非常實用。這裡還需要說明FastBERT主要應用於文字分類、句間關係等這一類NLP任務,對於其他NLP任務需要進一步研究。

03 實戰FastBERT

上面主要從理論角度分析為啥FastBERT可以又快又準的進行線上推理。下面咱們透過實戰的角度來跑一下FastBERT模型。作者已經在github上開源了程式碼,所以小夥伴們可以透過如下地址去下載並執行FastBERT:https://github。com/autoliuweijie/FastBERT

04 總結

本篇主要分享基於BERT實現線上推理服務的FastBERT模型。首先講了下為啥要用FastBERT模型。

因為NLP資料集中不同樣本的識別難度不同,厚重的模型會存在過度計算的問題,而輕量模型則很難識別複雜樣本,FastBERT模型提出了一種根據樣本複雜度動態調整使用Transformer層數的樣本自適應機制(sample-wise adaptive mechanism),從而可以又快又好的提供線上推理服務

;然後重點分析了FastBERT模型的來龍去脈,包括FastBERT模型的引入和最佳化思路、模型整體結構、模型訓練和推理流程以及FastBERT論文重要的實驗結論,從理論到實驗論證了FastBERT模型可以又快又好的提供線上推理服務的原理;最後基於作者開源的程式碼實戰了FastBERT。對BERT線上推理服務感興趣的小夥伴可以一起了解下FastBERT模型。

參考資料

[1]論文:FastBERT: a Self-distilling BERT with Adaptive Inference Time

[2]github原始碼:github。com/autoliuweijie/FastBERT

最新最全的文章請關注我的微信公眾號和知乎專欄:資料拾光者。