導航:首頁 > 數據處理 > bert訓練要多少數據

bert訓練要多少數據

發布時間:2023-05-31 03:20:34

⑴ BERT關系抽取之R-BERT模型

前期知識准備 :RNN, CNN, BERT, SemEval-2010 Task 8數據集, F1值

關系分類是一個重要的NLP任務,其主要目標是提取出實體之間的關系。最先進的關系分類方法主要是基於CNN或RNN。最近,預訓練BERT模型在許多NLP的分類和序列標注任務中都獲得了非常好的結果。關系分類不同於其他NLP任務的主要原因是它既依賴於句子的信息,又依賴於兩個目標實體的信息。在本文中,我們提出了一個用來解決關系分類任務的模型,它既利用了預訓練的BERT語言模型,又結合來自目標實體的信息。我們定位目標實體並通過預訓練結構傳遞信息,同時還結合了兩個實體的相關編碼。在SemEval-2010 Task 8任務上,相比目前的最優模型我們的方法獲得了有效的提升。簡桐搜

R-BERT的預訓練完全採用BERT模型,輸入句子為單句,因此不需要添加[SEP]。其輸出分為三部分,分別是[CLS]隱含狀態向量和兩個實體的隱含狀態向量。作者認為第一部分可以保存句子的語義內容,後兩個部分可以保存兩個實體的信息。

其中,i ,j分別為第一個實體的首、尾字元位置;k,m分別為第二個實體的首、尾字元位置。神經網路中,權重系數和偏置系數均共享,即 W0 = W1 = W2,b0 = b1 = b2。

該數據集包含9類語義關系和一個Other類別,規定某關系如果不屬於9類語義關系中的一種,則其屬於Other類別。9類關系分別是:Cause-Effect、Component-Whole、Content-Container、Entity-Destination、Entity-Origin、Instrument-Angency、Member-Collection、Message-Topic和Proct-Procer。數據集中共有10717個句子,8000個句子為訓練集,2717個句子為測試集,每個句子包含e1和e2兩個名詞以及與該句子相關的關系類型。需要注意的是,關系是有向的,即關系(e1, e2)和關系(e2, e1)不同。

作者還在相同的數據集上比較了其他多種模型,其中包括:SVM、RNN、MVRNN、CNN+Softmax、FCM、CR-CNN、Attention CNN、Att-Pooling-CNN和Entity Attention Bi-LSTM,以F1值作為評測標准,其結果如下:

可見,R-BERT的F1值達到了89.25,相比於其他方法有著明顯的優勢。

為了探究BERT模型之外的部分對最後識別結果的影響,作者分別進行了如下額外實驗,並得到結論:
(1)去除了實體前後的標識符,這種做法會使模型的F1值從89.25%降到87.98%,說明了標識符可以幫助提供實體信息。
(2)在BERT輸出層僅使用[CLS]句子向量而不利用實體向量,這樣會使得模型F1值從89.25%降到87.99%,說輪正明主動明確實體信息對模型是有幫助的。

想辦法給模型明確實體的位置對於關系抽取問題精度的提升是有攔歷幫助的。

https://zhuanlan.hu.com/p/78445887
https://blog.csdn.net/qq_36426650/article/details/96629835

⑵ BERT詳解(附帶ELMo、GPT 介紹)

首先我會詳細闡述 BERT 原理,然後簡單介紹一下 ELMO 以及 GPT

BERT 全稱為 B idirectional E ncoder R epresentation from T ransformer,是 Google 以 無監督的方式利用大量無標注文本 「煉成」的語言模型,其架構為 Transformer 中的 Encoder(BERT=Encoder of Transformer)

我在 Transformer 詳解 中已經詳細的解釋了所有 Transformer 的相關概念,這里就不再贅述

以往為了解決不同的 NLP 任務,我們會為該任務設計一個最合適的神經網路架構並做訓練,以下是一些簡單的例子

不同的 NLP 任務通常需要不同的模型,而設計這些模型並測試其 performance 是非常耗成本的(人力,時間,計算資源)改扒嘩。如果有一個能 直接處理各式 NLP 任務的通用架構 該有多好?

隨著時代演進,不少人很自然地有了這樣子的想法,而 BERT 就是其中一個將此概念付諸實踐的例子

Google 在預訓練 BERT 時讓它同時進行兩個任務:
1. 漏字填空
2. 下個句子預測

對正常人來說,要完成這兩個任務非常簡單。只要稍微看一下前後文就知道完形填空任務中 [MASK] 里應該填 退了 ;而 醒醒吧 後面接 你沒有妹妹 也十分合理(?)

接下來我會分別詳細介紹論文中這兩個任務的設計細節

在 BERT 中,Masked LM(核行Masked Language Model)構建了語言模型,簡單來說,就是 隨機遮蓋或替換 一句話裡面的任意字或詞,然後讓模型通過上下文預測那一個被遮蓋或替換的部分,之後 做 Loss 的時候也只計算被遮蓋部分的 Loss ,這其實是一個很容易理解的任務,實際操作如下:

這樣做的好處是,BERT 並不知道 [MASK] 替換的是哪一個詞,而且 任何一個詞都有可能是被替換掉的,比如它看到的 apple 可能是被替換的詞 。這樣強迫模型在編碼當前時刻詞的時候 不能太依賴當前的詞 ,而要考慮它的上下文,甚至根據上下文進行 "糾錯"。比如上面的例子中,模型在編碼 apple 時,根據上下文 my dog is,應該 把 apple 編碼成 hairy 的語義而不是 apple 的語義

我們首先拿到屬於上下文的一對句子,也就是兩個句子,之後我們要在這兩個句子中加一些特殊的 token: [CLS]上一句話[SEP]下一句話[SEP] 。也就是在句子開頭加一個 [CLS] ,在兩句話之間和句末加 [SEP] ,具體地如下圖所示

可以看到,上圖中的兩句話明顯是連續的。如果現在有這么一句話 [CLS] 我的狗很可愛 [SEP] 企鵝不擅長飛行 [SEP] ,可見這兩句話就 不是連續的 。在實際訓練中,我們會讓這兩種情況出現的數量為** 1:1**

Token Embedding 就是正常的詞向量,即 PyTorch 中的 nn.Embedding()
Segment Embedding 的作用是用 embedding 的信息讓模型 分開上下句 ,我們給上句的 token 全 0,下句的此含 token 全 1,讓模型得以判斷上下句的起止位置,例如

Position Embedding 和 Transformer 中的不一樣,不是三角函數,而是 學習出來的

BERT 預訓練階段實際上是將上述兩個任務結合起來,同時進行,然後將所有的 Loss 相加,例如

BERT 的 Fine-Tuning 共分為 4 種類型,以下內容、圖片均來自台大李宏毅老師 Machine Learning 課程 (以下內容 圖在上,解釋在下)

為什麼要用CLS?
這里李宏毅老師有一點沒講到,就是為什麼要用第一個位置,即 [CLS] 位置的 output。這里我看了網上的一些博客,結合自己的理解解釋一下。因為 BERT 內部是 Transformer,而 Transformer 內部又是 Self-Attention, 所以 [CLS] 的 output 裡面肯定含有整句話的完整信息 ,這是毋庸置疑的。但是 Self-Attention 向量中,自己和自己的值其實是佔大頭的,現在假設使用 的 output 做分類,那麼這個 output 中實際上會更加看重 ,而 又是一個有實際意義的字或詞,這樣難免會影響到最終的結果。但是 [CLS] 是沒有任何實際意義的,只是一個佔位符而已,所以就算 [CLS] 的 output 中自己的值佔大頭也無所謂。當然你 也可以將所有詞的 output 進行 concat,作為最終的 output

首先將問題和文章通過 [SEP] 分隔,送入 BERT 之後,得到上圖中黃色的輸出。此時我們還要訓練兩個 vector,即上圖中橙色和黃色的向量。首先將橙色和所有的黃色向量進行 dot proct,然後通過 softmax,看哪一個輸出的值最大,例如上圖中 對應的輸出概率最大,那我們就認為 s=2

同樣地,我們用藍色的向量和所有黃色向量進行 dot proct,最終預測得 的概率最大,因此 e=3。最終,答案就是 s=2,e=3

你可能會覺得這裡面有個問題,假設最終的輸出 s>e 怎麼辦,那不就矛盾了嗎?其實在某些訓練集里,有的問題就是沒有答案的,因此此時的預測搞不好是對的,就是沒有答案

以上就是 BERT 的詳細介紹,參考以下文章

ELMo是Embedding from language Model的縮寫,它通過無監督的方式對語言模型進行預訓練來學習單詞表示

這篇論文的想法其實非常簡單,但是效果卻很好。它的思路是用 深度的雙向 Language Model 在大量未標注數據上訓練語言模型 ,如下圖所示

在實際任務中,對於輸入的句子,我們使用上面的語言模型來處理它,得到輸出向量,因此這可以看作是一種 特徵提取 。但是 ELMo 與普通的 Word2Vec 或 GloVe 不同,ELMo 得到的 Embedding 是 有上下文信息

