天天看點

【自然語言處理】預訓練模型BERT的發展現狀1. BERT1.1 自注意力機制1.2 訓練模型2.BERT優化算法

目前,從bert的應用來看,已經在對話系統、機器閱讀了解、搜尋、文本分類等幾乎大多數 NLP 應用領域快速應用,并在部分應用領域取得了突破性的效果提升。

1. BERT

BERT基于一種相對較新的神經網絡結構——Transformers,使用一種叫做“Self-attention”的機制來捕捉單詞之間的關系。Transformers中沒有卷積(如CNNs)或遞歸操作(如RNNs)(“Attention is all you need”)。

1.1 自注意力機制

  • Self-attention是一個sequence-to-sequence的操作,它通過将每個單詞的上下文嵌入到其表示中,來更新輸入Token的嵌入。這使得它可以同時對所有輸入單詞之間的關系模組化——這與RNNs形成了對比,在RNNs中,輸入Token被讀入并按順序處理。Self-attention使用點積計算詞向量之間的相似度,由此得到的注意權重通常被可視化為一個注意權重矩陣。
  • 注意力權重捕捉單詞之間的關系強度,我們允許模型通過使用多個注意力頭來學習不同類型的關系。每個注意力頭通常捕捉單詞之間的一種特定類型的關系(帶有一些備援)。其中一些關系是可以直覺地解釋的(如主-客體關系,或跟蹤鄰近的詞),而另一些關系則相當難以了解。你可以把注意力頭部想象成卷積網絡中的過濾器,在卷積網絡中,每個過濾器從資料中提取特定類型的特征——無論哪種特征都能幫助神經網絡的其餘部分做出更好的預測。
  • Self-attention機制是Transformer的核心操作,但讓我們把它放在上下文中:Transformer最初是為機器翻譯而開發的,它們有一個編碼器和解碼器結構。Transformer編碼器和解碼器的組成部分是一個Transformer塊,它本身通常由一個自注意層、一定量的正則化和一個标準前饋層組成。每個塊對輸入向量執行這個操作序列,并将輸出傳遞給下一個塊。在Transformer中,深度是指Transformer塊的數量。

根據以上的Transformer設定,BERT模型被訓練在2個無監督語言任務上。BERT訓練最重要的一點是它隻需要無标注的資料——任何文本語料庫都可以使用,你不需要任何特殊的标注資料集。BERT的論文使用了Wikipedia和一個圖書語料庫來訓練模型。與“普通”語言模型一樣,資料的成本很低。

1.2 訓練模型

  • 掩碼語言模型(MLM)任務。這個任務鼓勵模型學習單詞級和句子級的良好表示(因為句子是單詞表示的整體)。簡單地說,句子中15%的單詞是随機選擇的,并使用來隐藏(或替代)。該模型的工作是預測這些隐藏單詞的身份,利用之前和之後的單詞——是以,我們試圖從損壞的輸入重建文本,并使用左右上下文進行預測。這使得我們能夠根據上下文建構單詞的表示。與ELMo(一種用于生成上下文感覺的單詞嵌入的基于rnn-based的語言模型)等方法不同,BERT同時學習它的雙向表示,在ELMo方法中,從左到右和從右到左的表示由兩個語言模型獨立學習,然後連接配接(簡單的向量相加)起來。我們可以說ELMo是一個“淺層雙向”模型,而BERT是一個“深層雙向”模型。
  • 下一個句子預測(NSP)任務。如果我們的模型将被用作語言了解的基礎,那麼它最好具備一些句子間連貫的知識。為了鼓勵模型學習句子之間的關系,我們添加了下一個句子預測任務,在這個任務中,模型必須預測一對句子是否相關,也就是一個句子是否可能出現在另一個句子之後。正訓練對是語料庫中真實的相鄰句子;從語料庫中随機抽取負訓練對。它不是一個完美的系統,因為随機抽樣的配對可能是相關的,但它已經足夠好了。

模型必須學會同時完成兩項任務,因為實際的訓練損失是兩項任務損失的組合(MLM和NSP權重平均)。

  • Fine-tuning BERT。一旦訓練了基本的BERT模型,你通常會在兩個步驟中進行調整:首先,對未标注的資料繼續進行“無監督”的訓練,然後通過添加額外的層和對新目标的訓練(使用很少标記的示例)來學習實際任務。這種方法起源于Dai & Le在2015年發表于的LSTM LM論文。
BERT微調實際上會更新模型的所有參數,而不僅僅是新任務特定層中的參數,是以這種方法與完全當機傳輸的層參數的技術不同。

在實踐中,使用BERT進行遷移學習,通常隻重用經過訓練的編碼器堆棧—将模型的decoder扔了,隻使用編碼器作為特征提取器。是以,我們并不關心Transformer的decoder部分對它最初訓練的語言任務所做的預測,我們感興趣的隻是模型學會在内部表示文本輸入的方式。

2.BERT優化算法

從預訓練模型改進的角度看,最近一年多也陸續出現了大量效果突出的改進模型,比如 XLNet、SpanBert、RoBERTa、ALBert、BART 等一系列改進。在衆多的 BERT 預訓練改進模型中,RoBERTa 可能是目前為止最簡單有效的,它僅僅通過增加更大規模的高品質資料、延長訓練時間以及增大 Batch Size 等簡單手段,就能将預訓練模型效果推到一個很高的精度,效果超過了很多其它的改進模型。這說明了:目前 BERT 采用的 Transformer 結構,從模型複雜度來說是足夠複雜的,表達能力也足夠強大,我們僅僅通過增加高品質資料、增加訓練時間,依然能夠極大幅度提升 BERT 的性能。相對提出新的複雜模型來說,這種改進更加簡潔有效。

從工程實用化角度看,因為 BERT 的基礎結構采用了 12 層或者 24 層的 Transformer,是以存在參數量大計算速度慢的問題,而真正要想使模型大規模落地應用,如何将預訓練模型做小做快是關鍵所在。目前在這方面的模型改進有幾種思路:

  • 一種思路以 ALBert 的做法為代表。它一方面将輸入單詞 Embedding 參數矩陣進行矩陣分解,一方面将 Transformer 各層參數共享。通過結合兩者來大量減少參數,但這種方案在計算量上并未減少,僅僅減少了模型參數。
  • 第二種是采用 Teacher-Student 模式的知識蒸餾,通過訓練小的 Student 模型來模拟大的 Teacher 來減小模型大小,這樣可以同時減小模型參數及計算量,以此增加計算速度;除此外,在模型壓縮方面常見的剪枝、模型參數二值化等方法也同樣可以應用在 BERT 的預訓練模型上。

繼續閱讀