百分點認知智慧實驗室出品:深度遷移學習十八問

百分點科技發表於2020-01-23

編者按

深度遷移學習是基於深度神經網路遷移學習方法,BERT通過預訓練模型達到深度遷移學習的效果,自從2018年底BERT橫空出世以來,就以勢不可擋的姿態橫掃了眾多榜單,甚至在閱讀理解任務SQuAD 中超越人類水平。BERT在公檢法、媒體出版、軍工、快消零售等工業界也迅速落地,如百分點智慧對話系統、百分點智慧審校系統和百分點智慧翻譯系統等。BERT幾乎在所有的下游任務中效果都獲得了明顯提升,BERT自此開創了一個NLP的新時代,那就是pre-train + fine-tuning的時代。

基於BERT的各種改進版預訓練模型層出不窮,令人眼花繚亂,似乎一不小心就會落伍。但是萬變不離其宗,只要掌握了一些最基本的的思想、技術,就能讓自己緊跟大神們的腳步,讓更優秀的演算法模型在工業界持續落地。百分點認知智慧實驗室梳理了以BERT為代表的基於fine-tuning模式的深度遷移學習中一些疑難問題,整理出18個典型的問題,對理解BERT論文和原始碼有明顯的幫助,因此分享給大家。

基本概念

1.如何正確理解深度遷移學習

答:遷移學習機器學習的一個重要分支,是指利用資料、任務、或模型之間的相似性,將在源領域學習過的模型,應用於新領域的一種學習過程。

百分點認知智慧實驗室出品:深度遷移學習十八問

圖1: 遷移學習示意圖

遷移學習主要有幾種形式:基於樣本的遷移、基於特徵的遷移、基於模型的遷移和基於關係的遷移。重點說下基於模型的遷移,其基本思想是指從源域和目標域中找到他們之間共享的引數資訊,以實現遷移。
百分點認知智慧實驗室出品:深度遷移學習十八問
圖2: 基於模型的遷移學習

深度遷移學習主要就是模型的遷移,一個最簡單最常用的方法就是fine-tuning,就是利用別人已經訓練好的網路,針對目標任務再進行調整。近年來大火的BERT、GPT、XLNET等都是首先在大量語料上進行預訓練,然後在目標任務上進行fine-tuning。
 
2. 預訓練方法中基於特徵的方法與基於微調的方法本質區別在哪裡?

答:特徵提取(Feature-extract):特徵提取是使用之前訓練好的模型對新的樣本生成特徵向量,然後將這些特徵作為task-specific模型的輸入,訓練新的模型引數。比如BERT就是之前學好的模型,把一個句子輸入到BERT,可以得到這個句子的向量表示,然後將這個向量作為後續的比如分類模型的輸入,在訓練的過程中只訓練後面的分類模型,BERT的輸出僅僅是作為分類模型的輸入特徵。

模型微調(Fine-tuning):不同於特徵提取的方式要另起灶爐針對具體任務設計新的模型,模型微調是直接使用已訓練好的模型,針對當前的任務對輸出層簡單修改,然後在當前任務的資料上進行訓練,對部分網路層的引數進行微調,讓模型更適合當前的任務。這種模型微調的方式能充分利用深度神經網路強大的泛化能力,還避免了設計新的的模型,無需從頭開始訓練,能達到更快的收斂速度和更好的效果。

模型輸入

3. BERT的輸入有三個embedding,各自的作用是什麼?

答:BERT embedding layer有三個輸入,分別是token-embedding、segment-embedding和position-embedding。

Token-embedding:將單詞轉換為固定維的向量表示形式,在BERT-base中,每個單詞都表示為一個768維的向量。

Segment-embedding:BERT在解決雙句分類任務(如判斷兩段文字在語義上是否相似)時是直接把這兩段文字拼接起來輸入到模型中,那麼模型是如何區分這兩段文字呢,答案就是通過segment-embedding。對於兩個句子,第一個句子的segment-embedding部分全是0,第二個句子的segment-embedding部分全是1。

