本项目约请飞桨社区中心开发者陈思州进行分享。作为一位深度学习爱好者,陈思州现在对自然语言处理感兴趣,热衷于了解一些人工智能中的数学推导和经典论文复现。在PPDE辅导计划中,创作了中医文献阅览了解项目,下面将由他来介绍在项目创作进程中的一些思考。

中医名词看不懂?用PaddleNLP做一个中医“百科全书”
**计划介绍**

中医名词看不懂?用PaddleNLP做一个中医“百科全书”
项目简介

中医文献阅览了解是一个将自然语言处理技能运用于中医药范畴的使命,其方针是运用能够读取、了解和答复中医药常识的模型普及和传播中医药常识。该使命需求树立一个大规模的中医药语料库,并运用自然语言处理技能对语料库进行处理,提取要害信息并树立模型。

模型的输入能够是一个中医药相关的问题,模型的输出则是问题的答案。例如,如果输入的问题是“什么是中医证候学?”,则模型的输出可能是“中医证候学是中医药的一个重要理论,它旨在经过调查患者的症状和体征,推断患者所患疾病的特点和发展趋势,为临床医治供给理论辅导。”

此外,依据该使命还能够开发更多关于中医药常识的小运用,如中医药问诊体系、中医药辨证论治辅助工具等,以协助更多人了解和运用中医药常识。

  • 项目链接

aistudio.baidu.com/aistudio/pr…

中医名词看不懂?用PaddleNLP做一个中医“百科全书”
数据集介绍

本项方针注数据源来自四个中医药范畴文本,包括《黄帝内经翻译版》《名医百科中医篇》《中成药用药卷》《慢性病摄生保健科普常识》。共计5000篇文档,每篇文档人工标示发生 1~4对(问题, 答案),共标示13000对(文档、问题、答案)。

{
2"id":98,
3"text":"黄帝道:什麽叫重实?岐伯说:所谓重实,如大热患者,邪气甚热,而脉象又盛满,内外俱实,便叫重实",
4"annotations":[
5{
6"Q":"重实是指什么?",
7"A":"所谓重实,如大热患者,邪气甚热,而脉象又盛满,内外俱实,便叫重实"
8},
9{
10"Q":"重实之人的脉象是什么样?",
11"A":"脉象又盛满"
12}
13],
14"source":"黄帝内经翻译版"
15}

中医名词看不懂?用PaddleNLP做一个中医“百科全书”
技能点介绍

随着中医文献资源的不断增加, 怎么高效地阅览和了解中医文献已经成为了一个重要课题。为了解决这个问题,咱们需求运用一些自然语言处理、机器学习、可视化等相关技能。本项意图首要技能点包括:

  • 构建中医MRC数据集,运用PaddleNLP搭建、练习并调优阅览了解模型;
  • 选用多种内置模型进行实验,终究确定运用Roberta阅览了解模型
  • 动转静,完结静态图的推理,并用Gradio完成可交互的布置。

PaddleNLP

PaddleNLP是飞桨自然语言处理模型库,具备易用的文本范畴API、丰厚的预练习模型、多场景的运用示例和高性能分布式练习与布置能力,旨在提升开发者在文本范畴的开发效率。

RoBERTa阅览了解模型

阅览了解实质是一个答案抽取使命,PaddleNLP对于各种预练习模型已经内置了对于下游使命-答案抽取的Fine-tune网络。以PaddleNLP中的RoBERTa模型为例,将模型Fine-tune完结答案抽取使命。

答案抽取使命的实质便是依据输入的问题和文章,猜测答案在文章中的开始方位和完毕方位。RoBERTa模型首要是在BERT基础上做了几点调整:

  • 练习时间更长,batch size更大,练习数据更多;

  • 移除了next predict loss

  • 练习序列更长;

  • 动态调整Masking机制

在BERT中,mask是在数据预处理进程中完结,这意味着,在每个epoch中,练习的每个语句的mask是固定的、静态的。RoBERTa提出一种动态mask的办法,将练习数据每个语句复制10次,选用不同的mask办法,这样在epoch为40的时分,均匀每条mask的序列会出现4次。

对中文数据的处理中,预练习模型RoBERTa运用BPE (Byte-Pair Encoding,字节对编码)处理文本次序。官方词表包括5万多的byte级别的token。其间,merges.txt文件存储了一切的token,vocab.json文件是一个byte到索引的映射,一般频率越高的byte索引越小。BPE编码转换的进程是,先将输入的一切tokens转化为merges.txt中对应的byte,再经过vocab.json中的字典进行byte到索引的映射。Tokenizer的作用是将原始输入文本转化成模型能够承受的输入数据方式。

