close

1 前言

各位朋友大家好,歡迎來到月來客棧,我是掌柜空字符。


近7萬字、60餘幅示例圖、4個下游任務微調場景、從零實現NSP和MLM預訓練任務,掌柜帶你步步走進BERT模型。公眾號後台回復「BERT」獲取下載鏈接!

自從幾個月前發布This Post Is All You Need(上)——層層剝開Transformer(點擊可直接閱讀原文)以來,就一直有不少客官來催掌柜更新BERT的相關內容。終於,經過幾個月磨磨蹭蹭地梳理,掌柜總算是把整個BERT模型的基本原理、代碼實現以及原論文中所提到的4個微調任務場景都給詳細地介紹了一遍。不管是對於模型本身還是各個下游任務場景,掌柜都通過圖示清晰地展示了任務場景數據集的構建流程、模型的構建原理等,力爭以最簡單、最直白和最清晰的方式向大家介紹各個任務的模型構建原理,並且同時還能夠掌握對應的代碼實現。

為感謝各位客官一直以來對月來客棧的支持,客棧近期將會推出一系列的贈書活動(後台回復zs查看最新贈書活動),本期(20220525004)贈書規則見文末。

以NSP和MLM任務為例,掌柜首先通過圖1介紹了這兩個任務的基本原理。

圖 1. MLM和NSP任務網絡結構圖

緊接着通過圖2介紹了在NSP和MLM任務中構建數據集的整體流程,以便做到心中有數不會迷路。

圖 2. MLM和NSP任務數據集構造流程圖

同時,在所有任務的數據預處理環境都可以通過日誌的輸出等級來選擇是否打印數據預處理時的中間結果,而這對於我們理解模型也是至關重要的一部分。

[2022-01-1720:27:38]-DEBUG:##當前句文本:風住塵香花已盡,日晚倦梳頭[2022-01-1720:27:38]-DEBUG:##下一句文本:錦書欲寄鴻難托[2022-01-1720:27:38]-DEBUG:##下一句標籤:False[2022-01-1720:27:38]-DEBUG:## Mask之前詞元結果:['[CLS]', '風', '住', '塵', '香', '花', '已', '盡', ',', '日', '晚', '倦', '梳', '頭', '[SEP]', '錦', '書', '欲', '寄', '鴻', '難', '托', '[SEP]'][2022-01-1720:27:38]-DEBUG:##Mask之前tokenids:[101,7599,857,2212,7676,5709,2347,2226,8024,3189,3241,958,3463,1928,102,7239,741,3617,2164,7896,7410,2805,102][2022-01-1720:27:38]-DEBUG:##segmentids:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1],序列長度為23[2022-01-1720:27:38]-DEBUG:##Mask數量為:3[2022-01-1720:27:38]-DEBUG:##Mask之後tokenids:[101,7599,857,2212,103,5709,2347,103,8024,3189,3241,103,3463,1928,102,7239,741,3617,2164,7896,7410,2805,102][2022-01-1720:27:38]-DEBUG:## Mask之後詞元結果:['[CLS]', '風', '住', '塵', '[MASK]', '花', '已', '[MASK]', ',', '日', '晚', '[MASK]', '梳', '頭', '[SEP]', '錦', '書', '欲', '寄', '鴻', '難', '托', '[SEP]'][2022-01-1720:27:38]-DEBUG:##Mask之後labelids:[0,0,0,0,7676,0,0,2226,0,0,0,958,0,0,0,0,0,0,0,0,0,0,0][2022-01-1720:27:38]-DEBUG:##當前樣本構造結束==================

然後通過圖3介紹了構建NSP和MLM這兩個任務的基本原理。

圖 3. MLM任務網絡結構圖

進一步介紹了數據集構建和任務實現的完整代碼,並得到了圖4所示的模型訓練結果。

圖 4. 訓練集上模型損失和準確率變化圖

最後,還得到了如下所示的推理結果。