Position-embedding:BERT使用transformer編碼器,通過self-attention機制學習句子的表徵,self-attention不關注token的位置資訊,所以為了能讓transformer學習到token的位置資訊,在輸入時增加了position-embedding。
 
4. BERT的輸入有token-embedding、segment-embedding和position- embedding三個向量,三者之間是拼接的關係還是相加的關係,維度分別是多少?

答:三個向量是相加後作為第一層transformer的輸入,三個向量的維度都是768。Pytorch版BERT-embedding具體實現程式碼如下,從中我們可以明顯看出是相加的關係。
百分點認知智慧實驗室出品:深度遷移學習十八問
圖3: BERT embedding層原始碼

5. BERT的position-embedding為什麼是通過學習出來的而不像transformer那樣通過sinusoidal函式生成?

答:BERT論文中作者對此沒有說明原因,不過可以從以下幾點進行分析:

a) 用於機器翻譯的平行語料有限,transformer那篇論文在做機器翻譯任務時沒有像現在訓練BERT⼀樣海量的訓練資料,所以即使⽤了learned-position-embedding也未必能夠學到⼀個好的表⽰。⽽BERT訓練的資料⽐transformer⼤的多,因此可以讓模型⾃⼰去學習位置特徵。

b) 對於翻譯任務,encoder的核⼼任務是提取完整的句⼦語義資訊,無需特別關注某個詞的具體位置。而BERT在做下游的序列標註類任務時需要確切的位置資訊,模型需要給出每個位置的預測結果,因此BERT在預訓練過程中需要建模完整的詞序資訊。
 
6. BERT分詞時使用的是wordpiece,wordpiece實現了什麼功能,為什麼要這麼做?

答:先說為什麼這麼做,如果以傳統的方式進行分詞,由於單詞存在時態、單複數等多種變化會導致詞表非常大,嚴重影響訓練速度,並且即使一個非常大的詞表仍無法處理未登入詞(OOV, Out Of Vocabulary),影響訓練效果。而如果以character級別進行文字表示粒度又太細。Subword粒度在word與character之間,能夠較好的解決上述分詞方式面臨的問題,已成為了一個重要的NLP模型效能提升方法。Subword的實現方式主要有wordpiece和BPE(Byte Pair Encoding),BERT使用了wordpiece方式。

Wordpiece的功能:Wordpiece可以理解為把⼀個單詞再拆分成subword,比如"loved","loving", "loves"這三個單詞,其實本⾝的語義都是“愛”,但是如果以單詞為單位,那這些詞就算是不⼀樣的詞。Wordpiece演算法能夠把這3個單詞拆分成"lov", "#ed", "#ing", "#es"幾部分,這些單詞都有一個共同的subword“lov”,這樣可以把詞的本⾝的意思和字首、字尾分開,使最終的詞表變得精簡,並且寓意也能更清晰。
 
7. BERT的詞彙表是怎麼生成的?

答:可能很多人沒思考過這個問題,雖然在上一個問題中我們已經知道wordpiece會把單詞拆分成subword,但是能拆分的前提是有一個subword詞彙表。這個問題中我們就來詳細看下這個subword詞彙表的生成方法。

將wordpiece詞彙表生成之前我們還是先看下BPE詞彙表是怎麼生成的,因為兩者非常相似。

BPE詞彙表生成演算法如下:

a) 準備訓練語料用於生成subword詞表,需要量足夠大;

b) 預設定好期望的subword詞表的大小;

c) 將單詞拆分為字元序列並在末尾新增字尾“ </ w>”,統計單詞頻率,例如“ low”的頻率為5,那麼我們將其改寫為“ l o w </ w>”: 5。這一階段的subword的粒度是單字元;

d) 統計連續位元組對出現的頻率,選擇頻率最高的合併成新的subword;

e) 重複第4步,直到subword詞表大小達到第2步設定的值,或下一個最高頻的位元組對出現頻率為1。

