BERT適應業務遇難題?這是小米NLP的實戰探索

機器之心專欄

作者:小米 AI 實驗室 NLP 團隊

一項技術在落地應用時,總會遇見各種各樣的難題。以 BERT 為例,在適應業務需求時,需要工程師們根據具體場景進行各種調整。本文介紹了小米 AI 實驗室 NLP 團隊在應用 BERT 時的實戰探索。

BERT適應業務遇難題?這是小米NLP的實戰探索

近年來,預訓練模型在自然語言處理(Natural Language Processing, NLP)領域大放異彩,其中最重要的工作之一就是 Google 於 2018 年發佈的 BERT 預訓練模型 [1]。自被髮布以來,BERT 預訓練模型就在多項自然語言理解任務上取得了優異的效果,並開啟了預訓練-微調的 NLP 範式時代,啟發了 NLP 領域後續一系列的預訓練模型工作。與此同時,BERT 模型在 NLP 相關工業領域也得到了廣泛應用,並取得了良好的效果。但由於工業領域相關業務的數據格式的複雜性,以及工業應用對推理性能的要求,BERT 模型往往不能簡單直接地被應用於 NLP 業務之中,需要根據具體場景和數據對 BERT 模型加以調整和改造,以適應業務的現實需求。

小米 AI 實驗室 NLP 團隊自創建以來,就積極探索 NLP 前沿領域,致力於將先進的 NLP 技術應用於公司的核心業務中,支撐信息流、搜索推薦、語音交互等業務對 NLP 技術的需求。近期,我們對 BERT 預訓練模型在各項業務中的應用進行了探索研究工作,使用各項深度學習技術利用和改造強大的 BERT 預訓練模型,以適應業務的數據形態和性能需求,取得了良好的效果,並應用到了對話理解、語音交互、NLP 基礎算法等多個領域。下面,我們將具體介紹 BERT 在小米 NLP 業務中的實戰探索,主要分為三個部分:第一部分是 BERT 預訓練模型簡介,第二部分是 BERT 模型實戰探索,第三部分是總結與思考。

BERT 預訓練模型簡介

BERT 預訓練模型 [1] 的全稱是基於 Transformer 的雙向編碼表示(Bidirectional Encoder Representations from Transformers, BERT),其主要思想是:採用 Transformer 網絡 [2] 作為模型基本結構,在大規模無監督語料上通過掩蔽語言模型和下句預測兩個預訓練任務進行預訓練(Pre-training),得到預訓練 BERT 模型。再以預訓練模型為基礎,在下游相關 NLP 任務上進行模型微調(Fine-tuning)。BERT 預訓練模型能夠充分利用無監督預訓練時學習到的語言先驗知識,在微調時將其遷移到下游 NLP 任務上,在 11 項下游自然語言處理任務上取得了優異的效果,開啟了自然語言處理的預訓練新範式。

BERT 模型的模型結構主要由三部分構成:輸入層、編碼層和任務相關層。輸入層包括詞嵌入(token embedding)、位置嵌入(position embedding)段嵌入(segment embedding),並將三者相加得到每個詞的輸入表示。編碼層直接使用了 Transformer 編碼器 [2] 來編碼輸入序列的表示。BERT 模型的任務相關層則根據下游任務不同而有所不同,如對於文本分類任務,任務相關層通常為帶 softmax 的線性分類器。

BERT 模型採用了兩個預訓練任務:一是掩蔽語言模型(Masked Language Model, MLM),二是下句預測(Next Sentence Prediction, NSP)。通過這兩個預訓練任務,BERT 模型能夠學習到先驗的語言知識,並在後面遷移給下游任務。第一個預訓練任務掩蔽語言模型(MLM)的原理是:隨機選取輸入序列中的一定比例(15%)的詞,用掩蔽標記 [MASK] 替換,然後根據雙向上下文的詞預測這些被掩蔽的詞。第二個預訓練任務下句預測(NSP)任務的主要目標是:根據輸入的兩個句子 A 和 B,預測出句子 B 是否是句子 A 的下一個句子。

經過預訓練的 BERT 模型可以用於下游的自然語言處理任務。在使用時,主要是在預訓練 BERT 模型的基礎上加入任務相關層,再在特定任務上進行微調(fine-tuning)。通常,我們取出 BERT 模型最後一層的向量表示,送入任務相關層中,就可以得到任務所要建模的目標概率。例如,在文本分類任務中,我們取出最後一層 [CLS] 標記對應的向量表示,再進行線性變換和 softmax 歸一化就可以得到分類概率。在微調時,BERT 模型和任務相關層的所有參數都一起更新,最優化當前下游任務的損失函數。