具體來說,給定一個長度為 N 的句子,假設為 ,語言模型會計算給定 的條件下出現 的概率:

傳統的 N-gram 模型 不能考慮很長的歷史 ,因此現在的主流是使用 多層雙向 LSTM 。在時刻 ,LSTM 的第 層會輸出一個隱狀態 ,其中 , 是 LSTM 的層數。最上層是 ,對它進行 softmax 之後得到輸出詞的概率

類似的,我們可以用 一個反向 來計算概率:

通過這個 LSTM,我們可以得到 。我們的損失函數是這兩個 LSTM 的 加和 :

這兩個 LSTM 有各自的參數 和 ,而 Word Embedding 參數 和 Softmax 參數 是共享的

為了用於下游(DownStream)的特定任務,我們會把不同層的隱狀態組合起來,具體組合的參數是根據不同的特定任務學習出來的,公式如下:

GPT 得到的語言模型參數不是固定的,它會根據特定的任務進行調整(通常是微調),這樣的到的句子表示能更好的適配特定任務。它的思想也很簡單,使用 單向 Transformer 學習一個語言模型 ,對句子進行無監督的 Embedding,然後 根據具體任務對 Transformer 的參數進行微調 。GPT 與 ELMo 有兩個主要的區別:

這里解釋一下上面提到的 單向 Transformer 。在 Transformer 的文章中,提到了 Encoder 與 Decoder 使用的 Transformer Block 是不同的。在 Decoder Block 中,使用了 Masked Self-Attention ,即句子中的每個詞都只能對 包括自己在內的前面所有詞進行 Attention ,這就是單向 Transformer。GPT 使用的 Transformer 結構就是將 Encoder 中的 Self-Attention 替換成了 Masked Self-Attention ,具體結構如下圖所示

訓練的過程也非常簡單,就是將 n 個詞的詞嵌入 ( ) 加上位置嵌入 ( ),然後輸入到 Transformer 中,n 個輸出分別預測該位置的下一個詞

這里的位置編碼沒有使用傳統 Transformer 固定編碼的方式,而是動態學習的

Pretraining 之後,我們還需要針對特定任務進行 Fine-Tuning。假設監督數據集合 的輸入 是一個詞序列 ,輸出是一個分類的標簽 ,比如情感分類任務

我們把 輸入 Transformer 模型,得到最上層最後一個時刻的輸出 ,將其通過我們新增的一個 Softmax 層(參數為 )進行分類,最後用 CrossEntropyLoss 計算損失,從而根據標准數據調整 Transformer 的參數以及 Softmax 的參數 。這等價於最大似然估計:

正常來說,我們應該調整參數使得 最大,但是 為了提高訓練速度和模型的泛化能力 ,我們使用 Multi-Task Learning,同時讓它最大似然 和

這里使用的 還是之前語言模型的損失(似然),但是使用的數據不是前面無監督的數據 ,而是使用當前任務的數據 ,而且只使用其中的 ,而不需要標簽

針對不同任務,需要簡單修改下輸入數據的格式,例如對於相似度計算或問答,輸入是兩個序列,為了能夠使用 GPT,我們需要一些特殊的技巧把兩個輸入序列變成一個輸入序列

ELMo 和 GPT 最大的問題就是 傳統的語言模型是單向的 —— 我們根據之前的歷史來預測當前詞。但是我們不能利用後面的信息。比如句子 The animal didn』t cross the street because it was too tired 。我們在編碼 it 的語義的時候需要同時利用前後的信息,因為在這個句子中, it 可能指代 animal 也可能指代 street 。根據 tired ,我們推斷它指代的是 animal 。但是如果把 tired 改成 wide ,那麼 it 就是指代 street 了。傳統的語言模型,都 只能利用單方向的信息 。比如前向的 RNN,在編碼 it 的時候它看到了 animal 和 street ,但是它還沒有看到 tired ,因此它不能確定 it 到底指代什麼。如果是後向的 RNN,在編碼的時候它看到了 tired ,但是它還根本沒看到 animal ,因此它也不能知道指代的是 animal 。 Transformer 的 Self-Attention 理論上是可以同時關注到這兩個詞的,但是根據前面的介紹,為了使用 Transformer 學習語言模型,必須 用 Mask 來讓它看不到未來的信息 ,所以它也不能解決這個問題的

根據上文內容預測下一個可能跟隨的單詞,就是常說的自左向右的語言模型任務,或者反過來也行,就是根據下文預測前面的單詞,這種類型的LM被稱為自回歸語言模型。(GPT,ELMO)GPT 就是典型的自回歸語言模型。ELMO盡管看上去利用了上文,也利用了下文,但是本質上仍然是自回歸LM,這個跟模型具體怎麼實現有關系。ELMO是做了兩個方向(從左到右以及從右到左兩個方向的語言模型),但是是分別有兩個方向的自回歸LM,然後把LSTM的兩個方向的隱節點狀態拼接到一起,來體現雙向語言模型這個事情的。所以其實是兩個自回歸語言模型的拼接,本質上仍然是自回歸語言模型。

自回歸語言模型有優點有缺點,缺點是只能利用上文或者下文的信息,不能同時利用上文和下文的信息,當然,貌似ELMO這種雙向都做,然後拼接看上去能夠解決這個問題,因為融合模式過於簡單,所以效果其實並不是太好。它的優點,其實跟下游NLP任務有關,比如生成類NLP任務,比如文本摘要,機器翻譯等,在實際生成內容的時候,就是從左向右的, 自回歸語言模型天然匹配這個過程 。而Bert這種DAE模式,在生成類NLP任務中,就面臨訓練過程和應用過程不一致的問題,導致 生成類的NLP任務到目前為止都做不太好

自回歸語言模型只能根據上文預測下一個單詞,或者反過來,只能根據下文預測前面一個單詞。相比而言,Bert通過 在輸入X中隨機Mask掉一部分單詞 ,然後預訓練過程的主要任務之一是根據上下文單詞來預測這些被Mask掉的單詞,如果你對Denoising Autoencoder比較熟悉的話,會看出,這確實是典型的DAE的思路。那些被Mask掉的單詞就是在輸入側加入的所謂噪音。類似Bert這種預訓練模式,被稱為DAE LM。

這種DAE LM的優缺點正好和自回歸LM反過來,它能比較自然地融入雙向語言模型,同時看到被預測單詞的上文和下文,這是好處。缺點是啥呢? 主要在輸入側引入[Mask]標記,導致預訓練階段和Fine-tuning階段不一致的問題 ,因為Fine-tuning階段是看不到[Mask]標記的。DAE嗎,就要引入噪音,[Mask] 標記就是引入噪音的手段,這個正常。

XLNet的出發點就是:能否 融合自回歸LM和DAE LM兩者的優點 。就是說如果站在自回歸LM的角度,如何引入和雙向語言模型等價的效果;如果站在DAE LM的角度看,它本身是融入雙向語言模型的,如何拋掉表面的那個[Mask]標記,讓預訓練和Fine-tuning保持一致。當然,XLNet還講到了一個Bert被Mask單詞之間相互獨立的問題。

⑶ BERT預訓練模型

n-gram語言模型:根據前面n個詞預測當前詞,它的缺點是,一般只能取1-2,n越大計算成本越高,這就使得它關注的信息是非常局限的。

預訓練語言模型:wordvec\glove\fasttext。wordvec是根據周圍詞預測當前詞或當前詞預測周圍詞,相比於n-gram,它關注了下文,但它仍然是關注局部信息。glove通過構建詞頻共現矩陣來訓練詞向量,將全局信息融入到詞向量中。fasttext仍然是局部的,只是他分詞是基於subword,對於oov詞相對友好。三者共同的缺點是,無法解決一詞多義問題。

高級語言模型:elmo\GPT,elmo採用1層靜態向量+2層單向LSTM提取特徵,並且能夠解決一詞多義,elmo是一個雙向語言模型,但實際上是兩個單向語言模型(方向相反)的拼接,這種融合特徵的隱搭能力比 BERT 一體化融合特徵方式弱。GPT採用Transformer的decoder單元提取特徵,同樣也可以解決一詞多義問題,但GPT是單向的。所以,對上下文信息的融合,二者能力還不夠。

bert是雙向語言模型,句子沒有shift_mask操作,所以是完整的上下文環境,證實了雙向語言模型對文本特徵表示的重要性。bert同時證實了預訓練模型能夠簡化很多繁重任務的網路結構,在11個nlp任務上都有顯著提升。

bert採用Transformer的encoder單元提取特徵,encoder中包含幾個重要的機制:self-attention、muti-head attention、position encoding。

bert分為bert_base和bert_large大小兩個模型,bert_base採用了12個encoder單元,768維隱藏層,12個attention。bert_base採用了24個encoder單元,1024維隱藏層,16個attention。

input:單句或句對組合,有[cls]作為句子開頭的標記,[sep]作為句子分隔和結束的標記。

