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

news2024/11/16 20:41:04

 

ea5f1a828b797d914049d2e1657f4e24.png

我是一个深度学习爱好者,目前对自然语言处理感兴趣,热衷于了解一些人工智能中的数学推导和经典论文复现,正在成长的“小趴菜”一枚,在PPDE指导计划中,创作了中医文献阅读理解项目,下面将由我介绍在项目创作过程中的一些思考

6240a74c2af4ae0acde91352e0ebcb7f.png

方案介绍

5d00d3e082d7858d15e376ef6a70951e.png

项目简介

中医文献阅读理解是一个将自然语言处理技术应用于中医药领域的任务,其目标是使用能够读取、理解和回答中医药知识的模型普及和传播中医药知识。该任务需要建立一个大规模的中医药语料库,并使用自然语言处理技术对语料库进行处理,提取关键信息并建立模型。

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

此外,基于该任务还可以开发更多关于中医药知识的小应用,如中医药问诊系统、中医药辨证论治辅助工具等,以帮助更多人了解和应用中医药知识。

  • 项目链接

https://aistudio.baidu.com/aistudio/projectdetail/5166465

97a3a8ca9c305a00b7fdf2f1f2592c76.png

数据集介绍

本项目标注数据源来自四个中医药领域文本,包括《黄帝内经翻译版》《名医百科中医篇》《中成药用药卷》《慢性病养生保健科普知识》。共计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   }

407e6392880e974e95058221097c5db4.png

技术点介绍

随着中医文献资源的不断增加, 如何高效地阅读和理解中医文献已经成为了一个重要课题。为了解决这个问题,我们需要利用一些自然语言处理、机器学习、可视化等相关技术。本项目的主要技术点包括:

  • 构建中医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算法可视化部署可以自动生成页面,形成交互,改动几行代码就能完成项目,支持自定义多种输入输出,支持生成可外部访问的链接,从而实现分享。

最终效果呈现

5b3561feee9fafd25054124c353446dc.jpeg

364ac1a0894ba852efc8c48f349d14bf.png

设计流程展示

f454962f1441fe60f393ded4227d9d22.png

环境配置

本项目基于PaddlePaddle2.0.2与PaddleNLP2.0.7版本。关于如何下载此版本可以点击飞桨官网,查看下载方式。更加推荐在AI Studio上一键运行哦。

  • 项目链接

https://aistudio.baidu.com/aistudio/projectdetail/5166465

f03f9dc1f2e5e78edf2fd2863eaae204.png

方案设计

430b7b6231259bc47162e835ea1040b4.png

阅读理解的方案如上图,query表示问句,一般是用户的提问,passage表示文章,query的答案要从passage里面抽取出来。query和passage经过数据预处理,生成其id形式的输入,然后经过RoBERTa模型,得到答案的位置,从而得到相应的answer。

d5c51ef846c67d4c21eb60840d7c9704.png

数据处理

具体的任务定义为:给定问题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]
}

a4e782cf140560a0dd6b6c5a5b1b8650.png

模型训练与策略选择

设置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)

# Generate parameter names needed to perform weight decay.
# All bias and LayerNorm parameters are excluded.
decay_params = [
    p.name for n, p in model.named_parameters()
    if not any(nd in n for nd in ["bias", "norm"])
]
optimizer = paddle.optimizer.AdamW(
    learning_rate=lr_scheduler,
    parameters=model.parameters(),
    weight_decay=weight_decay,
    apply_decay_param_fun=lambda x: x in decay_params)

设计损失函数

由于BertForQuestionAnswering模型将BERT模型的sequence_output拆成start_logits和end_logits,所以阅读理解任务的loss也由start_loss和end_loss组成。答案起始位置和结束位置的预测可以分成两个分类任务,我们需要自己定义损失函数。

设计的损失函数如下:

class CrossEntropyLossForSQuAD(paddle.nn.Layer):
def init (self):
super(CrossEntropyLossForSQuAD, self). init ()
def  forward(self,  y,  label):
start_logits,  end_logits  =  y    # both shape are [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) / 2 return loss