基於預訓練-微調範式的 BERT 模型具有許多優點。通過在大規模無監督語料上的預訓練,BERT 模型可以引入豐富的先驗語義知識,為下游任務提供更好的初始化,減輕在下游任務上的過擬合,並降低下游任務對大規模數據的依賴。同時,BERT 模型使用的深層 Transformer 編碼層具有很強的表徵能力,因此下游任務不需要太複雜的任務相關層,這簡化了下游任務的模型設計,為各項不同的自然語言處理任務提供一個統一的框架。

BERT 模型實戰探索

在 BERT 模型的實際應用中,往往需要根據具體業務形態對 BERT 模型進行調整。原始的 BERT 模型只能對文本序列進行建模,缺乏對其他特徵的建模能力;同時 BERT 模型的參數過多,推理速度較慢,不能滿足業務上線性能需求;另外,BERT 模型需要針對每個細分任務都各自進行微調,缺乏通用性,也不能很好地利用任務之間的共享信息。在實踐過程中,我們使用了特徵融合、注意力機制、集成學習、知識蒸餾、多任務學習等多種深度學習技術對 BERT 模型進行增強或改造,將 BERT 模型應用到了多項具體任務之中,取得了良好的業務效果。下面,我們主要介紹 BERT 模型在對話系統意圖識別、語音交互 Query 判不停、小米 NLP 平臺多粒度分詞這三項業務中的實戰探索。

對話系統意圖識別

意圖識別是任務型對話系統的重要組成部分,對於用戶對話的自然語言理解起著非常重要的作用。給定一個用戶 Query,意圖識別模塊能夠將用戶所要表達的意圖識別出來,從而為後續的對話反饋提供重要的意圖標籤信息。但在意圖識別的過程中,由於實體槽位知識稀疏性的問題,完全基於用戶 Query 文本的意圖識別模型很難進一步提升效果。在對 Query 文本進行建模時,如果能夠融合槽位知識特徵,模型的意圖識別效果可能會得到進一步提升。因此,我們構建的意圖識別模塊的輸入是用戶 Query 文本和槽位標籤,輸出是意圖類別,如下面的例子所示。

  • Query 文本/槽位標籤:播 放 張/b-music_artist/b-mobileVideo_artist 傑/i-music_artist/i-mobileVideo_artist 的 歌
  • 意圖類別:music

不同於一般的意圖識別只有 Query 文本特徵,我們的融合槽位特徵的意圖識別模型輸入還包括槽位標籤特徵,而且每一個位置還可能包括不止一個槽位標籤。在嘗試將 BERT 模型應用於意圖識別任務時,如何將槽位標籤特徵合適地與 BERT 模型結合起來就成為一個需要解決的重要問題。由於 BERT 預訓練模型在預訓練時並沒有輸入槽位信息,如果直接將槽位標籤特徵直接放入 BERT 模型的輸入中,將會擾亂 BERT 預訓練模型的輸入,使得預訓練模型過程失去意義。因此,我們需要考慮更合理的方式融合槽位標籤特徵。經過探索和實驗,最終我們採取了槽位注意力和融合門控機制的方法來融合槽位特徵,融合了槽位特徵的意圖識別模型結構如圖 4 所示。


BERT適應業務遇難題?這是小米NLP的實戰探索

圖 4 融合槽位特徵的意圖識別模型

首先,我們使用預訓練 BERT 模型編碼 Query 文本,得到融合了預訓練先驗知識的文本向量 Q。

接著,我們將槽位標籤進行嵌入,得到槽位嵌入 ES。由於每個位置可能有多個槽位標籤,我們需要對槽位嵌入進行池化操作,這裡我們採用了槽位注意力機制對多個槽位嵌入進行加權求和。我們採用了縮放點積注意力(Scaled Dot-Product Attention)[2] 作為我們的槽位注意力機制,同時,在應用點積注意力機制之前,我們先對文本向量和槽位嵌入進行線性變換,將其映射到同一個維度的子空間。經過槽位注意力之後,多個槽位嵌入被加權平均為一個槽位向量 S。

BERT適應業務遇難題?這是小米NLP的實戰探索


然後,我們使用融合門控機制對文本向量 Q 和槽位向量 S 進行融合,得到融合後的向量 F。這裡的融合門控機制類似長短期記憶網絡(Long Short-Term Memory, LSTM)中的門控機制。