依据Gradio完成AI算法可视化布置

怎么将你的AI算法敏捷分享给别人让对方体会,一直是一件费事事儿。Gradio算法可视化布置能够自动生成页面,形成交互,改动几行代码就能完结项目,支持自界说多种输入输出,支持生成可外部拜访的链接,然后完成分享。

终究作用出现

中医名词看不懂?用PaddleNLP做一个中医“百科全书”

中医名词看不懂?用PaddleNLP做一个中医“百科全书”
**设计流程展现**

中医名词看不懂?用PaddleNLP做一个中医“百科全书”
环境装备本项目依据PaddlePaddle2.0.2与PaddleNLP2.0.7版本。关于怎么下载此版本能够点击飞桨官网,查看下载方式。愈加推荐在AI Studio上一键运行哦。

  • 项目链接

aistudio.baidu.com/aistudio/pr…

中医名词看不懂?用PaddleNLP做一个中医“百科全书”
计划设计
中医名词看不懂?用PaddleNLP做一个中医“百科全书”
阅览了解的计划如上图,query表明问句,一般是用户的提问,passage表明文章,query的答案要从passage里边抽取出来。query和passage经过数据预处理,生成其id方式的输入,然后经过RoBERTa模型,得到答案的方位,然后得到相应的answer。

中医名词看不懂?用PaddleNLP做一个中医“百科全书”
数据处理

详细的使命界说为:给定问题q和一个华章p,依据华章内容,给出该问题的答案a。数据集中的每个样本,是一个三元组<q, p, a>,例如:

问题 q:草菇有什么成效?

华章 p:草菇荠菜汤新鲜幽香、色味搭配,具有清热和脾、益气平肝、降糖降压等成效,是夏季解暑祛热的良食佳品…….

参阅答案 a: 草菇荠菜汤新鲜幽香、色味搭配,具有清热和脾、益气平肝、降糖降压等成效。

本项意图数据集是json格局,包括:

  • lid: 阶段id
  • ltext: 阶段文本
  • lannotations: 每个阶段具有一个annotations,其间包括1~4对(问题、答案)
  • lQ: 问题
  • lA: 答案

将上述数据进行简略地数据清洗以及格局(sqaud格局)转换操作。为了方便读取,详细格局如下:

{
'id':'xx','title':'xxx',
'context':'xxxx',
'question':'xxxxx',
'answers':['xxxx'],
'answer_starts':[xxx]
}

中医名词看不懂?用PaddleNLP做一个中医“百科全书”
模型练习与战略挑选

设置Fine-tune优化战略

#参数装备
#练习进程中的最大学习率
learning_rate=3e-5
#练习次序
epochs=2
#学习率预热比例
warmup_proportion=0.1
#权重衰减系数,相似模型正则项战略,防止模型过拟合
weight_decay=0.01
num_training_steps=len(train_data_loader)*epochs
lr_scheduler=ppnlp.transformers.LinearDecayWithWarmup(learning_rate,num_training_steps,warmup_proportion)
#Generateparameternamesneededtoperformweightdecay.
#AllbiasandLayerNormparametersareexcluded.
decay_params=[
p.nameforn,pinmodel.named_parameters()
ifnotany(ndinnforndin["bias","norm"])
]
optimizer=paddle.optimizer.AdamW(
learning_rate=lr_scheduler,
parameters=model.parameters(),
weight_decay=weight_decay,
apply_decay_param_fun=lambdax:xindecay_params)

设计丢失函数

因为BertForQuestionAnswering模型将BERT模型的sequence_output拆成start_logits和end_logits,所以阅览了解使命的loss也由start_loss和end_loss组成。答案开始方位和完毕方位的猜测能够分红两个分类使命,咱们需求自己界说丢失函数。设计的丢失函数如下:

classCrossEntropyLossForSQuAD(paddle.nn.Layer):
definit(self):
super(CrossEntropyLossForSQuAD,self).init()
defforward(self,y,label):
start_logits,end_logits=y#bothshapeare[batch_size,seq_len]
start_position,end_position=label
start_position=paddle.unsqueeze(start_position,axis=-1)end_position=paddle.unsqueeze(end_position,axis=-1)
start_loss=paddle.nn.functional.softmax_with_cross_entropy(
logits=start_logits,label=start_position,soft_label=False)start_loss=paddle.mean(start_loss)
end_loss=paddle.nn.functional.softmax_with_cross_entropy(logits=end_logits,label=end_position,soft_label=False)
end_loss=paddle.mean(end_loss)
loss=(start_loss+end_loss)/2returnloss

