EasyNLP帶你實現中英文機器閱讀理解

語言: CN / TW / HK

highlight: arta theme: channing-cyan


我報名參加金石計劃1期挑戰——瓜分10萬獎池,這是我的第9篇文章,點選檢視活動詳情

作者:施晨、黃俊

導讀

機器閱讀理解是自然語言處理(NLP),特別是自然語言理解(NLU)領域最重要的研究方向之一。自1977年首次被提出以來,機器閱讀理解已有近50年的發展史,歷經“人工規則”、“傳統機器學習”、“深度學習”、“大規模預訓練模型”等多個發展階段。機器閱讀理解旨在幫助人類從大量文字中,快速聚焦相關資訊,降低人工資訊獲取成本,增加資訊檢索有效性。作為人工智慧在自然語言理解方向上的“集大成者”,機器閱讀理解任務考察了從 “詞” 到 “句” 乃至 “篇章”,每一個語言粒度的理解能力,這使得在人工智慧發展的每個階段,它都是非常困難、也頗為重要的“兵家必爭之地”。以SQuAD為代表的閱讀理解資料集,見證了深度學習大發展時代裡,各大公司刷榜創新方案的你方唱罷我登場,隨後又在大規模預訓練時代,成為BERT等預訓練模型的評測基準。可以說近十年裡,機器閱讀理解極大促進與見證了自然語言處理領域的繁榮與發展。

形式化來講,機器閱讀理解任務的輸入為一段篇章文字(context),與一個問句(question),通過學習模型,輸出預測的答案文字(answer)。根據獲取答案方式的不同,當前業界主流將閱讀理解任務分為四大類:完型填空式(Cloze tests)、多項選擇式(Multi-choice)、片段抽取式(Span extraction)及自由生成式(Free answering)。其中片段抽取式根據問句(question),直接從篇章文字(context)中預測答案文字(answer)的起止位置(start/end positions),從而抽取出答案。由於其與真實場景接近,難度適中,易於評測,且有SQuAD等高質量資料集支撐,因此成為當前的主流閱讀理解任務。隨著預訓練語言模型的發展,近年來片段抽取式閱讀理解的效果屢創新高。在英文場景下,傳統的BERT、RoBERTa、ALBERT等模型都能取得超越人類的效果;而在中文場景下,MacBERT等模型(Pre-Training with Whole Word Masking for Chinese BERT)通過引入一種糾錯型掩碼語言模型(Mac)預訓練任務,緩解了“預訓練-下游任務”不一致的問題,也更好地適配了中文場景,在包括機器閱讀理解在內的多種NLP任務上取得了顯著的效能提升。因此,我們在EasyNLP框架中集成了MacBERT演算法和模型,配合EasyNLP中原有的BERT、RoBERTa等模型,使使用者能夠方便地使用這些模型進行中英文機器閱讀理解任務的訓練和預測。