if__name__=='__main__':config=ModelConfig()train(config)sentences_1=["Inolongerloveher,true,butperhapsIloveher.","Loveissoshortandoblivionsolong."]sentences_2=["我住長江頭,君住長江尾。","日日思君不見君,共飲長江水。","此水幾時休,此恨何時已。","只願君心似我心,定不負相思意。"]inference(config,sentences_2,masked=False,language='zh')-INFO:##成功載入已有模型進行推理……-INFO:###原始:我住長江頭,君住長江尾。-INFO:##掩蓋:我住長江頭,[MASK]住長[MASK]尾。-INFO:##預測:我住長江頭,君住長河尾。-INFO:====================-INFO:###原始:日日思君不見君,共飲長江水。-INFO:##掩蓋:日日思君不[MASK]君,共[MASK]長江水。-INFO:##預測:日日思君不見君,共飲長江水。#......

例如以下輸入:

[2022-01-1720:27:38]-DEBUG:##當前句文本:風住塵香花已盡,日晚倦梳頭[2022-01-1720:27:38]-DEBUG:##下一句文本:錦書欲寄鴻難托[2022-01-1720:27:38]-DEBUG:##下一句標籤:False[2022-01-1720:27:38]-DEBUG:## Mask之前詞元結果:['[CLS]', '風', '住', '塵', '香', '花', '已', '盡', ',', '日', '晚', '倦', '梳', '頭', '[SEP]', '錦', '書', '欲', '寄', '鴻', '難', '托', '[SEP]'][2022-01-1720:27:38]-DEBUG:##Mask之前tokenids:[101,7599,857,2212,7676,5709,2347,2226,8024,3189,3241,958,3463,1928,102,7239,741,3617,2164,7896,7410,2805,102][2022-01-1720:27:38]-DEBUG:##segmentids:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1],序列長度為23[2022-01-1720:27:38]-DEBUG:##Mask數量為:3[2022-01-1720:27:38]-DEBUG:##Mask之後tokenids:[101,7599,857,2212,103,5709,2347,103,8024,3189,3241,103,3463,1928,102,7239,741,3617,2164,7896,7410,2805,102][2022-01-1720:27:38]-DEBUG:## Mask之後詞元結果:['[CLS]', '風', '住', '塵', '[MASK]', '花', '已', '[MASK]', ',', '日', '晚', '[MASK]', '梳', '頭', '[SEP]', '錦', '書', '欲', '寄', '鴻', '難', '托', '[SEP]'][2022-01-1720:27:38]-DEBUG:##Mask之後labelids:[0,0,0,0,7676,0,0,2226,0,0,0,958,0,0,0,0,0,0,0,0,0,0,0][2022-01-1720:27:38]-DEBUG:##當前樣本構造結束==================2 BERT模型

由於整個BERT模型的內容講解過長,近7萬餘字,所以大家直接通過下載PDF閱讀即可(公眾號回復「BERT」獲取網盤下載鏈接),完整內容目錄如下。

目 錄

第1節 BERT原理與預訓練任務 11.1 引言 11.2 動機 31.2.1 面臨問題 31.2.2 解決思路 41.3 技術實現 41.3.1 BERT網絡結構 51.3.2 Input Embedding 51.3.3 BertEncoder 71.3.4 MLM與NSP任務 7第2節 BERT實現 102.1 工程結構 102.2 參數管理 132.2.1 初始化類成員 132.2.2 導入本地參數 142.2.3 使用示例 142.3 Input Embedding實現 152.3.1 Token Embedding 152.3.2 Positional Embedding 162.3.3 Segment Embedding 162.3.4 Bert Embeddings 172.3.5 使用示例 192.4 BertModel實現 192.4.1 BertAttention實現 202.4.2 BertLayer實現 222.4.3 BertEncoder實現 242.4.4 BertModel實現 262.4.5 使用示例 27第3節 模型的保存與遷移 293.1 運用場景 293.2 查看網絡參數 293.2.1 查看參數 293.2.2 自定義參數前綴 313.3 模型推理過程 313.3.1 模型保存 313.3.2 模型復用 323.4 模型再訓練過程 333.5 模型遷移學習 343.5.1 定義新模型 343.5.2 讀取可用參數 343.5.3 模型遷移學習 36第4節 基於BERT預訓練模型的文本分類任務 384.1 任務構造原理 384.2 數據預處理 384.2.1 輸入介紹 384.2.2 語料介紹 394.2.3 數據集預覽 394.2.4 數據集構建 404.3 加載預訓練模型 464.3.1 查看模型參數 464.3.2 載入並初始化 484.4 文本分類 494.4.1 前向傳播 494.4.2 模型訓練 504.4.3 模型推理 53第5節 基於BERT預訓練模型的文本蘊含任務 555.1 任務構造原理 555.2 數據預處理 555.2.1 輸入介紹 555.2.2 語料介紹 555.2.3 數據集預覽 565.2.4 數據集構建 575.3 文本蘊含 625.3.1 前向傳播 625.3.2 模型訓練 625.3.3 模型推理 63

