【算法】Bert預訓練源碼閱讀

Bert預訓練源碼

主要代碼

地址:https://github.com/google-research/bertgit

  1. create_pretraning_data.py:原始文件轉換爲訓練數據格式
  2. tokenization.py:漢字,單詞切分,複合詞處理,create_pretraning_data中調用
  3. modeling.py: 模型結構
  4. run_pretraing.py: 運行預訓練

tokenization.py

做用:句子切分,特殊符號處理。
主要類:BasicTokenizer, WordpieceTokenizer, FullTokenizergithub

  1. BasicTokenizer.tokenize: 文本轉爲unicode, 去除特殊符號,漢字先後加空格,按空格切分單詞,去掉文本重音,按標點符號切割單詞。最後生成一個list
  2. WordpieceTokenizer.tokenize: 長度過長的單詞標記爲UNK,複合詞切分,找不到的詞標記爲UNK
  3. FullTokenizer:前後調用BasicTokenizer和WordpieceTokenizer

create_pretraning_data.py

輸入:詞典, 原始文本(空行分割不一樣文章,一行一句)
輸出:訓練數據
做用:生成訓練數據,句子對組合,單詞mask等
入口函數main函數

  1. 加載詞典,加載原始文本
  2. create_training_instances
    讀取原始文本文件,作unicode轉換,中文,標點,特殊符號處理,空格切分,複合詞切分。轉換爲[[[first doc first sentence],[first doc second sentence],[first doc third sentence]],[[second doc first sentence],[]],....] 這樣的結構
    去除空文章,文章順序打亂
    輸入的原始文本會重複使用dupe_factor次
  3. 對每一篇文章生成訓練數據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

  4. 訓練數據序列化,存入文件。單詞轉爲id,句子長度不足的後面補0。google

modeling.py

BertConfig: 配置
BertModel: 模型主體spa

建模主體過程:code

  1. 獲取詞向量 [batch_size, seq_length, embedding_size]
  2. 添加句向量,添加位置向量,在最後一個維度上作歸一化,總體作dropout
  3. transformer
    全鏈接映射 [B*F, embedding_size]->[B*F, N*H]
    \(dropout(softmax(QK^T))V\), 其中mask了本來沒有數據的部分
    全鏈接,dropout,殘差處理,歸一化,全鏈接,dropout,殘差處理,歸一化
    上述循環多層
    取最終[CLS]對應的向量作句向量

run_pretraining.py

做用:生成目標函數,加載已有參數,迭代訓練
主要函數:model_fn_builderorm

  1. 評估mask單詞的預測準確性,總體loss爲mask處預測對的分數的平均值
  2. 評估next_sentence預測準確性,loss爲預測對的機率值
  3. 總損失爲上面兩個損失相加
相關文章
相關標籤/搜索