前面已經(jīng)說了transformer(BERT(一) Transformer原理理解)的模型以及具體結(jié)構(gòu)中每一個(gè)component的作用己肮,那么今天這一篇我將會(huì)總結(jié)BERT(Bidirectional Encoder Representations from Transformers)是如何利用transformer的結(jié)構(gòu)進(jìn)行自然語言處理的拓哟。關(guān)于BERT與transformer的關(guān)系大家要能理解.章喉, 這里的embedding其實(shí)就是我們encoder輸出的隱藏層刨裆,其shape是[batch_size, length, embedding_size]
, 后面的自然語言處理任務(wù)則是根據(jù)這個(gè)embedding的特征編碼進(jìn)行任務(wù)處理聂示,如回歸分類等。
棺弊,但是我們可以利用BERT可以做很多自然語言處理的很多事情晶密。這里我將會(huì)通過兩個(gè)方向來解釋BERT,分別是:
【1】 如何訓(xùn)練我們的BERT模型
【2】如何利用我們的BERT模型進(jìn)行自然語言處理任務(wù)
一模她、 訓(xùn)練BERT模型
1稻艰、 訓(xùn)練方法一: 使用MLM(Masked Language Model)方法
比如上面的一句話 今天 [mask] 玩 DOTA,我們不知道這里的 [mask]究竟指代的是什么侈净,有可能指代的是咱們尊勿,有可能是你們,我們希望我們的模型去預(yù)測這里的mask畜侦, 從圖中可以很明顯的看出我們?cè)谳敵鰁mbedding
乘上[embedding_size, 單詞數(shù)量]
的矩陣元扔,再經(jīng)過一個(gè)softmax就可以預(yù)測出該字是什么。
如果還是有點(diǎn)迷惑旋膳,那我們繼續(xù)往下面去看澎语。
就是隨機(jī)遮蓋或替換一句話里面任意字或詞, 然后讓模型通過上下文的理解預(yù)測那一個(gè)被遮蓋或替換的部分, 之后做Loss的時(shí)候只計(jì)算被遮蓋部分的Loss** , 其實(shí)是一個(gè)很容易理解的任務(wù)。
論文中是這樣說的我們?cè)谳斎脒@句話的時(shí)候需要將一句話中15%的 單詞進(jìn)行mask验懊,也就是說不僅僅是這一個(gè) mask擅羞,當(dāng)然在這15%的mask中對(duì)于mask的編碼有三種方式:
【1】 80%直接將mask統(tǒng)一編碼成unknow的編碼形式作為模型輸入,然后去預(yù)測該輸出emdedding的單詞
【2】10%直接將mask替換成其他的單詞編碼輸入义图,比如說"小狗"减俏,讓模型預(yù)測其對(duì)應(yīng)的embedding的輸出
【3】10%保持不變的方式直接輸入到模型中去
這里摘用論文的demo
Masked LM and the Masking Procedure Assuming the unlabeled sentence is my dog is
hairy, and during the random masking procedure
we chose the 4-th token (which corresponding to
hairy), our masking procedure can be further illustrated by
? 80% of the time: Replace the word with the [MASK] token, e.g., my dog is hairy → my dog is [MASK]
? 10% of the time: Replace the word with a random word, e.g., my dog is hairy → my dog is apple
? 10% of the time: Keep the word unchanged, e.g., my dog is hairy → my dog is hairy. The purpose of this is to bias the representation towards the actual observed word.
這里我簡要說明一下具體矩陣是怎么計(jì)算的。首先在我們進(jìn)行mask機(jī)制之后碱工,讓模型預(yù)測和還原唄遮蓋或替換掉的部分娃承,模型最終輸出的隱藏層的計(jì)算結(jié)果的維度是:
我們初始化一個(gè)映射層的權(quán)重奏夫,
這里的就是字典中字的數(shù)量,簡單理解就是字典one-hot編碼草慧。我們?cè)谟?img class="math-inline" src="https://math.jianshu.com/math?formula=W_%7Bvocab%7D" alt="W_{vocab}" mathimg="1">完成隱藏維度到子向量數(shù)量的映射桶蛔,只要求和的矩陣進(jìn)行矩陣乘法(點(diǎn)積)匙头。這樣我們就進(jìn)行如下計(jì)算
之后把上面的計(jì)算結(jié)果在(最后一個(gè)維度)做softmax漫谷,是每個(gè)字對(duì)應(yīng)的的和為1, 我們就可以通過里概率最大的字來得到模型的預(yù)測結(jié)果蹂析,就可以和我們準(zhǔn)備好的做損失并反傳梯度舔示。注意在損失的時(shí)候,值計(jì)算句子中隨機(jī)遮蓋或替換的部分电抚,其余部分不做損失惕稻,對(duì)于其他部分,模型輸出什么東西蝙叛,我們并不在意俺祠。
這里這么用的好處總結(jié)如下:
1、首先, 如果所有參與訓(xùn)練的token被100%的[MASK], 那么在fine-tunning的時(shí)候所有單詞都是已知的, 不存在[MASK], 那么模型就只能根據(jù)其他token的信息和語序結(jié)構(gòu)來預(yù)測當(dāng)前詞, 而無法利用到這個(gè)詞本身的信息, 因?yàn)樗鼈儚奈闯霈F(xiàn)在訓(xùn)練過程中, 等于模型從未接觸到它們的信息, 等于整個(gè)語義空間損失了部分信息. 采用80%的概率下應(yīng)用[MASK], 既可以讓模型去學(xué)著預(yù)測這些單詞, 又以20%的概率保留了語義信息展示給模型借帘。
2蜘渣、保留下來的信息如果全部使用原始token, 那么模型在預(yù)訓(xùn)練的時(shí)候可能會(huì)偷懶, 直接照抄當(dāng)前token信息. 采用10%概率下random token來隨機(jī)替換當(dāng)前token, 會(huì)讓模型不能去死記硬背當(dāng)前的token, 而去盡力學(xué)習(xí)單詞周邊的語義表達(dá)和遠(yuǎn)距離的信息依賴, 嘗試建模完整的語言信息.
3、最后再以10%的概率保留原始的token, 意義就是保留語言本來的面貌, 讓信息不至于完全被遮掩, 使得模型可以"看清"真實(shí)的語言面貌肺然。
2蔫缸、 訓(xùn)練方法二: NSP(Next Sentence Prediction)方法
首先我們拿到屬于上下文的一對(duì)句子, 也就是兩個(gè)句子, 之后我們要在這兩段連續(xù)的句子里面加token。
,也就是在句子開頭加一個(gè), 在兩句話這之中和句子的末尾加, 具體如下圖所示际起。
- 我們看到上圖中兩句話是 my dog is cute he likes playing , 我的狗很可愛他喜歡玩耍, 除此之外, 我們還要準(zhǔn)備同樣格式的兩句話, 但他們不屬于上下文關(guān)系的情況;
我的狗很可愛企鵝不擅長飛行, 可見這屬于上下句不屬于上下文關(guān)系的情況; 在實(shí)際的訓(xùn)練中, 我們讓上面兩種情況出現(xiàn)的比例為, 也就是一半的時(shí)間輸出的文本屬于上下文關(guān)系, 一半時(shí)間不是. - 我們進(jìn)行完上述步驟之后, 還要隨機(jī)初始化一個(gè)可訓(xùn)練的, 見上圖中, 作用就是用的信息讓模型分開上下句, 我們一把給上句全的, 下句啊全的, 讓模型得以判斷上下句的起止位置, 例如:
我的狗很可愛企鵝不擅長飛行
上面和就是. - 還記得我們上節(jié)課說過的, 注意力機(jī)制就是, 讓每句話中的每一個(gè)字對(duì)應(yīng)的那一條向量里, 都融入這句話所有字的信息, 那么我們?cè)谧罱K隱藏層的計(jì)算結(jié)果里, 只要取出所對(duì)應(yīng)的一條向量, 里面就含有整個(gè)句子的信息, 因?yàn)槲覀兤谕@個(gè)句子里面所有信息都會(huì)往所對(duì)應(yīng)的一條向量里匯總:
模型最終輸出的隱藏層的計(jì)算結(jié)果的維度是:
我們
我們要取出所對(duì)應(yīng)的一條向量, 對(duì)應(yīng)著維度的第條:
之后我們?cè)俪跏蓟粋€(gè)權(quán)重, 完成從維度到的映射, 也就是邏輯回歸, 之后用函數(shù)激活, 就得到了而分類問題的推斷拾碌。
二、 如何使用BERT模型
1. 實(shí)例1
預(yù)測出輸出的分類街望,輸出句子分類校翔,比如在情感分類我們就可以使用這種BERT模型案例。Linear Classifier是隨機(jī)初始化的灾前,但是在訓(xùn)練的時(shí)候可以讓Linear Classifier調(diào)節(jié)防症, BERT進(jìn)行微調(diào)就好。
2. 實(shí)例2
這里就需要去得到每個(gè)詞匯是什么詞類型豫柬,只要我們得出詞的embedding, 然后在接上分類網(wǎng)絡(luò)告希,我們就可以得出每個(gè)詞的詞類型。
3. 實(shí)例3
這里我們輸入兩個(gè)句子輸出是表示根據(jù)第一句的假設(shè)烧给,第二個(gè)是進(jìn)行表示是否第二個(gè)句子可以根據(jù)第二個(gè)句子可以判斷燕偶。如果可以就是True, 不可以就是False, 不知道就是Unknow础嫡。也就是我們之前說的 NSP(Next Sentence Prediction)類型很相似指么,預(yù)測兩個(gè)句子的關(guān)聯(lián)程度酝惧。
4. 實(shí)例4
第四個(gè)案例其實(shí)就是為了解決QA 問題,但是此QA問題中的answer的前提條件就是能在文章中找到伯诬。如圖中的橘色的weight就是預(yù)測出answer start position晚唇, 而圖中藍(lán)色的weight就是為了預(yù)測出answer的end position,后面可以接一個(gè)softmax進(jìn)行分類盗似,這樣我們可以得到概率醉大的位置索引哩陕。我們就可以根據(jù)start position 以及end position的索引得到文章中的索引,但是如果start position小于end position我們可以理解中文章沒有結(jié)果赫舒。
三悍及、 額外補(bǔ)充
3.1 ERNIE
ERNIE模型是專門針對(duì)中文的進(jìn)行的語言模型,考慮的維度不僅僅是字的維度而是單詞的維度接癌。
3.2 BERT不同層所表示的意義
通過上圖我們可以看到隨著NLP任務(wù)難度的加深心赶,BERT越深層的權(quán)重越高(重要性),越簡單的任務(wù)缺猛,BERT越淺層的權(quán)重越小缨叫。(淺層和文本有關(guān),深層和語義有關(guān))
哈哈~ 終于說完了BERT荔燎,這里我會(huì)提供一個(gè)基于BERT進(jìn)行情感分類的代碼耻姥,這里的代碼有很多注釋,可以方便去學(xué)習(xí)湖雹。
code 地址:Semantic Analysis(Pytorch)