【NLP】BERT 模型与中文文本分类实践
簡介
2018年10月11日,Google發布的論文《Pre-training of Deep Bidirectional Transformers for Language Understanding》[1],提出的 BERT 模型成功在11項 NLP 任務中取得 state of the art 的結果,贏得自然語言處理學界的一片贊譽之聲,成為 NLP 發展史上的里程碑式的模型成就。BERT 的全稱是 Bidirectional Encoder Representations from Transformer。
Bidirectional:BERT 的模型結構和 ELMo 類似,均為雙向的。
Encoder:BERT 只是用到了 Transformer 的 Encoder 編碼器部分。
Representation:做詞 / 句子的語義表征。
Transformer:Transformer Encoder 是 BERT 模型的核心組成部分。
BERT 模型的目標是利用自監督學習方法在大規模無標注語料上進行預訓練,從而捕捉文本中的豐富語義信息。在后續特定的 NLP 任務中,我們可以根據任務類型對 BERT 預訓練模型參數進行微調,以取得更好的任務效果。BERT 論文鏈接:https://arxiv.org/abs/1810.04805 ,github 地址:https://github.com/google-research/bert
模型理解
網絡架構
BERT 的網絡架構使用的是《Attention is all you need》[2] 中提出的多層 Transformer Encoder 結構,其最大的特點是拋棄了傳統的 RNN 和 CNN,通過 Attention 機制將任意位置的兩個單詞的距離轉換成1,有效的解決了 NLP 中棘手的長期依賴問題。Transformer 的結構在 NLP 領域中已經得到了廣泛應用,其網絡架構如下圖所示,Transformer 是一個 encoder-decoder 的結構,由若干個編碼器和解碼器堆疊形成。圖中的左側部分為編碼器,由 Multi-Head Attention 和 Feed Forward 全連接層組成,用于將輸入語料轉化成特征向量。右側部分是解碼器,其輸入為編碼器的輸出以及已經預測出的結果,由 Masked Multi-Head Attention, Multi-Head Attention 以及 Feed Forward 全連接層組成,用于輸出最后結果的條件概率。
上圖的左側部分是一個 Transformer Block,對應到下圖中的一個 “Trm”。
BERT 提供了基礎和復雜兩個模型,對應的超參數分別如下:
:L=12,H=768,A=12,參數總量110M
:L=24,H=1024,A=16,參數總量340M
其中 L 表示網絡的層數(即 Transformer blocks 的數量),A 表示 Multi-Head Attention 中 self-Attention 的數量,H 是輸出向量的維度。谷歌提供了中文 BERT 基礎預訓練模型 bert-base-chinese,TensorFlow 版模型鏈接:https://storage.googleapis.com/bert_models/2018_11_03/chinese_L-12_H-768_A-12.zip ,Pytorch 版模型權重鏈接:https://huggingface.co/bert-base-chinese/tree/main
BERT 論文中還對比了 GPT[3] 和 ELMo[4],它們兩個的結構如下圖所示:
其中 BERT 使用的是雙向 Transformer 編碼器,GPT 使用的是單向 Transformer 解碼器,ELMo 使用兩個獨立訓練的 LSTM 結構,只有BERT表征會基于所有層中的左右兩側語境。除了結構上的不同,BERT 和 GPT 是基于微調的方式,而 ELMo 是基于特征的方法。
輸入表示
BERT 模型的輸入為表示單個文本句或一對文本的詞序列,對于給定的詞,其輸入表示通過三部分 Embedding 求和得到。
Token Embeddings:WordPiece 分詞后的詞向量。
Position Embedding:位置嵌入是指將單詞的位置信息編碼成特征向量,位置嵌入是向模型中引入單詞位置關系的至關重要的一環。
Segment Embedding:用于區分兩個句子。對于句子對輸入,第一個句子的特征值是0,第二個句子的特征值是1。
圖中的兩個特殊符號[CLS]和 [SEP]:[CLS]一般位于句首,是輸入的第一個 token,其對應的輸出向量可以作為整個輸入句子的表示,用于之后的分類任務。[SEP]表示分句符號,用于斷開輸入語料中的兩個句子。
預訓練任務
BERT 模型使用兩個新的無監督預測任務進行預訓練,分別是 Masked LM(MLM)和 Next Sentence Prediction(NSP)。
Masked LM
為了訓練深度雙向 Transformer 表示,采用了一種簡單的方法:隨機掩蓋部分輸入詞,然后對那些被掩蓋的詞進行預測,此方法被稱為“Masked LM”(MLM)。該任務非常像我們在中學時期經常做的完形填空。正如傳統的語言模型算法和 RNN 匹配一樣,MLM 的這個性質和 Transformer 的結構也是非常匹配的。
BERT 在預訓練時只預測[MASK]位置的單詞,這樣就可以同時利用上下文信息。但是在后續使用的時候,句子中并不會出現[MASK]的單詞,這樣會影響模型的性能。因此在訓練時采用如下策略,隨機選擇句子中15%的單詞進行 Mask,在選擇為 Mask 的單詞中,有80%真的使用[MASK]進行替換,10%使用一個隨機單詞替換,剩下10%保留原詞不進行替換。
原句:my dog is hairy
80%:my dog is [MASK]
10%:my dog is apple
10%:my dog is hairy
注意最后10%保留原句是為了將表征偏向真實觀察值,而另外10%用其它隨機詞替代原詞并不會影響模型對語言的理解能力,因為它只占所有詞的1.5%(0.1 × 0.15)。此外,作者在論文中還表示因為每次只能預測15%的詞,因此模型收斂比較慢。
Next Sentence Prediction
Next Sentence Prediction(NSP)是一個二分類任務,其目標是判斷句子 B 是否是句子 A 的下文,如果是的話輸出標簽為 ‘IsNext’,否則輸出標簽為 ‘NotNext’。BERT 使用這一預訓練任務的主要原因是,很多句子級別的任務如自動問答(QA)和自然語言推理(NLI)都需要理解兩個句子之間的關系。訓練數據的生成方式是從平行語料中隨機抽取的連續兩句話,其中50%保留抽取的兩句話,它們符合 IsNext 關系,另外50%的第二句話是隨機從預料中提取的,它們的關系是 NotNext 的。BERT 模型使用[CLS]的編碼信息進行預測。
輸入:[CLS]我 喜 歡 玩 英 [MASK] 聯 盟 [SEP] 我 最 擅 長 的 [MASK] 色 是 亞 索 [SEP]
類別:IsNext
輸入:[CLS]我 喜 歡 玩 英 [MASK] 聯 盟 [SEP] 今 天 天 氣 很 [MASK] [SEP]
類別:NotNext
BERT 預訓練的過程可以用下圖來表示。
微調
預訓練得到的 BERT 模型可以在后續用于具體 NLP 任務的時候進行微調 (Fine-tuning 階段),BERT 模型可以適用于多種不同的 NLP 任務,如下圖所示。
句子對分類任務
例如自然語言推斷 (MNLI),句子語義等價判斷 (QQP) 等,如上圖 (a) 所示,需要將兩個句子傳入 BERT,然后使用 [CLS] 的輸出向量 C 進行句子對分類。
單句分類任務
例如句子情感分析 (SST-2),判斷句子語法是否可以接受 (CoLA) 等,如上圖 (b) 所示,只需要輸入一個句子,無需使用 [SEP] 標志,然后也是用 [CLS] 的輸出向量 C 進行分類。
問答任務
如 SQuAD v1.1 數據集,樣本是語句對 (Question, Paragraph),Question 表示問題,Paragraph 是一段來自 Wikipedia 的文本,Paragraph 包含了問題的答案。而訓練的目標是在 Paragraph 中找出答案的起始位置 (Start,End)。如上圖 (c) 所示,將 Question 和 Paragraph 傳入 BERT,然后 BERT 根據 Paragraph 所有單詞的輸出預測 Start 和 End 的位置。
單句標注任務
例如命名實體識別 (NER),輸入單個句子,然后根據 BERT 對于每個單詞的輸出向量 T 預測這個單詞的類別,是屬于 Person,Organization,Location,Miscellaneous 還是 Other (非命名實體)。
任務效果
中文文本分類實踐
基于 pytorch-transformers 實現的 BERT 中文文本分類代碼倉庫:https://github.com/zejunwang1/bert_text_classification 。該倉庫主要包含 data 文件夾、pretrained_bert 文件夾和4個 python 源文件。
config.py:模型配置文件,主要配置訓練集 / 驗證集 / 測試集數據路徑,模型存儲路徑,batch size,最大句子長度和優化器相關參數等。
preprocess.py:實現 DataProcessor 數據預處理類。
main.py:主程序入口。
train.py:模型訓練和評估代碼。
從 THUCNews 中隨機抽取20萬條新聞標題,一共有10個類別:財經、房產、股票、教育、科技、社會、時政、體育、游戲、娛樂,每類2萬條標題數據。數據集按如下劃分:
訓練集:18萬條新聞標題,每個類別的標題數為18000
驗證集:1萬條新聞標題,每個類別的標題數為1000
測試集:1萬條新聞標題,每個類別的標題數為1000
訓練集對應 data 文件夾下的 train.txt,驗證集對應 data 文件夾下的 dev.txt,測試集對應 data 文件夾下的 test.txt。可以按照 data 文件夾中的數據格式來準備自己任務所需的數據,并調整 config.py 中的相關配置參數。
預訓練 BERT 模型
從 huggingface 官網上下載 bert-base-chinese 模型權重、配置文件和詞典到 pretrained_bert 文件夾中,下載地址:https://huggingface.co/bert-base-chinese/tree/main
模型訓練
文本分類模型訓練:
python?main.py?--mode?train?--data_dir?./data?--pretrained_bert_dir?./pretrained_bert訓練中間日志如下:
模型在驗證集上的效果如下:
Demo演示
文本分類 demo 展示:
python?main.py?--mode?demo?--data_dir?./data?--pretrained_bert_dir?./pretrained_bert模型預測
對 data 文件夾下的 input.txt 中的文本進行分類預測:
python?main.py?--mode?predict?--data_dir?./data?--pretrained_bert_dir?./pretrained_bert?--input_file?./data/input.txt輸出如下結果:
參考文獻
[1] BERT: https://arxiv.org/pdf/1810.04805.pdf
[2] Transformer: https://arxiv.org/pdf/1706.03762.pdf
[3] GPT: https://s3-us-west-2.amazonaws.com/openai-assets/research-covers/language-unsupervised/language_understanding_paper.pdf
[4] ELMo: https://arxiv.org/pdf/1802.05365.pdf
往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載機器學習的數學基礎專輯黃海廣老師《機器學習課程》視頻課 本站qq群851320808,加入微信群請掃碼: 與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的【NLP】BERT 模型与中文文本分类实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ie浏览器发送错误报告提示怎么关闭
- 下一篇: Linux 命令解压缩