模型练习

模型练习的进程一般有以下过程:

  • 从dataloader中取出一个batch data
  • 将batch data喂给model,做前向核算;
  • 将前向核算成果传给丢失函数,核算loss
  • loss反向回传,更新梯度。重复以上过程。

每练习一个epoch时,程序经过evaluate()调用paddlenlp.metric.squad中的squad_evaluate()回来点评目标,compute_predictions() 评估当时模型练习的作用,用于生成可提交的答案。

中医名词看不懂?用PaddleNLP做一个中医“百科全书”
**猜测布置**

模型练习完结之后,咱们完成模型的猜测布置。虽然练习阶段运用的动态图形式有诸多长处,包括Python风格的编程体会(运用RNN等包括控制流的网络时尤为显着)、友好的debug交互机制等。但Python动态图形式无法更好地满足猜测布置阶段的性能要求,同时也约束了布置环境。高性能猜测布置需求静态图模型导出和猜测引擎两方面的支持。

中医名词看不懂?用PaddleNLP做一个中医“百科全书”
动转静导出模型

依据静态图的猜测布置要求将动态图的模型转换为静态图方式的模型(网络结构和参数权重)。飞桨静态图方式的模型(由变量和算子构成的网络结构)运用Program来寄存,Program的结构能够经过飞桨的静态图形式说明,静态图形式下网络构建履行的各API会将输入输出变量和运用的算子添加到Program中。

中医名词看不懂?用PaddleNLP做一个中医“百科全书”
运用推理库猜测

取得静态图模型之后,咱们运用Paddle Inference进行猜测布置。Paddle Inference是飞桨的原生推理库,作用于服务器端和云端,供给高性能的推理能力。运用 Paddle Inference 开发 Python 猜测程序仅需以下过程:

中医名词看不懂?用PaddleNLP做一个中医“百科全书”
中医名词看不懂?用PaddleNLP做一个中医“百科全书”
Gradio进行交互项布置

Gradio布置有以下过程:

  • 将模型拷贝到本地,并依照接口要求封装好办法;
importGradioasgr
defquestion_answer(context,question):
pass#Implementyourquestion-answeringmodelhere...
gr.Interface(fn=question_answer,inputs=["text","text"],outputs=["textbox","text"]).launch(share=True)
  • 加载用户输入的context和question,并运用模型回来answer;
  • 回来到Gradio布置的框内, 进行页面展现;
  • 生成公开链接。

中医名词看不懂?用PaddleNLP做一个中医“百科全书”

**总结与展望**

中医名词看不懂?用PaddleNLP做一个中医“百科全书”
模型作用比照

本项目测验了12L768H的bert-base-chinese、bert-wwm-ext-chinese和24L1024H的roberta-wwm-ext-large模型,作用如下,能够看到roberta-wwm-ext-large模型能够取得较好的作用,随之付出的代价便是模型的体积变大,而且练习速度变迟缓。除此之外,如果epoch过大,极易发生过拟合,能够调整学习率等参数防止过拟合。

中医名词看不懂?用PaddleNLP做一个中医“百科全书”

与roberta-wwm-ext-large比较,同规模的ERNIE 1.0-Large-cw、ERNIE 2.0-Large-zh在CLUE各项使命上均匀精度更高,后续计划测验ERNIE系列模型。

中医名词看不懂?用PaddleNLP做一个中医“百科全书”

github.com/PaddlePaddl…

  • 运用办法参阅

aistudio.baidu.com/aistudio/pr…**

数据

寻觅更多优质中医语料数据集,进行简略增强,选用回译等数据增强办法,从无到有的构建文本相似数据集。

项目布置

运用AI Studio布置兴趣项目或将模型打包后运用flask结构,合作前端页面制造体会更好的小运用。

模型优化

将模型微调的几步epoch成果保存,进行模型均匀操作。选用模型Bagging战略,将练习质量好的模型融合处理,探寻更多优质模型。针对使命,运用更多医疗数据集练习好的预练习模型。

更多

学习RocketQA等端到端问答模型,加上检索条件,在机器阅览了解基础上制造完好的依据检索的问答体系,并可为后续学习依据生成的问答模型打下基础。(PS:勉励做个相似ChatGPT的通用问答模型)

开源项目地址

github.com/PaddlePaddl…

参阅文献

[1]aistudio.baidu.com/aistudio/pr…
[2]aistudio.baidu.com/aistudio/pr…