作者:陳之炎
本文約3000字,建議閱讀7分鐘本文介紹了利用BERT模型來對Twitter上海量的COVID-19資訊自動進行分類、過濾和總結。
一直以來,Twitter是新聞的重要來源,在COVID-19大流行期間,公衆可以在推特上表達自己的焦慮情緒。然而,要對Twitter上海量的COVID-19資訊手動進行分類、過濾和總結,幾乎是不可能做到的。這個艱巨而富有挑戰性的任務便落到了BERT 頭上,作為自然語言處理(NLP)領域機器學習工具的不二選擇,利用BERT模型來對Twitter上海量的COVID-19資訊自動進行分類、過濾和總結,提高對Twitter上相關COVID-19内容的了解,以及針對這些内容做出分析和總結,并稱之為 COVID-Twitter -BERT模型,簡稱CT-BERT。
模型基于BERT-LARGE (英文,不區分大小寫,全字屏蔽)模型。BERT-LARGE主要用于訓練英文維基百科(3.5B字)和免費書籍語料庫(0.8B字)等大型的原始文本資料集,雖然這些資料集中包含了海量的資料,但是它卻沒有包含特殊子領域的相關資訊,在一些特定的專業領域,已經有了利用transformer模型訓練特殊專業領域的預料庫的相關案例,如BIOBERT和SCIBERT,這些模型均采用完全相同的無監督訓練技術MLM / NSP / SOP,需要消耗巨大的硬體資源。更為常見和通用的方法是首先利用通用的模型訓練出權重,在完成專業領域的預訓練之後,再将專業領域的預訓練結果代替通用領域的預訓練結果,輸入到下遊任務中進行訓練。
1. 訓練過程
CT-BERT模型在一個160M的語料庫上進行訓練,這個語料庫搜集了2020年1月12日至2020年4月16日期間關于冠狀病毒的推文,利用推特過濾API(應用程式設計接口)偵聽一組與COVID-19相關的英文關鍵字。在訓練之前,先将原始的語料庫裡的轉發标簽清洗掉,利用一個通用的文本替換掉每條推文的使用者名稱,對所有的URL和程式網頁都執行類似操作。此外,用Python表情符号庫emoji将所有的unicode表情符号換成了文本ASCII表示法(例如:用微笑替換了笑臉)。最後,将所有的轉發、重複的資料從資料集中删除,2250萬條推特的五個最終語料庫總共有0.6B個字。專業領域的預訓練資料集的内容是基礎模型通用資料集大小的七分之一。每一條推文被視為一個獨立文檔,利用spaCy庫将其分割成獨立的句子。
所有輸入到BERT中的序列轉換成由30000個單詞的詞彙表構成的标記集合,每條推特消息的長度限制在280個字元以内,最大序列長度為96個标記,将訓練批大小增加到1024,最終在資料集上生成285M訓練示例和2.5M個驗證示例。控制持續學習率設為2e-5,在專業領域資料集上預訓練時,模型的參數設定和谷歌官方在GitHub上推薦的參數設定相一緻。
通過預訓練計算出損失和準确度程式,每10萬個訓練步長儲存一個檢查點,并将其定位為各種類型下遊的分類任務,分布式訓練在TPUv3-8(128GB)上使用Tensorflflow 2.2持續運作了120小時。
CT-BERT為基于transformer的模型,在關于COVID-19主題的大量推特消息語料庫上預先訓練好。v2模型在9700條推文基礎上進行訓練 (1.2B訓練示例)。
CT-BERT用于訓練特定專業領域的資料集,訓練評估結果表明:與标準的BERT-Large模型相比,該模型的性能将有10-30%的提高,尤其是在與COVID-19相關的推特資訊資料集上,性能改進尤為顯著。
2. 訓練方法
如果熟悉微調transformer模型,可以從兩個管道下載下傳CT-BERT模型:既可以通過TFHub下載下傳文檔,也可以到Huggingface中下載下傳文檔。
圖1
Huggingface
從huggingface中加載預先訓練好的模型:
圖2
可以使用内置的管道來預測内部辨別:
圖3
從TF-Hub中加載預先訓練好的模型:
圖4
用以下腳本對CT-BERT進行微調
腳本run_finetune.py可用于訓練分類器,該代碼依賴于tensorflow
2.2/Keras 架構下官方BERT模型實作。
在運作代碼之前需要進行如下設定:
- 谷歌雲bucket;
- 運作Tensorflow 2.2的谷歌雲虛拟機;
- 與虛拟機位于同一區域運作Tensorflow 2.2的TPU。
如果是做研究工作的話,可以申請通路TPU和/或谷歌雲。
安裝
遞歸地克隆存儲倉庫:
圖5
代碼是使用tf-nightly開發的,并確定它向後相容,以便能在tensorflow 2.2上運作。建議使用Anaconda來管理Python版本:
圖6
安裝requirements.txt
圖7
3. 資料準備
按照以下格式,将資料分為訓練資料集:train.tsv和驗證資料集dev.tsv :
圖8
将準備好的兩個資料集檔案放到下述檔案夾當中 data/finetune/originals/<dataset_name>/(train|dev).tsv
然後運作:
圖9
之後在 data/finetune/run_2020-05-19_14-14-53_517063_test_run/<dataset_name>/tfrecords.目錄下生成TF_Record 檔案,
将資料加載進來:
圖10
4. 預訓練
預訓練代碼在現有的預訓練模型(如BERT-Large)基礎上,對目标域資料(在這個例子中是推特資料)進行無監督的預訓練。此代碼原則上可以用于任何特殊專業領域資料集的預訓練。
資料準備階段
資料準備階段分兩步:
資料清洗階段
第一步,運作以下腳本,利用asciifying emojis将 使用者名/URLs等資訊清洗掉:
圖11
第二步 為預訓練生成TFrecord 檔案
圖12
此過程會占用大量記憶體,需要運作很長時間,是以可以選擇已經準備好的TFrecord 檔案max_num_cpus,預處理好的資料存儲在data/pretrain/<run_name>/tfrecords/目錄下。
将準備好的資料同步進來即可:
圖13
預訓練
在預訓練模型之前,確定将在gs://cloud-tpu-checkpoints/bert/keras_bert/wwm_uncased_L-24_H-1024_A-16.tar.gz下的壓縮檔案解壓,并将預訓練模型複制到gs://<;bucket_name>;/pretrained_models/bert/keras_bert/wwm_uncased_L-24_H-1024_A-16/目錄下:
将模型和TFrecord檔案加載進來之後,在谷歌雲虛拟機上通路TPU和bucket(二者位于同一區域same zone)。
圖14
在 gs://<bucket_name>/pretrain/runs/<run_name>目錄下會生成運作日志檔案和模型檢查點檔案
5. 微調
利用下述指令對此資料集,利用CT-BERT進行微調操作:
圖 15
運作配置檔案進行訓練,将運作日志檔案儲存到gs://<bucket_name>/covid-bert/finetune/runs/run_2020-04-29_21-20-52_656110_<run_prefix>/.目錄之下。在 tensorflow 的日志檔案中, run_logs.json 檔案中包含所有相關的訓練資訊。
圖 16
在本地計算機上運作sync_bucket_data.py腳本,下載下傳訓練日志檔案:
圖 17
模型的訓練用到了Tensorflow研究雲( Tensorflow Research Cloud ,TFRC)和谷歌雲covid-19研究提供的資源。
6. 模型評估
選用了五個獨立的訓練集,對模型應用于下遊任務的實際性能進行評估。其中三個資料集是公開的資料集,兩個來自尚未公開的内部項目,所有資料集包括Twitter上與COVID-19相關的資料。
圖18:評估資料集概覽:所有五個評估資料集都是帶标簽的多分類資料集,通過标簽欄中的比例欄寬度來實作可視化,N和Neg表示負面情緒;Disc 和A分别是沮喪和不确定情緒
7. 訓練結果
圖19顯示了CT-BERT對驗證資料集預訓練25k步長及進行1k步驗證後的結果,所有的名額均通過整個教育訓練過程得到驗證。值得注意的是,在MLM損失任務中性能有了顯著的提高,最終獲得的損失值為1.48。NSP任務的損失隻有略微改進,因為它最初的性能已經很不錯了。訓練在50萬個步長上中止,相當于訓練了512M個樣本,對應大約1.8個epochs。所有MLM任務和NLM任務的性能名額在整個訓練過程中得到穩步改進。但是,使用這些任務的損失/度量标準來評估停止訓練的正确時間難度相對來說比較大。
圖19:CT-BERT領域專業領域資料集預訓練評估名額。顯示的是屏蔽語言模型(MLM)和下一個句子預測(NSP)任務的損失和準确度
實驗表明,在預訓練完成20萬步步長之後,下遊性能開始快速提高。另一方面,在預訓練完成20萬步步長之後,損失曲線也會逐漸增加。對于與COVID-19相關的資料集,在預訓練完成20萬步步長之後,下遊性能有了明顯的改進。SST-2這個唯一的非推特資料集,其性能改進則要慢得多,在預訓練完成20萬步步長之後,性能才開始改善。
即便相同的模型在同一資料集上運作時,也會在一定程度上觀察到在性能上的差異。這個差異與資料集有關,但它在整個預訓練過程中并沒有明顯的增加,與運作BERT-LARGE中觀察到的差異大緻相同。在SE資料集上的訓練最為穩定,在SST-2資料集上的訓練最不穩定,大部分的差異在誤差允許的範圍之内。
8. 結論
雖然利用CT-BERT可以大幅度改善分類任務的性能,但是還沒有做将CT-BERT應用于其它自然語言處理任務上的實驗。此外,在寫本文的時候,也僅能通路一個與COVID-19相關的資料集。下一步,可以通過修改模型的超參數,比如修改學習率、訓練批次大小和優化器等手段,進一步提高模型的性能。未來的工作可能包括評估在其他資料集上的訓練結果。