BERT適應業務遇難題?這是小米NLP的實戰探索


融合後的向量 F 表示每個位置的文本信息和槽位信息,但是由於融合門控機制是在每個位置上進行的,因此,單個位置上的融合向量缺乏其他位置的槽位上下文信息。為了對上下文信息進行編碼,我們又使用了一個帶殘差連接和層歸一化的多頭注意力機制(Multi-Head Attention)[2] 編碼融合向量 F,得到最終的輸出向量 O。

最後,我們取出第一個位置([CLS] 標記對應位置)的輸出向量,拼接上文本長度特徵,送入帶 softmax 的線性分類器中,得到每個意圖類別上的概率,進而預測出 Query 對應的意圖類別標籤。

在業務數據上的微調實驗表明,融合了槽位特徵的 BERT 意圖識別模型比只使用文本信息的 BERT 模型能夠實現更好的效果。

語音交互 Query 判不停

用戶在語音輸入過程中會有停頓、語句不完整的現象,經過 ASR 識別後,得到的 query 文本存在不完整的情況,會影響到後續的意圖識別和槽位提取。因此在送入中臺之前,需要經過判不停模塊識別,對於不完整 query 返回給 ASR 繼續接收輸入,完整 query 才進入中臺。我們提出的語音交互 query 判不停模塊,就是用於判斷用戶 query 是否完整的重要模塊。判不停模塊輸入用戶 query 文本,輸出一個判不停標籤,表明該 query 是否完整,其中'incomplete'表示 query 不完整,'normal'表示 query 完整,如下例所示。

  • Query 文本:播放張傑的
  • 判不停標籤:incomplete

判不停模型的主要難點在於線上用戶 query 請求量大,對模型推理速度有比較嚴格的限制,因此普通的 BERT 模型無法滿足判不停業務的線上性能需求。但是,能夠滿足性能需求的小模型由於結構過於簡單,模型的準確度往往不如 BERT 模型。因此,我們經過思考,採取了「集成學習+知識蒸餾」的判不停系統框架,先通過集成學習,集成 BERT 等業務效果好的模型,實現較高的準確度。再使用知識蒸餾的方法,將集成模型的知識遷移給 Albert Tiny 小模型 [3],從而在保證推理速度的基礎上,大幅提升模型效果。「集成學習+知識蒸餾」的判不停框架如圖 5 所示。

BERT適應業務遇難題?這是小米NLP的實戰探索

圖 5 集成學習+知識蒸餾判不停框架


判不停框架的第一步是集成學習。目的是通過融合多個模型,減緩過擬合的問題,提升集成模型的效果。首先,我們在判不停業務數據集上訓練 BERT 模型等多個效果好的大模型,這些效果好的大模型稱之為教師模型。接著,對於每個教師模型,我們都使用它預測出每條數據對應的 logits,logits 本質上是 softmax 之前的 2 維向量,代表了教師模型在數據上的知識。最後,對於每條數據,我們對多個教師模型預測的 logits 進行集成,得到的集成 logits 就對應了一個集多個教師模型優點於一身的集成模型,這樣的集成模型具有比單個 BERT 教師模型更好的效果。


判不停框架的第二步是知識蒸餾。由於推理性能限制,集成模型無法直接應用於線上判不停業務。因此我們使用知識蒸餾 [4] 的方法,把集成模型的知識遷移給能滿足線上性能需求的小模型 Albert Tiny 模型,這樣的小模型也被稱為學生模型。蒸餾學生模型時,我們同時使用集成 logits 和真實標籤訓練學生模型,使得學生模型能夠學到集成模型的知識,進一步提升學生模型的效果。具體來說,對於第 i 條訓練數據,我們先使用 Albert Tiny 模型預測出該條數據對應的學生 logits,記為 z。另外,該條數據對應的集成模型 logits 記為 t,對應的真實標籤記為 y。我們使用真實標籤 y 和學生 logits z 得到通常的交叉熵損失函數,同時,我們使用集成 logits t 和學生 logits z 得到帶溫度平滑的蒸餾交叉熵損失函數,最終的損失函數是兩種損失函數的加權求和。


BERT適應業務遇難題?這是小米NLP的實戰探索

最終,經過「集成學習+知識蒸餾」的判不停框架得到的 Albert Tiny 小模型能夠達到 BERT 單模型的效果,同時也能很好地滿足線上的推理性能需求。