第6節 基於BERT預訓練模型的SWAG選擇任務 646.1 任務構造原理 646.2 數據預處理 656.2.1 輸入介紹 656.2.2 語料介紹 656.2.3 數據集預覽 666.2.4 數據集構造 676.3 選擇任務 716.3.1 前向傳播 716.3.2 模型訓練 736.3.3 模型推理 76第7節 自定義學習率動態調整 777.1 引言 777.2動態學習率使用 787.2.1 constant使用 787.2.2 constant_with_warmup使用 807.2.3 linear使用 817.2.4 polynomial使用 817.2.5 cosine使用 827.2.6 cosine_with_restarts使用 837.2.7 get_scheduler使用 837.3 動態學習率實現 847.3.1 constant實現 847.3.2 constant_with_warmup實現 847.3.3 linear實現 857.3.4 polynomial實現 857.3.5 cosine實現 867.3.6 cosine_with_restarts實現 877.3.7 transfromer實現 887.4 LambdaLR原理 897.4.1 實現邏輯 897.4.2 學習率恢復 91第8節 基於BERT預訓練模型的SQuAD問答任務 938.1 任務構造原理 938.2 數據預處理 948.2.1 輸入介紹 948.2.2 結果篩選 958.2.3 語料介紹 978.2.4 數據集預覽 998.2.4 數據集構造 1008.3 問答任務 1128.3.1 前向傳播 1128.3.2 模型訓練 1138.4 模型推理 1168.4.1 模型評估 1168.4.2 模型推理 1178.4.3 結果篩選 1188.5 樣本過長問題 1218.5.1 消除長度限制 1218.5.2 重構模型輸入 123

第9節 PyTorch中使用Tensorboard 1269.1 安裝與調試 1269.1.1 安裝啟動 1269.1.2 遠程連接 1279.2 使用Tensoboard 1309.2.1 add_scalar方法 1319.2.2 add_graph方法 1329.2.3 add_scalars方法 1339.2.4 add_histogram方法 1349.2.5 add_image方法 1359.2.6 add_images方法 1369.2.7 add_figure方法 1369.2.8 add_pr_curve方法 1389.2.9 add_embedding方法 1399.3 使用實例 1409.3.1 定義模型 1409.3.2 定義分類模型 1419.3.3 可視化展示 144第10講 從零實現NSP和MLM預訓練任務 14710.1 引言 14710.2 數據預處理 14810.2.1 英文數據格式化 14810.2.2 中文數據格式化 15010.2.3 構造NSP任務數據 15010.2.4 構造MLM任務數據 15210.2.5 構造整體任務數據 15410.2.6 構造訓練數據集 15610.2.7 使用示例 15710.3 預訓練任務實現 15910.3.1 NSP任務實現 15910.3.2 MLM任務實現 16010.3.3 前向傳播 16210.4 模型訓練與微調 16410.4.1 模型訓練 16410.4.2 模型推理 16710.4.3 模型微調 169總結 169引用 170

3 內容預覽

4 贈書

第20220525004期送書規則:分享本文至朋友圈,添加掌柜微信nulls8(備註贈書),下周三(20220601)以及下下周三(20220608)晚20:00點,兩次分別選出點讚數最多的五位客官送出李航老師的《統計學習方法》或李沐老師的《動手學深度學習》一本。

註:①兩次共計送出十本,每次五本;②如果點讚數相同則先關注月來客棧公眾號的客官優先。

本次內容就到此結束,感謝您的閱讀!青山不改,綠水長流,我們月來客棧見!

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 鑽石舞台 的頭像
    鑽石舞台

    鑽石舞台

    鑽石舞台 發表在 痞客邦 留言(0) 人氣()