BERT的新語言表示模型,它代表Transformer的雙向編碼器表示。與最近的其他語言表示模型不同,BERT旨在通過聯合調節所有層中的上下文來預先訓練深度雙向表示。因此,預訓練的BERT表示可以通過一個額外的輸出層進行微調(fine-tuning),適用於廣泛任務的最先進模型的構建,比如問答任務和語言推理,無需針對具體任務做大幅架構修改。
一、BERT是如何進行預訓練 pre-training的?
BERT 用了兩個步驟,試圖去正確地訓練模型的參數。
1)第一個步驟是把一篇文章中,15% 的詞匯遮蓋,讓模型根據上下文全向地預測被遮蓋的詞。假如有 1 萬篇文章,每篇文章平均有 100 個詞匯,隨機遮蓋 15% 的詞匯,模型的任務是正確地預測這 15 萬個被遮蓋的詞匯。通過全向預測被遮蓋住的詞匯,來初步訓練 Transformer 模型的參數。
2)然后,用第二個步驟繼續訓練模型的參數。譬如從上述 1 萬篇文章中,挑選 20 萬對語句,總共 40 萬條語句。挑選語句對的時候,其中 2*10 萬對語句,是連續的兩條上下文語句,另外 2*10 萬對語句,不是連續的語句。然后讓 Transformer 模型來識別這 20 萬對語句,哪些是連續的,哪些不連續。
這兩步訓練合在一起,稱為預訓練 pre-training,訓練結束后的Transformer模型,包括它的參數,就是論文期待的通用的語言表征模型。
二、BERT的bidirectional如何體現的?
論文研究團隊有理由相信,深度雙向模型比left-to-right 模型或left-to-right and right-to-left模型的淺層連接更強大。從中可以看出BERT的雙向叫深度雙向,不同於以往的雙向理解,以往的雙向是從左到右和從右到左結合,這種雖然看着是雙向的,但是兩個方向的loss計算相互獨立,所以其實還是單向的,只不過簡單融合了一下,而bert的雙向是要同時看上下文語境的,所有不同。
為了訓練一個深度雙向表示(deep bidirectional representation),研究團隊采用了一種簡單的方法,即隨機屏蔽(masking)部分輸入token,然后只預測那些被屏蔽的token,(我理解這種情況下,模型如果想預測出這個masked的詞,就必須結合上下文來預測,所以就達到了雙向目的,有點類似於我們小學時候做的完形填空題目,你要填寫對這個詞,就必須結合上下文,BERT就是這個思路訓練機器的,看來利用小學生的教學方式,有助於訓練機器)。論文將這個過程稱為“Masked Language Model”(MLM)。
Masked雙向語言模型這么做:隨機選擇語料中15%的單詞,把它摳掉,也就是用[Mask]掩碼代替原始單詞,然后要求模型去正確預測被摳掉的單詞。但是這里有個問題:訓練過程大量看到[mask]標記,但是真正后面用的時候是不會有這個標記的,這會引導模型認為輸出是針對[mask]這個標記的,但是實際使用又見不到這個標記,這自然會有問題。為了避免這個問題,Bert改造了一下,15%的被上天選中要執行[mask]替身這項光榮任務的單詞中,只有80%真正被替換成[mask]標記,10%被狸貓換太子隨機替換成另外一個單詞,10%情況這個單詞還待在原地不做改動。這就是Masked雙向語音模型的具體做法。
例如在這個句子“my dog is hairy”中,它選擇的token是“hairy”。然后,執行以下過程:
數據生成器將執行以下操作,而不是始終用[MASK]替換所選單詞:
80%的時間:用[MASK]標記替換單詞,例如,my dog is hairy → my dog is [MASK]
10%的時間:用一個隨機的單詞替換該單詞,例如,my dog is hairy → my dog is apple
10%的時間:保持單詞不變,例如,my dog is hairy → my dog is hairy. 這樣做的目的是將表示偏向於實際觀察到的單詞。
Transformer encoder不知道它將被要求預測哪些單詞或哪些單詞已被隨機單詞替換,因此它被迫保持每個輸入token的分布式上下文表示。此外,因為隨機替換只發生在所有token的1.5%(即15%的10%),這似乎不會損害模型的語言理解能力。
使用MLM的第二個缺點是每個batch只預測了15%的token,這表明模型可能需要更多的預訓練步驟才能收斂。團隊證明MLM的收斂速度略慢於 left-to-right的模型(預測每個token),但MLM模型在實驗上獲得的提升遠遠超過增加的訓練成本。
三、語句對預測
至於說“Next Sentence Prediction”,指的是做語言模型預訓練的時候,分兩種情況選擇兩個句子,一種是選擇語料中真正順序相連的兩個句子;另外一種是第二個句子從語料庫中拋色子,隨機選擇一個拼到第一個句子后面。我們要求模型除了做上述的Masked語言模型任務外,附帶再做個句子關系預測,判斷第二個句子是不是真的是第一個句子的后續句子。之所以這么做,是考慮到很多NLP任務是句子關系判斷任務,單詞預測粒度的訓練到不了句子關系這個層級,增加這個任務有助於下游句子關系判斷任務。所以可以看到,它的預訓練是個多任務過程。這也是Bert的一個創新。其實這個下一句的預測就變成了二分類問題了,如下:
四、BERT模型的影響
BERT是一個語言表征模型(language representation model),通過超大數據、巨大模型、和極大的計算開銷訓練而成,在11個自然語言處理的任務中取得了最優(state-of-the-art, SOTA)結果。或許你已經猜到了此模型出自何方,沒錯,它產自谷歌。估計不少人會調侃這種規模的實驗已經基本讓一般的實驗室和研究員望塵莫及了,但它確實給我們提供了很多寶貴的經驗:
深度學習就是表征學習 (Deep learning is representation learning):"We show that pre-trained representations eliminate the needs of many heavily engineered task-specific architectures". 在11項BERT刷出新境界的任務中,大多只在預訓練表征(pre-trained representation)微調(fine-tuning)的基礎上加一個線性層作為輸出(linear output layer)。在序列標注的任務里(e.g. NER),甚至連序列輸出的依賴關系都先不管(i.e. non-autoregressive and no CRF),照樣秒殺之前的SOTA,可見其表征學習能力之強大。
規模很重要(Scale matters):"One of our core claims is that the deep bidirectionality of BERT, which is enabled by masked LM pre-training, is the single most important improvement of BERT compared to previous work". 這種遮擋(mask)在語言模型上的應用對很多人來說已經不新鮮了,但確是BERT的作者在如此超大規模的數據+模型+算力的基礎上驗證了其強大的表征學習能力。這樣的模型,甚至可以延伸到很多其他的模型,可能之前都被不同的實驗室提出和試驗過,只是由於規模的局限沒能充分挖掘這些模型的潛力,而遺憾地讓它們被淹沒在了滾滾的paper洪流之中。
預訓練價值很大(Pre-training is important):"We believe that this is the first work to demonstrate that scaling to extreme model sizes also leads to large improvements on very small-scale tasks, provided that the model has been sufficiently pre-trained". 預訓練已經被廣泛應用在各個領域了(e.g. ImageNet for CV, Word2Vec in NLP),多是通過大模型大數據,這樣的大模型給小規模任務能帶來的提升有幾何,作者也給出了自己的答案。BERT模型的預訓練是用Transformer做的,但我想換做LSTM或者GRU的話應該不會有太大性能上的差別,當然訓練計算時的並行能力就另當別論了。
五、BERT如何解決NLP的經典問題且使之通用呢?
NLP的四大任務,絕大部分NLP問題可以歸入下面的四類任務中:
1)序列標注。這是最典型的NLP任務,比如中文分詞,詞性標注,命名實體識別,語義角色標注等都可以歸入這一類問題,它的特點是句子中每個單詞要求模型根據上下文都要給出一個分類類別。
2)分類任務。比如我們常見的文本分類,情感計算等都可以歸入這一類。它的特點是不管文章有多長,總體給出一個分類類別即可。
3)任務是句子關系判斷。比如Entailment,QA,語義改寫,自然語言推理等任務都是這個模式,它的特點是給定兩個句子,模型判斷出兩個句子是否具備某種語義關系;
4)生成式任務。比如機器翻譯,文本摘要,寫詩造句,看圖說話等都屬於這一類。它的特點是輸入文本內容后,需要自主生成另外一段文字。
對於種類如此繁多而且各具特點的下游NLP任務,Bert如何改造輸入輸出部分使得大部分NLP任務都可以使用Bert預訓練好的模型參數呢?
對於句子關系類任務,很簡單,和GPT類似,加上一個起始和終結符號,句子之間加個分隔符即可。對於輸出來說,把第一個起始符號對應的Transformer最后一層位置上面串接一個softmax分類層即可。
對於分類問題,與GPT一樣,只需要增加起始和終結符號,輸出部分和句子關系判斷任務類似改造;
對於序列標注問題,輸入部分和單句分類是一樣的,只需要輸出部分Transformer最后一層每個單詞對應位置都進行分類即可。
從這里可以看出,上面列出的NLP四大任務里面,除了生成類任務外,Bert其它都覆蓋到了,而且改造起來很簡單直觀。盡管Bert論文沒有提,但是稍微動動腦子就可以想到,其實對於機器翻譯或者文本摘要,聊天機器人這種生成式任務,同樣可以稍作改造即可引入Bert的預訓練成果。只需要附着在S2S結構上,encoder部分是個深度Transformer結構,decoder部分也是個深度Transformer結構。根據任務選擇不同的預訓練數據初始化encoder和decoder即可。這是相當直觀的一種改造方法。當然,也可以更簡單一點,比如直接在單個Transformer結構上加裝隱層產生輸出也是可以的。不論如何,從這里可以看出,NLP四大類任務都可以比較方便地改造成Bert能夠接受的方式。這其實是Bert的非常大的優點,這意味着它幾乎可以做任何NLP的下游任務,具備普適性,這是很強的。
六、預訓練的本質。
我們應該弄清楚預訓練這個過程本質上是在做什么事情,本質上預訓練是通過設計好一個網絡結構來做語言模型任務,然后把大量甚至是無窮盡的無標注的自然語言文本利用起來,預訓練任務把大量語言學知識抽取出來編碼到網絡結構中,當手頭任務帶有標注信息的數據有限時,這些先驗的語言學特征當然會對手頭任務有極大的特征補充作用,因為當數據有限的時候,很多語言學現象是覆蓋不到的,泛化能力就弱,集成盡量通用的語言學知識自然會加強模型的泛化能力。如何引入先驗的語言學知識其實一直是NLP尤其是深度學習場景下的NLP的主要目標之一,不過一直沒有太好的解決辦法,而ELMO/GPT/Bert的這種兩階段模式看起來無疑是解決這個問題自然又簡潔的方法,這也是這些方法的主要價值所在。