模型训练

模型训练的过程通常有以下步骤:

  • 从dataloader中取出一个batch data

  • 将batch data喂给model,做前向计算;

  • 将前向计算结果传给损失函数,计算loss

  • loss反向回传,更新梯度。重复以上步骤。

每训练一个epoch时,程序通过evaluate()调用paddlenlp.metric.squad中的squad_evaluate()返回评价指标,compute_predictions() 评估当前模型训练的效果,用于生成可提交的答案。

5793f52e898e927b03913d618feac8da.png

预测部署

模型训练完成之后,我们实现模型的预测部署。虽然训练阶段使用的动态图模式有诸多优点,包括Python风格的编程体验(使用RNN等包含控制流的网络时尤为明显)、友好的debug交互机制等。但Python动态图模式无法更好地满足预测部署阶段的性能要求,同时也限制了部署环境。

高性能预测部署需要静态图模型导出和预测引擎两方面的支持。

a58d5d8da71de81a4448783ff7935c33.png

动转静导出模型

基于静态图的预测部署要求将动态图的模型转换为静态图形式的模型(网络结构和参数权重)。飞桨静态图形式的模型(由变量和算子构成的网络结构)使用Program来存放,Program的构造可以通过飞桨的静态图模式说明,静态图模式下网络构建执行的各API会将输入输出变量和使用的算子添加到Program中。

cb73cd5740b82bad277d39bb7c27fc8e.png

使用推理库预测

获得静态图模型之后,我们使用Paddle Inference进行预测部署。Paddle Inference是飞桨的原生推理库,作用于服务器端和云端,提供高性能的推理能力。使用 Paddle Inference 开发 Python 预测程序仅需以下步骤:

db8bff36ecd07f80559e9b743186a054.png

995169731b39b87ba5ec0dcd336ce4c2.png

Gradio进行交互项部署

Gradio部署有以下步骤:

  • 将模型拷贝到本地,并按照接口要求封装好方法;

import Gradio as gr
def question_answer(context, question):
pass # Implement your question-answering model here...
gr.Interface(fn=question_answer,  inputs=["text",  "text"],  outputs=["textbox",  "text"]).launch(share=True)
  • 加载用户输入的context和question,并利用模型返回answer;

  • 返回到Gradio部署的框内, 进行页面展示;

  • 生成公开链接。 

2e8fe6aacc1d458598204015c51afdef.png

总结与展望

db6bdd1ff9e27021a01e0af581dbd7e7.png

模型效果对比

本项目尝试了12L768H的bert-base-chinese、bert-wwm-ext-chinese和24L1024H的roberta-wwm-ext-large模型,效果如下,可以看到roberta-wwm-ext-large模型能够取得较好的效果,随之付出的代价就是模型的体积变大,并且训练速度变迟缓。除此之外,如果epoch过大,极易发生过拟合,可以调整学习率等参数避免过拟合。

c172ef0ff892832ed1349bc1b1c249e2.png

与roberta-wwm-ext-large相比,同规模的ERNIE 1.0-Large-cw、ERNIE 2.0-Large-zh在CLUE各项任务上平均精度更高,后续计划尝试ERNIE系列模型。

ebfd64ea4ff995a602dfc615f5baca33.jpeg

  • 模型Benchmark地址

https://github.com/PaddlePaddle/PaddleNLP/tree/develop/model_zoo/ernie-3.0

  • 使用方法参考

https://aistudio.baidu.com/aistudio/projectdetail/2017189

9bcdb532354b4728ab3ee3e0ecfecca1.png

项目展望

数据

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

项目部署

利用AI Studio部署趣味项目或将模型打包后使用flask框架,配合前端页面制作体验更好的小应用。

模型优化

将模型微调的几步epoch结果保存,进行模型平均操作。采用模型Bagging策略,将训练质量好的模型融合处理,探寻更多优质模型。针对任务,使用更多医疗数据集训练好的预训练模型。

更多

学习RocketQA等端到端问答模型,加上检索条件,在机器阅读理解基础上制作完整的基于检索的问答系统,并可为后续学习基于生成的问答模型打下基础。(PS:励志做个类似ChatGPT的通用问答模型)

