機器之心發布
機器之心編輯部
騰訊 QQ 團隊研究員對 BERT 進行了模型壓縮,在效果損失很小的基礎上,LTD-BERT 模型大小 22M,相比於 BERT 模型內存、存儲開銷可降低近 20 倍,運算速度方面 4 核 CPU 單機可以預測速度加速 80 餘倍。相關代碼和更多結果將在近期開源。
BERT 已經被驗證是解決口語化短文本語義量化的極為有效的工具,對於口語化人機互動系統如 FAQ、語音助手等產品意義重大。但受限於模型的高複雜度和高計算量,其產業線上應用進展不如預期,尤其很難滿足像 QQ、QQ 空間等億級用戶量產品對性能的需求。
為了解決這個問題,QQ 團隊研究人員提出了 Learning to Distill BERT (LTD-BERT) 的模型對 BERT 進行了模型壓縮,在效果損失很小的基礎上,LTD-BERT 模型大小 22M,相比於 BERT 模型內存、存儲開銷可降低近 20 倍,運算速度方面 4 核 CPU 單機可以預測速度加速 80 餘倍。另外,LTD-BERT 也被驗證在下遊任務可以保持與 BERT 近似的效果,包括相似度計算、短文本分類、短文本聚類等,其應用場景包括但不限於語義匹配、意圖識別、文本聚類分析等。
據機器之心了解,從 2019 年 8 月份在騰訊內部開源至今,LTD-BERT 的效果已經在 QQ、騰訊新聞、騰訊遊戲、騰訊看點、騰訊健康等服務海量用戶的產品的實際任務中得到驗證,確保算法擁有足夠的泛化能力和實用性。
此外,該團隊還表示 LTD-BERT 相關代碼和更多結果將在近期開源。 簡介 2018 年底 Google 提出並開源了 BERT(Bidirectional Encoder Representation from Transformers),對 NLP 的影響已經綿延至今,非常多的 NLP 公開任務都被基於預訓練 BERT 的工作刷榜,在工業界大家也逐漸的直接或通過 finetuning 將 BERT 運用到實際業務當中。
但是在這個過程中讓大家非常頭疼的事情就是因為超大的參數量,BERT 的運算速度和資源開銷是很難權衡的問題。GPU 上線速度較快,但是成本很高;CPU 上線的話運算速度較慢,需要做大量的底層優化工作。 為了解決這個問題,QQ 研究團隊提出了一種基於知識蒸餾的方法,在儘可能保證預訓練 BERT 具備的文本理解能力不丟失的前提下,可以大大降低模型規模,提高預測速度。QQ 研究團隊主要針對的是基於從 BERT 得到的 sentence embedding 去完成更上層任務的需求,這也能滿足當前對於 BERT 的大部分的需求,囊括了文本分類、文本聚類、相似度計算等等。當然,word-level 的壓縮也可以以近似的方法去實現。
圖 1. BERT 的輸入和嵌入(取自 [1]) Bert 中帶權重的句嵌入 既然要基於 BERT 的 sentence embedding 去做擬合,那第一步要確定如何獲得 BERT 的 sentence embedding。如上圖所示,BERT 對一個完整的句子會加入 [CLS] 用於針對句子層面的上層任務和 [SEP] 作為句子分隔符,通常的做法是用 [CLS] 所在位置的 vector 作為 sentence embedding。因為 [CLS] 參與到了句子層面「句對二元關係預測-是否是下一句」的預訓練任務中,所以 [CLS] 位置是能一定程度反映句子的語義的,至少可以反應語句整體的 topic。另一種常用的方法是 averaging 每個字(中文)在 context 下的 embedding 來代表句子,這是在 word embedding 層面經常使用的方法。 但是其實通常來講,尤其是針對句子層面的任務而言,一個句子的信息更多是依靠 keywords 來提供的,因此 QQ 研究人員提出了利用 IDF 值給句子中字的權重進行加權的方式來獲取 BERT 的句向量,在試驗中也取得了更好的效果。 具體做法是:
首先,在大量文本上,用某個分詞工具分詞,計算得到詞語粒度的 IDF,即:
然後,對任意一個句子分詞後,可得到其每個詞語的 weight(即這個詞語的 IDF)。不過,鑑於 BERT 得到的是字向量,在此用該詞語的權重除以詞語長度得到字的權重。最後,每個字的權重加上平滑項,再用每個字的權重除以整個句子所有權重和,得到每個字最終的權重。 在計算得到句子中每個字的權重後,然後對字的 BERT 向量加權求和,得到加權句向量,即
為什麼不直接對字進行權重計算主要是考慮字的語義通常不夠明確,且在依賴上下文的同時還依賴組詞,那麼對於詞的 IDF 值更具有實際意義。另外,加權的方式另一種考量是對於具體的任務擁有足夠的適配能力,可以通過權重的調整來關注到具體任務更關心的詞語。 LTD-BERT 知識蒸餾是一種模型壓縮的常見方法,是 14 年 Hinton 提出的 [2]。其在 Teacher-Student 框架中,將一些複雜、學習能力強的網絡學到的特徵表示「知識」蒸餾出來,傳遞給參數量小、學習能力弱的網絡。常見的蒸餾一般把 Teacher 和 Student 作用在同樣的問題上,可以提供 Student 在 one-shot label 上學不到的 soft label 信息,這些裡面包含了類別間信息,以及 Student 小網絡學不到而 Teacher 網絡可以學到的特徵表示『知識』,所以一般可以提高 Student 網絡的精度 [3]。 之前已經提出的一些蒸餾方法 [5,6,7,8],多數是針對文本分類、語義匹配、序列標註等任務上,把 BERT 作為 Teacher,直接將標準的蒸餾過程實施起來,或在此基礎上改進 Student 的學習目標。
如下圖 2 中所示的 BERT 訓練流程,這部分工作更關注在右側 Supervised 部分。而 BERT 的突破很大程度上依賴與圖中左邊弱監督過程中從大量文本數據學習到的語義建模能力,因此這裡 LTD-BERT 的初衷是希望 Student 模型能夠將這部分能力蒸餾過來,所以不對 Student 網絡建立目標任務,Student 的目標僅為擬合 Teacher 網絡的 sentence vector,不再去關注 Teacher 網絡的預訓練任務。通過合適的 loss function 設計,實驗驗證簡單的 Student 網絡可以較好的擬合 BERT 產生的句向量,並運用於各類 Task。
圖 2. BERT 適用在 NLP 任務上的流程.(取自 [4]) Distilling 流程及架構 整個 BERT 壓縮的過程分成幾個部分,首先對輸入的句子做一定的清洗(BERT 本身也有一定的清洗過程),然後如前文提到字層面的 weight 計算需要分詞、計算/獲取 weight、均攤到 character(如下圖中 preprocessing 所示)。經歷完預處理後,得到了單字列表和每個字對應的權重,也就是 Learning to Distilling 過程的輸入。 訓練過程一方面用預訓練的 BERT(Google 開源的中文預訓練模型)給句子建模,並通過加權平均得到 BERT vector(如圖中 training 階段中的右側部分所示);另一方面,使用簡易的序列模型(本文介紹結果是以 LSTM 為例)同樣的方式給句子建模,得到每個字在 context 下的語義,並使用同樣的 weight 得到 sentence embedding,進而使用基於向量距離的 loss function 進行訓練。通過百萬級數據上的向量擬合訓練,得到了一個規模只有 BERT 1/20 大小的 LTD-BERT 模型來為句子構建句向量。該句向量可以直接用於語句相似度計算、基於語義的文本聚類,另外 LTD-BERT 也可以像 BERT 一樣在實際任務上 finetune 來獲得更好的目標數據上的適應性。 這裡 QQ 團隊提出的方法只優化了最後句子的向量,因為使用的是序列模型來作為 LTD-BERT 的基準模型,原理上是可以直接用這個流程擬合 BERT 給每個漢字的建模結果。但是沒有這樣做一方面是直接擬合已經可以獲得效果不錯的 sentence embedding;另一方面是擬合的過程是使用的預生成的 BERT based sentence embedding,如果存下每個詞的向量存儲開銷是巨大的,如果不進行預生成那訓練速度會被 BERT 的 inference 速度 block。
圖 3. LTD-BERT 訓練過程
LTD Student 模型結構
圖 4. LTD-BERT 的 Student 模型 這裡詳細介紹一下當前使用的 Student 模型(即 LTD-BERT)的模型結構,這裡基本是一個 standard 的雙向 LSTM,在字 embedding 之上構建正向和逆向的 LSTM 獲取上文語義和下文語義下一個漢字的語義,然後使用與 BERT 同樣的 weights(圖中 w)做 weighted sum,得到一個與 BERT dimension 一樣的 vector。這裡需要使用雙向 LSTM 是因為 BERT 預訓練任務對於每個詞構建上下文感知的表示,保持建模過程的一致性才能保證更好的擬合效果,因此這裡 LTD-BERT 基礎模型的唯一限制是需要在為每個漢字建模的時候提供上下文語義的建模,QQ 研究團隊也試驗了不滿足這個假設的基礎模型,效果會大打折扣。 效果
從 2019 年 8 月份在騰訊內部開源至今,LTD-BERT 的效果已經在如下業務:QQ、騰訊新聞、騰訊遊戲、騰訊看點、騰訊健康等海量用戶產品線的上得到驗證,包括文本分類、語義匹配、文本聚類等任務,確保算法擁有足夠的泛化能力和實用性。具體的任務上,本文選取了一些有代表性的對比數據說明模型的效果,因為涉及具體,這裡主要用「類別個數+數據量+數據類型+評測標準」來區分數據的特點。 文本分類
語義匹配
總結來說,在任意句子層面的任務上,該方法的方法可以提供一個規模很小的 LSTM 模型來替代 BERT,無差別的進行使用。並且實驗發現當數據量相對較少,尤其是業務數據常見的幾 k~幾十 k 規模上,LTD-BERT 要明顯優於 LSTM 以及前文提到的蒸餾算法,並且效果也更加接近 BERT,通常配合上一些其他的邏輯或者簡單方法可以與 BERT 持平,甚至更優於單獨 BERT 的效果。尤其對於資源有限或者業務量較大的業務來講可以有效解決已經嘗到 BERT 很香卻只能線下看看的問題。
另外,QQ 團隊也做了一些公開任務上的測試,以更好對比,後續會將代碼開源,並在開源項目中陸續放出更多實驗結果。另外,現在 NLP 飛速發展的時代,也會有很多相關的工作思路在一個階段發展起來。在內部使用 LTD-BERT 的同時,也看到了 DistillBERT[9] 和 Tiny-BERT[10] 陸續推出,這兩個工作跟 LTD-BERT 的出發點有一致之處,都是關注在圖 2 的左邊部分,大層面的不同之處主要有兩點:
1. LTD-BERT 關注在預訓練的模型上,DistillBERT 和 Tiny-BERT 關注在預訓練過程中引入蒸餾;
2,LTD-BERT 關注不依賴 Transformer 或者 BERT 結構的蒸餾過程,探索更小算量的可能性。
[1] BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding.
[2] Distilling the Knowledge in a Neural Network.
[3] 簡評 | 知識蒸餾(Knowledge Distillation)最新進展(一).
[4] The Illustrated BERT, ELMo, and co. (How NLP Cracked Transfer Learning).
[5] Distilling Task-Specific Knowledge from BERT into Simple Neural Networks.
[6] Scalable attentive sentence-pair modeling via distilled sentence embedding.
[7] Transformer to cnn: Label-scarce distillation for efficient text classification.
[8] Patient knowledge distillation for bert model compression.
[9] DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter.
[10] TinyBERT: Distilling BERT for Natural Language Understanding.