導讀:飛槳(PaddlePaddle)致力於讓深度學習技術的創新與應用更簡單。在重要的機器閱讀領域,基於DuReader數據集,飛槳升級並開源了一個經典的閱讀理解模型 —— BiDAF,相較於DuReader原始論文中的基線,在效果上有了大幅提升,驗證集上的ROUGE-L指標由原來的39.29提升至47.68,測試集上的ROUGE-L指標由原來的45.90提升至54.66。
1. 機器閱讀理解概述
閱讀理解,相信中國學生都不陌生,不管是語文考試還是英語考試,閱讀理解都是非常常規的考試內容。一般形式就是給出一篇文章,然後針對這些文章提出一些問題,問題的類型包括選擇題、填空題或者分析題,學生通過回答這些問題來證明自己理解了文章所要傳達的主旨內容。
而機器閱讀理解,就是指機器自主來完成以上過程。教會機器學會閱讀理解是自然語言處理(NLP)中的核心任務之一,也是機器真正智能化的體現。
在機器閱讀理解任務中,我們會給定一個問題(Q)以及一個或多個段落(P)/文檔(D),然後利用機器在給定的段落中尋找正確答案(A),即Q + P or D => A。
下圖是機器閱讀理解的一個示例:
作為自然語言處理領域的前沿課題,機器閱讀理解近年來一直受到學術界和工業界的廣泛關注。
從學術角度看,機器閱讀理解任務可以用來衡量機器理解人類語言的綜合水平。NLP的很多傳統任務,例如詞性標註、命名實體識別、句法分析、語義角色標註、指代消解等都試圖讓機器從詞法、語義等角度理解人類語言。機器在某一個任務上的效果,僅在一定程度上反應了機器在該方面對語言的理解水平。而在閱讀理解任務中,機器需要在詞法、語義等多方面有較高的理解水平,才能夠正確回答相關問題。因此可以通過讓機器閱讀文本回答相關問題,來評價機器理解人類語言的綜合水平。這與人類參加的語言考試中用閱讀理解題目考察答題者對語言和內容的理解水平是類似的。
從應用角度看,機器閱讀理解也是構建問答系統和對話系統的關鍵技術之一。近些年來,各種智能設備,如智慧型手機、智能音響等迅速普及。這些設備具有小屏化或無屏化的特點,因此用戶亟需能夠精準滿足其信息需求的問答技術。傳統的檢索式問答技術,主要關注段落排序,仍難以完成精準問答的「最後一公裡」,即段落中的精準答案定位。而近兩年機器閱讀理解技術所取得的進展,為精準答案定位提供了有力的技術支持。在百度的搜索問答和小度音箱中,都使用到了機器閱讀理解技術,為數億用戶提供了精準問答。
2. BiDAF模型原理介紹
BiDAF是一個經典的機器閱讀理解模型,包含多階段的層次化過程,通過使用雙向注意流機制,在不進行早期總結的情況下,仍可以在不同的粒度級別上,獲得一個查詢感知的上下文表示。
原始論文名稱:Bidirectional AttentionFlow for Machine Comprehension
BiDAF模型的結構圖如下:
BiDAF模型是一個分階段的多層過程,主要由6層網絡組成。
(1)字符嵌入層:
用字符級CNNs將每個字映射到向量空間。
(2)字嵌入層:
利用預訓練的詞嵌入模型,將每個字映射到向量空間。
(3)上下文嵌入層:
利用周圍單詞的上下文線索來細化單詞的嵌入。這前三層同時應用於問句和原文。
(4)注意力流層:
將問句向量和原文向量進行耦合,並為原文中每個詞生成一個問句相關的特徵向量集合。
(5)建模層:
使用RNN以掃描整個原文。
(6)輸出層:
輸出問句對應的回答。
飛槳此次開源的BiDAF模型,是基於DuReader閱讀理解數據集來訓練的。
數據集地址:
https://ai.baidu.com/broad/subordinate?dataset=dureader
DuReader是一個大規模、面向真實應用、由人類生成的中文閱讀理解數據集。DuReader聚焦於真實世界中的不限定領域的問答任務。相較於其他閱讀理解數據集,DuReader的優勢包括:
問題來自於真實的搜索日誌文章內容來自於真實網頁答案由人類生成面向真實應用場景標註更加豐富細緻更多關於DuReader數據集的詳細信息可在DuReader官網找到。
飛槳團隊在實現並升級BiDAF的過程中,去掉了char級別的embedding,在預測層中使用了pointer network,並且參考了R-NET中的一些網絡結構,從而達到了比原始論文中更好的模型效果。
在DuReader2.0驗證集、測試集的表現如下:
3. 飛槳BiDAF快速上手
3.1.基礎環境
(1)安裝飛槳
關於飛槳框架的安裝教程,可以參考飛槳官方網站。
官網地址:https://www.paddlepaddle.org.cn
(2)安裝代碼
克隆工具集代碼庫到本地
git clone https://github.com/PaddlePaddle/models.gitcd models/PaddleNLP/reading_comprehension/
cd models/PaddleNLP/reading_comprehension/
(3)下載第三方依賴
在本基線系統中,我們採用了Bleu以及Rouge-L指標作為模型的評估標準。這些指標的計算腳本可以通過運行以下命令進行下載
cd utils && bash download_thirdparty.sh
3.2.數據準備
為了方便開發者進行測試,我們提供了預處理(分詞、計算answer span等)過後的DuReader 2.0數據集、訓練好的模型參數以及詞表。通過運行以下命令即可下載:
cd data && bash download.sh
此外,用戶還可以利用paddlehub的方式下載模型參數,例如:
hub download dureader_machine_reading-bidaf
3.3.段落抽取
我們採用了一種新的段落抽取策略以提升模型在DuReader2.0數據集上的表現(策略內容詳見src/UPDATES.md)。該段落抽取策略可通過運行以下命令執行:
sh run.sh --para_extraction
請注意,在運行上面命令之前,需要先下載預處理之後的DuReader 2.0數據 (見」下載數據集以及模型「章節)。段落抽取得到的結果會存放在 data/extracted/文件夾中。
3.4.模型評估
通過運行以下命令,開發者可以利用上面提供的模型在DuReader 2.0驗證集進行評估:
sh run.sh --evaluate
--load_dir ../data/saved_model
--devset ../data/extracted/devset/zhidao.dev.json ../data/extracted/devset/search.dev.json
在評估結束後,程序會自動計算ROUGE-L指標並顯示最終結果。
3.5.模型預測
通過運行以下命令,開發者可以利用上面提供的模型在DuReader 2.0測試集進行預測:
sh run.sh --predict
--load_dir ../data/saved_model
--testset ../data/extracted/testset/zhidao.test.json ../data/extracted/testset/search.test.json
模型預測的答案將被保存在data/results文件夾中。
3.6.訓練自己的模型
如果開發者希望重新訓練模型參數,可以參考本章節步驟。
在模型訓練開始之前,需要先運行以下命令來生成詞表以及創建一些必要的文件夾,用於存放模型參數等:
sh run.sh --prepare
--trainset ../data/extracted/trainset/zhidao.train.json ../data/extracted/trainset/search.train.json
--devset ../data/extracted/devset/zhidao.dev.json ../data/extracted/devset/search.dev.json
--testset ../data/extracted/testset/zhidao.test.json ../data/extracted/testset/search.test.json
建立好的詞表會存放在data/vocab文件夾中。
然後運行下面的命令,即可開始訓練:
sh run.sh --train
--pass_num 5
--trainset ../data/extracted/trainset/zhidao.train.json ../data/extracted/trainset/search.train.json --devset ../data/extracted/devset/zhidao.dev.json ../data/extracted/devset/search.dev.json
以上參數配置會對模型進行5輪訓練,並在每輪結束後利用驗證集自動進行評估。每輪過後,程序會自動將模型參數保存到data/models文件夾當中,並以該輪的ID命名。
如果開發者需要改變模型訓練時的超參數,例如初始學習率、隱層維度等,可以通過指定以下參數來實現:
sh run.sh --train
--pass_num 5
--learning_rate 0.00001
--hidden_size 100
--trainset ../data/extracted/trainset/zhidao.train.json ../data/extracted/trainset/search.train.json
--devset ../data/extracted/devset/zhidao.dev.json ../data/extracted/devset/search.dev.json
更多參數配置可在paddle/args.py中找到。
3.7.提交測試集結果
當開發者通過調參、修改模型結構得到更好的結果後,可以將DuReader 2.0測試集的預測結果提交到DuReader 官網來進行評測。在提交結果之前,請確保以下幾點:
訓練已經全部結束;通過訓練日誌在data/models文件夾中選擇在驗證集表現最佳的模型;通過上面章節描述的方法在測試集上進行預測,並得到完整結果。
趕快自己動手嘗試下吧!
想與更多的深度學習開發者交流,請加入飛槳官方QQ群:432676488。
如果您想詳細了解更多飛槳的相關內容,請參閱以下文檔。
官網地址:https://www.paddlepaddle.org.cn
項目地址:
https://github.com/PaddlePaddle/models/tree/v1.5.1/PaddleNLP/reading_comprehension