目錄:
- ELMo與Transformer的簡單回顧
- DAE與Masked Language Model
- BERT模型詳解
- BERT模型的不同訓練方法
- 如何把BERT模型應用在實際項目中
- 如何對BERT減肥
- BERT存在的問題
1. ELMo與Transformer的簡單回顧
1.1 一詞多義
1.2 ELMo
ELMo是一個語言模型,主要是做給定文本的Context,預測下一個詞。ELMo最重要的一個特點是部分解決了一詞多義的情況,沒有完全解決喲!它為解決一詞多義提供了一個很好的解決方案。像word2vec、glove提供的embedding是靜態的,一旦訓練完成embedding是不變的。而ELMo其實考慮更多的是Context的信息,對每一個詞會給出3個embedding,這3個embedding可以看作是一個詞的3個embedding特徵,對3個embedding特徵會添加三個位置,對於不同的任務會賦予不同的權重,最後根據權重把這三個embedding結合起來做向量平均,把合併後的embedding作為最後詞的embedding。
ELMo用的是long contexts信息,而不是其他模型用到的window size contexts信息。ELMo用到的是Bi-LSTM,如果ELMo換成Transformer那就和BERT結構基本一樣了。
1.3 Transformer
LSTM和Transformer的區別:
- 基於RNN的LSTM訓練是疊代的,當前這個字進入完LSTM單元後才能輸入下一個字,是一個串行的過程。
- Transformer的訓練是並行的,它是所有的字都可以同時並行訓練,大大的加快了計算效率。而且Transformer加入了位置嵌入,幫助模型理解語言的順序。使用Self-Attention和全連接層來計算是Transformer的一個基本結構。
Transformer中最重要的就是Multi-Head Attention。
Transformer中Encoder的五個核心部分如下圖:
Skip connections:反向傳播的時候,防止梯度消失的問題。
2. DAE與Masked Language Model
2.1 什麼是DAE與Masked Language Model
隨著一些奇怪的高維數據出現,比如圖像、語音,傳統的統計學-機器學習方法遇到了前所未有的挑戰。數據維度過高,數據單調,噪聲分布廣,傳統的特徵工程很難奏效。
為了解決高維度的問題,出現的線性學習的PCA降維方法,PCA的數學理論確實無懈可擊,但是卻只對線性數據效果比較好。於是,尋求簡單的、自動的、智能的特徵提取方法仍然是機器學習的研究重點。
於是,CNN另闢蹊徑,利用卷積、降採樣兩大手段從信號數據的特點上很好的提取出了特徵。對於一般非信號數據,該怎麼辦呢?
研究者提出了自動編碼器(AutoEncoder),自動編碼器基於這樣一個事實:原始input(設為)經過加權( )、映射(Sigmoid)之後得到 ,再對 反向加權映射回來成為 。網絡結構如下圖:
自動編碼器的過程很有趣,首先,它沒有使用數據標籤來計算誤差update參數,所以是無監督學習。其次,利用類似神經網絡的雙隱層的方式,簡單粗暴地提取了樣本的特徵。
為了緩解經典AutoEncoder容易過擬合的問題,一個辦法是在輸入中加入隨機噪聲,所以Vincent在2008年的論文《Extracting and Composing Robust Features with Denoising Autoencoders》中提出了AutoEncoder的改良版Denoising AutoEncoder(DAE)。
怎麼才能使特徵很魯棒呢?就是以一定機率分布(通常使用二項分布)去擦除原始input矩陣,即每個值都隨機置0, 這樣看起來部分數據的部分特徵是丟失了。以這丟失的數據去計算 ,計算 ,並將 與原始 做誤差疊代,這樣,網絡就學習了這個破損(Corruputed)的數據。網絡結構如下圖:
這個破損的數據是很有用的,原因有二:
- 通過與非破損數據訓練的對比,破損數據訓練出來的Weight噪聲比較小。降噪因此得名。原因不難理解,因為擦除的時候不小心把輸入噪聲給擦掉了。
- 破損數據一定程度上減輕了訓練數據與測試數據的代溝。由於數據的部分被擦掉了,因而這破損數據一定程度上比較接近測試數據。(訓練、測試肯定有同有異,當然我們要求同舍異)。這樣訓練出來的Weight的魯棒性就提高了。
2.2 BERT與DAE、Masked Language Model的關係
BERT是一種基於Transformer Encoder來構建的一種模型,它整個的架構其實是基於DAE(Denoising Autoencoder,去噪自編碼器)的,這部分在BERT文章里叫作Masked Lanauge Model(MLM)。MLM並不是嚴格意義上的語言模型,因為整個訓練過程並不是利用語言模型方式來訓練的。BERT隨機把一些單詞通過MASK標籤來代替,並接著去預測被MASK的這個單詞, 過程其實就是DAE的過程。 BERT有兩種主要訓練好的模型,分別是BERT-Small和BERT-Large, 其中BERT-Large使用了12層的Encoder結構。整個的模型具有非常多的參數。
雖然BERT有很好的表現,但本身也有一些問題。比如, BERT並不能用來生成數據。 由於BERT本身是依賴於DAE的結構來訓練的,所以不像那些基於語言模型訓練出來的模型具備很好地生成能力。之前的方法比如NNLM、ELMo是基於語言模型生成的,所以用訓練好的模型可以生成出一些句子、文本等。但基於這類生成模型的方法論本身也存在一些問題,因為理解一個單詞在上下文里的意思的時候, 語言模型只考慮了它的上文,而沒有考慮下文!
BERT在2018年提出,當時引起了爆炸式的反應,因為從效果上來講刷新了非常多的記錄,之後基本上開啟了這個領域的飛速的發展。
3. BERT模型詳解
3.1 BERT簡介
Bidirection:BERT的整個模型結構和ELMo類似,都是雙向的。
Encoder:是一種編碼器,BERT只是用到了Transformer的Encoder部分。
Representation:做詞的表征。
Transformer:Transformer是BERT的核心內部元素。
BERT的基本思想和Word2Vec、CBOW是一樣的,都是給定context,來預測下一個詞。BERT的結構和ELMo是相似的都是雙向結構。第一個利用Transformer的並不是BERT,而是GPT。
3.2 BERT的模型結構
BERT的模型結構是Seq2Seq,核心是Transformer encoder,而Transformer encoder裡面又包含前面介紹的五個很重要的部分。
3.3 BERT的輸入
接下來看一下BERT的輸入,BERT的輸入包含三個部分:Token Embeddings、Segment Embeddings、Position Embeddings。這三個部分在整個過程中是可以學習的。
特殊字符介紹:
- CLS,全稱是Classification Token(CLS),是用來做一些分類任務。「CLS」token為什麼會放在第一位?因為本身BERT是並行結構,「CLS」放在尾部也可以,放在中間也可以。放在第一個應該是比較方便。
- SEP,全稱是Special Token(SEP),是用來區分兩個句子的,因為通常在train BERT的時候會輸入兩個句子。從下面圖片中,可以看出SEP是區分兩個句子的token。
- Token Embedding:就是對輸入的每次單詞進行Embedding。
- Segment Embedding:標記輸入的Token是屬於句子A還是句子B。
- Position Embedding:具體標記每一個Token的位置。
最後,把這三個Embedding的對應位置加起來,作為BERT最後的輸入Embedding。
4. BERT模型的不同訓練方法
4.1 BERT的預訓練
BERT是如何做預訓練的?有兩個任務:一是Masked Language Model(MLM);二是Next Sentence Predicition(NSP)。在訓練BERT的時候,這兩個任務是同時訓練的。所以,BERT的損失函數是把這兩個任務的損失函數加起來的,是一個多任務訓練。
BERT官方提供了兩個版本的BERT模型。一個是BERT的BASE版,另一個是BERT的LARGE版。BERT的BASE版有12層的Transformer,隱藏層Embedding的維度是768,head是12個,參數總數大概是一億一千萬。BERT的LARGE版有24層的Transformer,隱藏層Embedding的維度是1024,head是16個,參數總數大概是三億四千萬。
4.2 BERT-Masked Language Model
什麼是Masked Language Model?它的靈感來源於完形填空。具體在BERT中,掩蓋了15%的Tokens。這掩蓋了15%的Tokens又分為三種情況:一是,有80%的字符用「MASK」這個字符替換;二是,有10%的字符用另外的字符替換;三是,有10%的字符是保持不動。最後在計算損失時,只計算被掩蓋的這些Tokens,也就是掩蓋了15%的Tokens。
4.3 BERT-Next Sentence Prediction
Next Sentence Prediction是更關注於兩個句子之間的關係。與Masked Language Model任務相比,Next Sentence Prediction更簡單些。
4.4 BERT-Training Tips
4.5 BERT-What it looks like?
訓練好BERT之後,我們來研究BERT內部的機制。BERT的BASE版本有12個head,每一個head是否有相同的功能?如下圖所示,第一個head的連線非常的密集,它是Attends broadly;對於第3個head到第1個head,更關注的是下一個單詞;對於第8個head到第7個head,更關注的是句子的分割符(SEP);對於第11個head到第6個head,更關注的是句子的句號。
所以,對於每一個head來說,代表的意義是不一樣的,這也是BERT強大的原因。BERT本身的Multi-Headed結構可以抓住不一樣的特徵,包括全局的特徵、局部的特徵等。
BERT的BASE版有12層的Transformer,下圖中的每一個顏色代表一層的Transformer,相同顏色會聚集的比較近。相同層的head是非常相近的!
針對上面兩幅圖進行總結,對於含有12層+12個Head的BERT模型,對於每一層來說,它的Head的功能是相似的;對於每一個Head裡面的Attention表現出的功能是完全不一樣的。
4.6 BERT-What it learns?
在論文「 Tenney I, Das D, Pavlick E. Bert rediscovers the classical nlp pipeline[J]. arXiv preprint arXiv:1905.05950, 2019.」中研究了BERT的LARGE版本中每層Transformer在不同NLP任務中所做的貢獻。
從上圖可知,藍色部分越長表示改層Transformer對該NLP任務所起的作用更大。在Coref.任務中,可以看到18、19、20層所起的作用更大。
4.7 BERT-Multilingual Version
相關的GitHub地址:https://github.com/google-research/bert/blob/master/multilingual.md
5. 如何把BERT模型應用在實際項目中
我們有了BERT模型,也已經把BERT模型預訓練好了,那麼我們能用BERT模型做哪些NLP的任務呢?
- Classification
- Questions & Answering
- Named Entity Recognition(NER)
- Chat Bot(Intent Classification & Slot Filling)
- Reading Comprehension
- Sentiment Analysis
- Reference Resolution
- Fact Checking
- etc.
5.1 Classification
BERT論文提到:
【1】Devlin J, Chang M W, Lee K, et al. Bert: Pre-training of deep bidirectional transformers for language understanding[J]. arXiv preprint arXiv:1810.04805, 2018.
5.2 Questions & Answering
BERT論文提到:
【1】Devlin J, Chang M W, Lee K, et al. Bert: Pre-training of deep bidirectional transformers for language understanding[J]. arXiv preprint arXiv:1810.04805, 2018.
我們來看一下如何在QA系統中應該BERT:
具體信息可以參看:Bert時代的創新(應用篇):Bert在NLP各領域的應用進展 - 張俊林的文章 - 知乎 https://zhuanlan.zhihu.com/p/68446772
5.3 Named Entity Recognition(NER)
BERT論文提到:
【1】Devlin J, Chang M W, Lee K, et al. Bert: Pre-training of deep bidirectional transformers for language understanding[J]. arXiv preprint arXiv:1810.04805, 2018.
5.4 Chat Bot(Intent Classification & Slot Filling)
相關論文:
【1】Chen Q, Zhuo Z, Wang W. Bert for joint intent classification and slot filling[J]. arXiv preprint arXiv:1902.10909, 2019.
5.5 Reading Comprehension
6. 如何對BERT減肥
BERT表現的非常好,但是它參數太多了。我們能不能把BERT模型進行壓縮一下,方便我們使用呢?壓縮模型常用方法如下:
- Pruning-remove parts from the model
- Quantization-covert Double to Int32
- Distillation-teach a small model
6.1 知識蒸餾
7. BERT存在的問題
相關論文:
【1】Niven T, Kao H Y. Probing neural network comprehension of natural language arguments[J]. arXiv preprint arXiv:1907.07355, 2019. 該論文指出,現存的數據集不能很好的評估BERT模型的表現。
【2】Si C, Wang S, Kan M Y, et al. What does BERT Learn from Multiple-Choice Reading Comprehension Datasets?[J]. arXiv preprint arXiv:1910.12391, 2019. 該論文在數據集中添加干擾文本,結果顯示BERT的表現非常差。