伯特最近在10個以上的NLP任務上實現了新的最新結果。
這是深層雙向變壓器的預訓練的張量實現,以了解語言
(伯特)和注意力是您所需要的(變壓器)。
更新:這兩篇論文的重複主要思想的大部分部分已經完成,表現顯而易見
對於預訓練,模型和微調比較從頭開始訓練模型。
我們已經完成了實驗,以替換從變壓器到TextCNN的BERT的骨幹網絡,結果是
使用大量原始數據使用屏蔽語言模型預先培訓模型可以以顯著的數量提高性能。
更普遍地,我們認為,預訓練和微調策略獨立於模型獨立和預訓練任務。
話雖如此,您可以根據需要替換骨幹網絡。並添加更多的預訓練任務或將一些新的預訓練任務定義為
您可以,預訓練將不僅限於蒙版語言模型,也不會預測下一個句子任務。我們感到驚訝的是,
有一個中間尺寸數據集,即在預訓練任務的幫助下,即使不使用外部數據,也沒有使用外部數據
像蒙版語言模型一樣,性能可以大大提高,並且該模型甚至可以快速收斂。有時
在微調階段,訓練只需幾個時代。
雖然有開源(Tensor2Tensor)和官方
Transformer和BERT官方實施的實施即將到來,但可能會/可能很難閱讀,不容易理解。
我們不是要完全複製原始論文,而是要以更好的方式應用主要想法並解決NLP問題。
FO工作的大部分部分是由去年另一個存儲庫完成的:文本分類
中型數據集(Cail2018,450k)
| 模型 | textcnn(無預告片) | textcnn(預處理) | 從預訓練中獲得 |
|---|---|---|---|
| 1個時期後的F1得分 | 0.09 | 0.58 | 0.49 |
| 5個時期後的F1得分 | 0.40 | 0.74 | 0.35 |
| 7個時期後的F1分數 | 0.44 | 0.75 | 0.31 |
| 35個時期後的F1得分 | 0.58 | 0.75 | 0.27 |
| 一開始訓練損失 | 284.0 | 84.3 | 199.7 |
| 1個時期後的驗證損失 | 13.3 | 1.9 | 11.4 |
| 5個時期後的驗證損失 | 6.7 | 1.3 | 5.4 |
| 培訓時間(單GPU) | 8H | 2H | 6H |
注意:
A.Fine-Tuning階段在剛剛進行7個時期後完成了訓練,因為Max Epoch達到35。
in fact, fine-tuning stage start training from epoch 27 where pre-train stage ended.
此處報告的C.F1分數是在驗證集上,平均是F1得分的微觀和宏。
在測試集上報告了35個時期後的d.f1分數。
e。從450k RAW文檔中,檢索了200萬次培訓數據的蒙版語言模型,
pre-train stage finished within 5 hours in single GPU.
預先訓練後進行微調:

沒有預訓練:

小型數據集(私人,100k)
| 模型 | textcnn(無預告片) | textcnn(預處理) | 從預訓練中獲得 |
|---|---|---|---|
| 1個時期後的F1得分 | 0.44 | 0.57 | 10%+ |
| 1個時期後的驗證損失 | 55.1 | 1.0 | 54.1 |
| 一開始訓練損失 | 68.5 | 8.2 | 60.3 |
如果您想嘗試使用蒙版語言模型和微調的預培訓的BERT。採取兩個步驟:
python train_bert_lm.py [DONE]
python train_bert_fine_tuning.py [Done]
如您所見,即使在微調的起點,在預訓練模型的還原參數之後,模型的丟失也較小
比全新的訓練和F1分數也更高,而新型號可能從0開始。
注意:要幫助您首先嘗試新想法,您可以將Hyper-Paramater Test_mode設置為true。它只會加載少量數據,並開始快速培訓。
python train_transform.py [DONE, but a bug exist prevent it from converge, welcome you to fix, email: [email protected]]
D_Model:模型的維度。 [512]
num_layer:圖層數。 [6]
num_header:自我注意力的標題數[8]
D_K:鍵(K)的尺寸。查詢(Q)的維度相同。 [64]
D_V:V的維度。 [64]
default hyperparameter is d_model=512,h=8,d_k=d_v=64(big). if you have want to train the model fast, or has a small data set
or want to train a small model, use d_model=128,h=8,d_k=d_v=16(small), or d_model=64,h=8,d_k=d_v=8(tiny).
每行都是文檔(幾個句子)或句子。那是自由文本,您可以輕鬆獲得。
在zip文件中檢查數據/bert_train.txt或bert_train2.txt。
輸入和輸出在同一條線上,每個標籤以“標籤”開頭。
在輸入字符串和第一個標籤之間有一個空間,每個標籤也被一個空間拆開。
例如token1 token2 token3 __label__l1 __label __l5 __label __l3
token1 token2 token3 __label__l2 __label__l4
在zip文件中檢查數據/bert_train.txt或bert_train2.txt。
檢查“數據”文件夾中的示例數據。在此處加載中間尺寸數據集
每個輸入是450k 206類,平均長度約為300,一個或多標籤與輸入相關。
從Tencent AILAB下載嵌入式訓練單詞
事情很容易:
下載數據集(大約200m,450k數據,帶有一些緩存文件),將其解壓縮並將其放入數據/文件夾中,
運行步驟1進行預訓練,
並運行第2步以進行微調。
我完成了三個步驟以上,並希望有更好的性能,我該怎麼做。我需要找到一個大數據集嗎?
否。您可以通過下載一些自由文本來生成一個大數據集,以便在預訓練階段
是文檔或句子,然後用新數據文件替換數據/bert_train2.txt。
還有什麼?
嘗試一些大型參數或大型型號(通過替換骨幹網絡),您可以觀察所有預訓練數據。
播放模型:model/bert_cnn_model.py,或使用data_util_hdf5.py檢查預處理。
預處理語言模型和大規模語料庫的下一個句子預測任務,
基於多層自我輸入模型,然後通過添加分類層進行微調。
由於BERT模型是基於變壓器的,因此目前,我們正在為模型添加預處理任務。


