Bert預訓練源碼
主要代碼
地址:https://github.com/google-research/bertgit
- create_pretraning_data.py:原始文件轉換爲訓練數據格式
- tokenization.py:漢字,單詞切分,複合詞處理,create_pretraning_data中調用
- modeling.py: 模型結構
- run_pretraing.py: 運行預訓練
tokenization.py
做用:句子切分,特殊符號處理。
主要類:BasicTokenizer, WordpieceTokenizer, FullTokenizergithub
- BasicTokenizer.tokenize: 文本轉爲unicode, 去除特殊符號,漢字先後加空格,按空格切分單詞,去掉文本重音,按標點符號切割單詞。最後生成一個list
- WordpieceTokenizer.tokenize: 長度過長的單詞標記爲UNK,複合詞切分,找不到的詞標記爲UNK
- FullTokenizer:前後調用BasicTokenizer和WordpieceTokenizer
create_pretraning_data.py
輸入:詞典, 原始文本(空行分割不一樣文章,一行一句)
輸出:訓練數據
做用:生成訓練數據,句子對組合,單詞mask等
入口函數main函數
- 加載詞典,加載原始文本
- create_training_instances
讀取原始文本文件,作unicode轉換,中文,標點,特殊符號處理,空格切分,複合詞切分。轉換爲[[[first doc first sentence],[first doc second sentence],[first doc third sentence]],[[second doc first sentence],[]],....] 這樣的結構
去除空文章,文章順序打亂
輸入的原始文本會重複使用dupe_factor次
對每一篇文章生成訓練數據create_instances_from_document
訓練語句長度限制max_seq_length,0.1的機率生成長度較小的訓練語句,增長魯棒性
句子對(A,B)隨機組合
對於一篇文章,按順序獲取n行句子,其長度總和限制爲target_seq_length,
隨機選取n行中的前m行做爲A
0.5的機率,B是n行中後面剩餘的部分;其餘狀況,B是隨機選取的其餘文章內容,開始位置是隨機的
文章中沒有使用的部分繼續組合(A, B)
添加CLS,SEP分隔符,生成句子向量
對句子對中的單詞作隨機mask (create_masked_lm_predictions), 隨機取num_to_predict個單詞作mask,0.8的機率標記爲MASK,0.1的機率標記爲原始單詞,0.1的機率標記爲隨機單詞
封裝,句子對,句子id,是否爲隨機下一句,mask的下標位置,mask對應的原始單詞ui
訓練數據序列化,存入文件。單詞轉爲id,句子長度不足的後面補0。google
modeling.py
BertConfig: 配置
BertModel: 模型主體spa
建模主體過程:code
- 獲取詞向量 [batch_size, seq_length, embedding_size]
- 添加句向量,添加位置向量,在最後一個維度上作歸一化,總體作dropout
- transformer
全鏈接映射 [B*F, embedding_size]->[B*F, N*H]
\(dropout(softmax(QK^T))V\), 其中mask了本來沒有數據的部分
全鏈接,dropout,殘差處理,歸一化,全鏈接,dropout,殘差處理,歸一化
上述循環多層
取最終[CLS]對應的向量作句向量
run_pretraining.py
做用:生成目標函數,加載已有參數,迭代訓練
主要函數:model_fn_builderorm
- 評估mask單詞的預測準確性,總體loss爲mask處預測對的分數的平均值
- 評估next_sentence預測準確性,loss爲預測對的機率值
- 總損失爲上面兩個損失相加