【NLP】用BERT进行机器阅读理解
作者 | Edward Qian
編譯 | VK
來源 | Towards Data Science
這里可以找到帶有代碼的Github存儲庫:https://github.com/edwardcqian/bert_QA。本文將討論如何設置此項功能.
機器(閱讀)理解是NLP的領域,我們使用非結構化文本教機器理解和回答問題。
https://www.coursera.org/specializations/deep-learning?ranMID=40328&ranEAID=J2RDoRlzkk&ranSiteID=J2RDo.Rlzkk-XtffRH2JEnDifWa3VrZJ1A&siteID=J2RDo.Rlzkk-XtffRH2JEnDifWa3VrZJ1A&utm_content=2&utm_medium=partners&utm_source=linkshare&utm_campaign=J2RDoRlzkk
2016年,斯坦福德NLP將由超過100000對問答對組成的SQuAD (斯坦福問答數據集)集合在一起,這些數據集由維基百科文章編制。挑戰是訓練一個機器學習模型,以基于上下文文檔回答問題。
當提供上下文(自由文本)和問題時,模型將返回最有可能回答問題的文本子集。
世界上頂尖的人工智能從業人員解決了這個問題,但兩年后,沒有一個模型能超越人類的標準。然而,2018年底,谷歌大腦引入了通用語言理解模型BERT(Transforms的雙向編碼器表示)。經過一些微調,與小組測試集相比,該模型能夠超越人類的基準。
來自論文:https://arxiv.org/pdf/1606.05250.pdf,這些是用于評估的指標:
完全匹配。這個度量標準衡量的是精確匹配任何一個真實答案的百分比。
(宏平均)F1得分。這個度量了預測和真實答案之間的平均重疊。我們把預測和真實標簽當作token列表,并計算它們的F1。我們對給定問題的所有真實答案取最大F1,然后對所有問題取平均值。
基于初始的團隊數據集:
人類注釋者的精確匹配得分為82.304%,F1得分91.221%
原BERT模型獲得85.083%的精確匹配分數,F1得分91.835%
今天,我將向你演示如何使用BERT建立自己的閱讀理解系統。這里可以找到帶有代碼的Github存儲庫。
https://github.com/edwardcqian/bert_QA
先設置Docker。????
設置Docker
Docker對于容器化應用程序很有用。我們將使用Docker使這項工作更為有用,結果更可重復。按照以下說明在系統上安裝Docker。
你還需要docker compose,它是在macos和windows上與docker一起提供的。如果你使用Linux,可以在此處安裝它:https://runnable.com/docker/introduction-to-docker-compose
從Github倉庫保存代碼
除了訓練過的數據和預訓練的權重之外,所有代碼和必要的依賴項都在repo中。注意:只有當你想自己訓練模型時,才需要數據。如果沒有,你可以使用我預訓練過的權重。另一個注意:除非你有一個強大的GPU或大量的時間,否則我不建議訓練這個模型。
如果你想親自訓練模型…
在這里下載Team2.0數據集:https://rajpurkar.github.io/SQuAD-explorer/。將“Training Set v2.0”和“Dev Set v2.0”保存到bert_uqa/data。
如果你想使用預訓練的權重…
我已經針對SQuAD 2.0訓練了模型。你可以在這里下載。解壓縮文件并保存內容asbert_uqa/weights。
創建Docker容器
Docker容器是使用Docker映像中提供的指令構建的工作環境。我們需要一個docker-compose.yaml配置文件來定義容器的外觀。
我為huggingface的Pytorch Transformer制作了一個定制的docker鏡像,你可以在dockerhub上找到。為了本教程的目的,你不需要像配置文件那樣拉取任何鏡像。配置文件還將本地bert_QA文件夾作為容器中的/workspace。
通過在terminal/shell根目錄中運行docker compose up-d來啟動容器。第一次將需要幾分鐘。
檢查我們的包含是否已啟動,并使用Docker ps運行。
將bash shell附加到正在運行的容器:
訓練模型
如果你使用我的預訓練的權重,請跳過此步驟。我們將使用huggingface提供的默認訓練腳本來訓練模型。
在bash shell中運行此命令:
python?run_squad.py?\--model_type?bert?\--model_name_or_path?bert-base-uncased?\--do_train?\--do_eval?\--do_lower_case?\--train_file?data/train-v2.0.json?\--predict_file?data/dev-v2.0.json?\--per_gpu_train_batch_size?12?\--learning_rate?3e-5?\--num_train_epochs?2.0?\--max_seq_length?384?\--doc_stride?128?\--output_dir?weights/注意:如果沒有GPU,則per_gpu_train_batch_size將不會做任何操作
這將訓練模型權重并將其保存到權重目錄。
用模型進行推斷
現在讓我們用這個模型來做一些酷的事情。
在shell中啟動ipython會話,并導入ModelInference模塊以從weights/加載權重。將上下文文檔作為參數傳遞給mi.add_target_text()。
攝入語料庫后,使用mi.evaluate()提問。只有當模型確信答案存在于文本中時,模塊才會返回答案。否則,模型將輸出“找不到有效答案”。
from?model_inference?import?ModelInferencemi?=?ModelInference('weights/')mi.add_target_text(('The?Normans?(Norman:?Nourmands;?French:?Normands;?Latin:?Normanni)?''were?the?people?who?in?the?10th?and?11th?centuries?gave?their?name?to?''Normandy,?a?region?in?France.?They?were?descended?from?Norse?''(\"Norman\"?comes?from?\"Norseman\")?raiders?and?pirates?from?Denmark,?''Iceland?and?Norway?who,?under?their?leader?Rollo,?''agreed?to?swear?fealty?to?King?Charles?III?of?West?Francia.?''Through?generations?of?assimilation?and?mixing?with?the?native?''Frankish?and?Roman-Gaulish?populations,?their?descendants?would?gradually?''merge?with?the?Carolingian-based?cultures?of?West?Francia.?''The?distinct?cultural?and?ethnic?identity?of?the?Normans?emerged?initially?''in?the?first?half?of?the?10th?century,?''and?it?continued?to?evolve?over?the?succeeding?centuries.' ))mi.evaluate('Where?is?Normandy') #?francemi.evaluate('What?are?Normans?called?in?latin?') #?normannimi.evaluate('When?was?normandy?named?') #?in?the?10th?and?11th?centuriesmi.evaluate('What?kind?of?songs?did?the?Normans?sing?') #?No?valid?answers?found.mi.evaluate('What?is?you?quest?') #?No?valid?answers?found.結論
NLP在過去幾年里已經走了很長的路。預訓練的BERT權值對NLP的影響與AlexNet對圖像識別的影響相似。它為自然語言理解提供了許多新的應用。
往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載機器學習的數學基礎專輯溫州大學《機器學習課程》視頻 本站qq群851320808,加入微信群請掃碼:總結
以上是生活随笔為你收集整理的【NLP】用BERT进行机器阅读理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GNN大有可为,从这篇开始学以致用
- 下一篇: 谷歌浏览器地址栏记录怎么删除 Chrom