token embedding:對於英文採用WordPiece embeddings,也就是一個單詞會被拆成詞根詞綴的,比如圖中的playing被拆灶擾拿成了play和ing兩個token;對於中文,就是單子拆分。

segment embedding:相鄰句子採用不同的標志分隔,形如111111111100000011111100000。

position embedding:在transformer中,單詞之間是沒有先後順序的,而語言本身是有序的,所以採用採用正餘弦函數來計算每個單詞的先後順序,這種方式有點勉強,算是折中方式。

前面講到elmo也是雙向語言模型,它是採用bi-LSTM來提取特徵,如下:

比如一句話:『北京是中國的首都』,在LSTM中從左往右,預測『中國』的時候只能看到『北京』,從右往左,預測『中國』的時候只能看到『首都』,然後將兩個lstm的輸出做拼接來達到上下文信息融合的目的李旦。其實是沒有完全做到雙向,只是以結構的改變來接近雙向語言模型。真正的雙向是預測『中國』的時候,需要同時看到『北京』和『首都』。由此,mask LM產生了。

mask LM的原理是將『中國』遮蓋住,同時用『北京』和『首都』來預測『中國』。『北京』和『首都』聯系起來語言模型很容易聯想到就是『中國』啦。這個思想和wordvec的CBOW模型如出一轍,就是用周圍詞預測當前詞,只是這個思想放在厲害的transformer中,便能大顯其能。

BERT的mask方式:在選擇mask的15%的詞當中,80%情況下使用mask掉這個詞,10%情況下採用一個任意詞替換,剩餘10%情況下保持原詞彙不變。這樣mask的優點是什麼?

1)被隨機選擇15%的詞當中以10%的概率用任意詞替換去預測正確的詞,相當於文本糾錯任務,為BERT模型賦予了一定的文本糾錯能力;

2)被隨機選擇15%的詞當中以10%的概率保持不變,緩解了finetune時候與預訓練時候輸入不匹配的問題(預訓練時候輸入句子當中有mask,而finetune時候輸入是完整無缺的句子,即為輸入不匹配問題)。

在Mask LM任務中,模型學到了詞與詞之間的關系,而NSP任務是要模型學到句子與句子之間的關系,比如問答、推理等。它將訓練語料分為兩類,一是將50%語料構建成正常語序的句子對,比如A-B句子對,B就是A的實際下一個句子,並做標記為isnext;二是將50%語料構建成非正常語序句子對,B是來自語料庫的隨機句子,並做標記為notnext。然後通過對句子對的關系做分類,預測B到底是不是A句子的下一個句子,使模型具有句子級別的識別能力。

微調的目的在於我們的任務與bert預訓練任務是不一致的,但是bert是非常好的語言模型,他具備提取詞法和句法的強大能力。將bert嵌入到我們的網路結構中,能夠簡化在語言模型方面的復雜結構。只需要將輸入做成和bert適配的格式就行,而在bert後面接上全連接、CNN等簡單模型進行訓練,就能夠使訓練得到一個比較好的效果。

GPT 和 BERT 都採用Transformer,Transformer 是encoder-decoder 結構,GPT 的單向語言模型採用 decoder 部分,decoder 的部分見到的都是不完整的句子;BERT 的雙向語言模型則採用 encoder 部分,採用了完整句子。他倆最主要的區別在於BERT是雙向語言模型,更適合文本分類等任務,GPT是單向語言模型,更適合生成式任務。

1)低層網路捕捉了短語級別的結構信息

2)表層信息特徵在底層網路(3,4),句法信息特徵在中間層網路(6~9),語義信息特徵在高層網路。(9~12)

3)主謂一致表現在中間層網路(8,9)

1)ROBERTA

•靜態mask->動態mask:在bert中每一個epoch被mask的是相同的詞,而ROBERTA在每一個epoch結束,重新隨機15%的詞,使不同的詞被mask。

•去除句對NSP任務,輸入連續多個句子:在bert中最長是512個token,輸入單句或者句對不容易把512個token占滿,ROBERTA輸入更多句子占滿512個坑位。

•訓練使用更多數據 更大batch size 更長時間

2)ALBERT

•減少參數:詞表 V 到隱層 H 的中間,插入一個小維度 E,即一個VxH的embedding變成兩個VxE, ExH的兩個fc。

•共享所有層的參數:Attention 和 FFN,在bert中每一層的Attention 和 FFN的參數是不一樣的。

•SOP 替換 NSP:負樣本換成了同一篇文章中的兩個逆序的句子,bert中是A-->B和A-->隨機,ALBERT中是A-->B,B-->A。

•BERT對MASK 15% 的詞來預測。ALBERT 預測的是 n-gram 片段,包含更完整的語義信息。

•訓練數據長度:90%取512,BERT90% 128

•對應BERT large:H:1024 ->4096  L:24->12  窄而深->寬而淺

⑷ 預訓練模型綜述--Albert,xlnet,bert,word2vec

Albert,xlnet,bert,word2vec

通過預訓練模型實現遷移學習,遷移學習本質上是在一個數據集上訓練模型,然後對該模型進行調整,以在不同的數據集上執行不同拿或的自然語言處理功能。

1. word2vec

線性模型

很神奇的地方,從而也說明高維空間映射的詞向量可以很好體現真實世界中token之間的關系。如:king-man = queen-woman

負采樣

由於訓練詞向量模型的目標不是為了得到一個多麼精準的語言模型,而是為了獲得它的副產物——詞向量。所以要做到的不是在幾萬幾十萬個token中艱難廳敏伍計算softmax獲得最優的那個詞(就是預測的對於給定詞的下一詞),而只需能做到在幾個詞中找到對的那個詞就行,這幾個詞包括一個正例(即直接給定的下一詞),和隨機產生的雜訊詞(采樣抽取的幾個負例),就是說訓練一個sigmoid二分類器,只要模型能夠從中找出正確的詞就認為完成任務。

這種負采樣思想也應用到之後的BERT里,只不過從word-level變成sentence-level,這樣能獲取句子間關聯關系。

缺點是上下文無關(static):

因而為了讓句子有一個整體含義(context),大家會在下游具體的NLP任務中基與詞向量的序列做encoding操作。

下面是一個比較表格,模型不細講了,預測目標這里的next word下一個詞,是所有傳統語言模型都做的事——尋找下一個詞填什麼。

BERT模型進一步增加詞向量模型泛化能力,充分描述字元級、詞級、句子級甚至句間關系特徵。

真正的雙向encoding:

Masked LM,類似完形填空,盡管仍舊看到所有位置信息,但需要預測的詞已被特殊符號代替,可以放心雙向encoding。

Transformer做encoder實現上下文相關(context):

使用transformer而不是bi-LSTM做encoder,可以有更深的層數、具有更好並行性。並且線性的Transformer比lstm更易免受mask標記影響,只需要通過self-attention減小mask標記權重即可,而lstm類似黑盒模扮或型,很難確定其內部對於mask標記的處理方式。

提升至句子級別:

學習句子/句對關系表示,句子級負采樣。首先給定的一個句子,下一句子正例(正確詞),隨機采樣一句負例(隨機采樣詞),句子級上來做二分類(即判斷句子是當前句子的下一句還是雜訊),類似word2vec的單詞級負采樣。

二、BERT細則

這里主要介紹BERT的三個亮點Masked LM、transformer、sentence-level。

1. Masked Language Model

原本叫cloze test,是完形填空的意思。

隨機mask語料中15%的token,然後將masked token 位置輸出的最終隱層向量送入softmax,來預測masked token。

這樣輸入一個句子,每次只預測句子中大概15%的詞,所以BERT訓練很慢。。。(但是google設備NB。。)

而對於蓋住詞的特殊標記,在下游NLP任務中不存在。因此,為了和後續任務保持一致,作者按一定的比例在需要預測的詞位置上輸入原詞或者輸入某個隨機的詞。如:my dog is hairy

2. Transformer —— attention is all you need

Transformer模型是2018年5月提出的,可以替代傳統RNN和CNN的一種新的架構,用來實現機器翻譯,論文名稱是attention is all you need。無論是RNN還是CNN,在處理NLP任務時都有缺陷。CNN是其先天的卷積操作不很適合序列化的文本,RNN是其沒有並行化,很容易超出內存限制(比如50tokens長度的句子就會占據很大的內存)。

下面左圖是transformer模型一個結構,分成左邊Nx框框的encoder和右邊Nx框框的decoder,相較於RNN+attention常見的encoder-decoder之間的attention(上邊的一個橙色框),還多出encoder和decoder內部的self-attention(下邊的兩個橙色框)。每個attention都有multi-head特徵。最後,通過position encoding加入沒考慮過的位置信息。

下面從multi-head attention,self-attention, position encoding幾個角度介紹。

multi-head attention:

將一個詞的vector切分成h個維度,求attention相似度時每個h維度計算。由於單詞映射在高維空間作為向量形式,每一維空間都可以學到不同的特徵,相鄰空間所學結果更相似,相較於全體空間放到一起對應更加合理。比如對於vector-size=512的詞向量,取h=8,每64個空間做一個attention,學到結果更細化。

