作者:施晨、黄俊

导读

机器浏览了解是自然语言解决(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完全一致,可在不批改现有代码的根底上进行无缝过渡,这为开发者的代码迁徙带来了很大的便当。

具体来讲,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工作后,在机器浏览了解工作上的成果会显著降落,这也表明句子级预训练任务在篇章学习中的必要性。

机器浏览了解模型应用教程

以下咱们简要介绍,如何在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.tsvhttp://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.tsvhttp://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.cudafrom easynlp.appzoo import MachineReadingComprehensionDatasetfrom easynlp.appzoo import get_application_predictor, get_application_model, get_application_evaluator, get_application_model_for_evaluationfrom easynlp.core import Trainer, PredictorManagerfrom easynlp.utils import initialize_easynlp, get_args, get_pretrain_model_pathfrom easynlp.utils.global_vars import parse_user_defined_parametersinitialize_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-zh12-layer, 768-hidden, 12-heads, 102M parameters
hfl/macbert-large-zh24-layer, 1024-hidden, 16-heads, 324M parameters

咱们也应用这两种模型别离在中文机器浏览了解数据上进行了 finetune,成果如下:

中文EMF1
hfl/macbert-base-zh61.3578.62
hfl/macbert-large-zh59.1579.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,模型后果如下:

英文EMF1
bert-base-uncased76.6485.33
bert-large-uncased79.5987.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

阿里灵杰回顾

  • 阿里灵杰:阿里云机器学习PAI开源中文NLP算法框架EasyNLP,助力NLP大模型落地
  • 阿里灵杰:预训练常识度量较量夺冠!阿里云PAI公布常识预训练工具
  • 阿里灵杰:EasyNLP带你玩转CLIP图文检索
  • 阿里灵杰:EasyNLP中文文图生成模型带你秒变艺术家
  • 阿里灵杰:EasyNLP集成K-BERT算法,借助常识图谱实现更优Finetune
  • 阿里灵杰:EasyNLP玩转文本摘要(新闻标题)生成