开源项目地址

https://github.com/PaddlePaddle/PaddleNLP

参考文献

[1]https://aistudio.baidu.com/aistudio/projectdetail/2017189
[2]https://aistudio.baidu.com/aistudio/projectdetail/4113678

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/192729.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java开发面试(技术面)经历 (二)

2022-11-08&#xff0c;应聘Java开发 &#xff1a;云智慧&#xff08;实训机构&#xff0c;个人观点&#xff0c;与培训没区别&#xff09; 今天二面技术面&#xff0c;问了一些问题 1.集合有哪些&#xff1f; 两大容器如图&#xff1a;Collection集合 list下面还有Vector&…

Veeam Backup Replication v12 发布 (含下载) - 面向所有工作负载的备份软件

Veeam Availability Suite v12 请访问原文链接&#xff1a;https://sysin.org/blog/veeam-backup-12/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;www.sysin.org 全球首屈一指的备份和恢复提供商 管理、控制、保护您的 数据&#xff…

数字化基本概念

数字化是什么&#xff1f;为什么要做数字化转型&#xff1f;感觉只是用计算机软件替代了原有的工作和流程。 听多了&#xff0c;每天的工作也被冠以数字化&#xff0c;说来很重要&#xff0c;确是不清楚为何&#xff0c;也来了解一下。 数字化&#xff1a;改变做事方式、发…

分享企业做微信小程序开发的步骤_公司如何申请微信小程序步骤

对于小程序新手来说&#xff0c;想要建立一个小程序&#xff0c;第一步就是要拥有一个小程序。那么如何开通小程序&#xff1f;公司小程序如何申请&#xff1f;今天就来手把手教你们如何开通小程序吧&#xff1a; 一、填写帐号信息 到微信公众平台首页&#xff0c;直接点击帐号…

android——开发中哪些习惯会影响卡顿的发生

开发中哪些习惯会影响卡顿的发生&#xff0c;如下&#xff1a;1.布局太乱&#xff0c;层级太深。1.1&#xff1a;通过减少冗余或者嵌套布局来降低视图层次结构。比如使用约束布局代替线性布局和相对布局。1.2&#xff1a;用 ViewStub 替代在启动过程中不需要显示的 UI 控件。1.…

C#学习记录——C# winform程序怎么打包成安装项目(VS2019图解)

今天学习将Winform程序打包成安装项目&#xff0c;参考网上教程&#xff0c;并记录尝试过程。 测试打包的程序为用C# Winform开的的一个客户端程序。 1、安装打包插件 在程序打包之前需要安装Microsoft Visual Studio Installer Projects插件。 1.1、选择扩展管理 在VS2019…

(面经四):笔试

面试经历&#xff08;四&#xff09; 时间&#xff1a;2022-11-14 笔试 &#xff08;培训机构真该洗啊&#xff0c;写完后根本不看你写的笔试&#xff0c;直接给你说送你去培训&#xff0c;技术什么都没有问&#xff0c;直接拿着你的简历画画&#xff0c;画什么实训和培训的不同…

Docker建立自己的私有仓库

仓库&#xff08;Repository&#xff09;是集中存放镜像的地方。 一个容易混淆的概念是注册服务器&#xff08;Registry&#xff09;。实际上注册服务器是管理仓库的具体服务 器&#xff0c;每个服务器上可以有多个仓库&#xff0c;而每个仓库下面有多个镜像。从这方面来说&am…

Python学习------起步3(序列与数据类型转换)

目录 序列 1.切片 2.列表&#xff08;list&#xff09; 3.元组 数据类型转换 习题 好了&#xff0c;今天就开始序列的学习了&#xff0c;其实在C语言里面我们学过数组或者字符数组&#xff0c;Python中的序列跟它们一样是一种数据的储存方式&#xff0c;其中学习过程也是比…

LeetCode动态规划(九):完全背包(初级)

