BERT 能否被“平替”?作業幫文字分類場景下的一次嘗試
文 | 王佳奇 邵睿 蔣巨集飛
背景
近年來,在眾多自然語言處理模型中最具有代表性的就是 BERT,它以優異的效能贏得了廣大演算法工程師的青睞。但是,在有些生產環境中,BERT 龐大的引數量不僅在推理時佔用過多的計算資源,也不利於後續模型的擴充套件迭代。
作業幫的業務體量較大,每天會生產大量的文字資料。這些資料均需要經過自然語言處理模型來生成業務可以直接使用的文字分類標籤。在實際生產階段,我們的場景具有如下特點:
1、標籤分了多期進行建設和產出,每期的標籤在不同的場景有不同的閾值;
2、每個時期的標籤之間既存在獨立性又存在依賴性;
3、每個時期的有監督資料較少,一般的機器學習模型很難取得較好的線上效果,因此每一期的標籤都是基於 BERT 進行 fine-tune 和部署。
目前我們的模型訓練及部署流程如上圖所示。結合作業幫的實際業務場景特點和使用方式,我們面臨如下問題:
1) 每當新的任務需求提出後,都需要對 BERT 進行微調來滿足。
2) 隨著任務數量的增加,伺服器上部署的 BERT 數量也會不斷上升,導致佔用較多的 GPU 計算資源,而且任務之間的排程也會變得更加複雜。
因此,本文將以上述場景作為物件,探討在研究如何平替 BERT 過程中的發現和結果,並對比了它們的各項效能指標。最終目標是找到一個和 BERT 推理效果基本持平,但佔用更少計算資源(特別是減少 GPU 計算資源),同時具有優秀擴充套件性的解決方案。
一、可行的替換方案
方案選擇
為了減少計算資源,將 BERT 進行輕量化處理是一個不錯的選擇。目前主要的輕量化方法如下:
知識蒸餾:知識蒸餾是一種教師 - 學生(Teacher-Student)訓練結構,通常是使用訓練好的教師模型提供知識,學生模型通過蒸餾訓練來獲取教師模型的知識。它能夠以輕微的效能損失為代價,將複雜教師模型中蘊含的知識遷移到相對簡單的學生模型中。
剪枝:在不改變模型結構的情況下,去掉模型中作用較小的連線,從而減小模型的維度。
量化:將高精度的引數型別轉換為低精度較低的引數型別,從而減小模型的尺寸和計算時間消耗。
我們希望新模型不僅可以儘量接近 BERT 的推理效果,而且還能夠顯著減少推理時計算資源的消耗。因此,新模型需要具有一下特徵:
-
模型引數量少。這樣有利於進行快速迭代,且有較快的推理速度。
-
在文字分類任務上表現良好。
考慮到生產環境中積累了大量的基於 BERT 的標籤資料以及平替模型的特點,我們選用的方案是:結合知識蒸餾中 Teacher-Student 方式和主動學習的思路,使用 BERT 對 TextCNN 的推理結果進行篩選,並根據 TextCNN 的輸出 loss 和概率分佈,通過資料增強的方式迭代 TextCNN 的訓練,從而使 TextCNN 的推理效果逼近 BERT。流程如下圖所示:
訓練資料
作業幫的實際業務資料具有以下特徵:
a. 在時間上呈現週期性;
b. 某些資料具有相同的表達正規化;
c. 正負例樣本之間存在較多的競爭性表述,如“表揚”相關的正例表述應該為“求表揚”,如“為什麼我不在表揚榜上?”。而對於“誰在表揚榜”的表述則應該為負例;
d. 資料中的表情符號繁雜,具有某些特殊表情的資料可以代表某一類別;
e. 由於 ASR 或者 OCR 的識別精準度,會導致資料的質量較低。
基於上面提到的特徵,本文對資料進行了如下處理方式:
1) 拉取長時間範圍內的資料,讓時間範圍儘量包括多個數據週期。
2) 為了保證訓練資料的覆蓋完整性,我們使用瞭如下采樣方式:
-
多樣性抽樣:根據標籤的類別,使用 BERT 的 [CLS] 符號對不同的標籤資料進行聚類,得到每個標籤下不同表述的種子資料,再使用種子資料進行多樣性抽樣。
-
隨機抽樣:對預處理後的語料進行隨機抽樣,保證訓練資料的分佈不會發生大的偏移。
-
不確定性抽樣:根據 BERT 預測的結果,篩選出模型決策邊界附近的資料。對於這部分資料,如果在時間和人力成本允許的情況下,可以進行人工標註,否則直接將這部分資料直接捨棄。
3) 去重語句中多餘的符號:對錶情符號做分類統計,篩選出一些特殊的正規化作為語料的前處理,對無用語料進行過濾(如在我們的實際生產環境中,可以直接將滿足這些正規化的句子標記成負例)。
4) 訓練集的劃分:訓練集和測試集的劃分最好在時間上有一定的隔離,比如測試集選用時間範圍距離較近的資料,訓練集則選用時間範圍較遠的資料,這樣既可以驗證資料對週期性,也可以測試模型的泛化能力。
二、訓練方式
模型迭代訓練的完整流程如上圖所示:
首先,訓練基礎的 TextCNN。
然後,根據決策指標評估 TextCNN 模型。如果模型滿足指標需求,則在替換 BERT 前我們還需要取樣近七天的資料測試 TextCNN 的泛化能力。若不滿足指標需求,則需要分析 TextCNN 輸出的 loss 以及標籤得分,確定下一輪訓練資料的取樣策略來有目的性的富集訓練資料。
最後,迭代上述流程,迭代的輪次可以根據預設的指標設定。
三、效果評估
評估指標
評價指標主要基於測試集資料,以 BERT 推理結果為金標準,對比 TextCNN 和 BERT 之間的差距,具體指標如下:
其中,對於 Preicison、Recall 的指標,均以 BERT 推理結果為基準計算。
效果評估
根據訓練流程,我們可以觀察某類標籤在迭代三輪情況下,其指標的相關變化,如下表所示:
Iteration=1 |
Iteration=2 |
Iteration=3 |
|
Precision |
0.5435 |
0.912 |
0.876 |
Recall |
0.405 |
0.438 |
0.882 |
F1-score |
0.464 |
0.591 |
0.878 |
首先,在第一輪迭代時,使用和訓練 BERT 一致的語料訓練 TextCNN,其相關指標都比較低。我們對 loss 排序後篩選出來低分 loss 發現 TextCNN 容易陷入到某些關鍵詞的表述中。如我們需要識別“求表揚”的資料,在結果資料中我們找到兩個比較典型的例子:
“誰在表揚單上呢” vs. “表揚單上沒有我呢”
對於兩個句子,我們真正要篩選出後者的表達方式。那麼,前者是典型的競爭性負例。在實驗過程中產生的更多句子中,我們發現 TextCNN 由於競爭性負例,出現了嚴重的過擬合現象。
進一步地,本著將 TextCNN 逼近 BERT 的目標,我們對抽樣好的資料分別使用訓練好的 TextCNN 和 BERT 進行打分,然後對比兩個模型的得分結果,並進行如下操作:
1、對於一個樣本,若 BERT 分數高於某閾值而 TextCNN 分數低於某閾值,那麼就認為該樣本為競爭性負例;
2、將在 BERT 決策邊界附近的樣本直接捨棄(在條件允許的情況下,這部分資料可以在進行人工重新標註後再放回訓練集中)
在經過上述步驟之後,我們進行第二輪迭代。從指標結果上看,該步驟可以有效的提升 TextCNN 的精確率。
由於模型的召回率還比較低。比如對於“求表揚”標籤,我們對 BERT 的預測該類別 [CLS] 向量進行簡單的聚類分析發現,這類標籤的表述有:
“為什麼我沒上榜” “為什麼我不在表揚榜” “為什麼我沒有小紅花” “怎麼不誇我呢” “表揚時,怎麼沒有唸到我的名字”
同樣的,對比 TextCNN 的聚類結果,我們發現召回的資料大部分集中在某一兩類的表述上。基於此,我們進行了第三輪迭代:使用 [CLS] 向量對訓練資料進行了召回,發現確實存在表述不平衡的情況。因此,針對低召回的問題,我們使用多樣性抽樣的方式對不同的標籤的進行了資料增強。實驗結果表明可以有效的提升模型的召回率。
總結
總體流程可以分為訓練 TextCNN 基礎模型、提升 TextCNN 的精確率以及提升 TextCNN 的召回率三個主要部分。在每個流程部分中根據 loss 和模型輸出的概率分佈,針對不同問題取樣不同的資料。在滿足指標設定的前提下,讓 TextCNN 逼近 BERT 的推理結果。在迭代過程中,我們捨棄了 BERT 決策邊界附近的樣本。從實際應用的角度考慮,這些資料基本也不會漏到下游的應用中,因此捨棄這部分樣本也是合理的。
在生產環境中還需要考慮一個問題是 TextCNN 輸出概率閾值的設定。針對這個問題,我們拉取了不同日期的歷史資料,在預設指標的情況下,動態的搜尋了合理的閾值。
四、模型部署
由於生產環境中涉及的模型較多,因此需要考慮模型同時推理時帶來的計算資源的負載均衡問題。我們使用了任務佇列的方式部署模型:
首先,根據不同模型的優先順序配置不同任務的先後順序;
然後,對不同任務數量的執行進行壓力測試,設定合理的任務併發數量。
具體部署如下圖所示:
TextCNN 部署上線後,同一分類任務在不同的配置下,推理速度 (服務平均吞吐能力) 對比如下表所示。
部署情況 |
計算資源數 |
測試資料量 |
平均吞吐能力 (條/s) |
1卡 |
400k |
83 |
|
1核 |
400k |
5.1 |
|
1核 |
400k |
162 |
|
5核 |
400k |
396.2 |
|
20核 |
800k |
1449.6 |
(備註:本方案因為是離線處理模式,因此忽略單條資料處理時延指標,僅考慮整體吞吐能力)
我們基於 400k~800k 的資料量,對比了如下幾種部署方式的吞吐能力:
-
[email protected]:GPU(2080 Ti) 單卡
-
[email protected]:1 核 CPU
-
[email protected]:1 核、5 核、20 核
從表中對比資料可以看出,[email protected] 的吞吐能力很強大。5 核 CPU 配置就可以接近 4.8 倍的 [email protected](單卡)吞吐能力。而且在實際場景中,CPU 資源往往更廉價更容易擴容,可以輕鬆大幅縮短整體離線任務的處理時間。我們一個實際的線上任務,之前是 [email protected],需要耗時 2 個小時完成,平替為 [email protected] 方案後,只需要 26 分鐘左右即可完成。大幅提前了資料產出時間,為下游應用爭取到了更多的時間視窗。
五、技術總結展望
本文涉及的場景具有以下三個主要的特徵:
1、有大量的歷史資料積累,有利於採用不同的取樣策略來針對性的增強訓練資料;
2、部署的 BERT 模型數量多,不利於後續標籤的更新和維護。同時佔用的 GPU 資源較多,不利於算力成本的維護;
3、允許平替模型在指標上有較低的損失。
因此,從場景特徵出發,本文借鑑蒸餾中 teacher-student 的思想以及主動學習的方法,探索了 TextCNN 替換 BERT 的效果。經過幾輪迭代後,平替版的 TextCNN 可以滿足業務需求,釋放了寶貴的 GPU 資源,處理時間大幅縮短,而且比較利於後續進一步擴充套件更多的文字分類任務。
- 那些 Go 語言發展歷史上的重大決策
- 從趨勢到挑戰,一站式解讀作業系統運維和可觀測性
- 百萬級 Topic,騰訊雲的 Apache Pulsar 穩定性實踐
- Apache Doris 在思必馳的應用優化實踐:海量語音通話資料下,實時、離線一體的數倉架構設計實踐
- 愛數正式開源認知智慧開發框架 KWeaver
- 運維智慧化的三大關鍵技術
- “抄我的還‘反捅’我一刀”,Gary Marcus 發文駁斥圖靈獎得主 Yann LeCun
- 當出海成為必選項,企業如何構建全場景全生態技術底座?
- 數智底座必備能力三:快速構建創新應用
- Docker 多階段構建實戰 (multi-stage builds)
- 工作筆記之 SELECT 語句在 SAP ABAP 中的用法總結(上)
- 經久不衰的設計定律是不要讓我思考的設計
- 不要指望下一個像 GPT 這樣的大型語言模型會民主化
- Java 近期新聞:Helidon Níma、Spring Framework、MicroProfile、MicroStream、Kotlin 和 Piranha
- 一文入門 jQuery
- C 學習 ---__libc_open 函式的原理
- 監控系統工作原理
- 甲骨文新微服務框架 Helidon Níma:使用虛擬執行緒實現高效能
- 【雲原生 | 從零開始學 Kubernetes】二、使用 kubeadm 搭建 K8S 叢集
- Elasticsearch 聚合學習之四:結果排序