下邊來看一個例子:假設我們的訓練語料為:
lower出現2次,newest出現6次,widest出現3次,low出現5次
根據上述第3步的操作可以處理成如下格式:
{'l o w e r </w>': 2, 'n e w e s t</w>': 6, 'w i d e s t </w>': 3, 'l o w </w>': 5}

其中的key是詞表中的單詞拆分成字母,末尾新增字尾“</w>”,value代表單詞出現的頻率。此時初始的詞表中是訓練語料中所有單詞的字母集合,大小為10,如下表:
[l, o, w, e, r, n, s, t, i, d]

我們設定最終的詞表大小為18,然後開始整個演算法中最重要的是第4步,過程如下:

原始詞表: {'l o w e r </w>': 2, 'n e w e s t </w>': 6, 'w i d e s t </w>': 3, 'l o w </w>': 5}

出現最頻繁的序列: ('s', 't') 9

將”st”加入詞表,第1次迴圈結束,此時詞表大小為11

合併最頻繁的序列後的詞表: {'n e w e st </w>': 6, 'l o w e r </w>': 2, 'w i d e st </w>': 3, 'l o w </w>': 5}

出現最頻繁的序列: ('e', 'st') 9

將”est”加入詞表,第2次迴圈結束,此時詞表大小為12

合併最頻繁的序列後的詞表: {'l o w e r </w>': 2, 'l o w </w>': 5, 'w i d est </w>': 3, 'n e w est </w>': 6}

出現最頻繁的序列: ('est', '</w>') 9

將“est</w>”加入詞表,第3次迴圈結束,此時詞表大小為13

合併最頻繁的序列後的詞表: {'w i d est</w>': 3, 'l o w e r </w>': 2, 'n e w est</w>': 6, 'l o w </w>': 5}

出現最頻繁的序列: ('l', 'o') 7

將“lo”加入詞表,第4次迴圈結束,此時詞表大小為14

合併最頻繁的序列後的詞表: {'w i d est</w>': 3, 'lo w e r </w>': 2, 'n e w est</w>': 6, 'lo w </w>': 5}

出現最頻繁的序列: ('lo', 'w') 7

將“low”加入詞表,第5次迴圈結束,此時詞表大小為15

合併最頻繁的序列後的詞表: {'w i d est</w>': 3, 'low e r </w>': 2, 'n e w est</w>': 6, 'low </w>': 5}

出現最頻繁的序列: ('n', 'e') 6

將“ne”加入詞表,第6次迴圈結束,此時詞表大小為16

合併最頻繁的序列後的詞表: {'w i d est</w>': 3, 'low e r </w>': 2, 'ne w est</w>': 6, 'low </w>': 5}

出現最頻繁的序列: ('w', 'est</w>') 6

將“west</w>”加入詞表,第7次迴圈結束,此時詞表大小為17

合併最頻繁的序列後的詞表: {'w i d est</w>': 3, 'low e r </w>': 2, 'ne west</w>': 6, 'low </w>': 5}

出現最頻繁的序列: ('ne', 'west</w>') 6

將“newest</w>”加入詞表,第8次迴圈結束,此時詞表大小為18,整個迴圈結束

最終我們得到的詞表為:
[l, o, w, e, r, n, s, t, i, d, st, est,est</w>, lo, low, ne, west</w>, newest</w>]
Wordpiece與BPE稍有不同,主要區別在於BPE是通過最高頻率來確定下一個subword,而wordpiece是基於概率生成新的subword,另一個小的區別是wordpiece字尾新增的是“##”而不是“<\w>”,整個演算法過程如下:

a)準備訓練語料用於生成subword詞表,需要量足夠大; 

b)預設定好期望的subword詞表大小;

c)將單詞拆分為字元序列並在末尾新增字尾“##”; 

d)從所有可能的subword單元中選擇加入語言模型後能最大程度地增加訓練資料概率的組合作為新的單元; 