self-attention:

每個詞位的詞都可以無視方向和距離,有機會直接和句子中的每個詞encoding。比如上面右圖這個句子,每個單詞和同句其他單詞之間都有一條邊作為聯系,邊的顏色越深表明聯系越強,而一般意義模糊的詞語所連的邊都比較深。比如:law,application,missing,opinion。。。

position encoding:

因為transformer既沒有RNN的recurrence也沒有CNN的convolution,但序列順序信息很重要,比如你欠我100萬明天要還和我欠你100萬明天要還的含義截然不同。。。

transformer計算token的位置信息這里使用正弦波↓,類似模擬信號傳播周期性變化。這樣的循環函數可以一定程度上增加模型的泛化能力。

但BERT直接訓練一個position embedding來保留位置信息,每個位置隨機初始化一個向量,加入模型訓練,最後就得到一個包含位置信息的embedding(簡單粗暴。。),最後這個position embedding和word embedding的結合方式上,BERT選擇直接相加。

3. sentence-level representation

在很多任務中,僅僅靠encoding是不足以完成任務的(這個只是學到了一堆token級的特徵),還需要捕捉一些句子級的模式,來完成SLI、QA、dialogue等需要句子表示、句間交互與匹配的任務。對此,BERT又引入了另一個極其重要卻又極其輕量級的任務,來試圖把這種模式也學習到。

句子級負采樣

句子級別的連續性預測任務,即預測輸入BERT的兩端文本是否為連續的文本。訓練的時候,輸入模型的第二個片段會以50%的概率從全部文本中隨機選取,剩下50%的概率選取第一個片段的後續的文本。 即首先給定的一個句子(相當於word2vec中給定context),它下一個句子即為正例(相當於word2vec中的正確詞),隨機采樣一個句子作為負例(相當於word2vec中隨機采樣的詞),然後在該sentence-level上來做二分類(即判斷句子是當前句子的下一句還是雜訊)。

句子級表示

BERT是一個句子級別的語言模型,不像ELMo模型在與下游具體NLP任務拼接時需要每層加上權重做全局池化,BERT可以直接獲得一整個句子的唯一向量表示。它在每個input前面加一個特殊的記號[CLS],然後讓Transformer對[CLS]進行深度encoding,由於Transformer是可以無視空間和距離的把全局信息encoding進每個位置的,而[CLS]的最高隱層作為句子/句對的表示直接跟softmax的輸出層連接,因此其作為梯度反向傳播路徑上的「關卡」,可以學到整個input的上層特徵。

segment embedding

對於句對來說,EA和EB分別代表左句子和右句子;對於句子來說,只有EA。這個EA和EB也是隨模型訓練出來的。

如下圖所示,最終輸入結果會變成下面3個embedding拼接的表示。

首先,XLNet 是一個類似 BERT 的模型,而不是完全不同的模型。但這是一個非常有前途和潛力的。總之,XLNet是一種通用的自回歸預訓練方法。

那麼什麼是自回歸(AR)語言模型?

AR語言模型是一種使用上下文詞來預測下一個詞的模型。但是在這里,上下文單詞被限制在兩個方向,前向或後向。

AR 語言模型的優勢是擅長生成式自然語言處理任務。 因為在生成上下文時,通常是前向的。AR 語言模型很自然地適用於此類 NLP 任務。

但AR語言模型有一些缺點,它只能使用前向上下文或後向上下文,這意味著它不能同時使用前向和後向上下文。

自回歸語言模型有優點有缺點,缺點是只能利用上文或者下文的信息,不能同時利用上文和下文的信息,當然,貌似ELMO這種雙向都做,然後拼接看上去能夠解決這個問題,因為融合模式過於簡單,所以效果其實並不是太好。它的優點,其實跟下游NLP任務有關,比如生成類NLP任務,比如文本摘要,機器翻譯等,在實際生成內容的時候,就是從左向右的,自回歸語言模型天然匹配這個過程。而Bert這種DAE模式,在生成類NLP任務中,就面臨訓練過程和應用過程不一致的問題,導致生成類的NLP任務到目前為止都做不太好。

與 AR 語言模型不同,BERT 被歸類為自動編碼器(AE)語言模型。

AE 語言模型旨在從損壞的輸入重建原始數據。

損壞的輸入意味著我們在預訓練階段用 [MASK] 替換原始詞 into 。目標是預測 into 得到原始句子。

AE 語言模型的優勢是,它可以從向前和向後的方向看到上下文。

但 AE 語言模型也有其缺點。它在預訓練中使用 [MASK] ,但這種人為的符號在調優時在真實數據中並不存在,會導致預訓練-調優的差異。[MASK] 的另一個缺點是它假設預測(掩蔽的)詞 在給定未屏蔽的 詞 的情況下彼此獨立。例如,我們有一句話「它表明住房危機已經變成銀行危機」。我們掩蔽「銀行業」和「危機」。在這里注意,我們知道掩蔽的「銀行業」和「危機」包含彼此的隱含關系。但 AE 模型試圖預測「銀行業」給予未掩蔽的 詞,並預測「危機」分別給出未掩蔽的 詞。它忽略了「銀行業」與「危機」之間的關系。換句話說,它假設預測(掩蔽)的標記彼此獨立。但是我們知道模型應該學習預測(掩蔽)詞之間的這種相關性來預測其中一個詞。

作者想要強調的是,XLNet 提出了一種讓 AR 語言模型從雙向上下文中學習的新方法,以避免 MASK 方法在 AE 語言模型中帶來的缺點。
XLNet的出發點就是:能否融合自回歸LM和DAE LM兩者的優點。就是說如果站在自回歸LM的角度,如何引入和雙向語言模型等價的效果;如果站在DAE LM的角度看,它本身是融入雙向語言模型的,如何拋掉表面的那個[Mask]標記,讓預訓練和Fine-tuning保持一致。當然,XLNet還講到了一個Bert被Mask單詞之間相互獨立的問題,我相信這個不太重要,原因後面會說。當然,我認為這點不重要的事情,純粹是個人觀點,出錯難免,看看就完了,不用較真。

AR 語言模型只能向前或向後使用上下文,那麼如何讓它從雙向上下文中學習呢?

語言模型包括兩個階段,即預訓練階段和調優階段。XLNet 專注於預訓練階段。在預訓練階段,它提出了一個名為排列語言建模的新目標。我們可以從這個名稱知道基本思想,它使用排列。

這里我們舉一個例子來解釋。序列的次序是 [x1, x2, x3, x4] 。這種序列的所有排列如下。

因此對於這 4 個詞的([圖片上傳失敗...(image-c7a4e0-1570519576567)]

)句子,有 24([圖片上傳失敗...(image-d738b7-1570519576567)]

)個排列。

情景是我們想要預測 x3 。因此在 24 個排列中有 4 種模式,分別 x3 位於第 1 位,第 2 位,第 3 位,第 4 位。

當然,上面講的仍然是基本思想。難點其實在於具體怎麼做才能實現上述思想。首先,需要強調一點,盡管上面講的是把句子X的單詞排列組合後,再隨機抽取例子作為輸入,但是,實際上你是不能這么做的,因為Fine-tuning階段你不可能也去排列組合原始輸入。所以,就必須讓預訓練階段的輸入部分,看上去仍然是x1,x2,x3,x4這個輸入順序,但是可以在Transformer部分做些工作,來達成我們希望的目標。具體而言,XLNet採取了Attention掩碼的機制,你可以理解為,當前的輸入句子是X,要預測的單詞Ti是第i個單詞,前面1到i-1個單詞,在輸入部分觀察,並沒發生變化,該是誰還是誰。但是在Transformer內部,通過Attention掩碼,從X的輸入單詞裡面,也就是Ti的上文和下文單詞中,隨機選擇i-1個,放到Ti的上文位置中,把其它單詞的輸入通過Attention掩碼隱藏掉,於是就能夠達成我們期望的目標(當然這個所謂放到Ti的上文位置,只是一種形象的說法,其實在內部,就是通過Attention Mask,把其它沒有被選到的單詞Mask掉,不讓它們在預測單詞Ti的時候發生作用,如此而已。看著就類似於把這些被選中的單詞放到了上文Context_before的位置了)。具體實現的時候,XLNet是用「雙流自注意力模型」實現的,細節可以參考論文,但是基本思想就如上所述,雙流自注意力機制只是實現這個思想的具體方式,理論上,你可以想出其它具體實現方式來實現這個基本思想,也能達成讓Ti看到下文單詞的目標。

