Transformer模型自提出以來,已經在很多地方都取得了不錯的成果,尤其是在nlp領域,它取得的成果是令人矚目的,相比於之前的模型,transformer模型的attention機制更夠更好地學習到句子當中單詞與單詞之間的聯繫,從而能夠結合上下文語境來提高準確度。

更重要的是,transformer的這種attention機制是一種底層的方法,我們基於它可以構造出一些新的模型,而這些模型在nlp中往往有著出色的表現,下面介紹的BERT模型就是其中之一。

如果對Transformer模型還不熟悉的話,可以看我之前的文章:Transformer模型淺析

一、預訓練過程

BERT是一種預訓練語言模型,因此在介紹它之前,先簡單說一下什麼是nlp中的預訓練過程。顧名思義,預訓練就是在拿樣本數據對模型進行訓練之前做的訓練,那麼為什麼要有預訓練呢?其實在nlp的下游任務(比如機器翻譯、閱讀理解等)中,可以使用的樣本數據是比較少的,因為這些任務需要的都是經過專門標註的數據,這樣就使得拿這些樣本數據直接訓練出來的模型效果比較一般,因此就需要對模型進行預訓練了。

預訓練的目的就是,提前訓練好這些下游任務中底層的、共性的部分模型,然後再用下游任務各自的樣本數據來訓練各自的模型,這樣就可以極大地加快收斂速度。在這裡舉一個cv的例子,對於人臉識別和數字識別兩種任務,顯然它們有很多的區別,然而在用CNN進行訓練的時候,其實比較淺的幾層網路學習到的特徵是很相似的,都是類似於邊角線的這類基礎特徵(下圖紅色框部分),因此我們可以認為這幾層網路可以共用,如果我們能夠預先訓練好這部分,那麼模型的訓練收斂速度將會大大加快。

用於人臉識別的神經網路

對於nlp的下游任務,儘管它們的最終目標各不相同,但是它們也有著共同的、也是必須首先要做的東西,那就是要讓模型理解文檔中的單詞和句子,具體說就是將文本中的無法直接計算的單詞轉變為可以計算的向量或者矩陣等形式,並且這些數字化的向量要能夠比較好地反映出對應單詞在句子中的含義,這就nlp中預訓練的目的。在nlp中採用的是語言模型來做預訓練,從最初的word embedding到ELMO、再到GPT,以及現在的BERT,其實做的都是上面說的這件事,只不過效果變得越來越好。

二、語言模型和word embedding

我們知道,一句話不是由一些單詞簡單地組合就能得到的,它必須要符合人類的語言習慣,而語言模型就是用來判斷一句話是不是符合人類的習慣,具體地說就是給定句子中在某一單詞前面的單詞(也可以是上下文),然後預測該單詞出現的概率。如下圖所示,對於一句話來說,如果把每一個位置的條件概率都相乘,那麼概率越大越能說明它更像一句人說的話。如果我們想訓練一個語言模型,只需要選擇一個單詞並通過它的上下文來預測該單詞的概率,然後最大化這個概率就行了。

而語言模型除了能看句子是不是更符合人類習慣之外,是否還有別的作用呢?當然有,那就上面提到的word embedding,這其實是一個副產品,在模型的訓練過程中,首先需要將句子中的前面的單詞都轉化為對應的向量,然後再通過隱層和softmax來預測後面接的單詞概率,如果模型能夠預測得很好的話,那麼就可以認為第一步得到的向量能夠很好地反應出對應單詞的含義。這樣就可以認為得到了一個單詞表,每一個單詞都可以在表中找到對應的向量,而這個過程就是word embedding,在這之後就可以讓word embedding接到具體的下游任務中,這樣通過語言模型就實現了對於nlp任務的預訓練。

語言模型

可以看出,語言模型的訓練不需要預先對數據進行標註,因此可以使用的語料庫是相當龐大的,而這也是採用語言模型來做nlp預訓練的原因,大量的訓練數據使得word embedding的效果更佳,從而使得預訓練後的下游任務模型更優。