e)重複第4步,直到subword詞表大小達到第2步中設定的值,或概率增量低於某一閾值。

8. BERT的輸入token-embedding為什麼要在頭部新增"[CLS]"標誌?

答:CLS是classification的縮寫,新增該標誌主要用於句子級別的分類任務。BERT借鑑了GPT的做法,在句子首部增加一個特殊的token“[CLS]”,在NSP預訓練任務中,就取的是“[CLS]”位置對應的最後的隱狀態,然後接一個MLP輸出兩個句子是否是上下句關係。可以認為“[CLS]”位置的資訊包含了句子類別的重要特徵。同理可以取“[MASK]”位置的向量用於預測這個位置的詞是什麼。
 
9. BERT輸入的長度限制為512,那麼如何處理長文字?

答:BERT由於position-embedding的限制只能處理最長512個詞的句子。如果文字長度超過512,有以下幾種方式進行處理:

a)直接截斷:從長文字中擷取一部分,具體擷取哪些片段需要觀察資料,如新聞資料一般第一段比較重要就可以擷取前邊部分;

b)抽取重要片段:抽取長文字的關鍵句子作為摘要,然後進入BERT;

c)分段:把長文字分成幾段,每段經過BERT之後再進行拼接或求平均或者接入其他網路如lstm。

模型原理

10. Attention機制相比CNN、RNN有什麼樣的優勢?為什麼?

答:在傳統的seq2seq模型中,我們一般使用RNN或CNN對序列進行編碼,然後採用pooling操作或者直接取RNN的終態作為輸入部分的語義編碼C,然後把C輸入到解碼模組中,在解碼過程中,C對每個位置的輸出重要程度是一致的,如下圖所示:

百分點認知智慧實驗室出品:深度遷移學習十八問

圖4: 普通的seq2seq

然而在自然語言中,一個句子中不同部分的重要性也是不一樣的,用RNN或CNN進行句子編碼,並不能學習到這樣的資訊。因此出現了attention,顧名思義就是在解碼時能對序列中不同位置分配一個不同的注意力權重,抽取出更加關鍵和重要的資訊,從而使模型做出更好的判斷,就像我們人在看一個句子時,重點關注的是其中的重要資訊,對不重要的資訊根本不關心或基本不關心。
百分點認知智慧實驗室出品:深度遷移學習十八問
圖5: 基於attention的seq2seq
 
11. BERT使用multi-head attention機制, multi-head的輸出是如何拼接在一起的?維度大小是多少?

答:mutli-head attention的計算過程如下圖所示:百分點認知智慧實驗室出品:深度遷移學習十八問
圖6: Multi-head attention計算過程

輸入向量維度為768維,經過每個self-attention後得到隱層輸出為64維,然後把12個輸出拼接起來得到768維的向量。
 
12. BERT MLM(Masked Language Model)任務具體訓練方法為:隨機遮住15%的單詞作為訓練樣本,其中80%用“[MASK]” 來代替,10%用隨機的一個詞來替換,10%保持這個詞不變。這麼做的目的是什麼?

答:要弄明白為什麼這樣構造MLM的訓練資料,我們需要首先搞明白什麼是MLM、為什麼要使用MLM,以及MLM存在哪些問題。

a)為什麼使用MLM:傳統的語言模型一般都是單向的,要同時獲取上下文資訊的常見做法是分別訓練正向與反向的語言模型,然後再做ensemble,但這種做法並不能充分利用上下文資訊。MLM 的意義在於能夠真正利用雙向的資訊,使模型學習到上下文相關的表徵。具體做法就是隨機遮蔽(mask)輸入文字中的部分token,類似於完形填空,這樣在預測被mask部分的token時就能夠同時利用上下文資訊。

b)MLM存在問題:由於預訓練資料中存在“[MASK]”這個token,而在實際的下游任務中對BERT進行fine-tuning時,資料中沒有“[MASK]”,這樣就導致預訓練模型使用的資料和fine-tuning任務使用的資料不一致,會影響fine-tuning的效果。