注意:CAIL2018約為450K,如上所述。
私人數據集的訓練大小約為100K,類數為9,對於每個輸入都有一個或多個標籤。
CAIL2018的F1得分據報導為Micro F1分數。
基本想法非常簡單。幾年來,人們一直在作為語言模型獲得很好的結果“預訓練” DNN
然後對一些下游NLP任務進行微調(問題回答,自然語言推斷,情感分析等)。
語言模型通常是從左到右的,例如:
"the man went to a store"
P(the | <s>)*P(man|<s> the)*P(went|<s> the man)*…
問題在於,對於通常不想要語言模型的下游任務,您需要最好的上下文表示
每個單詞。如果每個單詞只能看到左邊的上下文,那麼顯然缺少很多。因此,人們所做的一個技巧也是訓練
左右模型,例如:
P(store|</s>)*P(a|store </s>)*…
現在,您有兩個單詞的兩種表示形式,一個從左到右和一個右至左的表示,您可以將它們串聯在一起以完成下游任務。
但是從直覺上講,如果我們可以訓練一個深層雙向的單個模型,那就更好了。
不幸的是,不可能訓練像普通LM這樣的深層雙向模型,因為這會產生單詞可以間接的周期
“看自己”,預測變得瑣碎。
相反,我們可以做的是用於脫落自動編碼器中的非常簡單的技巧,我們從輸入和
必須從上下文重建這些詞。我們將其稱為“蒙版LM”,但通常被稱為披肩任務。
我們通過深層變壓器編碼器饋入輸入,然後使用對應於蒙版位置對應的最終隱藏狀態
預測什麼詞被掩蓋,就像我們將訓練語言模型一樣。
source_file each line is a sequence of token, can be a sentence.
Input Sequence : The man went to [MASK] store with [MASK] dog
Target Sequence : the his
如何獲得最後一個隱藏的蒙版位置狀態?
1) we keep a batch of position index,
2) one hot it, multiply with represenation of sequences,
3) everywhere is 0 for the second dimension(sequence_length), only one place is 1,
4) thus we can sum up without loss any information.
有關更多詳細信息,請檢查Mask_language_model的方法
許多語言理解任務,例如問答,推論,需要理解關係
在句子之間。但是,語言模型只能在沒有句子的情況下理解。下一個句子
預測是一項示例任務,可以幫助模型在這類任務中更好地理解。
機會的50%是第二句話的下一個句子,而不是下一個句子的50%。
給定兩個句子,要求該模型預測第二句是否是真實的下一個句子
第一個。
Input : [CLS] the man went to the store [SEP] he bought a gallon of milk [SEP]
Label : Is Next
Input = [CLS] the man heading to the store [SEP] penguin [MASK] are flight ##less birds [SEP]
Label = NotNext