上面說的Attention掩碼,我估計你還是沒了解它的意思,我再用例子解釋一下。Attention Mask的機制,核心就是說,盡管當前輸入看上去仍然是x1->x2->x3->x4,但是我們已經改成隨機排列組合的另外一個順序x3->x2->x4->x1了,如果用這個例子用來從左到右訓練LM,意味著當預測x2的時候,它只能看到上文x3;當預測x4的時候,只能看到上文x3和x2,以此類推……這樣,比如對於x2來說,就看到了下文x3了。這種在輸入側維持表面的X句子單詞順序,但是其實在Transformer內部,看到的已經是被重新排列組合後的順序,是通過Attention掩碼來實現的。如上圖所示,輸入看上去仍然是x1,x2,x3,x4,可以通過不同的掩碼矩陣,讓當前單詞Xi只能看到被排列組合後的順序x3->x2->x4->x1中自己前面的單詞。這樣就在內部改成了被預測單詞同時看到上下文單詞,但是輸入側看上去仍然維持原先的單詞順序了。關鍵要看明白上圖右側那個掩碼矩陣,我相信很多人剛開始沒看明白,因為我剛開始也沒看明白,因為沒有標出掩碼矩陣的單詞坐標,它的坐標是1-2-3-4,就是表面那個X的單詞順序,通過掩碼矩陣,就能改成你想要的排列組合,並讓當前單詞看到它該看到的所謂上文,其實是摻雜了上文和下文的內容。這是attention mask來實現排列組合的背後的意思。

ALBERT相比於BERT的改進
ALBERT也是採用和BERT一樣的Transformer的encoder結果,激活函數使用的也是GELU,在講解下面的內容前,我們規定幾個參數,詞的embedding我們設置為E,encoder的層數我們設置為L,hidden size即encoder的輸出值的維度我們設置為H,前饋神經網路的節點數設置為4H,attention的head個數設置為H/64。

在ALBERT中主要有三個改進方向。

1、對Embedding因式分解(Factorized embedding parameterization)
在BERT中,詞embedding與encoder輸出的embedding維度是一樣的都是768。但是ALBERT認為,詞級別的embedding是沒有上下文依賴的表述,而隱藏層的輸出值不僅包括了詞本生的意思還包括一些上下文信息,理論上來說隱藏層的表述包含的信息應該更多一些,因此應該讓H>>E,所以ALBERT的詞向量的維度是小於encoder輸出值維度的。

在NLP任務中,通常詞典都會很大,embedding matrix的大小是E×V,如果和BERT一樣讓H=E,那麼embedding matrix的參數量會很大,並且反向傳播的過程中,更新的內容也比較稀疏。

結合上述說的兩個點,ALBERT採用了一種因式分解的方法來降低參數量。首先把one-hot向量映射到一個低維度的空間,大小為E,然後再映射到一個高維度的空間,說白了就是先經過一個維度很低的embedding matrix,然後再經過一個高維度matrix把維度變到隱藏層的空間內,從而把參數量從O(V×H) O(V×H)O(V×H)降低到了O(V×E+E×H) O(V×E+E×H)O(V×E+E×H),當E<<H時參數量減少的很明顯。

下圖是E選擇不同值的一個實驗結果,尷尬的是,在不採用參數共享優化方案時E設置為768效果反而好一些,在採用了參數共享優化方案時E取128效果更好一些。

2、跨層的參數共享(Cross-layer parameter sharing)
在ALBERT還提出了一種參數共享的方法,Transformer中共享參數有多種方案,只共享全連接層,只共享attention層,ALBERT結合了上述兩種方案,全連接層與attention層都進行參數共享,也就是說共享encoder內的所有參數,同樣量級下的Transformer採用該方案後實際上效果是有下降的,但是參數量減少了很多,訓練速度也提升了很多。

下圖是BERT與ALBERT的一個對比,以base為例,BERT的參數是108M,而ALBERT僅有12M,但是效果的確相比BERT降低了兩個點。由於其速度快的原因,我們再以BERT xlarge為參照標准其參數是1280M,假設其訓練速度是1,ALBERT的xxlarge版本的訓練速度是其1.2倍,並且參數也才223M,評判標準的平均值也達到了最高的88.7

除了上述說了訓練速度快之外,ALBERT每一層的輸出的embedding相比於BERT來說震盪幅度更小一些。下圖是不同的層的輸出值的L2距離與cosine相似度,可見參數共享其實是有穩定網路參數的作用的。

3、句間連貫(Inter-sentence coherence loss)
BERT的NSP任務實際上是一個二分類,訓練數據的正樣本是通過采樣同一個文檔中的兩個連續的句子,而負樣本是通過採用兩個不同的文檔的句子。該任務主要是希望能提高下游任務的效果,例如NLI自然語言推理任務。但是後續的研究發現該任務效果並不好,主要原因是因為其任務過於簡單。NSP其實包含了兩個子任務,主題預測與關系一致性預測,但是主題預測相比於關系一致性預測簡單太多了,並且在MLM任務中其實也有類型的效果。

這里提一下為啥包含了主題預測,因為正樣本是在同一個文檔中選取的,負樣本是在不同的文檔選取的,假如我們有2個文檔,一個是娛樂相關的,一個是新中國成立70周年相關的,那麼負樣本選擇的內容就是不同的主題,而正樣都在娛樂文檔中選擇的話預測出來的主題就是娛樂,在新中國成立70周年的文檔中選擇的話就是後者這個主題了。

在ALBERT中,為了只保留一致性任務去除主題識別的影響,提出了一個新的任務 sentence-order prediction(SOP),SOP的正樣本和NSP的獲取方式是一樣的,負樣本把正樣本的順序反轉即可。SOP因為實在同一個文檔中選的,其只關注句子的順序並沒有主題方面的影響。並且SOP能解決NSP的任務,但是NSP並不能解決SOP的任務,該任務的添加給最終的結果提升了一個點。

4、移除dropout
除了上面提到的三個主要優化點,ALBERT的作者還發現一個很有意思的點,ALBERT在訓練了100w步之後,模型依舊沒有過擬合,於是乎作者果斷移除了dropout,沒想到對下游任務的效果竟然有一定的提升。這也是業界第一次發現dropout對大規模的預訓練模型會造成負面影響。

參考鏈接:
徹底搞懂BERT
什麼是 XLNet,為何它會超越 BERT?
XLNet:運行機制及和Bert的異同比較
一文揭開ALBERT的神秘面紗
不懂word2vec,還敢說自己是做NLP?

⑸ RoBERTa 和 ALBERT

BERT 模型是 2018 年提出的,並在很多自然語言處理任務有前所未有的提升。因此 2019 年就有很多工作是圍繞著 BERT 展開的,其中出現了兩個 BERT 的改進版模型,RoBERTa 和 ALBERT。RoBERTa 在更大的數據集和最優的參數中訓練 BERT,使 BERT 的性能再次提升;ALBERT 主要是對 BERT 進行壓縮,通過共享所有層的參數以及 Embedding 分解減少 BERT 的參數量。

本文主要介紹 BERT 的兩種改進模型 RoBERTa 和 ALBERT,關於 BERT 模型可以參考之前的文章 《徹底理解 Google BERT 模型》 ,首先總體看一下 RoBERTa 和 ALBERT 的一些特點。

RoBERTa:

ALBERT:

RoBERTa 主要試驗了 BERT 中的一些訓練設置 (例如 NSP Loss 是否有意義,batch 的大小等),並找出最好的設置,然後再更大的數據集上訓練 BERT。

原來的 BERT 只使用了 16G 的數據集,而 RoBERTa 在更大的數據集上訓練 BERT,使用了 160G 的語料:

BERT 在訓練的過程中採用了 NSP Loss,原本用意是為了讓模型能夠更好地捕捉到文本的語義,給定兩段語句 X = [x1, x2, ..., xN] 和 Y = [y1, y2, ...., yM],BERT 中的 NSP 任務需要預測 Y 是不是 出現在 X 的後面。

但是 NSP Loss 受到不少橋帆文章的質疑 ,例如 XLNet,RoBERTa 採用了一個嘩消帶實驗驗證 NSP Loss 的實用性。實驗中採用了四種組合:

Segment-Pair + NSP: 這個是原來 BERT 的訓練方法,使用 NSP Loss,輸入的兩段文字 X 和 Y 可以包含多個句子,但是 X + Y 的長度要小於 512。

Sentence-Pair + NSP: 與上一個基本類似,也使用 NSP Loss,但是輸入的兩段文字 X 和 Y 都分別是一個句子,因此一個輸入包含的 token 通常比 Segment-Pair 少,所以要增大 batch,使總的 token 數量和 Sentence-Pair 差不多。

Full-Sentences: 不使用 NSP,直接從一個或者多個文檔中采樣多個句子,直到總長度到達 512。當采樣到一個文檔末尾時,會在序列中添加一個文檔分隔符 token,然後再從下一個文檔采樣。

Doc-Sentences: 與 Full-Sentences 類似,不使用 NSP,但是只能從一個文檔中采樣句子,所以輸入的長度可能會少於 512。Doc-Sentences 也需要動態調整 batch 大小,使其包含的 token 數量和 Full-Sentences 差不多。

上圖是實驗結果,最上面的兩行是使用 NSP 的,可以看到使用 Segment-Pair (多個句子) 要好於 Sentence-Pair (單個句子),實驗結果顯示使用單個句子會使 BERT 在下游任務的性能下降,主要原因可能是使用單個句子導致模型不能很好地學習長期的依賴關系。