為了讓MLM能夠學習上下文相關特徵,同時又儘量避免pre-train和fine-tuning資料不一致的問題,資料處理時就採取題目中策略,具體處理策略和原因解釋如下:
百分點認知智慧實驗室出品:深度遷移學習十八問
13. BERT的引數量如何計算?

答:要計算BERT的引數量,首先需要對BERT的結構瞭解的非常清楚,下面我們就來看下base版BERT 110M的引數到底是怎麼計算出來的。 

百分點認知智慧實驗室出品:深度遷移學習十八問

圖7: BERT結構圖

a) embedding層的引數
BERT的輸入有三種embedding,如下原始碼中所示:
百分點認知智慧實驗室出品:深度遷移學習十八問
圖8: BERT embedding層原始碼

vocab_size=30522,hidden_size為768,最大位置長度為512,type_vocab_size=2,因此可以計算出:
embedding層的引數量 =(30522+512+2)*768=23,835,648

b) multi-headattention的引數
百分點認知智慧實驗室出品:深度遷移學習十八問
圖9: Self attention計算過程

先來看下multi-head attention的計算過程:embedding層的輸出x分別與三個矩陣WQ、Wk、Wv相乘得到Q、K、V,再經過右上圖的計算得到一個self-attention的輸出,12個self-attention的輸出拼接起來得到,再經過一個線性變換得到multi-head attention的輸出。

WQ、Wk、Wv的維度均為768*64,head數為12,線性變換矩陣為768*768,因此可以計算出:
multi-head的引數量 =768*64*3*12+768*768=2,359,296

c) 全連線層(FeedForward)的引數
全連線層把multi-head attention輸出的維度從768對映到3072又對映到768,公式如下圖所示:
百分點認知智慧實驗室出品:深度遷移學習十八問
其中W1維度為768*3072,W2維度為3072*768,因此可以計算出:
全連線層的引數量 = 768*3072*2=4,718,592

Base版BERT使用了12層transformer的encoder,因此可以計算出:
引數量 = embedding引數量+12(multi-headattention引數量+全連線引數量)=23,835,648+12*(2,359,296+4,718,592)=108,770,304≈110M


14. BERT基於NSP和MLM兩個任務進⾏預訓練,如果對BERT進⾏改進,⼀個可⾏的⽅向就是增加更多的預訓練任務,那麼除了這兩個任務之外,還可以增加哪些預訓練任務呢?

答:⾸先這些預訓練任務的訓練資料要能從⽆監督的資料中獲取,這樣才能獲取到海量的訓練資料,符合這⼀條件的任務都可以進⾏嘗試,如百度的ERNIE增加了很多個預訓練任務,相比於原始BERT有了明顯的提升。幾個有代表性的預訓練任務如下:

Knowledge Masking Task:BERT的MLM任務中是對句⼦中單個的token進⾏mask,可以對於句⼦中的短語和命名實體進⾏mask。

Capitalization Prediction Task:預測單詞是否⼤寫,與其他詞語相⽐,⼤寫詞語通常具有特定的語義價值。

Token-Document Relation Prediction Task:預測⼀個段落中的某個token是否出現在原始⽂檔的其他段落中。根據經驗,在⽂檔不同部分都出現的單詞通常是⽂檔的關鍵詞,因此這⼀任務可以在⼀定程度上使模型能夠捕獲文件的關鍵字。

Sentence Distance Task:⼀個學習句⼦間距離的任務,該任務被建模為⼀個3類分類問題,“0”表示兩個句⼦在同⼀個文件中相鄰,“1”表示兩個句⼦在同⼀個文件中,但不相鄰,“2”表示兩個句子來自兩個不同的文件。

模型的進化

15.自迴歸語言模型(AR, Autoregressive LM)與自編碼語言模型(AE, Autoencoder LM)的區別?