小米 NLP 平臺多粒度分詞

中文分詞已經成為了眾多 NLP 任務的基礎需求,為下游任務提供基礎分詞服務。小米 NLP 平臺(MiNLP 平臺)也開發了中文分詞功能,為公司內其他 NLP 相關業務提供中文分詞服務支撐。在實踐中我們發現,不同業務對中文分詞的粒度需求有所差異,短文本相關業務往往需要粒度較細的分詞服務,而長文本相關業務則希望分詞的粒度能夠更粗一些。針對不同業務對不同粒度分詞的需求,我們開發了多粒度分詞算法,能夠支持粗/細兩種粒度的中文分詞服務。多粒度分詞的示例如下:

  • 文本:這是一家移動互聯網公司
  • 粗粒度分詞:這/是/一家/移動互聯網/公司
  • 細粒度分詞:這/是/一/家/移動/互聯網/公司

我們在開發基於 BERT 模型的多粒度分詞算法時,發現如果分別在每個粒度分詞的數據集上進行微調,則需要訓練並部署多個不同粒度的 BERT 分詞模型,總的模型資源消耗量與粒度的數量成線性相關。同時,不同粒度的分詞結果雖然有一些差異,但依然有著很大的共性,各自訓練不同粒度的 BERT 分詞模型不能充分利用這些共性知識來提升分詞效果。為了充分利用不同粒度分詞的共性信息,並減少訓練和部署成本,我們基於多任務學習的思路,提出了一種「基於 BERT 的統一多粒度分詞模型"[5],用一個統一的 BERT 模型訓練了支持多個粒度的中文分詞器。


BERT適應業務遇難題?這是小米NLP的實戰探索

圖 6 基於 BERT 的統一多粒度分詞模型

我們提出的統一多粒度分詞模型如圖 6 所示,其主要思想是:先在輸入文本中加入一個特殊的粒度標記表示粒度信息,如 [fine] 表示細粒度,[coarse] 表示粗粒度。然後把加入了粒度標記的文本字符送入 BERT 模型中,再經過一個帶 softmax 的線性分類器,把每個位置的表示映射為 BMES 四個分詞標籤上的概率。四個分詞標籤的含義分別是:B-詞的開始,M-詞的中間,E-詞的結束,S-單獨成詞。如上面的文本得到的細粒度分詞標籤序列就是:

  • 細粒度分詞標籤:這/S 是/S 一/S 家/S 移/B 動/E 互/B 聯/M 網/E 公/B 司/E

最後對整個文本序列的分詞標籤進行解碼就得到了最終的分詞結果。

我們提出的統一多粒度分詞模型,不僅在公司內部的多粒度分詞數據上取得了更好的效果,同時也在公開多標準分詞數據集上取得了 SOTA(State-of-the-Art)的性能,實驗結果可以參見參考文獻 [5]。

總結與思考

小米 AI 實驗室 NLP 團隊通過 BERT 模型在具體業務中的實戰探索,使用特徵融合、集成學習、知識蒸餾、多任務學習等深度學習技術,改造和增強了 BERT 預訓練模型,並在對話系統意圖識別、語音交互 Query 判不停、小米 NLP 平臺多粒度分詞等多個任務上取得了良好的效果。

同時,我們對如何進一步應用 BERT 模型提出一些簡單的想法,留待於未來的探索和研究。首先,如何將非文本特徵尤其是外部知識特徵更有效地融入 BERT 模型之中,是一個值得深入研究的問題。另外,有些具體業務對線上推理性能有著嚴格的要求,這種場景下 BERT 模型往往不能直接進行應用,我們需要進一步探究大模型到小模型的知識遷移或模型壓縮,在保證推理性能的基礎之上提升模型效果。最後,公司內部的各項業務往往各自為戰,在使用 BERT 模型時存在一些重複工作,並且不能很好地利用多個任務的共性信息,在多任務學習的基礎上,打造一個各業務充分共享的 BERT 模型平臺,服務並助益多項業務需求,是我們下一步需要努力的方向。

參考文獻

[1] Devlin. BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding. NAACL. 2019.

[2] Vaswani. Attention is all you need. NIPS. 2017.

[3] Lan. ALBERT: A Lite BERT for Self-supervised Learning of Language Representations. ICLR. 2020.

[4] Hinton. Distilling the Knowledge in a Neural Network. NIPS. 2014.

[5] Ke. Unified Multi-Criteria Chinese Word Segmentation with BERT. 2020.


分享到:


相關文章: