BERT语言模型
1 Transformer原理
文章:《Attention Is All You Need》
模型架構(gòu)圖如下:
transformer的結(jié)構(gòu)由encoder編碼和decoder解碼組成。
1.1 Encoder
Encoder組件部分由一堆Layer(可以理解為編碼器)構(gòu)成(論文中是將6個(gè)Layer疊在一起)。Decoder解碼組件部分也是由相同數(shù)量(與編碼器對應(yīng))的解碼器(decoder)組成的。每個(gè)Layer由兩個(gè)sub-layer組成,分別是multi-head self-attention mechanism和fully connected feed-forward network,sub-layer的結(jié)構(gòu)相同,但是沒有共享參數(shù)。
?
使用self-attrntion,考慮到以下三個(gè)需求:
- the total computational complexity per layer 每層計(jì)算復(fù)雜度
- the amount of computation that can be parallelized, as measured by the minimum number of sequential operations required.
- the path length between long-range dependencies in the network
1.2 Decoder
Decoder組件部分與Encoder很想,但是它多了一個(gè)attention的sub-layer(解碼注意力層),用來關(guān)注輸入句子的相關(guān)部分(和seq2seq模型的注意力作用相似)。
Transformer的一個(gè)核心特性,在這里輸入序列中每個(gè)位置的單詞都有自己獨(dú)特的路徑流入編碼器。在自注意力層中,這些路徑之間存在依賴關(guān)系。而前饋(feed-forward)層沒有這些依賴關(guān)系。因此在前饋(feed-forward)層時(shí)可以并行執(zhí)行各種路徑。如下圖所示:
輸入句子: The animal didn't cross the street because it was too tired
隨著模型處理輸入序列的每個(gè)單詞,自注意力會關(guān)注整個(gè)輸入序列的所有單詞,幫助模型對本單詞更好地進(jìn)行編碼。
如果你熟悉RNN(循環(huán)神經(jīng)網(wǎng)絡(luò)),回憶一下它是如何維持隱藏層的。RNN會將它已經(jīng)處理過的前面的所有單詞/向量的表示與它正在處理的當(dāng)前單詞/向量結(jié)合起來。而自注意力機(jī)制會將所有相關(guān)單詞的理解融入到我們正在處理的單詞中。
當(dāng)我們在編碼器#5(棧中最上層編碼器)中編碼“it”這個(gè)單詞的時(shí),注意力機(jī)制的部分會去關(guān)注“The Animal”,將它的表示的一部分編入“it”的編碼中。
1.3?Positional Encoding
除了主要的Encoder和Decoder,還有數(shù)據(jù)預(yù)處理的部分。Transformer拋棄了RNN,而RNN最大的優(yōu)點(diǎn)就是在時(shí)間序列上對數(shù)據(jù)的抽象,所以文章中作者提出兩種Positional Encoding的方法,將encoding后的數(shù)據(jù)與embedding數(shù)據(jù)求和,加入了相對位置信息。計(jì)算方法:
- 用不同頻率的sine和cosine函數(shù)直接計(jì)算
- 學(xué)習(xí)出一份positional embedding
作者試驗(yàn)了上面兩種方法,兩者的結(jié)果很相近,最后選了第一種方法,是因?yàn)樗梢栽试S模型外推到比訓(xùn)練期間遇到的序列長度更長的序列長度(We chose the sinusoidal version because it may allow the model to extrapolate to sequence lengths longer than the ones encountered during training)。
推薦文章:
Attention Is All You Need
【NLP】Transformer詳解
BERT大火卻不懂Transformer?讀這一篇就夠了
2 BERT 原理
文章《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》
BERT是一種基于微調(diào)的多層雙向Transformer編碼器,其中的Transformer與原始的Transformer是相同的。
BERT 利用了 Transformer 的 encoder 部分。
Transformer 是一種注意力機(jī)制,可以學(xué)習(xí)文本中單詞(或子單詞)之間的上下文關(guān)系。
Transformer 的原型包括兩個(gè)獨(dú)立的機(jī)制,一個(gè) encoder 負(fù)責(zé)接收文本作為輸入,一個(gè) decoder 負(fù)責(zé)預(yù)測任務(wù)的結(jié)果。
BERT 的目標(biāo)是生成語言模型,所以只需要 encoder 機(jī)制。
Transformer 的 encoder 是一次性讀取整個(gè)文本序列,而不是從左到右或從右到左地按順序讀取,因此它被認(rèn)為是雙向的,盡管說它是非定向的更準(zhǔn)確。。
下圖是 Transformer 的 encoder 部分,輸入是一個(gè) token 序列,先對其進(jìn)行 embedding 稱為向量,然后輸入給神經(jīng)網(wǎng)絡(luò),輸出是大小為 H 的向量序列,每個(gè)向量對應(yīng)著具有相同索引的 token。
在訓(xùn)練語言模型時(shí),存在定義預(yù)測目標(biāo)的挑戰(zhàn)。 許多模型預(yù)測序列中的下一個(gè)單詞(例如“The child came home from ___”),這是一種固有地限制語境學(xué)習(xí)的方向性方法。 為了克服這一挑戰(zhàn),BERT模型使用兩個(gè)新的無監(jiān)督預(yù)測任務(wù)對BERT進(jìn)行預(yù)訓(xùn)練,分別是Masked LM和Next Sentence Prediction。
2.1?Masked LM
為了訓(xùn)練深度雙向Transformer表示,采用了一種簡單的方法:隨機(jī)掩蓋部分輸入詞,然后對那些被掩蓋的詞進(jìn)行預(yù)測,此方法被稱為“Masked LM”(MLM)。預(yù)訓(xùn)練的目標(biāo)是構(gòu)建語言模型,BERT模型采用的是bidirectional Transformer。那么為什么采用“bidirectional”的方式呢?因?yàn)樵陬A(yù)訓(xùn)練語言模型來處理下游任務(wù)時(shí),我們需要的不僅僅是某個(gè)詞左側(cè)的語言信息,還需要右側(cè)的語言信息。
在訓(xùn)練的過程中,隨機(jī)地掩蓋每個(gè)序列中15%的token,并不是像word2vec中的cbow那樣去對每一個(gè)詞都進(jìn)行預(yù)測。MLM從輸入中隨機(jī)地掩蓋一些詞,其目標(biāo)是基于其上下文來預(yù)測被掩蓋單詞的原始詞匯。與從左到右的語言模型預(yù)訓(xùn)練不同,MLM目標(biāo)允許表示融合左右兩側(cè)的上下文,這使得可以預(yù)訓(xùn)練深度雙向Transformer。Transformer編碼器不知道它將被要求預(yù)測哪些單詞,或者哪些已經(jīng)被隨機(jī)單詞替換,因此它必須對每個(gè)輸入詞保持分布式的上下文表示。此外,由于隨機(jī)替換在所有詞中只發(fā)生1.5%,所以并不會影響模型對于語言的理解。這樣在預(yù)測輸出詞需要以下三步計(jì)算:
- 在編碼器輸出之上添加分類層。
- 將輸出向量乘以嵌入矩陣,將它們轉(zhuǎn)換為詞匯維度。
- 用softmax計(jì)算詞匯表中每個(gè)單詞的概率。
2.2 Next Sentence Prediction
很多句子級別的任務(wù)如自動問答(QA)和自然語言推理(NLI)都需要理解兩個(gè)句子之間的關(guān)系,譬如上述Masked LM任務(wù)中,經(jīng)過第一步的處理,15%的詞匯被遮蓋。那么在這一任務(wù)中我們需要隨機(jī)將數(shù)據(jù)劃分為等大小的兩部分,一部分?jǐn)?shù)據(jù)中的兩個(gè)語句對是上下文連續(xù)的,另一部分?jǐn)?shù)據(jù)中的兩個(gè)語句對是上下文不連續(xù)的。然后讓Transformer模型來識別這些語句對中,哪些語句對是連續(xù)的,哪些語句是不連續(xù)。
注意:作者特意說了語料的選取很關(guān)鍵,要選用document-level的而不是sentence-level的,這樣可以具備抽象連續(xù)長序列特征的能力。
為了幫助模型區(qū)分開訓(xùn)練中的兩個(gè)句子,輸入在進(jìn)入模型之前要按以下方式進(jìn)行處理:
-
token Embeddings表示詞向量,第一個(gè)單詞是CLS標(biāo)志,可以用于之后的分類任務(wù),對于非分類任務(wù),可以忽略詞向量;
-
Segment Embeddings用來區(qū)別兩種句子,因?yàn)轭A(yù)訓(xùn)練不只做語言模型還要做以兩個(gè)句子為輸入的分類任務(wù);
-
Position Embeddings是通過模型學(xué)習(xí)得到的
為了預(yù)測第二個(gè)句子是否是第一個(gè)句子的后續(xù)句子,用下面幾個(gè)步驟來預(yù)測:
在訓(xùn)練 BERT 模型時(shí),Masked LM 和 Next Sentence Prediction 是一起訓(xùn)練的,目標(biāo)就是要最小化兩種策略的組合損失函數(shù)。
2.3?Fine-tuning (How to use BERT)
BERT可用于各種語言任務(wù),而只需在核心模型中添加一個(gè)層:
- Classification tasks such as sentiment analysis are done similarly to Next Sentence classification, by adding a classification layer on top of the Transformer output for the [CLS] token.(在分類任務(wù)中,例如情感分析等,只需要在 Transformer 的輸出之上加一個(gè)分類層)
- In Question Answering tasks (e.g. SQuAD v1.1), the software receives a question regarding a text sequence and is required to mark the answer in the sequence. Using BERT, a Q&A model can be trained by learning two extra vectors that mark the beginning and the end of the answer.(在問答任務(wù)(例如SQUAD v1.1)中,問答系統(tǒng)需要接收有關(guān)文本序列的 question,并且需要在序列中標(biāo)記 answer。 可以使用 BERT 學(xué)習(xí)兩個(gè)標(biāo)記 answer 開始和結(jié)尾的向量來訓(xùn)練Q&A模型)
- In Named Entity Recognition (NER), the software receives a text sequence and is required to mark the various types of entities (Person, Organization, Date, etc) that appear in the text. Using BERT, a NER model can be trained by feeding the output vector of each token into a classification layer that predicts the NER label.(在命名實(shí)體識別(NER)中,系統(tǒng)需要接收文本序列,標(biāo)記文本中的各種類型的實(shí)體(人員,組織,日期等)。 可以用 BERT 將每個(gè) token 的輸出向量送到預(yù)測 NER 標(biāo)簽的分類層)
在 fine-tuning 中,大多數(shù)超參數(shù)可以保持與 BERT 相同,在論文中還給出了需要調(diào)整的超參數(shù)的具體指導(dǎo)
推薦文章:
《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》
BERT算法原理解析
BERT – State of the Art Language Model for NLP? ? ? ? ? ? ?5 分鐘入門 Google 最強(qiáng)NLP模型:BERT
3?利用預(yù)訓(xùn)練的BERT模型將句子轉(zhuǎn)換為句向量,進(jìn)行文本分類
code 尚未學(xué)習(xí)
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
總結(jié)
- 上一篇: Mac:github 下载慢的问题
- 下一篇: C语言结构体的定义与使用、结构体数组、指