EasyNLP(https://github.com/alibaba/EasyNLP)是阿⾥雲機器學習PAI 團隊基於 PyTorch 開發的易⽤且豐富的中⽂NLP演算法框架,⽀持常⽤的中⽂預訓練模型和⼤模型落地技術,並且提供了從訓練到部署的⼀站式 NLP 開發體驗。EasyNLP 提供了簡潔的接⼝供⽤戶開發 NLP 模型,包括NLP應⽤ AppZoo 和預訓練 ModelZoo,同時提供技術幫助⽤戶⾼效的落地超⼤預訓練模型到業務。機器閱讀理解作為自然語言理解的集大成者,同時也是文字問答、資訊抽取等領域的基礎任務,具有較高的研究價值。因此,EasyNLP增加了對中英文機器閱讀理解任務的支援,希望能服務更多的NLP/NLU演算法開發者和研究者,也希望和社群一起推動NLU相關技術的發展和落地。

本⽂將提供對MacBERT模型的技術解讀,以及如何在EasyNLP框架中使⽤MacBERT及其他預訓練語言模型,進行中英文機器閱讀理解任務的訓練與預測。

MacBERT模型解讀

主流的大規模預訓練語言模型(如BERT、RoBERTa等)主要針對英語語言設計,將其直接遷移到中文場景時,會面臨中英文語言本身的差異,如:中文詞間無空格、無需切分子詞、多個單字組成具有完整意義的詞語等。例如下圖中原始語句“使用語言模型來預測下一個詞的概率”,按單字切分後,某些單字由於會組成完整的詞語(如:語言模型、預測、概率),此時若只mask掉其中一個字,會影響掩碼與語言模型預訓練的效果。此外,傳統語言模型在預訓練時會採用 [MASK] 字元進行mask,而在下游任務文字中卻並不存在 [MASK] 標記,這在兩階段中天然引入了gap。為緩解上述問題,MacBERT等模型修改傳統MLM任務,引入了一種糾錯型掩碼語言模型(Mac)預訓練任務,包括wwm (whole word masking)、NM(n-gram masking)、相似詞替換等mask方案,更好地適配了中文的語言場景,減少了“預訓練-下游任務”不一致的問題,提升了預訓練模型在多種NLP任務上的效果。另外,由於MacBERT的主要框架與BERT完全一致,可在不修改現有程式碼的基礎上進行無縫過渡,這為開發者的程式碼遷移帶來了很大的便利。

image.png

具體來講,MacBERT等模型在MLM時,對中文整詞中所有單字同時進行mask,並採用n-gram mask策略,從unigram到4-gram對應的mask概率分別為40%-10%。在mask時不再採用 [MASK] token,而改為使用詞語的近義詞,近義詞采用基於word2vec相似度計算的Synonyms toolkit獲取,在極少數情況沒有近義詞時,使用隨機詞進行替換。模型總體對輸入15%的詞進行mask,mask時80%的概率替換為近義詞、10%的概率替換為隨機詞、10%的概率保留為原始詞。此外,BERT原版的NSP模型長期為研究者們所詬病,MacBERT模型中將NSP修改為SOP (Sentence Order Prediction),其正例為連續文字,負例為交換原始文字順序,這樣很好提升了模型在多句篇章型任務上的效果。模型的實驗結果表明,去除上述MLM中任一改進都會導致平均效能下降,這表明幾處掩碼修改都有助於語言模型學習;同時去除SOP任務後,在機器閱讀理解任務上的效果會明顯下降,這也表明句子級預訓練任務在篇章學習中的必要性。

image.png

機器閱讀理解模型使用教程

以下我們簡要介紹,如何在EasyNLP框架中使用MacBERT及其他預訓練語言模型,進行機器閱讀理解任務的訓練及預測。

安裝EasyNLP

使用者可以直接參考GitHub(https://github.com/alibaba/EasyNLP)上的說明安裝EasyNLP演算法框架。

pipeline介面快速“嚐鮮”體驗效果

為了方便開發者使用,我們在EasyNLP框架內實現了Inference Pipeline功能。使用者可以在不需要自己訓練或微調模型的情況下,直接“嚐鮮”,使用pipeline介面一步呼叫finetune好的中英文機器閱讀理解模型。只需執行如下命令即可:

``` from easynlp.pipelines import pipeline

輸入資料

data = [{ "query": "杭州什麼時候釋出了《杭州市亞運城市行動計劃綱要》?", "answer_text": "2020年4月", "context": "新華社杭州9月22日電(記者商意盈 夏亮)競賽場館全部竣工並完成賽事功能驗收,“迎亞運”城市基礎設施建設邁入快車道,亞運場館提前開放掀起全民健身熱潮……23日,延期後的杭州亞運會將迎來倒計時一週年,各項籌備工作也結出累累碩果,“天堂之城”再次蓄勢待發。辦好一個會,提升一座城。2020年4月,杭州釋出了《杭州市亞運城市行動計劃綱要》,其中包括基礎設施提升、綠水青山守護、數字治理賦能等八項具體行動。隨著亞運的腳步日益臨近,杭州西站、蕭山國際機場三期、合杭高鐵湖杭段、機場軌道快線(19號線)等“兩點兩線”重大專案正式投運。根據杭州市城鄉建設委員會發布的資訊,預計到今年9月底全市快速路總里程將達到480公里。住在這裡的人們正切身體會到悄然發生的變化——交通方便了,道路變美了,城市基礎設施也愈發完善。", "qas_id": "CN_01" }, { "query": "今年9月底全市快速路總里程將達到多少?", "answer_text": "480公里", "context": "新華社杭州9月22日電(記者商意盈 夏亮)競賽場館全部竣工並完成賽事功能驗收,“迎亞運”城市基礎設施建設邁入快車道,亞運場館提前開放掀起全民健身熱潮……23日,延期後的杭州亞運會將迎來倒計時一週年,各項籌備工作也結出累累碩果,“天堂之城”再次蓄勢待發。辦好一個會,提升一座城。2020年4月,杭州釋出了《杭州市亞運城市行動計劃綱要》,其中包括基礎設施提升、綠水青山守護、數字治理賦能等八項具體行動。隨著亞運的腳步日益臨近,杭州西站、蕭山國際機場三期、合杭高鐵湖杭段、機場軌道快線(19號線)等“兩點兩線”重大專案正式投運。根據杭州市城鄉建設委員會發布的資訊,預計到今年9月底全市快速路總里程將達到480公里。住在這裡的人們正切身體會到悄然發生的變化——交通方便了,道路變美了,城市基礎設施也愈發完善。", "qas_id": "CN_02" }]

pipeline的引數為finetune好的模型

當前EasyNLP支援中英文機器閱讀理解的pipeline快速體驗,分別集成了finetune好的中文macbert模型和英文bert模型

如想體驗英文閱讀理解,只需將模型名改為 'bert-base-rcen' 即可

generator = pipeline('macbert-base-rczh')

results = generator(data)

for input_dict, result in zip(data, results): context = result["context"] query = result["query"] answer_gold = result["gold_answer"] answer_pred = result["best_answer"] print('\n context: {} \n query: {} \n gold_answer: {} \n pred_answer: {} \n'.format(context, query, answer_gold, answer_pred)) ```

如程式碼中所示,輸入的data為一個list,其中每條instance為一個dict,包含其query、answer、context、id資訊。pipeline的引數為finetune好的模型,當前EasyNLP支援中英文機器閱讀理解的pipeline快速體驗,分別集成了finetune好的中文macbert模型和英文bert模型,中文機器閱讀理解的模型為 'macbert-base-rczh' ,如想體驗英文閱讀理解,只需將上述程式碼pipeline引數中的模型名改為 'bert-base-rcen' 即可。

以上程式碼的執行結果如下所示,可以看出,機器準確地理解了文字與問句的含義,並給出了正確的結果。

``` context: 新華社杭州9月22日電(記者商意盈夏亮)競賽場館全部竣工並完成賽事功能驗收,“迎亞運”城市基礎設施建設邁入快車道,亞運場館提前開放掀起全民健身熱潮……23日,延期後的杭州亞運會將迎來倒計時一週年,各項籌備工作也結出累累碩果,“天堂之城”再次蓄勢待發。辦好一個會,提升一座城。2020年4月,杭州釋出了《杭州市亞運城市行動計劃綱要》,其中包括基礎設施提升、綠水青山守護、數字治理賦能等八項具體行動。隨著亞運的腳步日益臨近,杭州西站、蕭山國際機場三期、合杭高鐵湖杭段、機場軌道快線(19號線)等“兩點兩線”重大專案正式投運。根據杭州市城鄉建設委員會發布的資訊,預計到今年9月底全市快速路總里程將達到480公里。住在這裡的人們正切身體會到悄然發生的變化——交通方便了,道路變美了,城市基礎設施也愈發完善。 query: 杭州什麼時候釋出了《杭州市亞運城市行動計劃綱要》? gold_answer: 2020年4月 pred_answer: 2020年4月

context: 新華社杭州9月22日電(記者商意盈夏亮)競賽場館全部竣工並完成賽事功能驗收,“迎亞運”城市基礎設施建設邁入快車道,亞運場館提前開放掀起全民健身熱潮……23日,延期後的杭州亞運會將迎來倒計時一週年,各項籌備工作也結出累累碩果,“天堂之城”再次蓄勢待發。辦好一個會,提升一座城。2020年4月,杭州釋出了《杭州市亞運城市行動計劃綱要》,其中包括基礎設施提升、綠水青山守護、數字治理賦能等八項具體行動。隨著亞運的腳步日益臨近,杭州西站、蕭山國際機場三期、合杭高鐵湖杭段、機場軌道快線(19號線)等“兩點兩線”重大專案正式投運。根據杭州市城鄉建設委員會發布的資訊,預計到今年9月底全市快速路總里程將達到480公里。住在這裡的人們正切身體會到悄然發生的變化——交通方便了,道路變美了,城市基礎設施也愈發完善。 query: 今年9月底全市快速路總里程將達到多少? gold_answer: 480公里 pred_answer: 480公里 ```

下面,我們將詳細介紹中英文機器閱讀理解模型的詳細實現過程,從資料準備,到模型的訓練、評估、預測,並給出基於EasyNLP的幾種方便快捷的一步執行方法。

資料準備

採用預訓練好的語言模型,進行機器閱讀理解任務的finetune時,需要使用者提供任務相關的訓練與驗證資料,均為tsv格式檔案。檔案中每行包含以製表符\t分隔的多列,包含閱讀理解訓練所需的所有資訊,從左至右依次為:樣例ID、篇章文字(context)、問句(question)、答案文字(answer)、答案文字在篇章文字中的起始位置、篇章題目。樣例如下:

DEV_125_QUERY_3 乙二醛是一個有機化合物,化學式為OCHCHO,由兩個醛基-C相連。它是最簡單的二醛,室溫下為黃色液體。工業上,乙二醛可由乙二醇在銀或銅催化下的氣相氧化,或用硝酸溶液氧化乙醛製得。實驗室中,乙二醛是通過用亞硒酸氧化乙醛製取。無水乙二醛可由固態水合物與五氧化二磷共熱製得。乙二醛的應用有:of通常乙二醛以40%溶液的形式出售。它與其他小分子醛類似,可以形成水合物,而且水合物縮合生成一系列的“寡聚體”,結構尚不清楚。目前出售的至少有以下兩種水合物:根據估計,乙二醛水溶液濃度低於1M時,它主要以單體或水合物的形式存在,即OCHCHO、OCHCH(OH)或(HO)CHCH(OH)。濃度大於1M時,主要為二聚體型,可能為縮醛/酮結構,分子式為[(HO)CH]OCHCHO。 工業上乙二醛是怎麼製得的? 由乙二醇在銀或銅催化下的氣相氧化,或用硝酸溶液氧化乙醛製得。 59 乙二醛

下列檔案為已經完成預處理的中英文機器閱讀理解的訓練和驗證資料,可用於模型訓練與測試:

```

中文機器閱讀理解資料

http://atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com/release/tutorials/machine_reading_comprehension/train_cmrc2018.tsv http://atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com/release/tutorials/machine_reading_comprehension/dev_cmrc2018.tsv

英文機器閱讀理解資料

http://atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com/release/tutorials/machine_reading_comprehension/train_squad.tsv http://atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com/release/tutorials/machine_reading_comprehension/dev_squad.tsv ```

中文機器閱讀理解

在Python 3.6環境下,我們首先從剛剛安裝好的EasyNLP中引入模型執行需要的各種庫,並做初始化。我們只需指定 pretrain_model_name_or_path=hfl/macbert-base-zh,即可使用整合好的MacBERT模型。EasyNLP中集成了豐富的預訓練模型庫,如果想嘗試其他預訓練模型,如BERT、RoBERTa等,也可以在user_defined_parameters中進行相應修改,具體的模型名稱可見模型列表。EasyNLP當前同時支援中英文的閱讀理解,只需要在user_defined_parameters中指定language=zh,即可指定中文文字預處理的相應配置。

``` import torch.cuda from easynlp.appzoo import MachineReadingComprehensionDataset from easynlp.appzoo import get_application_predictor, get_application_model, get_application_evaluator, get_application_model_for_evaluation from easynlp.core import Trainer, PredictorManager from easynlp.utils import initialize_easynlp, get_args, get_pretrain_model_path from easynlp.utils.global_vars import parse_user_defined_parameters

initialize_easynlp() args = get_args() user_defined_parameters = parse_user_defined_parameters('pretrain_model_name_or_path=bert-base-uncased language=en qas_id=qas_id answer_name=answer_text start_position_name=start_position_character max_query_length=64 max_answer_length=30 doc_stride=128 n_best_size=10 output_answer_file=dev.ans.csv') ```

載入資料時,可以使用EasyNLP內建的MachineReadingComprehensionDataset。需要注意的是,由於描述文字可能過長,從而可能導致答案片段在超出max_seq_length後被截斷的部分中。因此機器閱讀理解中通常採用“滑窗法”,當描述文字過長時,使用滑動視窗將完整的描述文字拆成幾段,將一個輸入case拆成多個case分別處理。使用user_defined_parameters中的doc_stride引數即可控制滑動視窗大小。

train_dataset = MachineReadingComprehensionDataset(pretrained_model_name_or_path=get_pretrain_model_path("bert-base-uncased"), data_file="train_squad.tsv", sequence_length=384, input_schema="qas_id:str:1,context_text:str:1,question_text:str:1,answer_text:str:1,start_position_character:str:1,title:str:1", first_sequence="question_text", second_sequence="context_text", user_defined_parameters=user_defined_parameters, is_training=True )

模型訓練時,使用EasyNLP中封裝好的get_application_model函式,並指定app_name="machine_reading_comprehension",便可進行訓練時的模型構建。由於滑動視窗機制的存在,訓練時batch_size設定不宜過大,否則容易引起OOM。

model = get_application_model(app_name="machine_reading_comprehension", pretrained_model_name_or_path=get_pretrain_model_path("bert-base-uncased"), user_defined_parameters=user_defined_parameters )

模型評估與預測時,我們同樣可以使用EasyNLP中封裝好的get_application_model_for_evaluation和get_application_predictor函式,並分別指定app_name="machine_reading_comprehension",即可進行模型的評估與預測。

evaluator = get_application_evaluator(app_name="machine_reading_comprehension", valid_dataset=valid_dataset, eval_batch_size=32, user_defined_parameters=user_defined_parameters )

模型預測時,結果將輸出至指定檔案中,檔案格式schema可以定製,一般分為\t分隔的4列,依次為:樣例ID、答案文字、問句、篇章文字。除了輸出的最佳答案之外,模型還會將beam_search後排在top_n的答案結果,也輸出到指定檔案中,供模型優化時分析比對。通過user_defined_parameters中的n_best_size引數,即可定製top_n值。

``` predictor = get_application_predictor(app_name="machine_reading_comprehension", model_dir="./squad_model_dir/", first_sequence="question_text", second_sequence="context_text", sequence_length=384, output_file="dev.pred.csv", user_defined_parameters=user_defined_parameters )

predictor_manager = PredictorManager(predictor=predictor, input_file="dev_squad.tsv", input_schema="qas_id:str:1,context_text:str:1,question_text:str:1,answer_text:str:1,start_position_character:str:1,title:str:1", output_file="dev.pred.csv", output_schema="unique_id,best_answer,query,context", append_cols=args.append_cols, batch_size=1024 ) ```

當前EasyNLP已經對MacBERT-base/large兩種模型進行了整合,在modelzoo中的模型呼叫名稱分別為:hfl/macbert-base-zh 和 hfl/macbert-large-zh,兩種模型的結構引數如下表所示。使用者可直接在pretrain_model_name_or_path引數中指定名稱進行呼叫。

| 中文 | 結構引數 | | -------------------- | ------------------------------------------------ | | hfl/macbert-base-zh | 12-layer, 768-hidden, 12-heads, 102M parameters | | hfl/macbert-large-zh | 24-layer, 1024-hidden, 16-heads, 324M parameters |

我們也使用這兩種模型分別在中文機器閱讀理解資料上進行了 finetune,效果如下:

| 中文 | EM | F1 | | -------------------- | ----- | ----- | | hfl/macbert-base-zh | 61.35 | 78.62 | | hfl/macbert-large-zh | 59.15 | 79.33 |

上述所有訓練/評估/預測程式碼,都已經被整合在EasyNLP/examples/appzoo_tutorials/machine_reading_comprehension/main.py 中。使用者可以通過帶引數執行main.py,一步執行上述所有訓練/評估/預測操作。

```

模型訓練

python main.py \ --mode train \ --app_name=machine_reading_comprehension \ --worker_gpu=1 \ --tables=train.tsv,dev.tsv \ --input_schema=qas_id:str:1,context_text:str:1,question_text:str:1,answer_text:str:1,start_position_character:str:1,title:str:1 \ --first_sequence=question_text \ --second_sequence=context_text \ --sequence_length=384 \ --checkpoint_dir=./model_dir \ --learning_rate=3.5e-5 \ --epoch_num=3 \ --random_seed=42 \ --save_checkpoint_steps=500 \ --train_batch_size=16 \ --user_defined_parameters=' pretrain_model_name_or_path=hfl/macbert-base-zh language=zh answer_name=answer_text qas_id=qas_id start_position_name=start_position_character doc_stride=128 max_query_length=64 ' ```

```

模型預測

python main.py \ --mode predict \ --app_name=machine_reading_comprehension \ --worker_gpu=1 \ --tables=dev.tsv \ --outputs=dev.pred.csv \ --input_schema=qas_id:str:1,context_text:str:1,question_text:str:1,answer_text:str:1,start_position_character:str:1,title:str:1 \ --output_schema=unique_id,best_answer,query,context \ --first_sequence=question_text \ --second_sequence=context_text \ --sequence_length=384 \ --checkpoint_dir=./model_dir \ --micro_batch_size=256 \ --user_defined_parameters=' pretrain_model_name_or_path=hfl/macbert-base-zh language=zh qas_id=qas_id answer_name=answer_text start_position_name=start_position_character max_query_length=64 max_answer_length=30 doc_stride=128 n_best_size=10 output_answer_file=dev.ans.csv ' ```

除了main.py一步執行之外,我們同樣可以使用命令列執行的方式進行快速訓練/預測,命令如下:

```

模型訓練

easynlp \ --mode train \ --app_name=machine_reading_comprehension \ --worker_gpu=1 \ --tables=train.tsv,dev.tsv \ --input_schema=qas_id:str:1,context_text:str:1,question_text:str:1,answer_text:str:1,start_position_character:str:1,title:str:1 \ --first_sequence=question_text \ --second_sequence=context_text \ --sequence_length=384 \ --checkpoint_dir=./model_dir \ --learning_rate=3.5e-5 \ --epoch_num=5 \ --random_seed=42 \ --save_checkpoint_steps=600 \ --train_batch_size=16 \ --user_defined_parameters=' pretrain_model_name_or_path=hfl/macbert-base-zh language=zh answer_name=answer_text qas_id=qas_id start_position_name=start_position_character doc_stride=128 max_query_length=64 ' ```

```

模型預測

easynlp \ --mode predict \ --app_name=machine_reading_comprehension \ --worker_gpu=1 \ --tables=dev.tsv \ --outputs=dev.pred.csv \ --input_schema=qas_id:str:1,context_text:str:1,question_text:str:1,answer_text:str:1,start_position_character:str:1,title:str:1 \ --output_schema=unique_id,best_answer,query,context \ --first_sequence=question_text \ --second_sequence=context_text \ --sequence_length=384 \ --checkpoint_dir=./model_dir \ --micro_batch_size=256 \ --user_defined_parameters=' pretrain_model_name_or_path=hfl/macbert-base-zh language=zh qas_id=qas_id answer_name=answer_text start_position_name=start_position_character max_query_length=64 max_answer_length=30 doc_stride=128 n_best_size=10 output_answer_file=dev.ans.csv ' ```

此外,我們還在EasyNLP/examples/appzoo_tutorials/machine_reading_comprehension/資料夾下封裝好了多種可直接執行的bash指令碼,使用者同樣可以通過使用bash檔案命令列執行的方式來一步完成模型的訓練/評估/預測。bash檔案需要傳入兩個引數,第一個引數為執行程式的GPU編號,一般為0;第二個引數代表模型的訓練/評估/預測。

```

訓練

! bash run_train_eval_predict_user_defined_local_zh.sh 0 train

預測

! bash run_train_eval_predict_user_defined_local_zh.sh 0 predict ```

模型訓練好之後,我們可以對任意中文文字進行閱讀理解,只要將文字轉成符合上述模型輸入的格式,新增相應的問題,便可使用模型進行預測並得到答案。以下為新華社最新關於“杭州亞運會倒計時一週年”的新聞稿件,我們以這一稿件作為篇章文字,人工添加了兩個問題:“杭州什麼時候釋出了《杭州市亞運城市行動計劃綱要》?” & “今年9月底全市快速路總里程將達到多少?”,通過模型預測,便可得到正確的結果:“2020年4月” & “480公里”。

CN_01 2020年4月 杭州什麼時候釋出了《杭州市亞運城市行動計劃綱要》? 新華社杭州9月22日電(記者商意盈夏亮)競賽場館全部竣工並完成賽事功能驗收,“迎亞運”城市基礎設施建設邁入快車道,亞運場館提前開放掀起全民健身熱潮……23日,延期後的杭州亞運會將迎來倒計時一週年,各項籌備工作也結出累累碩果,“天堂之城”再次蓄勢待發。辦好一個會,提升一座城。2020年4月,杭州釋出了《杭州市亞運城市行動計劃綱要》,其中包括基礎設施提升、綠水青山守護、數字治理賦能等八項具體行動。隨著亞運的腳步日益臨近,杭州西站、蕭山國際機場三期、合杭高鐵湖杭段、機場軌道快線(19號線)等“兩點兩線”重大專案正式投運。根據杭州市城鄉建設委員會發布的資訊,預計到今年9月底全市快速路總里程將達到480公里。住在這裡的人們正切身體會到悄然發生的變化——交通方便了,道路變美了,城市基礎設施也愈發完善。 CN_02 480公里 今年9月底全市快速路總里程將達到多少? 新華社杭州9月22日電(記者商意盈夏亮)競賽場館全部竣工並完成賽事功能驗收,“迎亞運”城市基礎設施建設邁入快車道,亞運場館提前開放掀起全民健身熱潮……23日,延期後的杭州亞運會將迎來倒計時一週年,各項籌備工作也結出累累碩果,“天堂之城”再次蓄勢待發。辦好一個會,提升一座城。2020年4月,杭州釋出了《杭州市亞運城市行動計劃綱要》,其中包括基礎設施提升、綠水青山守護、數字治理賦能等八項具體行動。隨著亞運的腳步日益臨近,杭州西站、蕭山國際機場三期、合杭高鐵湖杭段、機場軌道快線(19號線)等“兩點兩線”重大專案正式投運。根據杭州市城鄉建設委員會發布的資訊,預計到今年9月底全市快速路總里程將達到480公里。住在這裡的人們正切身體會到悄然發生的變化——交通方便了,道路變美了,城市基礎設施也愈發完善。

英文機器閱讀理解

EasyNLP同樣支援英文機器閱讀理解,只需要在user_defined_parameters中指定language=en,即可指定英文文字預處理的相應配置。之後便可選擇EasyNLP中已整合好的英文預訓練語言模型,如 bert-base-uncased、bert-large-uncased 等,進行機器閱讀理解的訓練與預測。EasyNLP中集成了豐富的預訓練模型庫,如果想嘗試其他預訓練模型,如RoBERTa、ALBERT等,也可以在user_defined_parameters中進行相應修改,具體的模型名稱可見模型列表

模型的資料載入、訓練、評估、預測部分程式碼呼叫方式與上述中文機器閱讀理解中完全一致,EasyNLP已將中英文差異性處理的程式碼整合在各部分函式中,使用者只需簡單指定引數language=en/zh,即可自如切換中英文相應配置。

我們對 bert-base-uncased 和 bert-large-uncased 兩個模型分別在英文機器閱讀理解資料上進行了 finetune,模型結果如下:

| 英文 | EM | F1 | | ------------------ | ----- | ----- | | bert-base-uncased | 76.64 | 85.33 | | bert-large-uncased | 79.59 | 87.68 |

與中文機器閱讀理解一樣,使用者可以通過帶引數執行main.py(指定language=en和相應的pretrain_model_name_or_path),一步執行所有訓練/評估/預測操作。

```

模型訓練

python main.py \ --mode train \ --app_name=machine_reading_comprehension \ --worker_gpu=1 \ --tables=train.tsv,dev.tsv \ --input_schema=qas_id:str:1,context_text:str:1,question_text:str:1,answer_text:str:1,start_position_character:str:1,title:str:1 \ --first_sequence=question_text \ --second_sequence=context_text \ --sequence_length=384 \ --checkpoint_dir=./model_dir \ --learning_rate=3.5e-5 \ --epoch_num=3 \ --random_seed=42 \ --save_checkpoint_steps=500 \ --train_batch_size=16 \ --user_defined_parameters=' pretrain_model_name_or_path=bert-base-uncased language=en answer_name=answer_text qas_id=qas_id start_position_name=start_position_character doc_stride=128 max_query_length=64 ' ```

```

模型預測

python main.py \ --mode predict \ --app_name=machine_reading_comprehension \ --worker_gpu=1 \ --tables=dev.tsv \ --outputs=dev.pred.csv \ --input_schema=qas_id:str:1,context_text:str:1,question_text:str:1,answer_text:str:1,start_position_character:str:1,title:str:1 \ --output_schema=unique_id,best_answer,query,context \ --first_sequence=question_text \ --second_sequence=context_text \ --sequence_length=384 \ --checkpoint_dir=./model_dir \ --micro_batch_size=256 \ --user_defined_parameters=' pretrain_model_name_or_path=bert-base-uncased language=en qas_id=qas_id answer_name=answer_text start_position_name=start_position_character max_query_length=64 max_answer_length=30 doc_stride=128 n_best_size=10 output_answer_file=dev.ans.csv ' ```

除了main.py一步執行之外,我們同樣可以使用命令列執行的方式進行快速訓練/預測,命令如下:

```

模型訓練

easynlp \ --mode train \ --app_name=machine_reading_comprehension \ --worker_gpu=1 \ --tables=train.tsv,dev.tsv \ --input_schema=qas_id:str:1,context_text:str:1,question_text:str:1,answer_text:str:1,start_position_character:str:1,title:str:1 \ --first_sequence=question_text \ --second_sequence=context_text \ --sequence_length=384 \ --checkpoint_dir=./model_dir \ --learning_rate=3.5e-5 \ --epoch_num=5 \ --random_seed=42 \ --save_checkpoint_steps=600 \ --train_batch_size=16 \ --user_defined_parameters=' pretrain_model_name_or_path=bert-base-uncased language=en answer_name=answer_text qas_id=qas_id start_position_name=start_position_character doc_stride=128 max_query_length=64 ' ```

```

模型預測

easynlp \ --mode predict \ --app_name=machine_reading_comprehension \ --worker_gpu=1 \ --tables=dev.tsv \ --outputs=dev.pred.csv \ --input_schema=qas_id:str:1,context_text:str:1,question_text:str:1,answer_text:str:1,start_position_character:str:1,title:str:1 \ --output_schema=unique_id,best_answer,query,context \ --first_sequence=question_text \ --second_sequence=context_text \ --sequence_length=384 \ --checkpoint_dir=./model_dir \ --micro_batch_size=256 \ --user_defined_parameters=' pretrain_model_name_or_path=bert-base-uncased language=en qas_id=qas_id answer_name=answer_text start_position_name=start_position_character max_query_length=64 max_answer_length=30 doc_stride=128 n_best_size=10 output_answer_file=dev.ans.csv ' ```

此外,我們還在EasyNLP/examples/appzoo_tutorials/machine_reading_comprehension/資料夾下封裝好了多種可直接執行的bash指令碼,使用者同樣可以通過使用bash檔案命令列執行的方式來一步完成模型的訓練/評估/預測。bash檔案需要傳入兩個引數,第一個引數為執行程式的GPU編號,一般為0;第二個引數代表模型的訓練/評估/預測。

```

模型訓練

! bash run_train_eval_predict_user_defined_local_en.sh 0 train

模型預測

! bash run_train_eval_predict_user_defined_local_en.sh 0 predict ```

模型訓練好之後,我們可以對任意英文文字進行閱讀理解,只要將文字轉成符合上述模型輸入的格式,新增相應的問題,便可使用模型進行預測並得到答案。我們選取近日費德勒退役後,納達爾為他發表的Twitter作為篇章文字,人工新增兩個問題:"Where will the Laver Cup take place?" & "Who is he's wife?",通過模型預測,便可得到正確的結果:"London" & "Mirka"。

EN_01 London Where will the Laver Cup take place? I wish this day had never come. It is a sad day for me personally and for people all over the world who love sports. I told you when we talked and here it is. It has been a pleasure, but also an honor and a privilege to share all these years with you, having so many wonderful moments together, on and off the court. We will still have many moments to share to share together in the future, but there are still many things to do together, we know. For now, I would sincerely wish you the best with your wife Mirka, your children, your family and enjoy for what the future will give you. We will see you in London for the Laver Cup. EN_02 Mirka, Who is he's wife? I wish this day had never come. It is a sad day for me personally and for people all over the world who love sports. I told you when we talked and here it is. It has been a pleasure, but also an honor and a privilege to share all these years with you, having so many wonderful moments together, on and off the court. We will still have many moments to share to share together in the future, but there are still many things to do together, we know. For now, I would sincerely wish you the best with your wife Mirka, your children, your family and enjoy for what the future will give you. We will see you in London for the Laver Cup.

未來展望

在未來,我們計劃在EasyNLP框架中進一步完善NLU相關能力,並在此基礎上更進一步,開發白盒化可拆解可遷移複用的多輪智慧對話系統,敬請期待。我們也將在EasyNLP框架中整合更多SOTA模型(特別是中⽂模型),來⽀持各種NLP和多模態任務。此外,阿⾥雲機器學習PAI團隊也在持續推進中文閱讀理解、對話系統及中⽂多模態模型的⾃研⼯作,歡迎⽤戶持續關注我們,也歡迎加⼊我們的開源社群,共建中⽂NLP和多模態演算法庫!

Github地址:https://github.com/alibaba/EasyNLP

參考文獻

  1. Chengyu Wang, et al. EasyNLP: A Comprehensive and Easy-to-use Toolkit for Natural Language Processing. arXiv preprint
  2. Danqi Chen. Neural Reading Comprehension and Beyond. Stanford dissertation.
  3. Shanshan Liu. Neural Machine Reading Comprehension: Methods and Trends. arXiv preprint
  4. Rajpurkar, et al. "SQuAD: 100,000+ Questions for Machine Comprehension of Text." EMNLP 2016
  5. Devlin, Jacob, et al. "BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding." NAACL 2019
  6. Yiming Cui, et al. "A Span-Extraction Dataset for Chinese Machine Reading Comprehension" EMNLP 2019
  7. Yiming Cui, et al. "Pre-Training with Whole Word Masking for Chinese BERT." TASLP 2021

阿里靈傑回顧