中間兩行是不使用 NSP Loss 的結果,可以看到兩種方式都是比使用 NSP 效果要好的,這說明了 NSP Loss 實際上沒什麼作用,因此在 RoBERTa 中丟棄了 NSP Loss。

原始的 BERT 在亂蘆訓練之前就把數據 Mask 了,然後在整個訓練過程中都是保持數據不變的,稱為 Static Mask。即同一個句子在整個訓練過程中,Mask 掉的單詞都是一樣的。

RoBERTa 使用了一種 Dynamic Mask 的策略,將整個數據集復制 10 次,然後在 10 個數據集上都 Mask 一次,也就是每一個句子都會有 10 種 Mask 結果。使用 10 個數據集訓練 BERT。

下圖是實驗結果,可以看到使用 Dynamic Mask 的結果會比原來的 Static Mask 稍微好一點,所以 RoBERTa 也使用了 Dynamic Mask。

之前的一些關於神經網路翻譯的研究顯示了使用一個大的 batch 並相應地增大學習率,可以加速優化並且提升性能。RoBERTa 也對 batch 大小進行了實驗,原始的 BERT 使用的 batch = 256,訓練步數為 1M,這與 batch = 2K,訓練步數 125K 的計算量是一樣的,與 batch = 8K 和訓練步數為 31K 也是一樣的。下圖是使用不同 batch 的實驗結果,不同 batch 學習率是不同的,可以看到使用 batch = 2K 時的效果最好。

BERT 的預訓練模型參數量很多,訓練時候的時間也比較久。ALBERT 是一個對 BERT 進行壓縮後的模型,降低了 BERT 的參數量,減少了訓練所需的時間。

注意 ALBERT 只是減少 BERT 的參數量,而不減少其計算量。ALBERT 能減少訓練時間,這是因為減少了參數之後可以降低分布式訓練時候的通訊量;ALBERT 不能減少 inference 的時間,因為 inference 的時候經過的 Transformer 計算量和 BERT 還是一樣的。

下面介紹 ALBERT 的一些優化方法。

這是對 Embedding 進行分解,從而減少參數。在 BERT 中,Embedding 的維度和 Transformer 隱藏層維度是一樣的,都是 H。假設詞庫的大小為 V,則單詞的 Embedding 矩陣參數量就有 VH,如果詞庫很大,則參數量會很多。

因此,ALBERT 使用了一種基於 Factorized 的方法,不是直接把單詞的 one-hot 矩陣映射到 H 維的向量,而是先映射到一個低維空間 (E 維),再映射到 H 維的空間,這個過程類似於做了一次矩陣分解。

這個是參數共享機制,即所有 Transformer 層共享一套參數,Transformer 包括 Multi-Head Attention 的參數和 Feed-Forward 的參數。針對不同部分的參數,ALBERT 採用了四種方式實驗。

all-shared: 共享所有的 Transformer 參數。

shared-attention: 只共享 Transformer 中 Multi-Head Attention 的參數。

shared-FFN: 只共享 Transformer 中 Feed-Forward 的參數。

not-shared: 不共享參數。

上圖顯示了不同共享方式模型的參數量,可以看到共享所有參數之後的模型要遠遠小於不共享參數的模型。當 E = 768 時,not-shared 的參數量其實就是 BERT-base 的參數量,等於 108M,而共享所有參數後,模型的參數量變為 31M。

通過共享參數可以有效地減少模型的參數量,另外共享參數還可以幫助模型穩定網路中的參數。作者對比了 ALBERT 和 BERT 每一層 Transformer 的輸入和輸出的 L2 距離,發現 ALBERT 的效果更加平滑,如下圖所示。

如 RoBERTa 結果顯示的,NSP Loss 對於模型並沒有什麼用處,因此 ALBERT 也對 NSP 進行了一些思考。

ALBERT 認為 BERT 中使用的 NSP 任務過於簡單了,因為 NSP 的反例是隨機采樣得到的,這些反例的句子通常屬於不同的主題,例如前面的句子是來自體育新聞,而後面的句子來自於娛樂新聞。因此 BERT 在進行 NSP 任務時,通常是不需要真正學習句子之間的語義以及順序的,只需要判斷它們的主題類型。

ALBERT 將 NSP 替換成了 SOP (sentence order prediction),預測兩個句子是否被交換了順序。即輸入的兩個句子是來自同一文檔的連續句子,並隨機對這兩個句子的順序進行調換,讓模型預測句子是否被調換過。這樣可以讓模型更好地學習句子語義信息和相互關系。

RoBERTa 更像是一個經過仔細調參後得到的 BERT 模型,並且使用了更大的數據集進行訓練。

ALBERT 對 BERT 的參數量進行了壓縮,並且能夠減少分布式訓練的開銷。但是 ALBERT 並不能減少需要的計算量,因此模型在 inference 時的速度沒有提升。

RoBERTa: A Robustly Optimized BERT Pretraining Approach
ALBERT: A LITE BERT FOR SELF-SUPERVISED LEARNING OF LANGUAGE REPRESENTATIONS

⑹ 理解Bert

離開深度學習瞎折騰了一段時間後,我終於又回來了。

於是趕緊回顧了下18年之後NLP的發展,基本就是將遷移學習更廣泛的用於消歲NLP領域,以及把17年年底的《Attention is all you need》里的思想給發揚光大了,ELMO彌補了傳統word2vec多義詞表示的不足,GPT使用更強大的特徵提取器Transformer取代LSTM,Bert使用雙豎如向Transformer進一步改進了GPT成為這兩年發展的集大成者。

從Bert模型所帶來的NLP界里程碑式的影響和所取得的成就來看,無疑Bert將會是未來兩三年NLP應用發展的基石,於是有必要仔細的看看其模型的結構,數據是如何流動的,訓練的和測試的。

不得不說現在的學習環境相對幾年前好太多了,本文主要參考了以下幾篇文章,然後加了點自己的理解:

Dissecting BERT Part 1: The Encoder

The Illustrated Transformer

Dissecting BERT Appendix: The Decoder

它的總體框架同lstm時代的MNT或者是attention is all you need中的 transformer 一樣的 encoder-decoder 結構:

我們先來介紹一下Encoder部分。

為了理解這個架構,我們使用一個簡單的具體的例子,來看一下 輸入 的數據是怎麼通過 encoder 一步一步變化讓後到 輸出 的。

bert的詞嵌入由三個嵌入token embedding、segment embedding,和position embedding疊加而成。

這個過程跟以往的RNNs沒什麼區別,比如給定一個句子余橋啟:

第一步是先將其標記化:

然後是數字化,將每個標記映射到語料詞彙表中的唯一整數編號:

接下來就是得到序列中每個詞的詞嵌入,也就是將整數映射到一個 維的向量,這個向量是模型在訓練時學習的,你可以將其視為一個查表的過程,這些向量的元素作為模型的參數,像其他權重一樣通過反向傳播進行了優化。

在論文中是使用WordPiece tokenization 來將英文單詞轉換成768( )維的向量,轉化的過程類似這樣:

把每個詞的向量放到一起,就得到了一個 句子長度x向量維度 ( ) 尺寸的矩陣 Z :

說明一點,我們通常使用 填充 的方式來讓輸入序列具有相同的長度,比如通過添加"<pad>" 標記來增加某些序列的長度,還是前面的例子,填充後可能變為:

如果設定 設定為9,那我們就把句子從5填充到了9。

但是,上面的embedding並沒有包含詞的位置信息。於是,我們的目標是能夠根據詞在句子中的位置適當調整這個向量,使它帶上位置信息。

作者選擇的方法是使用預定的(非學習的)正餘弦函數將 之間的數字加到前面的embedding中,即通過正餘弦函數將位置表示為彼此的線性組合,從而實現網路學習中標記位置之間的相對關系。在Token embedding 獲得的矩陣 的基礎上加上位置矩陣 。

數學上,用 表示序列中標記的位置,用 表示token embedding特徵向量中的位置:

具體來說,對於給定的句子 ,其位置嵌入矩陣為:

作者解釋說,使用這種確定性方法的結果和學習位置表示(就像我們對詞嵌入那樣)的結果差不多,因此這樣反而會有一些優勢:

因此,添加了位置信息之後的矩陣是:

它是第一個encoder塊的輸入,尺寸是

共有N個編碼器塊連接在一起直到生成編碼器的輸出,特定的塊負責查找輸入表示之間的關系並將編碼在其輸出中。

直觀地,通過這些塊的迭代過程將幫助神經網路捕獲輸入序列中的詞之間的更加復雜的關系,你可以把它理解成一個整體用來捕捉輸入序列的語義。

encoder中使用Transformer的多頭注意力機制,這意味著它將計算 份不同權重矩陣的自注意力,然後將結果連接在一起。

這些並行注意力計算的結果稱之為Head,我們用下標 來表示一個特定的head和相關的權重矩陣。