学习目标&#xff1a; 理解完全背包和0-1背包遍历顺序的区别 学习内容&#xff1a; 15. LeetCode377. 组合总和 Ⅳhttps://leetcode.cn/problems/combination-sum-iv/ 16. 爬楼梯(进阶班版) 17. LeetCode322. 零钱兑换https://leetcode.cn/problems/coin-change/ 18. Leet…

winform发布功能附加dll、db、xml、json等文件

我们日常进行程序的更新升级可能会用到winform的发布功能&#xff0c;但有些文件可能会无法伴随着发布一同发布出去或者每次发布后文件的数据被覆盖&#xff0c;下面一起看一下怎么解决&#xff1a; winform发布功能参考我另一篇文章https://blog.csdn.net/qq_39569480/articl…

筑基四层 —— 详解三子棋和扫雷

目录 一.修炼必备 二.三子棋详解 三.扫雷详解 四.三子棋和扫雷的完整代码 &#xff01;&#xff01;&#xff01;恭喜你&#xff0c;成功突破至筑基四层&#xff01;&#xff01;&#xff01; 一.修炼必备 1.入门必备&#xff1a;VS2019社区版&#xff0c;下载地址&#xff…

leetcode51,52 N皇后相关(回溯方法)

题目1&#xff1a;N皇后 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n 皇后问题…

入职一年,那个准的下班的人,比我先升职了...

最近心态崩了。 和我同期一道进公司的人又升了一级&#xff0c;可是明明大家在进公司时&#xff0c;他不论是学历还是工作经验&#xff0c;样样都不如自己&#xff0c;眼下不过短短的两年时间便一跃在自己的职级之上&#xff0c;这着实让我有几分不甘心。 我想不明白&#xff…

谈谈Linux epoll惊群问题的原因和解决方案

近期排查了一个问题&#xff0c;epoll惊群的问题&#xff0c;起初我并不认为这是惊群导致&#xff0c;因为从现象上看&#xff0c;只是体现了CPU不均衡。一共fork了20个Server进程&#xff0c;在请求负载中等的时候&#xff0c;有三四个Server进程呈现出比较高的CPU利用率&…

OpenCV 图像平滑处理

本文是OpenCV图像视觉入门之路的第10篇文章&#xff0c;本文详细的在图像上面进行了图像均值滤波、方框滤波 、高斯滤波、中值滤波、双边滤波、2D卷积等操作。 OpenCV 图像平滑处理目录 1 均值滤波 2 方框滤波 3 高斯滤波 4 中值滤波 5 双边滤波 6 2D卷积(自定义…

电子技术——分立MOS放大电路

电子技术——分立MOS放大电路 有了前两节的学习&#xff0c;即三种放大器配置和偏置方法之后&#xff0c;我们可以通过现成的分立晶体管、电阻、电容等搭建分立MOS放大电路。 DC偏置基本结构 在本节我们选用的DC偏置基本结构是如图所示的源极恒流源的偏置方案&#xff0c;下图…

用#define宏实现Add函数

✋作者&#xff1a;阿润菜菜 &#x1f4d6;专栏&#xff1a;C语言 我们知道#define宏是一种非常暴力的替换&#xff0c;宏定义会在程序编译预处理阶段在调用宏的位置进行文本内容的直接替换&#xff0c;因此我们在使用宏定义实现Add加法函数时就要注意一些可能会报错的问题。 …

第九层(10):STL之函数对象

文章目录前情回顾函数对象概念特点谓词概念内建函数对象分类算术仿函数关系仿函数逻辑仿函数下一座石碑&#x1f389;welcome&#x1f389; ✒️博主介绍&#xff1a;一名大一的智能制造专业学生&#xff0c;在学习C/C的路上会越走越远&#xff0c;后面不定期更新有关C/C语法&a…

你是如何学习 Java 的?

每一个行业中能成为大佬的人&#xff0c;一定都有他自己一套具有独到见解的方法...... 这个问题我很有发言权&#xff0c;从刚毕业做Java实习生月薪2k&#xff0c;到现在干了5年Java开发月薪43k&#xff0c;一直都在保持不断学习的状态。以我个人的经验来看&#xff0c;一个程…