答:自迴歸語言模型根據上文內容預測下一個單詞或者根據下文內容預測上一個單詞,這樣單向的語言模型就是自迴歸語言模型。LSTM、GPT、ELMO都是自迴歸語言模型。自迴歸語言模型的缺點,是不能同時利用上下文資訊。

自編碼語言模型自編碼器是一種通過無監督方式學習特徵的方法,用神經網路把輸入變成一個低維的特徵,這就是編碼部分,然後再用一個解碼器把特徵恢復成原始的訊號,這就是解碼部分。具體到語言模型中,BERT使用的MLM就是自編碼語言模型,對一些token進行mask,然後拿被mask位置的向量(包含了上下文的資訊)來預測該位置真正的token。

自編碼語言模型的優點就是可以同時利用上下文資訊,缺點就是預訓練階段和fine-tuning階段使用的訓練資料不一致,因為fine-tuning階段的資料是不會被mask的。
 
16.XLNET相對於BERT做了哪些重要改進?

答:BERT的AE語言模型雖然能同時學習上下文資訊但是會導致預訓練資料和fine-tuning階段的資料不一致從而影響fine-tuning的效果。而XLNET的思路就是使用AR語言模型,根據上文預測下文,但是在上文中新增了下文資訊,這樣既解決了BERT面臨的問題也同時利用了上下文資訊。

XLNET改進後的語言模型叫做PermutationLanguage Model(PLM),其重點就是permutation,用一個例子來解釋:對於一個輸入句子X=[x1, x2, x3, x4],我們希望預測x3,在正常的輸入中通過AR語言模型只能看到x1和x2。為了在預測x3時能看到x4,XLNET的操作是固定x3的位置,然後把其它的詞進行隨機排列,得到如:[x4, x1, x3, x2],[x1, x4, x3, x2]等資料,這樣就可以使用單向的AR語言模型來學習雙向資訊。

這時有人可能就會有疑問:就算訓練時可以對輸入句子進行排列組合,但是fine-tuning時沒法這樣做啊。沒錯,fine-tuning階段確實不能對輸入做排列,只能輸入原始句子,所以XLNET在預訓練階段也是不能顯示地對輸入進行排列的。為了解決這個問題,XLNET的輸入還是原始的句子,只不過是在transformer內部利用attention mask來實現的,而無需真正修改句子中詞語的順序。例如原來的句子是X=[x1, x2, x3, x4],如果隨機生成的序列是[x3, x2, x4,x1],但輸入到 XLNET 的句子仍然是[x1, x2,x3, x4],此時設定attention mask如下圖:
百分點認知智慧實驗室出品:深度遷移學習十八問
圖10: Attention mask示意圖

圖中的掩碼矩陣,白色表示不遮掩,黑色表示遮掩。第 1 行表示 x1 的掩碼,因為x1是句子的最後一個 token,因此可以看到之前的所有 token [x3,x2,x4];第2行是x2的掩碼,因為x2是句子的第二個token,所以能看到前一個token x3;第3行、第4行同理。這樣就實現了儘管當前輸入看上去仍然是[x1, x2, x3, x4],但是已經改成排列組合的另外一個順序[x3, x2,x4, x1]了。如果用這個例子用來從左到右訓練LM,意味著當預測x2的時候,它只能看到上文x3;當預測x4的時候,只能看到上文x3和x2,……
 
17.RoBERTa相對於BERT做了哪些重要改進?

答:RoBERTa相對於BERT在模型結構上並沒有改變,改進的是預訓練方法,主要改進有以下幾點:

a) 靜態mask變為動態mask
BERT MLM任務中,有15%的樣本在預處理階段會進行一次隨機mask,具體的mask方式參考問題12,然後在整個訓練過程中,這15%的被mask的樣本其mask方式就不再變化,也不會有新的被mask樣本,這就是靜態mask。