然而在實際實驗中,採用word embedding的預訓練技術加到下游任務後,卻並沒有取得很大的提升,其主要原因是:對於word embedding,一個單詞唯一對應一個向量,但是有些單詞在不同的句子中往往對應著不同的含義,對於這類多義詞,是無法只用一個向量來進行表示的,一個向量只能做到「四不像」——平均該單詞的每一種含義,這樣顯然會對之後的模型學習造成影響,因此需要對預訓練的語言模型進行改進,而BERT就是較好地解決了這個問題

三、從word embedding到BRET

BERT的全稱是Bidirectional Encoder Representations from Transformer,也就是基於Transformer的雙向編碼器表徵。顧名思義,BERT採用的是Transformer,並且在處理一個單詞的時候,還能夠考慮到該詞前面的和後面的單詞,得到它在上下文中的含義。我們知道,Transformer的attention機制在對語境中的單詞進行特徵抽取時有著很好的效果,而且從直覺上看,考慮上下文的雙向編碼要比只考慮上文(或下文)的單向效果更好,下面介紹BERT模型的具體內容。

1.輸入表示

如下圖所示,BERT的輸入是token、segmentation和position embeddings的疊加,也就說每個單詞的embedding是三個embedding的疊加。對於token embeddings使用WordPiece嵌入,也就是通過上面單詞表來實現的;而positional embeddings用來表示句子中單詞的位置信息;segement embeddings則是對於句子整體的,不同的句子有不同的項,它用來實現句子級別的任務。

2.遮蔽語言模型

前面提到了BERT是一種雙向語言模型,它需要同時考慮單詞的上文和下文,為了實現這一目的,模型採用了一種簡單的方法:隨機屏蔽(masking)部分輸入token,然後訓練模型去正確預測那些被屏蔽的token,用到的模型結構和Transformer基本一樣。

具體來說,模型會隨機選擇語料中15%的單詞,然後其中的80%會用[Mask]掩碼代替原始單詞,其中的10%會被隨機換為另一個單詞,剩下10%保持原單詞不變,然後要求模型去正確預測被選中的單詞。做這些處理的原因是,[Mask]只在訓練中才會出現,如果選中單詞都變為了[Mask],這會導致訓練出來的模型可能會針對於[Mask],這與實際不符,所以才會有一些概率將[Mask]隨機替換,而這個概率大小為10%×15%=1.5%,基本不會損害模型的語言理解能力,而模型為了預測正確,就需要保持每個輸入token的分散式上下文表示,從而實現了對上下文進行特徵提取的目的。

3.下一句預測

前面的遮蔽語言模型是針對於單詞量級的訓練,而nlp中有許多任務是在句子量級上的,這就需要語言模型還要理解句子之間的關係,這有助於下游句子關係判斷任務,而BERT中的下一句預測(Next Sentence Prediction)就是為了這一目的。它的原理也很簡單,就是預訓練一個二值化的下一句預測任務,具體來說,選擇句子A和B作為訓練樣本:A的下一句有50%的可能是B,另外50%的可能B是隨機取自語料庫的,模型需要正確預測B是不是A的下一句。

4.微調

通過上面的方法,我們就實現了BERT模型的預訓練,對於特定下游任務的模型,可以通將BERT與一個額外的輸出層結合而形成,這樣需要重新學習的參數量就會比較小,如下圖所示,只需要按BERT模型要求的格式輸入訓練數據,就可以完成不同的下游任務。

總結

從整體上看,BERT模型採用了目前流行的特徵提取器Transformer,同時還實現了雙向語言模型,採眾家之長使得它具有更好的性能——在11項NLP任務中都刷新了性能表現記錄。不過BERT也還有可以改進的地方,比如說BERT採用的是原始的Transformer,Transformer固然強大,不過現在已經也有了一些更強的改進版;另外就是BERT的Mask機制,雖然通過它可以實現雙向語言模型的訓練,但是這樣會導致預訓練和在下游任務上進行微調時的不一致(後者語料中沒有[Mask]掩碼),而如果能夠在這些方面做出改進,那麼相信模型的性能會有進一步的提高。

參考資料

[1] BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

[2] 從Word Embedding到Bert模型—自然語言處理中的預訓練技術發展史


推薦閱讀:
相關文章