直接使用
请打开基于EasyNLP的MacBERT中文机器阅读理解,并点击右上角 “ 在DSW中打开” 。
基于EasyNLP的MacBERT中文机器阅读理解
EasyNLP是阿里云PAI算法团队基于PyTorch开发的易用且丰富的NLP算法框架( https://github.com/alibaba/EasyNLP ),支持常用的中文预训练模型和大模型落地技术,并且提供了从训练到部署的一站式NLP开发体验。EasyNLP提供多种模型的训练及预测功能,旨在帮助自然语言开发者方便快捷地构建模型并应用于生产。
本文以机器阅读理解任务为例,为您介绍如何在PAI-DSW中基于EasyNLP快速使用MacBERT进行中文机器阅读理解模型的构建、训练、评估、预测。
关于MacBERT
MacBERT是2019年6月由哈工大-讯飞联合实验室(HFL)提出的一种基于BERT改进的预训练语言表征模型,其中Mac全称为MLM as correction。该模型修改了传统的MLM任务,引入了一种纠错型掩码语言模型(Mac)预训练任务,包括wwm (whole word masking)、NM(n-gram masking)、相似词替换等mask方案,更好地适配了中文的语言场景,减少了“预训练-下游任务”不一致的问题,提升了预训练模型在多种NLP任务上的效果。此外,BERT原版的NSP任务长期为研究者们所诟病,MacBERT模型中将NSP修改为SOP (Sentence Order Prediction),其正例为连续文本,负例为交换原始文本顺序,这样很好地提升了模型在多句篇章型任务上的效果。由于MacBERT的主要框架与BERT完全一致,可在不修改现有代码的基础上进行无缝过渡,这为开发者的代码迁移带来了很大的便利。
关于机器阅读理解
机器阅读理解(machine reading comprehension),指的是同时给模型输入一个问题(question)和一段描述(context),需要模型根据给定的描述给出答案(answer)。根据任务范式的不同,机器阅读理解任务通常可以分为4大类:完型填空式(Cloze tests)、多项选择式(Multi-choice)、片段抽取式(Span extraction)及自由生成式(Free answering)。其中片段抽取式根据问句(question),直接从篇章文本(context)中预测答案文本(answer)的起止位置(start/end positions),从而抽取出答案。由于其与真实场景接近,难度适中,易于评测,且有SQuAD等高质量数据集支撑,因此成为当前的主流阅读理解任务。
运行环境要求
建议用户使用:Python 3.6,Pytorch 1.8镜像,GPU机型 P100 or V100,内存至少为 32G
EasyNLP安装
建议从GitHub下载EasyNLP源代码进行安装,命令如下:
! git clone https://github.com/alibaba/EasyNLP.git ! pip install -r EasyNLP/requirements.txt ! cd EasyNLP && python setup.py install
您可以使用如下命令验证是否安装成功:
! which easynlp
/home/pai/bin/easynlp
如果您系统内已经安装完easynlp的CLI工具,则说明EasyNLP代码库已经安装。
数据准备
首先,您需要进入指定模型目录,下载用于本示例的训练和测试集,并创建保存模型的文件夹,命令如下:
! cd examples/appzoo_tutorials/machine_reading_comprehension ! wget http://atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com/release/tutorials/machine_reading_comprehension/train_cmrc2018.tsv ! wget http://atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com/release/tutorials/machine_reading_comprehension/dev_cmrc2018.tsv ! wget http://atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com/release/tutorials/machine_reading_comprehension/trial_cmrc2018.tsv
/bin/bash: line 0: cd: examples/appzoo_tutorials/machine_reading_comprehension: No such file or directory --2022-09-16 16:50:50-- http://atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com/release/tutorials/machine_reading_comprehension/train_cmrc2018.tsv Resolving atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com (atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com)... 47.101.88.27 Connecting to atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com (atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com)|47.101.88.27|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 15455780 (15M) [text/tab-separated-values] Saving to: ‘train_cmrc2018.tsv’ train_cmrc2018.tsv 100%[===================>] 14.74M 5.10MB/s in 2.9s 2022-09-16 16:50:53 (5.10 MB/s) - ‘train_cmrc2018.tsv’ saved [15455780/15455780] --2022-09-16 16:50:54-- http://atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com/release/tutorials/machine_reading_comprehension/dev_cmrc2018.tsv Resolving atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com (atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com)... 47.101.88.27 Connecting to atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com (atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com)|47.101.88.27|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 4898973 (4.7M) [text/tab-separated-values] Saving to: ‘dev_cmrc2018.tsv’ dev_cmrc2018.tsv 100%[===================>] 4.67M 17.6MB/s in 0.3s 2022-09-16 16:50:54 (17.6 MB/s) - ‘dev_cmrc2018.tsv’ saved [4898973/4898973] --2022-09-16 16:50:54-- http://atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com/release/tutorials/machine_reading_comprehension/trial_cmrc2018.tsv Resolving atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com (atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com)... 47.101.88.27 Connecting to atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com (atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com)|47.101.88.27|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 1602934 (1.5M) [text/tab-separated-values] Saving to: ‘trial_cmrc2018.tsv’ trial_cmrc2018.tsv 100%[===================>] 1.53M 6.87MB/s in 0.2s 2022-09-16 16:50:55 (6.87 MB/s) - ‘trial_cmrc2018.tsv’ saved [1602934/1602934]
训练和测试数据都是以\t隔开的.tsv文件,数据下载完成后,可以通过以下代码查看前5条数据。每行为一个数据,每列为一个字段值,包括需要进行文本匹配的两个句子,以及对应的匹配结果标签。
print('Training data sample:') ! head -n 5 train_cmrc2018.tsv print('Development set data sample:') ! head -n 5 dev_cmrc2018.tsv
Training data sample: TRAIN_186_QUERY_0 范廷颂枢机(,),圣名保禄·若瑟(),是越南罗马天主教枢机。1963年被任为主教;1990年被擢升为天主教河内总教区宗座署理;1994年被擢升为总主教,同年年底被擢升为枢机;2009年2月离世。范廷颂于1919年6月15日在越南宁平省天主教发艳教区出生;童年时接受良好教育后,被一位越南神父带到河内继续其学业。范廷颂于1940年在河内大修道院完成神学学业。范廷颂于1949年6月6日在河内的主教座堂晋铎;及后被派到圣女小德兰孤儿院服务。1950年代,范廷颂在河内堂区创建移民接待中心以收容到河内避战的难民。1954年,法越战争结束,越南民主共和国建都河内,当时很多天主教神职人员逃至越南的南方,但范廷颂仍然留在河内。翌年管理圣若望小修院;惟在1960年因捍卫修院的自由、自治及拒绝政府在修院设政治课的要求而被捕。1963年4月5日,教宗任命范廷颂为天主教北宁教区主教,同年8月15日就任;其牧铭为「我信天主的爱」。由于范廷颂被越南政府软禁差不多30年,因此他无法到所属堂区进行牧灵工作而专注研读等工作。范廷颂除了面对战争、贫困、被当局迫害天主教会等问题外,也秘密恢复修院、创建女修会团体等。1990年,教宗若望保禄二世在同年6月18日擢升范廷颂为天主教河内总教区宗座署理以填补该教区总主教的空缺。1994年3月23日,范廷颂被教宗若望保禄二世擢升为天主教河内总教区总主教并兼天主教谅山教区宗座署理;同年11月26日,若望保禄二世擢升范廷颂为枢机。范廷颂在1995年至2001年期间出任天主教越南主教团主席。2003年4月26日,教宗若望保禄二世任命天主教谅山教区兼天主教高平教区吴光杰主教为天主教河内总教区署理主教;及至2005年2月19日,范廷颂因获批辞去总主教职务而荣休;吴光杰同日真除天主教河内总教区总主教职务。范廷颂于2009年2月22日清晨在河内离世,享年89岁;其葬礼于同月26日上午在天主教河内总教区总主教座堂举行。 范廷颂是什么时候被任为主教的? 1963年 30 范廷颂 TRAIN_186_QUERY_1 范廷颂枢机(,),圣名保禄·若瑟(),是越南罗马天主教枢机。1963年被任为主教;1990年被擢升为天主教河内总教区宗座署理;1994年被擢升为总主教,同年年底被擢升为枢机;2009年2月离世。范廷颂于1919年6月15日在越南宁平省天主教发艳教区出生;童年时接受良好教育后,被一位越南神父带到河内继续其学业。范廷颂于1940年在河内大修道院完成神学学业。范廷颂于1949年6月6日在河内的主教座堂晋铎;及后被派到圣女小德兰孤儿院服务。1950年代,范廷颂在河内堂区创建移民接待中心以收容到河内避战的难民。1954年,法越战争结束,越南民主共和国建都河内,当时很多天主教神职人员逃至越南的南方,但范廷颂仍然留在河内。翌年管理圣若望小修院;惟在1960年因捍卫修院的自由、自治及拒绝政府在修院设政治课的要求而被捕。1963年4月5日,教宗任命范廷颂为天主教北宁教区主教,同年8月15日就任;其牧铭为「我信天主的爱」。由于范廷颂被越南政府软禁差不多30年,因此他无法到所属堂区进行牧灵工作而专注研读等工作。范廷颂除了面对战争、贫困、被当局迫害天主教会等问题外,也秘密恢复修院、创建女修会团体等。1990年,教宗若望保禄二世在同年6月18日擢升范廷颂为天主教河内总教区宗座署理以填补该教区总主教的空缺。1994年3月23日,范廷颂被教宗若望保禄二世擢升为天主教河内总教区总主教并兼天主教谅山教区宗座署理;同年11月26日,若望保禄二世擢升范廷颂为枢机。范廷颂在1995年至2001年期间出任天主教越南主教团主席。2003年4月26日,教宗若望保禄二世任命天主教谅山教区兼天主教高平教区吴光杰主教为天主教河内总教区署理主教;及至2005年2月19日,范廷颂因获批辞去总主教职务而荣休;吴光杰同日真除天主教河内总教区总主教职务。范廷颂于2009年2月22日清晨在河内离世,享年89岁;其葬礼于同月26日上午在天主教河内总教区总主教座堂举行。 1990年,范廷颂担任什么职务? 1990年被擢升为天主教河内总教区宗座署理 41 范廷颂 TRAIN_186_QUERY_2 范廷颂枢机(,),圣名保禄·若瑟(),是越南罗马天主教枢机。1963年被任为主教;1990年被擢升为天主教河内总教区宗座署理;1994年被擢升为总主教,同年年底被擢升为枢机;2009年2月离世。范廷颂于1919年6月15日在越南宁平省天主教发艳教区出生;童年时接受良好教育后,被一位越南神父带到河内继续其学业。范廷颂于1940年在河内大修道院完成神学学业。范廷颂于1949年6月6日在河内的主教座堂晋铎;及后被派到圣女小德兰孤儿院服务。1950年代,范廷颂在河内堂区创建移民接待中心以收容到河内避战的难民。1954年,法越战争结束,越南民主共和国建都河内,当时很多天主教神职人员逃至越南的南方,但范廷颂仍然留在河内。翌年管理圣若望小修院;惟在1960年因捍卫修院的自由、自治及拒绝政府在修院设政治课的要求而被捕。1963年4月5日,教宗任命范廷颂为天主教北宁教区主教,同年8月15日就任;其牧铭为「我信天主的爱」。由于范廷颂被越南政府软禁差不多30年,因此他无法到所属堂区进行牧灵工作而专注研读等工作。范廷颂除了面对战争、贫困、被当局迫害天主教会等问题外,也秘密恢复修院、创建女修会团体等。1990年,教宗若望保禄二世在同年6月18日擢升范廷颂为天主教河内总教区宗座署理以填补该教区总主教的空缺。1994年3月23日,范廷颂被教宗若望保禄二世擢升为天主教河内总教区总主教并兼天主教谅山教区宗座署理;同年11月26日,若望保禄二世擢升范廷颂为枢机。范廷颂在1995年至2001年期间出任天主教越南主教团主席。2003年4月26日,教宗若望保禄二世任命天主教谅山教区兼天主教高平教区吴光杰主教为天主教河内总教区署理主教;及至2005年2月19日,范廷颂因获批辞去总主教职务而荣休;吴光杰同日真除天主教河内总教区总主教职务。范廷颂于2009年2月22日清晨在河内离世,享年89岁;其葬礼于同月26日上午在天主教河内总教区总主教座堂举行。 范廷颂是于何时何地出生的? 范廷颂于1919年6月15日在越南宁平省天主教发艳教区出生 97 范廷颂 TRAIN_186_QUERY_3 范廷颂枢机(,),圣名保禄·若瑟(),是越南罗马天主教枢机。1963年被任为主教;1990年被擢升为天主教河内总教区宗座署理;1994年被擢升为总主教,同年年底被擢升为枢机;2009年2月离世。范廷颂于1919年6月15日在越南宁平省天主教发艳教区出生;童年时接受良好教育后,被一位越南神父带到河内继续其学业。范廷颂于1940年在河内大修道院完成神学学业。范廷颂于1949年6月6日在河内的主教座堂晋铎;及后被派到圣女小德兰孤儿院服务。1950年代,范廷颂在河内堂区创建移民接待中心以收容到河内避战的难民。1954年,法越战争结束,越南民主共和国建都河内,当时很多天主教神职人员逃至越南的南方,但范廷颂仍然留在河内。翌年管理圣若望小修院;惟在1960年因捍卫修院的自由、自治及拒绝政府在修院设政治课的要求而被捕。1963年4月5日,教宗任命范廷颂为天主教北宁教区主教,同年8月15日就任;其牧铭为「我信天主的爱」。由于范廷颂被越南政府软禁差不多30年,因此他无法到所属堂区进行牧灵工作而专注研读等工作。范廷颂除了面对战争、贫困、被当局迫害天主教会等问题外,也秘密恢复修院、创建女修会团体等。1990年,教宗若望保禄二世在同年6月18日擢升范廷颂为天主教河内总教区宗座署理以填补该教区总主教的空缺。1994年3月23日,范廷颂被教宗若望保禄二世擢升为天主教河内总教区总主教并兼天主教谅山教区宗座署理;同年11月26日,若望保禄二世擢升范廷颂为枢机。范廷颂在1995年至2001年期间出任天主教越南主教团主席。2003年4月26日,教宗若望保禄二世任命天主教谅山教区兼天主教高平教区吴光杰主教为天主教河内总教区署理主教;及至2005年2月19日,范廷颂因获批辞去总主教职务而荣休;吴光杰同日真除天主教河内总教区总主教职务。范廷颂于2009年2月22日清晨在河内离世,享年89岁;其葬礼于同月26日上午在天主教河内总教区总主教座堂举行。 1994年3月,范廷颂担任什么职务? 1994年3月23日,范廷颂被教宗若望保禄二世擢升为天主教河内总教区总主教并兼天主教谅山教区宗座署理 548 范廷颂 TRAIN_186_QUERY_4 范廷颂枢机(,),圣名保禄·若瑟(),是越南罗马天主教枢机。1963年被任为主教;1990年被擢升为天主教河内总教区宗座署理;1994年被擢升为总主教,同年年底被擢升为枢机;2009年2月离世。范廷颂于1919年6月15日在越南宁平省天主教发艳教区出生;童年时接受良好教育后,被一位越南神父带到河内继续其学业。范廷颂于1940年在河内大修道院完成神学学业。范廷颂于1949年6月6日在河内的主教座堂晋铎;及后被派到圣女小德兰孤儿院服务。1950年代,范廷颂在河内堂区创建移民接待中心以收容到河内避战的难民。1954年,法越战争结束,越南民主共和国建都河内,当时很多天主教神职人员逃至越南的南方,但范廷颂仍然留在河内。翌年管理圣若望小修院;惟在1960年因捍卫修院的自由、自治及拒绝政府在修院设政治课的要求而被捕。1963年4月5日,教宗任命范廷颂为天主教北宁教区主教,同年8月15日就任;其牧铭为「我信天主的爱」。由于范廷颂被越南政府软禁差不多30年,因此他无法到所属堂区进行牧灵工作而专注研读等工作。范廷颂除了面对战争、贫困、被当局迫害天主教会等问题外,也秘密恢复修院、创建女修会团体等。1990年,教宗若望保禄二世在同年6月18日擢升范廷颂为天主教河内总教区宗座署理以填补该教区总主教的空缺。1994年3月23日,范廷颂被教宗若望保禄二世擢升为天主教河内总教区总主教并兼天主教谅山教区宗座署理;同年11月26日,若望保禄二世擢升范廷颂为枢机。范廷颂在1995年至2001年期间出任天主教越南主教团主席。2003年4月26日,教宗若望保禄二世任命天主教谅山教区兼天主教高平教区吴光杰主教为天主教河内总教区署理主教;及至2005年2月19日,范廷颂因获批辞去总主教职务而荣休;吴光杰同日真除天主教河内总教区总主教职务。范廷颂于2009年2月22日清晨在河内离世,享年89岁;其葬礼于同月26日上午在天主教河内总教区总主教座堂举行。 范廷颂是何时去世的? 范廷颂于2009年2月22日清晨在河内离世 759 范廷颂 Development set data sample: DEV_0_QUERY_0 《战国无双3》()是由光荣和ω-force开发的战国无双系列的正统第三续作。本作以三大故事为主轴,分别是以武田信玄等人为主的《关东三国志》,织田信长等人为主的《战国三杰》,石田三成等人为主的《关原的年轻武者》,丰富游戏内的剧情。此部份专门介绍角色,欲知武器情报、奥义字或擅长攻击类型等,请至战国无双系列1.由于乡里大辅先生因故去世,不得不寻找其他声优接手。从猛将传 and Z开始。2.战国无双 编年史的原创男女主角亦有专属声优。此模式是任天堂游戏谜之村雨城改编的新增模式。本作中共有20张战场地图(不含村雨城),后来发行的猛将传再新增3张战场地图。但游戏内战役数量繁多,部分地图会有兼用的状况,战役虚实则是以光荣发行的2本「战国无双3 人物真书」内容为主,以下是相关介绍。(注:前方加☆者为猛将传新增关卡及地图。)合并本篇和猛将传的内容,村雨城模式剔除,战国史模式可直接游玩。主打两大模式「战史演武」&「争霸演武」。系列作品外传作品 《战国无双3》是由哪两个公司合作开发的? 光荣和ω-force 11 战国无双3 DEV_0_QUERY_1 《战国无双3》()是由光荣和ω-force开发的战国无双系列的正统第三续作。本作以三大故事为主轴,分别是以武田信玄等人为主的《关东三国志》,织田信长等人为主的《战国三杰》,石田三成等人为主的《关原的年轻武者》,丰富游戏内的剧情。此部份专门介绍角色,欲知武器情报、奥义字或擅长攻击类型等,请至战国无双系列1.由于乡里大辅先生因故去世,不得不寻找其他声优接手。从猛将传 and Z开始。2.战国无双 编年史的原创男女主角亦有专属声优。此模式是任天堂游戏谜之村雨城改编的新增模式。本作中共有20张战场地图(不含村雨城),后来发行的猛将传再新增3张战场地图。但游戏内战役数量繁多,部分地图会有兼用的状况,战役虚实则是以光荣发行的2本「战国无双3 人物真书」内容为主,以下是相关介绍。(注:前方加☆者为猛将传新增关卡及地图。)合并本篇和猛将传的内容,村雨城模式剔除,战国史模式可直接游玩。主打两大模式「战史演武」&「争霸演武」。系列作品外传作品 男女主角亦有专属声优这一模式是由谁改编的? 村雨城 226 战国无双3 DEV_0_QUERY_2 《战国无双3》()是由光荣和ω-force开发的战国无双系列的正统第三续作。本作以三大故事为主轴,分别是以武田信玄等人为主的《关东三国志》,织田信长等人为主的《战国三杰》,石田三成等人为主的《关原的年轻武者》,丰富游戏内的剧情。此部份专门介绍角色,欲知武器情报、奥义字或擅长攻击类型等,请至战国无双系列1.由于乡里大辅先生因故去世,不得不寻找其他声优接手。从猛将传 and Z开始。2.战国无双 编年史的原创男女主角亦有专属声优。此模式是任天堂游戏谜之村雨城改编的新增模式。本作中共有20张战场地图(不含村雨城),后来发行的猛将传再新增3张战场地图。但游戏内战役数量繁多,部分地图会有兼用的状况,战役虚实则是以光荣发行的2本「战国无双3 人物真书」内容为主,以下是相关介绍。(注:前方加☆者为猛将传新增关卡及地图。)合并本篇和猛将传的内容,村雨城模式剔除,战国史模式可直接游玩。主打两大模式「战史演武」&「争霸演武」。系列作品外传作品 战国史模式主打哪两个模式? 「战史演武」&「争霸演武」 395 战国无双3 DEV_1_QUERY_0 锣鼓经是大陆传统器乐及戏曲里面常用的打击乐记谱方法,以中文字的声音模拟敲击乐的声音,纪录打击乐的各种不同的演奏方法。常用的节奏型称为「锣鼓点」。而锣鼓是戏曲节奏的支柱,除了加强演员身段动作的节奏感,也作为音乐的引子和尾声,提示音乐的板式和速度,以及作为唱腔和念白的伴奏,令诗句的韵律更加抑扬顿锉,段落分明。锣鼓的运用有约定俗成的程式,依照角色行当的身份、性格、情绪以及环境,配合相应的锣鼓点。锣鼓亦可以模仿大自然的音响效果,如雷电、波浪等等。戏曲锣鼓所运用的敲击乐器主要分为鼓、锣、钹和板四类型:鼓类包括有单皮鼓(板鼓)、大鼓、大堂鼓(唐鼓)、小堂鼓、怀鼓、花盆鼓等;锣类有大锣、小锣(手锣)、钲锣、筛锣、马锣、镗锣、云锣;钹类有铙钹、大钹、小钹、水钹、齐钹、镲钹、铰子、碰钟等;打拍子用的檀板、木鱼、梆子等。因为京剧的锣鼓通常由四位乐师负责,又称为四大件,领奏的师傅称为:「鼓佬」,其职责有如西方乐队的指挥,负责控制速度以及利用各种手势提示乐师演奏不同的锣鼓点。粤剧吸收了部份京剧的锣鼓,但以木鱼和沙的代替了京剧的板和鼓,作为打拍子的主要乐器。以下是京剧、昆剧和粤剧锣鼓中乐器对应的口诀用字: 锣鼓经是什么? 大陆传统器乐及戏曲里面常用的打击乐记谱方法 4 锣鼓经 DEV_1_QUERY_1 锣鼓经是大陆传统器乐及戏曲里面常用的打击乐记谱方法,以中文字的声音模拟敲击乐的声音,纪录打击乐的各种不同的演奏方法。常用的节奏型称为「锣鼓点」。而锣鼓是戏曲节奏的支柱,除了加强演员身段动作的节奏感,也作为音乐的引子和尾声,提示音乐的板式和速度,以及作为唱腔和念白的伴奏,令诗句的韵律更加抑扬顿锉,段落分明。锣鼓的运用有约定俗成的程式,依照角色行当的身份、性格、情绪以及环境,配合相应的锣鼓点。锣鼓亦可以模仿大自然的音响效果,如雷电、波浪等等。戏曲锣鼓所运用的敲击乐器主要分为鼓、锣、钹和板四类型:鼓类包括有单皮鼓(板鼓)、大鼓、大堂鼓(唐鼓)、小堂鼓、怀鼓、花盆鼓等;锣类有大锣、小锣(手锣)、钲锣、筛锣、马锣、镗锣、云锣;钹类有铙钹、大钹、小钹、水钹、齐钹、镲钹、铰子、碰钟等;打拍子用的檀板、木鱼、梆子等。因为京剧的锣鼓通常由四位乐师负责,又称为四大件,领奏的师傅称为:「鼓佬」,其职责有如西方乐队的指挥,负责控制速度以及利用各种手势提示乐师演奏不同的锣鼓点。粤剧吸收了部份京剧的锣鼓,但以木鱼和沙的代替了京剧的板和鼓,作为打拍子的主要乐器。以下是京剧、昆剧和粤剧锣鼓中乐器对应的口诀用字: 锣鼓经常用的节奏型称为什么? 锣鼓点 67 锣鼓经
初始化
在Python 3.6环境下,我们首先从刚刚安装好的EasyNLP中引入模型运行需要的各种库,并做一些初始化。在本教程中,我们使用hfl/macbert-base-zh。EasyNLP中集成了丰富的预训练模型库,如果想尝试其他预训练模型,如BERT、albert等,也可以在user_defined_parameters中进行相应修改,具体的模型名称可见模型列表。EasyNLP当前同时支持中英文的阅读理解,这里只需要在user_defined_parameters中指定language=zh,即可指定中文文本处理相应配置。此外,机器阅读理解任务中有一些特殊的参数,如doc_stride等,也需要在user_defined_parameters中预先声明,这些参数的具体含义,我们将在下面的“载入数据”小节中详细阐述。
# 为了避免EasyNLP中的args与Jupyter系统的冲突,需要手动设置,否则无法进行初始化。 # 在命令行或py文件中运行文中代码则可忽略下述代码。 import sys sys.argv = ['main.py']
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=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_cmrc.ans.csv') args.checkpoint_dir = "./cmrc_model_dir/"
[2022-09-23 17:25:29,898.898 dsw40519-8f8689f47-8jh9s:72601 INFO utils.py:30] NOTICE: PAIDEBUGGER is turned off. Please ignore the following import error if you are using tunnel table io. No module named '_common_io'
No module named 'easy_predict' ------------------------ arguments ------------------------ app_name ........................................ text_classify append_cols ..................................... None buckets ......................................... None checkpoint_dir .................................. None chief_hosts ..................................... data_threads .................................... 10 distributed_backend ............................. nccl do_lower_case ................................... False epoch_num ....................................... 3.0 export_tf_checkpoint_type ....................... easytransfer first_sequence .................................. None gradient_accumulation_steps ..................... 1 input_schema .................................... None is_chief ........................................ is_master_node .................................. True job_name ........................................ None label_enumerate_values .......................... None label_name ...................................... None learning_rate ................................... 5e-05 local_rank ...................................... None logging_steps ................................... 100 master_port ..................................... 23456 max_grad_norm ................................... 1.0 micro_batch_size ................................ 2 mode ............................................ train modelzoo_base_dir ............................... n_cpu ........................................... 1 n_gpu ........................................... 1 odps_config ..................................... None optimizer_type .................................. AdamW output_schema ................................... outputs ......................................... None predict_queue_size .............................. 1024 predict_slice_size .............................. 4096 predict_table_read_thread_num ................... 16 predict_thread_num .............................. 2 ps_hosts ........................................ random_seed ..................................... 1234 rank ............................................ 0 read_odps ....................................... False restore_works_dir ............................... ./.easynlp_predict_restore_works_dir resume_from_checkpoint .......................... None save_all_checkpoints ............................ False save_checkpoint_steps ........................... None second_sequence ................................. None sequence_length ................................. 16 skip_first_line ................................. False tables .......................................... None task_count ...................................... 1 task_index ...................................... 0 use_amp ......................................... False use_torchacc .................................... False user_defined_parameters ......................... None user_entry_file ................................. None user_script ..................................... None warmup_proportion ............................... 0.1 weight_decay .................................... 0.0001 worker_count .................................... 1 worker_cpu ...................................... -1 worker_gpu ...................................... -1 worker_hosts .................................... None world_size ...................................... 1 -------------------- end of arguments --------------------- > initializing torch distributed ...
/home/pai/lib/python3.6/site-packages/OpenSSL/crypto.py:12: CryptographyDeprecationWarning: Python 3.6 is no longer supported by the Python core team. Therefore, support for it is deprecated in cryptography and will be removed in a future release. from cryptography import x509 [2022-09-23 17:25:32,253.253 dsw40519-8f8689f47-8jh9s:72601 INFO distributed_c10d.py:195] Added key: store_based_barrier_key:1 to store for rank: 0
Init dist done. World size: 1, rank 0, l_rank 0 > setting random seeds to 1234 ...
netstat -tunlp|grep 6000
kill -9 PID (需要替换成上一行代码执行结果中对应的程序ID)
载入数据
我们使用EasyNLP中自带的MachineReadingComprehensionDataset,对训练和测试数据进行载入。主要参数如下:
- pretrained_model_name_or_path:预训练模型名称路径,这里我们使用封装好的get_pretrain_model_path函数,来处理模型名称"hfl/macbert-base-zh"以得到其路径,并自动下载模型
- max_seq_length:总输入文本的最大长度,超过将截断,不足将padding
- input_schema:输入tsv数据的格式,逗号分隔的每一项对应数据文件中每行以\t分隔的一项,每项开头为其字段标识,如question_text、answer_text、context_text等
- first_sequence、second_sequence:用于说明input_schema中哪些字段用于作为问句、描述,input_schema中其他字段名(qas_id、answer_name、start_position_name)将在user_defined_parameters中进行声明
- user_defined_parameters:任务特定的预声明参数。在机器阅读理解任务中,需要声明如下几种:
- pretrain_model_name_or_path:同上
- language:指定语言,中文(zh),英文(en)。不同语种数据预处理及后处理方式存在差异,不声明的话默认采用中文处理方式。
- qas_id、answer_name、start_position_name:用于说明input_schema中,哪些字段用于作为输入id、答案、答案在描述文本中的起始位置
- max_query_length:输入文本中问句的最大长度,超过将截断,不足将padding
- max_answer_length:输入文本中答案的最大长度,超过将截断,不足将padding
- doc_stride:由于描述文本可能过长,可能导致答案片段在超出max_seq_length后被截断的部分中。因此机器阅读理解中通常采用“滑窗法”,当描述文本过长时,使用滑动窗口将完整的描述文本拆成几段,将一个输入case拆成多个case分别处理。doc_stride即为滑动窗口大小。
- output_answer_file:模型预测时,除了输出的最佳答案之外,模型会将beam_search后排在top_n的答案结果,都输出到output_answer_file中,供模型优化时分析比对。
- n_best_size:上述top_n,用来指定将beam_search后排在前多少名的答案输出至output_answer_file中。
- is_training:是否为训练过程,train_dataset为True,valid_dataset为False
train_dataset = MachineReadingComprehensionDataset(pretrained_model_name_or_path=get_pretrain_model_path("hfl/macbert-base-zh"), data_file="train_cmrc2018.tsv", max_seq_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 ) valid_dataset = MachineReadingComprehensionDataset(pretrained_model_name_or_path=get_pretrain_model_path("hfl/macbert-base-zh"), data_file="dev_cmrc2018.tsv", max_seq_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=False )
`/root/.easynlp/modelzoo/public/hfl/macbert-base-zh.tgz` already exists ****train_cmrc2018.tsv `/root/.easynlp/modelzoo/public/hfl/macbert-base-zh.tgz` already exists ****dev_cmrc2018.tsv
模型训练
处理好数据与模型载入后,我们开始训练模型。 我们使用EasyNLP中封装好的get_application_model函数进行训练时的模型构建,其参数如下:
- app_name:任务名称,这里选择机器阅读理解"machine_reading_comprehension"
- pretrained_model_name_or_path:预训练模型名称路径,这里我们使用封装好的get_pretrain_model_path函数,来处理模型名称"hfl/macbert-base-zh"以得到其路径,并自动下载模型
- user_defined_parameters:用户自定义参数,直接填入刚刚处理好的自定义参数user_defined_parameters
model = get_application_model(app_name="machine_reading_comprehension", pretrained_model_name_or_path=get_pretrain_model_path("hfl/macbert-base-zh"), user_defined_parameters=user_defined_parameters )
`/root/.easynlp/modelzoo/public/hfl/macbert-base-zh.tgz` already exists ============ from pretrained model ===============
Loaded weights of the model: [bert.embeddings.position_ids,bert.embeddings.word_embeddings.weight,bert.embeddings.position_embeddings.weight,bert.embeddings.token_type_embeddings.weight,bert.embeddings.LayerNorm.weight,bert.embeddings.LayerNorm.bias,bert.encoder.layer.0.attention.self.query.weight,bert.encoder.layer.0.attention.self.query.bias,bert.encoder.layer.0.attention.self.key.weight,bert.encoder.layer.0.attention.self.key.bias,bert.encoder.layer.0.attention.self.value.weight,bert.encoder.layer.0.attention.self.value.bias,bert.encoder.layer.0.attention.output.dense.weight,bert.encoder.layer.0.attention.output.dense.bias,bert.encoder.layer.0.attention.output.LayerNorm.weight,bert.encoder.layer.0.attention.output.LayerNorm.bias,bert.encoder.layer.0.intermediate.dense.weight,bert.encoder.layer.0.intermediate.dense.bias,bert.encoder.layer.0.output.dense.weight,bert.encoder.layer.0.output.dense.bias,bert.encoder.layer.0.output.LayerNorm.weight,bert.encoder.layer.0.output.LayerNorm.bias,bert.encoder.layer.1.attention.self.query.weight,bert.encoder.layer.1.attention.self.query.bias,bert.encoder.layer.1.attention.self.key.weight,bert.encoder.layer.1.attention.self.key.bias,bert.encoder.layer.1.attention.self.value.weight,bert.encoder.layer.1.attention.self.value.bias,bert.encoder.layer.1.attention.output.dense.weight,bert.encoder.layer.1.attention.output.dense.bias,bert.encoder.layer.1.attention.output.LayerNorm.weight,bert.encoder.layer.1.attention.output.LayerNorm.bias,bert.encoder.layer.1.intermediate.dense.weight,bert.encoder.layer.1.intermediate.dense.bias,bert.encoder.layer.1.output.dense.weight,bert.encoder.layer.1.output.dense.bias,bert.encoder.layer.1.output.LayerNorm.weight,bert.encoder.layer.1.output.LayerNorm.bias,bert.encoder.layer.2.attention.self.query.weight,bert.encoder.layer.2.attention.self.query.bias,bert.encoder.layer.2.attention.self.key.weight,bert.encoder.layer.2.attention.self.key.bias,bert.encoder.layer.2.attention.self.value.weight,bert.encoder.layer.2.attention.self.value.bias,bert.encoder.layer.2.attention.output.dense.weight,bert.encoder.layer.2.attention.output.dense.bias,bert.encoder.layer.2.attention.output.LayerNorm.weight,bert.encoder.layer.2.attention.output.LayerNorm.bias,bert.encoder.layer.2.intermediate.dense.weight,bert.encoder.layer.2.intermediate.dense.bias,bert.encoder.layer.2.output.dense.weight,bert.encoder.layer.2.output.dense.bias,bert.encoder.layer.2.output.LayerNorm.weight,bert.encoder.layer.2.output.LayerNorm.bias,bert.encoder.layer.3.attention.self.query.weight,bert.encoder.layer.3.attention.self.query.bias,bert.encoder.layer.3.attention.self.key.weight,bert.encoder.layer.3.attention.self.key.bias,bert.encoder.layer.3.attention.self.value.weight,bert.encoder.layer.3.attention.self.value.bias,bert.encoder.layer.3.attention.output.dense.weight,bert.encoder.layer.3.attention.output.dense.bias,bert.encoder.layer.3.attention.output.LayerNorm.weight,bert.encoder.layer.3.attention.output.LayerNorm.bias,bert.encoder.layer.3.intermediate.dense.weight,bert.encoder.layer.3.intermediate.dense.bias,bert.encoder.layer.3.output.dense.weight,bert.encoder.layer.3.output.dense.bias,bert.encoder.layer.3.output.LayerNorm.weight,bert.encoder.layer.3.output.LayerNorm.bias,bert.encoder.layer.4.attention.self.query.weight,bert.encoder.layer.4.attention.self.query.bias,bert.encoder.layer.4.attention.self.key.weight,bert.encoder.layer.4.attention.self.key.bias,bert.encoder.layer.4.attention.self.value.weight,bert.encoder.layer.4.attention.self.value.bias,bert.encoder.layer.4.attention.output.dense.weight,bert.encoder.layer.4.attention.output.dense.bias,bert.encoder.layer.4.attention.output.LayerNorm.weight,bert.encoder.layer.4.attention.output.LayerNorm.bias,bert.encoder.layer.4.intermediate.dense.weight,bert.encoder.layer.4.intermediate.dense.bias,bert.encoder.layer.4.output.dense.weight,bert.encoder.layer.4.output.dense.bias,bert.encoder.layer.4.output.LayerNorm.weight,bert.encoder.layer.4.output.LayerNorm.bias,bert.encoder.layer.5.attention.self.query.weight,bert.encoder.layer.5.attention.self.query.bias,bert.encoder.layer.5.attention.self.key.weight,bert.encoder.layer.5.attention.self.key.bias,bert.encoder.layer.5.attention.self.value.weight,bert.encoder.layer.5.attention.self.value.bias,bert.encoder.layer.5.attention.output.dense.weight,bert.encoder.layer.5.attention.output.dense.bias,bert.encoder.layer.5.attention.output.LayerNorm.weight,bert.encoder.layer.5.attention.output.LayerNorm.bias,bert.encoder.layer.5.intermediate.dense.weight,bert.encoder.layer.5.intermediate.dense.bias,bert.encoder.layer.5.output.dense.weight,bert.encoder.layer.5.output.dense.bias,bert.encoder.layer.5.output.LayerNorm.weight,bert.encoder.layer.5.output.LayerNorm.bias,bert.encoder.layer.6.attention.self.query.weight,bert.encoder.layer.6.attention.self.query.bias,bert.encoder.layer.6.attention.self.key.weight,bert.encoder.layer.6.attention.self.key.bias,bert.encoder.layer.6.attention.self.value.weight,bert.encoder.layer.6.attention.self.value.bias,bert.encoder.layer.6.attention.output.dense.weight,bert.encoder.layer.6.attention.output.dense.bias,bert.encoder.layer.6.attention.output.LayerNorm.weight,bert.encoder.layer.6.attention.output.LayerNorm.bias,bert.encoder.layer.6.intermediate.dense.weight,bert.encoder.layer.6.intermediate.dense.bias,bert.encoder.layer.6.output.dense.weight,bert.encoder.layer.6.output.dense.bias,bert.encoder.layer.6.output.LayerNorm.weight,bert.encoder.layer.6.output.LayerNorm.bias,bert.encoder.layer.7.attention.self.query.weight,bert.encoder.layer.7.attention.self.query.bias,bert.encoder.layer.7.attention.self.key.weight,bert.encoder.layer.7.attention.self.key.bias,bert.encoder.layer.7.attention.self.value.weight,bert.encoder.layer.7.attention.self.value.bias,bert.encoder.layer.7.attention.output.dense.weight,bert.encoder.layer.7.attention.output.dense.bias,bert.encoder.layer.7.attention.output.LayerNorm.weight,bert.encoder.layer.7.attention.output.LayerNorm.bias,bert.encoder.layer.7.intermediate.dense.weight,bert.encoder.layer.7.intermediate.dense.bias,bert.encoder.layer.7.output.dense.weight,bert.encoder.layer.7.output.dense.bias,bert.encoder.layer.7.output.LayerNorm.weight,bert.encoder.layer.7.output.LayerNorm.bias,bert.encoder.layer.8.attention.self.query.weight,bert.encoder.layer.8.attention.self.query.bias,bert.encoder.layer.8.attention.self.key.weight,bert.encoder.layer.8.attention.self.key.bias,bert.encoder.layer.8.attention.self.value.weight,bert.encoder.layer.8.attention.self.value.bias,bert.encoder.layer.8.attention.output.dense.weight,bert.encoder.layer.8.attention.output.dense.bias,bert.encoder.layer.8.attention.output.LayerNorm.weight,bert.encoder.layer.8.attention.output.LayerNorm.bias,bert.encoder.layer.8.intermediate.dense.weight,bert.encoder.layer.8.intermediate.dense.bias,bert.encoder.layer.8.output.dense.weight,bert.encoder.layer.8.output.dense.bias,bert.encoder.layer.8.output.LayerNorm.weight,bert.encoder.layer.8.output.LayerNorm.bias,bert.encoder.layer.9.attention.self.query.weight,bert.encoder.layer.9.attention.self.query.bias,bert.encoder.layer.9.attention.self.key.weight,bert.encoder.layer.9.attention.self.key.bias,bert.encoder.layer.9.attention.self.value.weight,bert.encoder.layer.9.attention.self.value.bias,bert.encoder.layer.9.attention.output.dense.weight,bert.encoder.layer.9.attention.output.dense.bias,bert.encoder.layer.9.attention.output.LayerNorm.weight,bert.encoder.layer.9.attention.output.LayerNorm.bias,bert.encoder.layer.9.intermediate.dense.weight,bert.encoder.layer.9.intermediate.dense.bias,bert.encoder.layer.9.output.dense.weight,bert.encoder.layer.9.output.dense.bias,bert.encoder.layer.9.output.LayerNorm.weight,bert.encoder.layer.9.output.LayerNorm.bias,bert.encoder.layer.10.attention.self.query.weight,bert.encoder.layer.10.attention.self.query.bias,bert.encoder.layer.10.attention.self.key.weight,bert.encoder.layer.10.attention.self.key.bias,bert.encoder.layer.10.attention.self.value.weight,bert.encoder.layer.10.attention.self.value.bias,bert.encoder.layer.10.attention.output.dense.weight,bert.encoder.layer.10.attention.output.dense.bias,bert.encoder.layer.10.attention.output.LayerNorm.weight,bert.encoder.layer.10.attention.output.LayerNorm.bias,bert.encoder.layer.10.intermediate.dense.weight,bert.encoder.layer.10.intermediate.dense.bias,bert.encoder.layer.10.output.dense.weight,bert.encoder.layer.10.output.dense.bias,bert.encoder.layer.10.output.LayerNorm.weight,bert.encoder.layer.10.output.LayerNorm.bias,bert.encoder.layer.11.attention.self.query.weight,bert.encoder.layer.11.attention.self.query.bias,bert.encoder.layer.11.attention.self.key.weight,bert.encoder.layer.11.attention.self.key.bias,bert.encoder.layer.11.attention.self.value.weight,bert.encoder.layer.11.attention.self.value.bias,bert.encoder.layer.11.attention.output.dense.weight,bert.encoder.layer.11.attention.output.dense.bias,bert.encoder.layer.11.attention.output.LayerNorm.weight,bert.encoder.layer.11.attention.output.LayerNorm.bias,bert.encoder.layer.11.intermediate.dense.weight,bert.encoder.layer.11.intermediate.dense.bias,bert.encoder.layer.11.output.dense.weight,bert.encoder.layer.11.output.dense.bias,bert.encoder.layer.11.output.LayerNorm.weight,bert.encoder.layer.11.output.LayerNorm.bias,bert.pooler.dense.weight,bert.pooler.dense.bias,cls.predictions.bias,cls.predictions.transform.dense.weight,cls.predictions.transform.dense.bias,cls.predictions.transform.LayerNorm.weight,cls.predictions.transform.LayerNorm.bias,cls.predictions.decoder.weight,cls.predictions.decoder.bias,cls.seq_relationship.weight,cls.seq_relationship.bias]. Unloaded weights of the model: [cls.predictions.transform.LayerNorm.bias,cls.predictions.transform.dense.weight,cls.predictions.transform.dense.bias,cls.predictions.decoder.bias,cls.predictions.transform.LayerNorm.weight,cls.seq_relationship.bias,cls.seq_relationship.weight,cls.predictions.decoder.weight,cls.predictions.bias]. This IS expected if you initialize A model from B. This IS NOT expected if you initialize A model from A.
trainer = Trainer(model=model, train_dataset=train_dataset, evaluator=get_application_evaluator(app_name="machine_reading_comprehension", valid_dataset=valid_dataset, eval_batch_size=16, pretrained_model_name_or_path=get_pretrain_model_path("hfl/macbert-base-zh"), user_defined_parameters=user_defined_parameters )) trainer.train()
需要注意的是,由于滑动窗口机制的存在,在训练时的batch_size不可设置过大,否则容易挤爆内存。
从日志中可以看出,我们对预训练模型的参数进行了载入。下一步我们使用EasyNLP中的Train类创建训练实例,并进行训练。
模型评估
训练过程结束后,train好的模型被我们保存在一开始指定好的checkpoint_dir中,本地路径为"./cmrc_model_dir/"。我们可以对train好的模型进行效果评估。我们同样先使用EasyNLP中的get_application_model_for_evaluation方法构建评估模型。
model = get_application_model_for_evaluation(app_name="machine_reading_comprehension", pretrained_model_name_or_path="./cmrc_model_dir/", user_defined_parameters=user_defined_parameters )
[2022-09-16 17:06:48,662 INFO] Loading model... [2022-09-16 17:06:48,691 INFO] Load finished! Inited keys of the model: [_model.encoder.layer.1.attention.self.query.bias,_model.encoder.layer.1.attention.output.dense.bias,_model.encoder.layer.4.output.dense.bias,_model.encoder.layer.5.output.dense.bias,_model.encoder.layer.6.attention.self.query.weight,_model.encoder.layer.1.attention.output.LayerNorm.weight,_model.encoder.layer.7.output.dense.bias,_model.encoder.layer.10.output.LayerNorm.bias,_model.encoder.layer.11.attention.self.key.weight,_model.encoder.layer.2.output.LayerNorm.weight,_model.encoder.layer.10.output.dense.bias,_model.encoder.layer.1.output.LayerNorm.weight,_model.encoder.layer.9.intermediate.dense.weight,_model.encoder.layer.2.attention.output.LayerNorm.bias,_model.encoder.layer.9.output.dense.weight,_model.embeddings.token_type_embeddings.weight,_model.encoder.layer.1.intermediate.dense.bias,_model.encoder.layer.10.output.dense.weight,_model.encoder.layer.8.attention.self.query.weight,_model.encoder.layer.4.output.LayerNorm.bias,_model.encoder.layer.5.attention.self.query.bias,_model.encoder.layer.7.attention.self.query.weight,_model.encoder.layer.5.intermediate.dense.bias,_model.embeddings.position_ids,_model.encoder.layer.11.attention.self.query.weight,_model.encoder.layer.2.intermediate.dense.weight,_model.encoder.layer.4.output.dense.weight,_model.encoder.layer.1.attention.self.key.bias,_model.encoder.layer.7.attention.self.value.weight,_model.encoder.layer.8.output.dense.bias,_model.encoder.layer.9.attention.output.dense.weight,_model.encoder.layer.10.attention.self.value.bias,_model.encoder.layer.6.output.LayerNorm.bias,_model.encoder.layer.2.attention.self.key.bias,_model.encoder.layer.8.attention.output.dense.bias,_model.encoder.layer.10.attention.self.key.bias,_model.encoder.layer.2.attention.self.key.weight,_model.embeddings.position_embeddings.weight,_model.encoder.layer.10.attention.output.LayerNorm.bias,_model.encoder.layer.11.output.LayerNorm.bias,_model.encoder.layer.4.attention.output.dense.bias,_model.encoder.layer.4.output.LayerNorm.weight,_model.encoder.layer.6.output.dense.weight,_model.encoder.layer.9.attention.self.key.bias,_model.encoder.layer.8.attention.self.key.weight,_model.encoder.layer.0.attention.self.key.bias,_model.encoder.layer.10.attention.self.value.weight,_model.encoder.layer.4.attention.output.LayerNorm.weight,classifier.bias,_model.encoder.layer.4.attention.self.value.bias,_model.encoder.layer.0.attention.output.LayerNorm.bias,_model.encoder.layer.3.output.LayerNorm.weight,_model.encoder.layer.8.output.LayerNorm.bias,_model.encoder.layer.3.attention.self.value.bias,_model.encoder.layer.3.attention.self.query.weight,_model.encoder.layer.6.attention.self.key.weight,_model.encoder.layer.3.attention.self.key.weight,_model.embeddings.word_embeddings.weight,_model.encoder.layer.4.attention.self.query.bias,_model.encoder.layer.2.attention.self.value.weight,_model.encoder.layer.5.output.LayerNorm.weight,_model.encoder.layer.7.attention.output.LayerNorm.bias,_model.encoder.layer.7.output.LayerNorm.weight,_model.encoder.layer.2.output.dense.bias,classifier.weight,_model.encoder.layer.2.output.LayerNorm.bias,_model.encoder.layer.2.output.dense.weight,_model.encoder.layer.0.attention.output.dense.bias,_model.encoder.layer.11.output.dense.weight,_model.encoder.layer.0.output.LayerNorm.bias,_model.encoder.layer.3.attention.output.LayerNorm.bias,_model.encoder.layer.7.attention.output.LayerNorm.weight,_model.encoder.layer.0.intermediate.dense.weight,_model.encoder.layer.0.intermediate.dense.bias,_model.encoder.layer.1.attention.self.value.bias,_model.encoder.layer.7.attention.self.value.bias,_model.encoder.layer.4.attention.output.LayerNorm.bias,_model.encoder.layer.8.attention.output.dense.weight,_model.encoder.layer.11.attention.self.query.bias,_model.encoder.layer.3.output.dense.weight,_model.encoder.layer.10.attention.self.query.weight,_model.encoder.layer.9.intermediate.dense.bias,_model.encoder.layer.6.attention.self.query.bias,_model.encoder.layer.6.attention.self.value.bias,_model.encoder.layer.0.output.dense.weight,_model.encoder.layer.9.attention.output.LayerNorm.bias,_model.encoder.layer.5.attention.output.LayerNorm.bias,_model.encoder.layer.10.attention.self.key.weight,_model.encoder.layer.8.attention.self.value.bias,_model.encoder.layer.0.output.dense.bias,_model.encoder.layer.11.attention.self.value.weight,_model.encoder.layer.1.output.LayerNorm.bias,_model.encoder.layer.3.attention.output.dense.weight,_model.encoder.layer.4.attention.self.value.weight,_model.encoder.layer.0.output.LayerNorm.weight,_model.encoder.layer.5.attention.self.key.weight,_model.encoder.layer.4.intermediate.dense.weight,_model.encoder.layer.5.output.LayerNorm.bias,_model.encoder.layer.4.attention.self.key.bias,_model.encoder.layer.5.attention.output.dense.weight,_model.encoder.layer.2.attention.output.LayerNorm.weight,_model.encoder.layer.7.output.dense.weight,_model.encoder.layer.7.intermediate.dense.weight,_model.encoder.layer.1.attention.self.query.weight,_model.encoder.layer.7.attention.self.key.bias,_model.encoder.layer.5.output.dense.weight,_model.encoder.layer.10.attention.output.dense.bias,_model.encoder.layer.6.intermediate.dense.weight,_model.encoder.layer.1.intermediate.dense.weight,_model.encoder.layer.8.attention.output.LayerNorm.weight,_model.encoder.layer.10.intermediate.dense.weight,_model.encoder.layer.2.attention.output.dense.bias,_model.embeddings.LayerNorm.bias,_model.encoder.layer.5.attention.self.key.bias,_model.encoder.layer.2.attention.self.query.bias,_model.encoder.layer.8.output.dense.weight,_model.encoder.layer.7.attention.output.dense.bias,_model.encoder.layer.11.attention.output.LayerNorm.weight,_model.pooler.dense.bias,_model.encoder.layer.5.attention.self.query.weight,_model.encoder.layer.10.intermediate.dense.bias,_model.encoder.layer.4.intermediate.dense.bias,_model.encoder.layer.6.output.LayerNorm.weight,_model.encoder.layer.3.attention.self.query.bias,_model.encoder.layer.5.intermediate.dense.weight,_model.encoder.layer.4.attention.self.key.weight,_model.encoder.layer.8.attention.output.LayerNorm.bias,_model.encoder.layer.0.attention.output.dense.weight,_model.encoder.layer.7.intermediate.dense.bias,_model.encoder.layer.0.attention.self.key.weight,_model.encoder.layer.7.attention.self.query.bias,_model.encoder.layer.6.attention.output.dense.bias,_model.encoder.layer.5.attention.output.LayerNorm.weight,_model.encoder.layer.11.attention.output.dense.bias,_model.encoder.layer.1.attention.self.value.weight,_model.encoder.layer.9.output.dense.bias,_model.encoder.layer.1.output.dense.bias,_model.encoder.layer.6.attention.output.LayerNorm.weight,_model.encoder.layer.10.attention.output.dense.weight,_model.encoder.layer.2.attention.output.dense.weight,_model.encoder.layer.11.attention.self.key.bias,_model.encoder.layer.0.attention.self.value.weight,_model.encoder.layer.1.attention.output.dense.weight,_model.encoder.layer.11.attention.self.value.bias,_model.encoder.layer.11.attention.output.LayerNorm.bias,_model.encoder.layer.7.output.LayerNorm.bias,_model.encoder.layer.9.attention.self.value.bias,_model.encoder.layer.0.attention.output.LayerNorm.weight,_model.encoder.layer.8.intermediate.dense.bias,_model.encoder.layer.4.attention.output.dense.weight,_model.encoder.layer.8.attention.self.query.bias,_model.encoder.layer.1.output.dense.weight,_model.encoder.layer.3.attention.self.key.bias,_model.encoder.layer.3.attention.output.LayerNorm.weight,_model.encoder.layer.6.attention.self.key.bias,_model.encoder.layer.9.attention.self.query.bias,_model.encoder.layer.10.attention.self.query.bias,_model.encoder.layer.11.attention.output.dense.weight,_model.encoder.layer.3.intermediate.dense.weight,_model.encoder.layer.11.intermediate.dense.bias,_model.encoder.layer.6.attention.output.dense.weight,_model.encoder.layer.1.attention.output.LayerNorm.bias,_model.encoder.layer.5.attention.output.dense.bias,_model.encoder.layer.10.attention.output.LayerNorm.weight,_model.encoder.layer.11.output.dense.bias,_model.encoder.layer.7.attention.self.key.weight,_model.encoder.layer.2.intermediate.dense.bias,_model.encoder.layer.7.attention.output.dense.weight,_model.encoder.layer.9.attention.output.dense.bias,_model.encoder.layer.6.attention.self.value.weight,_model.encoder.layer.11.output.LayerNorm.weight,_model.encoder.layer.8.output.LayerNorm.weight,_model.encoder.layer.0.attention.self.query.weight,_model.encoder.layer.1.attention.self.key.weight,_model.encoder.layer.2.attention.self.query.weight,_model.encoder.layer.3.attention.self.value.weight,_model.encoder.layer.9.attention.self.value.weight,_model.encoder.layer.9.attention.self.key.weight,_model.encoder.layer.6.output.dense.bias,_model.encoder.layer.4.attention.self.query.weight,_model.encoder.layer.6.attention.output.LayerNorm.bias,_model.encoder.layer.5.attention.self.value.weight,_model.encoder.layer.3.intermediate.dense.bias,_model.encoder.layer.3.output.dense.bias,_model.encoder.layer.3.output.LayerNorm.bias,_model.encoder.layer.9.output.LayerNorm.weight,_model.encoder.layer.11.intermediate.dense.weight,_model.encoder.layer.9.attention.output.LayerNorm.weight,_model.encoder.layer.8.attention.self.key.bias,_model.encoder.layer.0.attention.self.query.bias,_model.encoder.layer.3.attention.output.dense.bias,_model.encoder.layer.8.attention.self.value.weight,_model.encoder.layer.5.attention.self.value.bias,_model.encoder.layer.8.intermediate.dense.weight,_model.encoder.layer.10.output.LayerNorm.weight,_model.encoder.layer.0.attention.self.value.bias,_model.encoder.layer.9.output.LayerNorm.bias,_model.encoder.layer.2.attention.self.value.bias,_model.encoder.layer.6.intermediate.dense.bias,_model.pooler.dense.weight,_model.encoder.layer.9.attention.self.query.weight,_model.embeddings.LayerNorm.weight]. All keys are initialized.
之后我们使用EasyNLP中的get_application_evaluator来初始化evaluator,并指定当前device下的当前模型,进行模型评估。
evaluator = get_application_evaluator(app_name="machine_reading_comprehension", valid_dataset=valid_dataset, eval_batch_size=16, user_defined_parameters=user_defined_parameters ) model.to(torch.cuda.current_device()) evaluator.evaluate(model=model)
模型预测
我们同样可以使用训练好的模型进行文本分类的预测。我们首先创建一个predictor,并据此实例化一个PredictorManager实例。我们指定预测好的结果输出在"dev.pred.csv",并指定输出格式为"unique_id,best_answer,query,context"。此外,我们将抽取出的,beam_search排在top_n的答案结果都输出在"dev.ans.csv"中,供模型优化时分析比对。
predictor = get_application_predictor(app_name="machine_reading_comprehension", model_dir="./cmrc_model_dir/", first_sequence="question_text", second_sequence="context_text", max_seq_length=384, output_file="dev_cmrc.pred.csv", user_defined_parameters=user_defined_parameters ) predictor_manager = PredictorManager(predictor=predictor, input_file="dev_cmrc2018.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_cmrc.pred.csv", output_schema="unique_id,best_answer,query,context", append_cols=args.append_cols, batch_size=256 ) predictor_manager.run() exit()
输入以下命令,可以展示测试集中的5条数据,其id、context、query,以及经过训练后的模型预测出的answer。
print('Predicted results: id best_answer query context') ! head -n 5 dev.pred.csv
Predicted results: id best_answer query context DEV_0_QUERY_0 光荣和ω-force 《战国无双3》是由哪两个公司合作开发的? 《战国无双3》()是由光荣和ω-force开发的战国无双系列的正统第三续作。本作以三大故事为主轴,分别是以武田信玄等人为主的《关东三国志》,织田信长等人为主的《战国三杰》,石田三成等人为主的《关原的年轻武者》,丰富游戏内的剧情。此部份专门介绍角色,欲知武器情报、奥义字或擅长攻击类型等,请至战国无双系列1.由于乡里大辅先生因故去世,不得不寻找其他声优接手。从猛将传andZ开始。2.战国无双编年史的原创男女主角亦有专属声优。此模式是任天堂游戏谜之村雨城改编的新增模式。本作中共有20张战场地图(不含村雨城),后来发行的猛将传再新增3张战场地图。但游戏内战役数量繁多,部分地图会有兼用的状况,战役虚实则是以光荣发行的2本「战国无双3人物真书」内容为主,以下是相关介绍。(注:前方加☆者为猛将传新增关卡及地图。)合并本篇和猛将传的内容,村雨城模式剔除,战国史模式可直接游玩。主打两大模式「战史演武」&「争霸演武」。系列作品外传作品 DEV_0_QUERY_1 村雨城 男女主角亦有专属声优这一模式是由谁改编的? 《战国无双3》()是由光荣和ω-force开发的战国无双系列的正统第三续作。本作以三大故事为主轴,分别是以武田信玄等人为主的《关东三国志》,织田信长等人为主的《战国三杰》,石田三成等人为主的《关原的年轻武者》,丰富游戏内的剧情。此部份专门介绍角色,欲知武器情报、奥义字或擅长攻击类型等,请至战国无双系列1.由于乡里大辅先生因故去世,不得不寻找其他声优接手。从猛将传andZ开始。2.战国无双编年史的原创男女主角亦有专属声优。此模式是任天堂游戏谜之村雨城改编的新增模式。本作中共有20张战场地图(不含村雨城),后来发行的猛将传再新增3张战场地图。但游戏内战役数量繁多,部分地图会有兼用的状况,战役虚实则是以光荣发行的2本「战国无双3人物真书」内容为主,以下是相关介绍。(注:前方加☆者为猛将传新增关卡及地图。)合并本篇和猛将传的内容,村雨城模式剔除,战国史模式可直接游玩。主打两大模式「战史演武」&「争霸演武」。系列作品外传作品 DEV_0_QUERY_2 「战史演武」&「争霸演武」 战国史模式主打哪两个模式? 《战国无双3》()是由光荣和ω-force开发的战国无双系列的正统第三续作。本作以三大故事为主轴,分别是以武田信玄等人为主的《关东三国志》,织田信长等人为主的《战国三杰》,石田三成等人为主的《关原的年轻武者》,丰富游戏内的剧情。此部份专门介绍角色,欲知武器情报、奥义字或擅长攻击类型等,请至战国无双系列1.由于乡里大辅先生因故去世,不得不寻找其他声优接手。从猛将传andZ开始。2.战国无双编年史的原创男女主角亦有专属声优。此模式是任天堂游戏谜之村雨城改编的新增模式。本作中共有20张战场地图(不含村雨城),后来发行的猛将传再新增3张战场地图。但游戏内战役数量繁多,部分地图会有兼用的状况,战役虚实则是以光荣发行的2本「战国无双3人物真书」内容为主,以下是相关介绍。(注:前方加☆者为猛将传新增关卡及地图。)合并本篇和猛将传的内容,村雨城模式剔除,战国史模式可直接游玩。主打两大模式「战史演武」&「争霸演武」。系列作品外传作品 DEV_1_QUERY_0 锣鼓经是大陆传统器乐及戏曲里面常用的打击乐记谱方法 锣鼓经是什么? 锣鼓经是大陆传统器乐及戏曲里面常用的打击乐记谱方法,以中文字的声音模拟敲击乐的声音,纪录打击乐的各种不同的演奏方法。常用的节奏型称为「锣鼓点」。而锣鼓是戏曲节奏的支柱,除了加强演员身段动作的节奏感,也作为音乐的引子和尾声,提示音乐的板式和速度,以及作为唱腔和念白的伴奏,令诗句的韵律更加抑扬顿锉,段落分明。锣鼓的运用有约定俗成的程式,依照角色行当的身份、性格、情绪以及环境,配合相应的锣鼓点。锣鼓亦可以模仿大自然的音响效果,如雷电、波浪等等。戏曲锣鼓所运用的敲击乐器主要分为鼓、锣、钹和板四类型:鼓类包括有单皮鼓(板鼓)、大鼓、大堂鼓(唐鼓)、小堂鼓、怀鼓、花盆鼓等;锣类有大锣、小锣(手锣)、钲锣、筛锣、马锣、镗锣、云锣;钹类有铙钹、大钹、小钹、水钹、齐钹、镲钹、铰子、碰钟等;打拍子用的檀板、木鱼、梆子等。因为京剧的锣鼓通常由四位乐师负责,又称为四大件,领奏的师傅称为:「鼓佬」,其职责有如西方乐队的指挥,负责控制速度以及利用各种手势提示乐师演奏不同的锣鼓点。粤剧吸收了部份京剧的锣鼓,但以木鱼和沙的代替了京剧的板和鼓,作为打拍子的主要乐器。以下是京剧、昆剧和粤剧锣鼓中乐器对应的口诀用字: DEV_1_QUERY_1 锣鼓点」 锣鼓经常用的节奏型称为什么? 锣鼓经是大陆传统器乐及戏曲里面常用的打击乐记谱方法,以中文字的声音模拟敲击乐的声音,纪录打击乐的各种不同的演奏方法。常用的节奏型称为「锣鼓点」。而锣鼓是戏曲节奏的支柱,除了加强演员身段动作的节奏感,也作为音乐的引子和尾声,提示音乐的板式和速度,以及作为唱腔和念白的伴奏,令诗句的韵律更加抑扬顿锉,段落分明。锣鼓的运用有约定俗成的程式,依照角色行当的身份、性格、情绪以及环境,配合相应的锣鼓点。锣鼓亦可以模仿大自然的音响效果,如雷电、波浪等等。戏曲锣鼓所运用的敲击乐器主要分为鼓、锣、钹和板四类型:鼓类包括有单皮鼓(板鼓)、大鼓、大堂鼓(唐鼓)、小堂鼓、怀鼓、花盆鼓等;锣类有大锣、小锣(手锣)、钲锣、筛锣、马锣、镗锣、云锣;钹类有铙钹、大钹、小钹、水钹、齐钹、镲钹、铰子、碰钟等;打拍子用的檀板、木鱼、梆子等。因为京剧的锣鼓通常由四位乐师负责,又称为四大件,领奏的师傅称为:「鼓佬」,其职责有如西方乐队的指挥,负责控制速度以及利用各种手势提示乐师演奏不同的锣鼓点。粤剧吸收了部份京剧的锣鼓,但以木鱼和沙的代替了京剧的板和鼓,作为打拍子的主要乐器。以下是京剧、昆剧和粤剧锣鼓中乐器对应的口诀用字:
以上输出的每行结果,从左到右依次为:id, best_answer, context, query。可以看出,模型很好地预测出了每个问题的答案,答案准确而简洁。
一步执行#
值得一提的是,上述所有训练/评估/预测代码,都已经被集成在EasyNLP/examples/appzoo_tutorials/machine_reading_comprehension/main.py中,此外,我们也预先编写好了多种可供直接执行的脚本。用户可以通过带参数运行main.py中指令,或者直接使用bash文件命令行执行的方式,一步执行上述所有训练/评估/预测操作。
main文件一步执行
用户通过以下代码带参数执行main.py中的指令,可直接对模型进行训练/评估/预测操作。
训练代码指令如下。参数说明如“载入数据”小节中所示。在本示例中,预训练模型指定为hfl/macbert-base-zh。
! python main.py \ --mode train \ --app_name=machine_reading_comprehension \ --worker_gpu=1 \ --tables=train_cmrc2018.tsv,dev_cmrc2018.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=./cmrc_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 '
评估代码如下,参数含义与训练是一致的。
! python main.py \ --mode evaluate \ --app_name=machine_reading_comprehension \ --worker_gpu=1 \ --tables=dev_cmrc2018.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=./cmrc_model_dir \ --micro_batch_size=16 \ --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 doc_stride=128 max_query_length=64 '
预测代码如下。参数同样与上面保持一致,输出结果可在dev.pred.tsv中查看。
! python main.py \ --mode predict \ --app_name=machine_reading_comprehension \ --worker_gpu=1 \ --tables=dev_cmrc2018.tsv \ --outputs=dev_cmrc.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=./cmrc_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_cmrc.ans.csv '
利用bash文件命令行执行
我们在EasyNLP/examples/appzoo_tutorials/machine_reading_comprehension/文件夹下封装好了多种可直接执行的bash脚本,用户同样可以通过使用bash文件命令行执行的方式来一步完成模型的训练/评估/预测。以下以run_train_eval_predict_user_defined_local_zh.sh脚本为例。该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 evaluate
模型预测:
! bash run_train_eval_predict_user_defined_local_zh.sh 0 predict