RoBERTa採用了一種動態mask的方式,它並沒有在預處理的時候對樣本進行mask,而是在每次向模型提供輸入時動態生成mask,所以訓練樣本是時刻變化的,並且實驗表明這種動態mask的方式要比BERT原始的靜態mask效果要好。

b) 去除NSP任務
很多實驗表明NSP任務的沒多大意義,RoBERTa中去除了該任務,不過在生成資料時也做了一些改進,原始的BERT中是選擇同一篇文章中連續的兩個句子或不同文章中的兩個句子,而RoBERTa的輸入是連續的多個句子(總長度不超過512)。

c) 更多的資料、更大的mini-batch、更長的訓練時間
BERT base的訓練語料為13G,batch-size為256,而RoBERTa的訓練語料擴大了10到130G,訓練中batch-size為8000,實為大力出奇跡的傑出代表。
 
18.ALBERT相對於BERT做了哪些重要改進?

答:ALBERT是一個精簡的BERT,引數量得到了明顯的降低,使得BERT的大規模應用成為可能。相對於BERT,ALBERT主要有三點改進:

a) Embedding matrix因式分解
在BERT、XLNET等模型中,embedding的維度 E 和隱藏層維度 H 是相等的,都是768,V是詞表的大小一般的3萬左右。從建模的角度來說,embedding層的目標是學習上下文無關的表示,而隱藏層的目標是學習上下文相關的表示,理論上來說隱藏層的表述包含的資訊應該更多一些,因此應該讓H>>E。如果像BERT那樣讓E=H,那增大H之後,embedding matrix大小V*H會變的很大。

ALBERT採取因式分解的方式來降低引數量,先將單詞對映到一個低維的embedding空間,然後再將其對映到高維的隱藏空間,讓H>>E,這樣就可以把embedding matrix的維度從O(V*H)減小到O(V*E+E*H),引數量減少非常明顯。

b) 跨層權重共享
Transformer引數共享可以只共享全連線層、只共享attention層,ALBERT結合了這兩種方式,讓全連線層與attention層都進行引數共享,也就是說共享encoder內的所有引數,採用該方案後效果下降的並不多,但是引數量減少了很多,訓練速度也提升了很多。此外實驗還表明ALBERT每一層的輸出embedding相比於BERT來說震盪幅度更小一些,可以增加模型的魯棒性。

c) 修改預訓練任務NSP為SOP
一些研究表明BERT的NSP並不適合用於預訓練任務,原因可能是負樣本來源於不同的文件,模型在判斷兩個句子的關係時不僅考慮了兩個句子之間的連貫性,還會考慮兩個句子的話題,而兩篇文件的話題通常不同,模型可能更多的通過話題去分析兩個句子的關係,而不是連貫性,這使得NSP任務變的相對簡單。

ALBERT中設計了SOP(Sentence-orderprediction)任務,其正樣本選取方式與BERT一致(來自同一文件的兩個連續句子),而負樣本也同樣是選自同一文件的兩個連續句子,但交換了兩個句子的順序,從而使模型可以更多地建模句子之間的連貫性而不是句子的話題。
 
參考文獻:
1.http://jd92.wang/assets/files/transfer_learning_tutorial_wjd.pdf
2.https://jalammar.github.io/illustrated-transformer/
3.https://medium.com/@_init_/why-BERT-has-3-embedding-layers-and-their-implementation-details-9c261108e28a
4.https://medium.com/@makcedward/how-subword-helps-on-your-nlp-model-83dd1b836f46
5.BERT Explained: State ofthe art language model for NLP. 
https://towardsdatascience.com/BERT-explained-state-of-the-art-language-model-for-nlp-f8b21a9b6270
6.https://zhuanlan.zhihu.com/p/70257427
7.https://arxiv.org/pdf/1706.03762
8.https://arxiv.org/pdf/1906.08237
9.https://arxiv.org/pdf/1907.11692
10.https://arxiv.org/pdf/1909.11942
11.https://arxiv.org/pdf/1905.07129

相關文章