作者:wipenHan

近期百度開源的ERNIE在多種中文文本任務中表現出色,相較於 BERT 隨機[MASK]或替換字元,ERNIE 直接對詞進行隨機[MASK]或替換,增強了模型中文實體含義的表示能力。

ERNIE基於百度的paddle-paddle框架,手頭沒有配置好的環境,那麼能否在Tensorflow下復現ERNIE呢?

其實我們可以看出ERNIE與BERT非常相似,區別主要是在pretrain中選擇[MASK]字元的邏輯。那麼我們就可以通過改造BERT的 create_pretraining_data.py 實現ERNIE的邏輯。

clone代碼:wipen/bert

使用create_ernie_pretraining_data.py 處理預訓練數據,數據樣例:

INFO:tensorflow:*** Example ***
INFO:tensorflow:tokens: [CLS] [MASK] [MASK] 在 腎 臟 的 [MASK] [MASK] [MASK] 就 是 腎 [MASK] [MASK] [MASK] , 是 由 [MASK] [MASK] 內 [MASK] [MASK] 態 ##nne 的 血 管 、 脂 肪 和 平 滑 肌 [MASK] [MASK] 構 成 的 , [MASK] [MASK] [MASK] [MASK] 也 叫 它 腎 [MASK] [MASK] 平 滑 肌 脂 肪 瘤 。 [SEP] 間 20 ##~5 ##0 歲 , [MASK] [MASK] 現 代 b 超 和 ct 技 術 的 [MASK] [MASK] 先 進 , 對 腎 錯 構 瘤 有 較 高 的 檢 出 率 。 腎 錯 構 瘤 的 主 要 [MASK] [MASK] 是 瘤 體 長 大 後 , [MASK] [MASK] 破 裂 [MASK] [MASK] 後 帶 來 的 並 發 症 , 隨 著 [SEP]
INFO:tensorflow:input_ids: 101 103 103 1762 5513 5552 4638 103 103 103 2218 3221 5513 103 103 103 8024 3221 4507 103 103 1079 103 103 2706 12866 4638 6117 5052 510 5544 5505 1469 2398 3998 5491 103 103 3354 2768 4638 8024 103 103 103 103 738 1373 2124 5513 103 103 2398 3998 5491 5544 5505 4606 511 102 7313 8113 11864 8129 2259 8024 103 103 4385 807 144 6631 1469 9162 2825 3318 4638 103 103 1044 6822 8024 2190 5513 7231 3354 4606 3300 6772 7770 4638 3466 1139 4372 511 5513 7231 3354 4606 4638 712 6206 103 103 3221 4606 860 7270 1920 1400 8024 103 103 4788 6162 103 103 1400 2372 3341 4638 2400 1355 4568 8024 7390 4708 102
INFO:tensorflow:input_mask: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
INFO:tensorflow:segment_ids: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
INFO:tensorflow:masked_lm_positions: 2 5 9 11 15 20 23 25 35 37 43 45 51 67 69 78 103 112 116 0
INFO:tensorflow:masked_lm_ids: 4495 5552 4606 3221 4606 5552 2382 4495 5491 5302 809 812 5052 4708 807 4660 2154 4197 6117 0
INFO:tensorflow:masked_lm_weights: 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0
INFO:tensorflow:next_sentence_labels: 0
INFO:tensorflow:*** Example ***
INFO:tensorflow:tokens: [CLS] 很 多 [MASK] [MASK] 會 [MASK] [MASK] 女 性 的 生 活 質 量 , 例 如 工 作 忙 碌 、 缺 少 服 飾 、 [MASK] [MASK] 壓 抑 、 [MASK] [MASK] ##︰ 濤 [UNK] [UNK] [MASK] [MASK] 是 一 些 婦 科 疾 病 會 妨 礙 [MASK] [MASK] [MASK] [MASK] 、 影 響 夫 妻 感 情 。 [SEP] 四 [MASK] [MASK] [MASK] [MASK] 唐 都 [MASK] [MASK] 王 學 廉 主 任 回 復 : [MASK] [MASK] 術 ##葷 姚 做 [MASK] [MASK] , 雙 側 雞 宙 會 [MASK] [MASK] [MASK] [MASK] [MASK] 的 茲 1964 潺 [MASK] [MASK] [MASK] [MASK] , [MASK] [MASK] 第 二 側 手 術 的 [MASK] [MASK] 要 遠 遠 差 於 第 一 側 [SEP]
INFO:tensorflow:input_ids: 101 2523 1914 103 103 833 103 103 1957 2595 4638 4495 3833 6574 7030 8024 891 1963 2339 868 2564 4808 510 5375 2208 3302 7652 510 103 103 1327 2829 510 103 103 21049 4092 100 100 103 103 3221 671 763 1967 4906 4565 4567 833 1981 4809 103 103 103 103 510 2512 1510 1923 1988 2697 2658 511 102 1724 103 103 103 103 1538 6963 103 103 4374 2110 2442 712 818 1726 1908 8038 103 103 3318 18936 2001 976 103 103 8024 1352 904 7883 2136 833 103 103 103 103 103 4638 5760 9129 4064 103 103 103 103 8024 103 103 5018 753 904 2797 3318 4638 103 103 6206 6823 6823 2345 754 5018 671 904 102
INFO:tensorflow:input_mask: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
INFO:tensorflow:segment_ids: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
INFO:tensorflow:masked_lm_positions: 4 7 29 34 36 40 54 68 72 82 85 88 93 96 99 103 107 110 118 0
INFO:tensorflow:masked_lm_ids: 5162 1510 5328 4567 5736 1071 3833 2110 7368 2938 5543 904 3318 2533 2595 4568 1217 684 3362 0
INFO:tensorflow:masked_lm_weights: 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0
INFO:tensorflow:next_sentence_labels: 1
INFO:tensorflow:Wrote 3804063 total instances

由於格式問題,不能直接使用百度開源的ERNIE預訓練模型,需要使用run_pretraining.py進行預訓練。採用特定領域內的無標註數據進行預訓練,也許在相關任務上能夠超越官方開源的預訓練模型。


推薦閱讀:
相关文章