中文医疗预训练模型ERNIE-Health 在模型结构上与 ELECTRA 相似,包括生成器和判别器两部分,各自包含1个 ERNIE 模型。生成器的训练任务为Masked Language Model(MLM),主要作用是给判别器提供训练语料。判别器的训练任务为多任务学习,也是论文的主要改进点:
- 判断各个位置上的字是否被替换(Replaced Token Detection,RTD)
- 从候选字中选取被替换位置的原始字(Multi-Token Selection,MTS)
- 判断对比序列预测(Contrastive Sequence Prediction,CSP),即给定某个句子,通过替换其中个别字构造两个句子作为正例,替换其他句子中的字作为负例来进行分类。
预训练结束后将不再使用生成器,只对判别器进行fine-tuning用于下游的医疗文本处理任务。
图片来源:来自ERNIE-Health论文
ERNIE-Health模型在中文医疗自然语言处理榜单 CBLUE 上取得了冠军,平均得分达到 77.822。
本项目是 ERNIE-Health 的开源实现,支持自定义数据上的中文医疗预训练模型训练。
- paddlepaddle >= 2.2.0
-
数据编码:UTF-8
-
数据格式:预训练文本数据放在同个目录下,每个文件中每行一句中文文本。
-
数据预处理:首先对原始文本进行分词,分词结果中非首中文字符替换为
##前缀的字符(例如,医疗处理后得到[医, ##疗])。接着将token转换为对应的id。最后将目录下的全部数据合并存储,token ids拼接后存储至.npy文件,每条样本的长度存储在.npz文件。
python preprocess.py --input_path ./raw_data/ --output_file ./data/samples --tokenize_tool lac --num_worker 8可配置参数包括
input_path为原始文本数据所在目录,该目录下包含至少一个中文文本文件,UTF-8编码。output_file为预处理后数据的存储路径及文件名(不包含后缀)。tokenize_tool表示分词工具,包括lac、seg和jieba,默认为lac。logging_steps表示日志打印间隔,每处理logging_steps个句子打印一次日志。num_worker表示使用的进程数,增加进程数可加速预处理。
PaddleNLP中提供了ERNIE-Health训练好的模型参数。该版本为160G医疗文本数据上的训练结果,数据包括脱敏医患对话语料、医疗健康科普文章、脱敏医院电子医疗病例档案以及医学和临床病理学教材。
- 推荐使用至少4张16G以上显存的GPU进行预训练。
- 数据量应尽可能接近ERNIE-Health论文中训练数据的量级,以获得好的预训练模型效果。
- 若资源有限,可以直接使用开源的ERNIE-Health模型进行Fine-tuning,具体实现可参考 CBLUE样例。
CUDA_VISIBLE_DEVICES=0 python run_pretrain.py \
--input_dir ./data \
--output_dir ./output \
--learning_rate 1e-7 \
--batch_size 10 \
--adam_epsilon 1e-8 \
--weight_decay 1e-2 \
--warmup_steps 10000 \
--max_steps 1000000 \
--save_steps 10000 \
--logging_steps 1 \
--seed 1000 \
--use_amp
unset CUDA_VISIBLE_DEVICES
python -m paddle.distributed.launch --gpus "0,1,2,3" run_pretrain.py \
--input_dir ./data \
--output_dir ./output \
--learning_rate 1e-7 \
--batch_size 10 \
--adam_epsilon 1e-8 \
--weight_decay 1e-2 \
--warmup_steps 10000 \
--max_steps 1000000 \
--save_steps 10000 \
--logging_steps 1 \
--seed 1000 \
--use_amp
可配置参数包括
model_name_or_path表示内置模型参数名(目前支持ernie-health-chinese),或者模型参数配置路径(这时需配置 --init_from_ckpt 参数一起使用,一般用于断点恢复训练场景。)input_dir表示训练数据所在目录,该目录下要有.npy和.npz两个文件,格式与```preprocess.py``预处理结果相同。output_dir表示预训练模型参数和训练日志的保存目录。batch_size表示每次迭代每张卡上的样本数量。当batch_size=4时,运行时单卡约需要12G显存。如果实际GPU显存小于12G或大大多于12G,可适当调小/调大此配置。learning_rate表示基础学习率大小,将于learning rate scheduler产生的值相乘作为当前学习率。max_seq_length表示最大句子长度,超过该长度将被截断。weight_decay表示每次迭代中参数缩小的比例,该值乘以学习率为真正缩小的比例。adam_epsilon表示adam优化器中的epsilon值。warmup_steps表示学习率逐渐升高到基础学习率(即上面配置的learning_rate)所需要的迭代数,最早的使用可以参考这篇论文。num_epochs表示训练轮数。logging_steps表示日志打印间隔。save_steps表示模型保存间隔。max_steps如果配置且大于0,表示预训练最多执行的迭代数量;如果不配置或配置小于0,则根据输入数据量、batch_size和num_epochs来确定预训练迭代数量。device表示使用的设备类型。默认为GPU,可以配置为CPU、GPU、XPU。若希望使用GPU训练,将其设置为GPU,同时环境变量CUDA_VISIBLE_DEVICES配置要使用的GPU id。use_amp表示是否开启混合精度(float16)进行训练,默认不开启。如果在命令中加上了--use_amp,则会开启。init_from_ckpt表示是否从某个checkpoint继续训练(断点恢复训练),默认不开启。如果在命令中加上了--init_from_ckpt,且 --model_name_or_path 配置的是路径,则会开启从某个checkpoint继续训练。
本样例同时提供了Trainer版本的预训练流程,预训练重启、可视化等流程较为完备。需要从源码安装paddlenlp使用。
unset CUDA_VISIBLE_DEVICES
task_name="eheath-pretraining"
python -u -m paddle.distributed.launch \
--gpus 0,1,2,3,4,5,6,7 \
run_pretrain_trainer.py \
--input_dir "./data" \
--output_dir "output/$task_name" \
--max_seq_length 512 \
--gradient_accumulation_steps 1\
--per_device_train_batch_size 8 \
--per_device_eval_batch_size 8 \
--learning_rate 0.001 \
--max_steps 1000000 \
--save_steps 50000 \
--weight_decay 0.01 \
--warmup_ratio 0.01 \
--max_grad_norm 1.0 \
--logging_steps 20 \
--dataloader_num_workers 2 \
--device "gpu"\
--fp16 \
--fp16_opt_level "O1" \
--do_train \
--disable_tqdm \
--save_total_limit 10
大部分参数含义如上文所述,这里简要介绍一些新参数:
- dataset, 同上文task_name,此处为小写字母。表示 Fine-tuning 的分类任务,当前支持 afamc、tnews、iflytek、ocnli、cmnli、csl、cluewsc2020。
- per_device_train_batch_size 同上文batch_size。训练时,每次迭代每张卡上的样本数目。
- per_device_eval_batch_size 同上文batch_size。评估时,每次迭代每张卡上的样本数目。
- warmup_ratio 与warmup_steps类似,warmup步数占总步数的比例。
-fp16 与
use_amp相同,表示使用混合精度 -fp16_opt_level 混合精度的策略。注:O2训练eHealth存在部分问题,暂时请勿使用。 - save_total_limit 保存的ckpt数量的最大限制
Wang, Quan, et al. “Building Chinese Biomedical Language Models via Multi-Level Text Discrimination.” arXiv preprint arXiv:2110.07244 (2021). pdf
