乐趣区

关于深度学习:EasyNLP带你实现中英文机器阅读理解

作者:施晨、黄俊

导读

机器浏览了解是自然语言解决(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.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

阿里灵杰回顾

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