Python 3+張量1.10
在培訓和微調階段之間有什麼共享和不共享?
1)基本上,預訓練和微調階段使用的骨幹網絡的所有參數彼此共享。
2)。我們可以盡可能地共享參數,以便在微調階段我們需要學習很少
參數盡可能地共享了這兩個階段的單詞嵌入。
3)。因此,大多數參數已經在微調階段開始時被學到了。
我們如何實施蒙版語言模型?
為了使事情變得容易,我們從文檔中生成句子,將其分成句子。對於每個句子
我們將其截斷並填充到相同的長度,然後隨機選擇一個單詞,然後用[mask],其自我和隨機替換
單詞。
如何使微調階段提高效率,而不是打破結果和我們從培訓階段學到的知識?
我們在微調過程中使用較小的學習率,因此調整的程度很小。
為什麼我們需要自我注意?
自我發揮的新型網絡最近引起了越來越多的關注。傳統上,我們使用
RNN或CNN解決問題。但是,RNN並行存在問題,而CNN不擅長模型位置敏感任務。
自我注意力可以並行運行,同時能夠建模長距離依賴性。
多頭自我注意事項是什麼,Q,K,V代表什麼?在這裡添加一些東西。
Mulit-Heads自我注意是一個自我注意力,而它將Q和K項目分為幾個不同的子空間,
然後注意。
Q代表問題,K代表鑰匙。對於機器翻譯任務,Q是以前隱藏的解碼狀態,k表示
編碼器的隱藏狀態。 k的每個元素都將計算q的相似性得分。然後將使用SoftMax
要進行歸一化分數,我們將獲得權重。最後,通過使用權重計算加權總和適用於V。
但是,在自我注意的情況下,Q,K,V與任務輸入序列的表示。
什麼是位置的飼料?
它是一個進料前層,也稱為完全連接(FC)層。但是由於在變壓器中,所有的輸入和輸出
層是向量的序列:[sequence_length,d_model]。我們通常將FC進行輸入矢量。所以我們再做一次,
但是不同的時間步驟有自己的FC。
伯特的主要貢獻是什麼?
雖然預訓練任務已經存在了很多年,但它引入了一種新的方式(所謂的雙向)來進行語言模型
並將其用於下流任務。由於語言模型的數據無處不在。事實證明它是強大的,因此重塑
NLP世界。
為什麼作者在生成蒙版語言模型的培訓數據時使用三種不同類型的令牌?
作者認為,在微調階段沒有[面具]令牌。因此,預訓練和微調之間的不匹配。
它還迫使模型注意句子中的所有上下文信息。
是什麼使BERT模型實現了新的技術導致語言理解任務?
大型模型,大型計算,最重要的是 - 新算法使用自由文本數據預處理模型。
玩具任務用於檢查模型是否可以正常工作而不取決於實際數據。
它要求模型計數數字,並總結所有輸入。並使用閾值
如果求和大於閾值(或少於閾值),則該模型需要將其預測為1(或0)。
內部模型/transform_model.py,有火車和預測方法。
首先,您可以運行Train()開始訓練,然後運行Predive()以使用訓練有素的模型開始預測。
由於模型非常大,因此具有默認的超參票(d_model = 512,h = 8,d_v = d_k = 64,num_layer = 6),因此需要大量數據才能收斂。
至少需要10k步驟,在損失小於0.1之前。如果您想用小訓練
數據,您可以使用一組小型Parmeter(d_model = 128,h = 8,d_v = d_k = 16,num_layer = 6)
您可以使用兩個求解二進制分類,多類分類或多標籤分類問題。
它將在訓練期間打印損失,並在驗證期間為每個時期打印F1分數。
修復變壓器中的錯誤[重要的是,招募團隊成員並需要合併請求]
(變壓器:為什麼早期訓練階段的損失減少,但損失仍然不太小(例如損失= 8.0)?
更多的預訓練數據,損失仍然不小)
支持句子對任務[重要,招募團隊成員並需要合併請求]
添加下一個句子預測的預訓練任務[重要,招募團隊成員並需要合併請求]
需要一個數據集來進行情感分析或英語文本分類[重要的是,招募團隊成員並需要合併請求]
位置嵌入尚未與預訓練和微調之間共享。由於在訓練前的階段長度可能
比微調階段短。
特殊處理第一個令牌[CLS]作為輸入和分類[完成]
預先訓練fine_tuning:需要從預訓練階段的代幣的負載詞彙量,但可以從實際任務上標記。 [完畢]
進行微調時的學習率應該較小。 [完畢]
預訓練就是您所需要的。使用變壓器或其他一些複雜的深層模型可以幫助您實現最佳性能
在某些任務中,使用大量的原始數據(然後在特定於任務數據集上微調模型,
將始終幫助您獲得額外的表現。
在這裡添加更多。
添加建議,問題或想做出貢獻,歡迎與我聯繫:[email protected]
注意就是您所需要的
BERT:深層雙向變壓器的預訓練以了解語言理解
Tensor2Tensor用於神經機器翻譯
句子分類的捲積神經網絡
CAIL2018:一個大規模的法律數據集用於判斷預測