如上圖所示,一旦計算了所有head,它們將被連接起來,得到一個尺寸為 的矩陣,然後將它乘以一個尺寸為 的權重矩陣 進行線性變換,就得到了一個尺寸為 的最終結果,用數學公式表示就是:

其中的 通過 乘以相應權重矩陣 獲得,我們通過一個簡單的例子來可視化的看一下這個過程。

這圖描繪了輸入標記通過 token embedding 和 positional encoding ,再輸入到Encoder:

接下來,我們再來看下Encoder中的操作過程,先看一下單頭的self-attention:

上圖描繪了一個Head的 是怎麼來的,其中的 的尺寸是 , 因為Q和K需要計算相似性,所以維度應當是相同的, 的尺寸是 , 的維度可以相同也可以不同,在論文中 .

所謂的自注意力,就是 與 的點積進行 的縮放之後通過softmax獲得一個概率權重,然後用這些權重分別乘以各自的 即可:

為了加深理解,我們選擇其中一個頭,通過圖形繼續可視化的看一下這個變化過程:

然後計算self-attention,

多頭的話就是同時有多個上述計算過程在進行:

假設我們有8個Head,那麼我們就獲得8個 :

但是,顯然前饋層只需要一個矩陣 ,怎麼處理呢?類似多卷積核的處理,把這8個矩陣連起來,乘以一個權重矩陣 壓縮到一個矩陣。

為了有一個更加全面直觀的認識,我們把上面整個過程放到一個圖里,

顯然,第二個encoder塊是不需要embedding過程的,只要把第一個encoder塊的輸出作為輸入即可。

經過上面的介紹,你應該對這個過程已經有了足夠的了解,但是,為什麼可以利用向量點積來計算注意力概率呢?

於是讓我們進一步深入來了解其中的原理。

這個結構體系的關鍵在於:

也就是每個詞的q向量與每個詞的k向量的點積,套用點積公式:

這意味著 和 的方向越相似,長度越大,點積就越大。詞與此之間關聯越大,對於理解這個詞時得到的關注越大,跟我們的本意是相同的。

我們再看一下最開頭的結構示意圖,每個encoder塊在Multi-Head Attention之後經過一個 Add & Norm層才進入下一個塊。於是我們來看一下這一層做了些什麼。

Add 實際就是一個殘差連接,將輸出加上輸入,這個在每一塊的self-attenton以及FFN之後都會有,然後跟隨一個Layer Norm 。

Norm 是一個Layer Normlization,將 正則化,就是把它縮放到一個均值為0方差為1的域里。因為

不過一般在這一層之前,就會有一個dropout層。

每個encoder塊都由 mulit-head atteion add & Norm feed forword network add & Norm 這樣一個過程,下面來介紹一下這個Feed-Forward Network。

這是一個全連接層,包含兩個線性變化和一個非線性函數(實際一般就是ReLu),

對於輸入的 (尺寸為 ) ,通過權重矩陣 (尺寸為 )和偏置 線性變換到隱藏層 (尺寸為 ) ,然後**ReLu **激活 ,記下來再用權重矩陣 (尺寸為 ) 和偏置 的線性變換到輸出層(尺寸為 ) ,表示成數學公式就是:

在最後一個encoder塊輸出之後連接到decoder。

Decoder和Encoder的結構是類似的,但是因為可視信息的不同,又有所差別。

Transformer解決的是翻譯的問題,將一個句子翻譯成另一種語言,我們希望模型能夠捕捉到輸入句子中詞之間的關系,並且將輸入句子中包含的信息與每一步已翻譯的內容結合起來。繼續上面的例子,我們的目標是把一個句子從英文翻譯為西班牙文,這是我們獲得的序列標記:

我們同之前一樣來看看輸入到輸出數據是如何流動的。

這是我們的解碼器的輸入標記:

然後這是解碼器的期望輸出:

但是,這里存在一個問題,比如輸入這邊我們已經看到了'como' 的後面是'estas', 然後再用它來預測'estas' ,這顯然是不合理的,因為模型在測試的時候是看不到後面的詞的。

因此,我們需要修改注意力層,防止模型可以看到預測詞右邊的信息,與此同時,它能利用已經預測的詞,即左邊的信息。

繼續上面的例子,我們將輸入標記轉換成矩陣的形式,並添加位置信息:

和encoder一樣,decoder塊的輸出也將是大小為 的矩陣,在逐行線性變換+softmax激活後,將生成一個舉證,其中每行的最大元素表示下一個單詞。也就是說,分配"<SS>" 的行負責預測「Hola」, 分配"Hola"的行負責預測"," ...以此類推。比如,為了預測"estas", 我們將允許該行直接和下圖中綠色區域互動,而不能和紅色區域互動:

但是,在我們使用多頭注意力機制的時候,所有的行都會產生交互,因此需要在輸入的時候添加遮罩,這個遮罩會在注意力計算之後進行:

這是 self-attention 的計算結果:

然後我們在此基礎上添加遮掩,就是把矩陣上三角的位置全部設置為 :

於是,在進行softmax激活之後,矩陣就變成了:

恰好達到了我們的要求,那些需要在訓練時忽略的右側的詞的注意力全部變成了0。

當將這個注意力矩陣與 相乘時,預測的詞就是模型可以訪問元素右邊的元素。注意,這里的多頭注意力輸出將是 維的,因為它的序列長度是 。

這個就是 Decoder target序列 的輸入,並經過 Masked Multi-Head Attention 的一個變化得到了 ,decoder的還有一部分輸入來自於源語句經過 Encoder 的最終輸出 (尺寸是 )。

接下來,就是與encoder一樣的 Multi-Head Attention Add and Layer Norm -> FFN 的過程。

只不過,現在的 來自於 ,而 來自於 :

計算每個query相對於key的注意力之後,得到的是一個 的矩陣, 繼續咱們的例子,比如注意力矩陣為:

如上圖所見,這個注意力是當前Decoder輸入與Encoder輸出的每個詞之間的注意力,咱們用這個矩陣再乘以 ,就得到了一個 的矩陣,每一行代表了源語句相對於當前輸入詞彙的特徵:

h個Head連接起來,尺寸變為 ,它通過 的權重矩陣 線性變換到一個 的輸出。

這在多個Decoder之後,最後輸出的矩陣通過乘以權重矩陣 ( ) 進行線性變換,變換之後再對每一行的向量softmax, 其中選擇值最大位置對應詞表索引的詞就是預測的詞。

損失的話只需要用預測的每個詞向量與真實的詞的one-hot詞表示計算交叉熵即可。

⑺ 1080ti微調12層bert要多久

看你所謂的訓練是指重頭預訓練一個bert,還是用bert做漏瞎微調。前者別想了,後者視數據量而定,一般幾十分鍾吧。

影馳GTX 1080Ti名人堂顯卡延續了經典的白色裝甲設計,採用全新的Lumin X RGB炫彩技術,除了中畝明央名人堂LOGO部分,外接供電和視頻介面均添加了RGB元素,玩家可使用影馳最新魔盤實現1680萬色的多彩調節。此外還有HOF Armor+金屬強化背板,HOF Panel液晶顯示屏。

同時,還採用「TriMax」散熱器,在HOF系列成熟的散熱體繫上再次優化,採用三枚9CM大風扇,能夠帶來強大的散熱效能。

GTX 1080Ti名人堂有限量版和高頻版,同樣採用GP-102核心,流處理器個數為迅搜告3584個。

基礎頻率和提升頻率分別達到了1645MHz和1759MHz(高頻版是基礎頻率為1569MHz,提升頻率為1683MHz),同時使用的11GB高速顯存,在顯存頻率是11210MHz(高頻版11010MHz)。

總結如下:

影馳GTX 1080Ti名人堂限量版沿用10系名人堂的皇冠造型,更添加了許多RGB元素。12層至臻純白PCB設計,高強度鋁合金HOF Armor+背板,用料豪華。



⑻ Bert技術

google在2018年10月底公布BERT在11項nlp任務中的卓越表現,NLP任務的兩個衡量指標上全面超越人類,並且還在11種不同NLP測試中創出最佳成績,包括將GLUE基準推至80.4%(絕對改進7.6%),MultiNLI准確度達到86.7% (絕對改進率5.6%)等,此後,BERT(Bidirectional Encoder Representation from Transformers)就成為NLP領域大火、整個ML界略有耳聞的模型。

BERT的出現,徹底改變了預訓練產生詞向量和下游具體NLP任務的關系,提出龍骨級的訓練詞向量概念。

詞向量,就是用一個向量的形式表示一個詞。

(1)one-hot編碼:詞的符號化。

(2)詞的分布式表示:詞的語義由其上下文決定。以(CBOW)為例,如果有一個句子「the cat sits one the mat」,在訓練的時候,將「the cat sits one the」作為輸入,預測出最後一個詞是「mat」。分布式表示的較大優點在於它具有非常強大的表徵能力,比如n維向量每維k個值,可以表徵k的n次方個概念。

其中,詞嵌入就是分布式表示的一種:基於神經網路的分布表示一般派畝稱為詞向量、詞嵌入( word embedding)或分布式表示( distributed representation)。核心依然是上下文的表示以及上下文與目標詞之間的關系的建模。本質:詞向量是訓練神經網路迅羨信時候的隱藏層參數或者說矩陣。

兩種訓練模式:CBOW (Continuous Bag-of-Words Model)和Skip-gram (Continuous Skip-gram Model)

NLP任務分成兩部分,一是預訓練產生詞向量,二是對詞向量操作實現特定功能。而詞向量模型是一個工具,可以把抽象存在的文字轉換成可以進行數學公式操作的向量,而對這些向量的操作,才是NLP真正要做的任務。從word2vec到ELMo到BERT,做的其實主要是把下游具體NLP任務的活逐漸移到預訓練產生詞向量上。

(1)word2vec:上下文概率的一種表示,但無法對一詞多義進行建模

(2)ELMo:用的是一個雙向的LSTM語言模型,由一個前向和一個後向語言模型構成,目標函數就是取這兩個方向語言模型的最大似然。

在預訓練好這個語言模型之後,ELMo就是根據下面的公式來用作詞表示,其實就是把這個雙向語言模型的每一中間層進行一個求和。最簡單的也可以使用最高層的表示來作為ELMo。

然後在進行有監督的NLP任務時,可以將ELMo直接當做特徵拼接到具體任務模型的詞向量輸入或者是模型的最高層表示上。總結一下,不像傳統的詞向量,每一個詞只對應一個詞向量,ELMo利用預訓練好的雙向語言模型,然後根據具體輸入從該語言模型中可以得到上下文依賴的當前詞表示(對於不同上下文的同一個詞的表示是不一樣的),再當成特徵加入到具體的NLP有監督模型里。

(3)bert

word2vec——>ELMo:

結果:上下文無關的static向量變成上下文相關的dynamic向量,比如蘋果在不同語境vector不同。

操作:encoder操作轉移到預訓練產生詞向量過程實現。

ELMo——>BERT:

結果:訓練出的word-level向量變成sentence-level的向量,下游具體NLP任務調用更方便,修正了ELMo模型的潛在問題。

操作:使用句子級負采樣獲得句子表示/句對關系,Transformer模型代替LSTM提升畝輪表達和時間上的效率,masked LM解決「自己看到自己」的問題。

(1)bert模型證明了雙向預訓練對於語言表示的重要性。與採用單向語言模型進行預訓練的模型不同,BERT使用masked language models 進行預訓練的深層雙向表示。

(2)經過預訓練的模型表示解決了許多為特定任務而設計架構的需要。BERT是第一個基於微調的表示模型,它在一系列句子級和詞級別的任務上實現了最先進的性能,優於許多具有特定任務架構的系統。

bert架構由兩步實現:預訓練和模型微調;在預訓練階段,基於無標注數據通過多輪預訓練任務完成。在微調階段,bert模型由預訓練的參數進行初始化,然後由待下游的任務數據進行參數微調。

bert模型是多層雙向transformer編碼器。將層的數量(Transformer blocks)表示為L,隱藏的大小表示為H,而self-attention heads 為A。在所有的情況下,我們將feed-forward/filter大小設置為4H,即H=768時,為3072, H=1024時,為4096.

bert的兩種格式:

BERTBASE : L=12, H=768, A=12, Total Parameter=110M,

BERTLARGE : L=24, H=1024, A=16, Total Parameters=340M

為了使用bert可以應對各式各樣的下游任務,bert的輸入為token序列,它可以表示一個句子或句子對(比如對話)。使用該方案,輸入可以是任意跨度的相鄰文本,即一個token序列可以是單個句子,也可以是多個句子。

具體地說,bert使用30000個詞的詞級別的embeddings。每個序列的起始token是[CLS]。句子對被打包在一個序列中,用兩種方式區別句子。方法一,使用特殊token[SEP];方法二,在每個標記中添加一個學習過的嵌入,表示它是屬於句子A還是句子B。

兩個無監督任務對BERT進行訓練。

任務一:Masked LM語言模型。

為了訓練雙向表示模型,隨機按百分比的方式(一般選15%)屏蔽輸入序列中的部分詞,然後預測那些屏蔽詞。在這種情況下,屏蔽詞的最終隱向量經softmax運算後輸出。有點類似於中文的完形填空。

雖然如些操作可以獲得一個雙向的預訓練模型,但這在預訓練和微調之間創建了一個不匹配,因為在微調過程中從來沒有見過[MASK]詞。為了減輕這一點,我們並不總是用實際的[MASK]詞替換被屏蔽的詞。相反,生成隨機選擇15%的詞進行預測,例如在句子 my dog is hairy 選擇了 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。

每一輪使用交叉熵損失來預測原始詞。

任務二:下一句的預測;

許多重要的下游任務,如問答(QA)和自然語言推理(NLI),都基於理解兩個文本句之間的關系,而語言建模並不能直接捕獲到這兩個文本句之間的關系。為了訓練一個理解句子關系的模型,我們預訓練了一個二分類的預測下一個句子的任務,該任務可以由任何單語語料庫生成。

具體來說,在為每個訓練前的例子選擇句子A和B時,50%的時間B是A後面的實際下一個句子,50%的時間B是來自語料庫的隨機句子。例如:

Input =[CLS] the man went to [MASK] store [SEP],he bought a gallon [MASK] milk [SEP]

Label = IsNext

Input = [CLS] the man [MASK] to the store [SEP],penguin [MASK] are flight ##less birds [SEP]

Label = NotNext

我們完全隨機選擇NotNext 句子,最終預測模型在這個任務中達到97%-98%的准確率。

預訓練數據:預訓練過程很大程度上依賴現有語言模型的數據。從維基網路上抽取文本信息,忽略列表,表格和標題。對於預訓練過程來說,使用文檔級別的語料庫而不是經過亂序後的句子級語料庫來提取長的連續序列是很重要的。

對於序列級別分類任務,BERT微調很簡單。BERT使用self-attention機制來統一兩個過程。因為編碼文本序列中,使用self-attention有效地包含了兩上句子之間雙向交叉的attention。

微調過程,就是對於每一個任務,簡單地將特定的輸入和輸出接入bert,然後端到端地調節全部參數即可。在輸入端,句子A和句子B類似於(1)語義句子對(2)假設前提(3)問答中的問句(4)文本分類或序列標記中文本。在輸出端,token向量被傳遞給token級別任務的輸出層,例如,序列標簽,問答對的答案。[CLS]向量被傳遞給分類的輸出層,用於分類或情感分析。

相對於預訓練,微調要相對容易。大多數模型超參數與預訓練相同,除了批的大小、學習率和訓練輪數。

可以通過一個額外的輸出層對預訓練的BERT表示進行微調,以創建適用於各種任務的最先進模型,比如問答和語言推斷,無需對特定與任務的架構進行實質性修改。

第一,如果NLP任務偏向在語言本身中就包含答案,而不特別依賴文本外的其它特徵,往往應用Bert能夠極大提升應用效果。

第二,Bert特別適合解決句子或者段落的匹配類任務。就是說,Bert特別適合用來解決判斷句子關系類問題,這是相對單文本分類任務和序列標注等其它典型NLP任務來說的,很多實驗結果表明了這一點。

第三,Bert的適用場景,與NLP任務對深層語義特徵的需求程度有關。感覺越是需要深層語義特徵的任務,越適合利用Bert來解決

第四,Bert比較適合解決輸入長度不太長的NLP任務,而輸入比較長的任務,典型的比如文檔級別的任務,Bert解決起來可能就不太好。

【引用】:

bert論文:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

https://www.cnblogs.com/robert-dlut/p/8638283.html

https://blog.csdn.net/DarrenXf/article/details/89184225

https://www.cnblogs.com/xlturing/p/10824400.html

https://www.cnblogs.com/ylHe/p/10193166.html

閱讀全文

與bert訓練要多少數據相關的資料

熱點內容
產品被判定為受限產品怎麼解決 瀏覽:28
汽車漂移技術要多少錢 瀏覽:212
為什麼產品排名始終靠後 瀏覽:937
健身膠囊如何建立身體數據檔案 瀏覽:888
無需手術就能生發是什麼技術 瀏覽:839
二手房交易銳費怎麼分 瀏覽:764
大三如何做產品經理 瀏覽:738
什麼叫取現沖正交易 瀏覽:954
精選速購怎麼做代理 瀏覽:532
嘉定區市場包裝材料哪個好 瀏覽:429
村合作社的產品怎麼外銷 瀏覽:866
在交易貓上架商品要多久審核完 瀏覽:673
微博一周數據怎麼看 瀏覽:104
床上用品批發市場哪裡 瀏覽:810
影響產品銷售成本的因素有哪些 瀏覽:35
曼龍怎麼做代理 瀏覽:540
大學駕校如何找代理 瀏覽:62
怎麼銷售開拓檳榔市場 瀏覽:870
信息輔助家園共育活動有什麼 瀏覽:448
廣州服裝批發市場白馬什麼定位 瀏覽:623