- 人工智能
- 大模型
- 预训练
- 微调
- LoRA
- RLHF
- 强化学习
- 分布式训练
【免费下载链接】PaddleNLP
Easy-to-use and powerful LLM and SLM library with awesome model zoo.
导读:ERNIE-CTM(ERNIE for Chinese Text Mining)是 PaddleNLP 解语(Text to Knowledge)体系中面向中文文本挖掘任务的预训练语言模型,具备 2 万+ 汉字字表、全局观察位多任务训练等设计。本文以 ERNIE-CTM 官方文档 为主体,结合仓库中的模型实现与训练脚本源码,系统讲解其模型结构、预训练任务设计,并给出基于 WordTag 词类知识标注任务的增量训练、模型预测与 Taskflow 自定义模型一键预测的完整实战流程。读完本文,你将掌握 ERNIE-CTM 的核心原理,并能独立完成中文词类知识标注模型的微调与部署。
ERNIE-CTM 特点
ERNIE-CTM 是适用于中文文本挖掘任务的预训练语言模型,拥有更全面的汉字字表集合,更优的中文文本挖掘任务表现,并与 PaddleNLP 深度结合,提供便捷的应用实践。其核心特点可以归纳为三点:
- 全面的中文汉字字表扩充:ERNIE-CTM 的字符集包含 2 万+ 汉字,以及中文常用符号(常用标点、汉语拼音、编号)、部分外语符号(假名、单位)等,大幅减少中文解析挖掘任务中 UNK(未识别字符)引发的标注问题。同时,ERNIE-CTM 使用了 embedding 分解,可以更加灵活地扩充应用字表。
- 更加适配中文文本挖掘任务:ERNIE-CTM 在每个表示后面添加了全局信息,在序列特征上叠加了全局的信息,使得在文本挖掘任务上有更加强力的表现。
- 支持多种特征训练的模型结构:ERNIE-CTM 的模型结构支持多种特征训练,用户可按照自己的需求任意添加任务及对应特征训练模型,而无需考虑任务之间的冲突所造成的灾难性遗忘。
在解语框架中,ERNIE-CTM 作为"中文知识标注工具集"的预训练底座,与词类知识标注工具(WordTag)、名词短语标注工具(NPTag)以及百科知识树(TermTree)配合使用,详见解语总览。
ERNIE-CTM 模型介绍
模型结构:BERT 双向 Transformer + ALBERT 式 embedding 分解
ERNIE-CTM 的模型结构大体与 BERT 相同,都是双向 transformer 结构。区别在于,ERNIE-CTM 为能灵活扩充字表,采用了 ALBERT 的 embedding 分解,将 embedding 层分解为 128 维,参数列表如下:
| 模型 | embedding size | hidden size | hidden layers | vocab size |
|---|---|---|---|---|
| ERNIE-CTM-base | 128 | 768 | 12 | 23000 |
上述参数可以在仓库的模型配置类 ErnieCtmConfig 中得到印证:其默认配置即为vocab_size=23000、embedding_size=128、hidden_size=768、num_hidden_layers=12,同时还包含cls_num=2(全局观察位数量)、type_vocab_size=2等与预训练设计相关的字段。从 ErnieCtmEmbeddings 的实现可以看到,词嵌入、位置嵌入、token 类型嵌入三个 embedding 表都以embedding_size(128 维)为输出维度,随后经过 LayerNorm 与 Dropout,再由后续 12 层 Transformer 编码器投影到 768 维 hidden size——这就是"embedding 分解"在代码层面的具体落地。
输入表示:字粒度建模与全局观察位 [CLS{n}]
ERNIE-CTM 以字粒度建模,英文区分大小写,其输入表示如下:
其中,[CLS{n}]是 ERNIE-CTM 预留出的全局观察位,n从 0 开始计数。该全局观察位用于不同的训练任务,建模不同的语义特征;在下游任务中,可以结合使用,如使用 attention 筛选/融合特征,以达到更好的效果。而在灵活使用[CLS{n}]的时候,为中途增减任务 token 时不影响文本输入,所有的[CLS{n}]的位置编码均为 0,且可以使用可见性矩阵(visible matrix)控制[CLS{n}]位置的特征对序列中其他位置,以及其他的全局观察位的可见性,以获得更加灵活、独立的特征表示。
这一设计在源码中也有直接体现:ErnieCtmEmbeddings.forward 在计算位置编码时,会把前cls_num个位置的 position id 置为 0,其余文本 token 从位置 1 开始递增,与文档描述的"[CLS{n}] 位置编码均为 0"完全一致。
本次开源的 ERNIE-CTM-base 模型中,使用了两个全局观察位[CLS0]和[CLS1],具体作用见下文预训练任务介绍。
预训练任务:MLM + SOP 双任务
ERNIE-CTM 使用的预训练任务为掩码语言模型(Masked Language Model,MLM)及 ALBERT 所使用的句子顺序预测(Sentence Order Prediction,SOP)。
[CLS0]用于 SOP 任务:训练方式如 ALBERT 中描述,正例为同一篇文章中的两个连续的句子,负例为用一篇文章中两个连续的句子顺序翻转。[CLS1]作为全局监督信号,应用于 MLM 任务:训练 MLM 任务前,将[CLS1]特征表示拼接在所有的序列表示之后,通过线性层融合,成为最终的序列表示,之后预测 MLM 任务。
因此,ERNIE-CTM 最终输出的文本序列表示中,都融合了[CLS1]的特征表示。最终的序列表示带有全句的特征,一定程度上可避免序列中全局特征捕捉不足;同时,[CLS1]最终的表示中也充分融合了句子内容的信息,弥补了 SOP 任务对文本主题信息捕捉不足的缺陷。
WordTag 增量训练
在 Ernie-Ctm 微调任务中,官方提供了一个基于 WordTag 的百科知识标注任务。该任务旨在解析中文词汇的知识标注,其词性体系覆盖了所有中文词汇的词类体系,包括各类实体词与非实体词(如概念、实体/专名、语法词等)。除了使用已有的 WordTag 工具对通用中文文本进行词类知识标注,WordTag 同样支持用户使用自己的数据进行增量训练。下面是在 WordTag 模型上进行增量训练的具体示例流程。
代码结构说明
增量训练相关脚本位于仓库的 ernie-ctm 示例目录:
wordtag/ ├── data.py # 训练数据处理脚本 ├── metric.py # 模型效果验证指标脚本 ├── predict.py # 预测脚本 ├── README.md # 使用说明 ├── train.py # 训练脚本 └── utils.py # 工具函数从源码看,train.py 是训练入口,通过ErnieCtmTokenizer.from_pretrained("wordtag")加载分词器、ErnieCtmWordtagModel.from_pretrained("wordtag", num_labels=len(tags_to_idx))加载带分类头的预训练模型;data_process.py 负责将"词/标签"格式的原始数据转换为 token 序列与 BIOES 标签序列;metric.py 提供序列标注准确率及分词/词类软硬准确率等评估指标;utils.py 负责把预测的标签序列解码为带 offset、length 的标注结果。
关于模型底座需要说明的是:WordTag 模型本身是 ERNIE-CTM + CRF 的结构,预测时使用 Viterbi 解码。这一结构在 ErnieCtmWordtagModel 的源码中体现得很清晰:模型在 ERNIE-CTM 编码器之上叠加了一个tag_classifier线性分类头,并接入LinearChainCrf线性链条件随机场(训练时使用crf_loss与交叉熵之和作为损失),推理时通过ViterbiDecoder完成全局最优标签序列的搜索。
数据准备
官方提供了少数样本用以示例增量训练。执行以下命令,下载并解压示例数据集:
wget https://bj.bcebos.com/paddlenlp/datasets/wordtag_dataset_v3.tar.gz && tar -zxvf wordtag_dataset_v3.tar.gz解压之后:
data/ ├── dev.txt # 验证集 ├── tags.txt # WordTag标签集合 └── train.json # 训练数据训练样本示例如下,每个单词以/type的形式标记其词性或实体类别,单词之间使用空格作为切分标记:
砚台/物体类 与/连词 笔/物体类 、/w 墨/物体类 、/w 纸/物体类 是/肯定词 中国/世界地区类 传统/修饰词 的/助词 文房四宝/词汇用语 。/w 《/w 全球化与中国:理论与发展趋势/作品类_实体 》/w 是/肯定词 2010年/时间类 经济管理出版社/组织机构类 出版/场景事件 的/助词 图书/作品类_概念 ,/w 作者/人物类_概念 是/肯定词 余永定/人物类_实体 、/w 路爱国/人物类_实体 、/w 高海红/人物类_实体 。/w需要说明的是:源码 data_process.py 中的transfer_str_to_example实际读取的是train.txt/dev.txt(read_custom_data逐个读取行),并将其转换为字粒度 token + BIOES 标签。转换规则为:单字词标记为S-类别,多字词按B-类别 / I-类别 / E-类别逐字标记;[CLS]与[SEP]位置则统一用O填充。因此,无论 README 中提到的是train.json还是源码中的train.txt,数据内容都遵循"词/类别以空格切分"的同一格式约定。
模型训练
执行以下命令开始增量训练:
python -m paddle.distributed.launch --gpus "0" train.py \ --max_seq_len 128 \ --batch_size 32 \ --learning_rate 5e-5 \ --num_train_epochs 3 \ --logging_steps 10 \ --save_steps 100 \ --output_dir ./output \ --device "gpu"其中参数释义如下:
max_seq_length:表示最大句子长度,超过该长度将被截断。batch_size:表示每次迭代每张卡上的样本数目。learning_rate:表示基础学习率大小,将于 learning rate scheduler 产生的值相乘作为当前学习率。num_train_epochs:表示训练轮数。logging_steps:表示日志打印间隔。save_steps:表示模型保存及评估间隔。output_dir:表示模型保存路径。device:表示训练使用的设备,gpu表示使用 GPU,xpu表示使用百度昆仑卡,cpu表示使用 CPU。
结合 train.py 的源码,可以对训练流程做更深入的说明:
- 超参数与优化器:脚本还支持
weight_decay(默认 0.0)、warmup_steps(默认 0)、warmup_proportion(默认 0.0)、adam_epsilon(默认 1e-6)与seed(默认 1000)等参数。当warmup_steps > 0时优先使用绝对步数,否则使用 warmup 比例;学习率调度采用LinearDecayWithWarmup,优化器为对 bias 与 norm 参数不施加 weight decay 的 AdamW。 - 数据加载:训练与验证集分别通过
create_dataloader构建,训练模式使用DistributedBatchSampler支持多卡分布式训练,验证模式使用普通BatchSampler;batchify_fn对 input_ids、token_type_ids、seq_len、tags 分别做 Pad 与 Stack,其中标签 padding 值取tags_to_idx["O"]。 - 训练与保存:每个
save_steps会保存model_<global_step>目录(通过save_pretrained保存模型与分词器),训练结束前会在验证集上执行evaluate,输出 eval loss 与 SequenceAccuracy(忽略O标签后的标签级准确率)。
模型预测
增量训练完成后,可用以下命令对文本进行预测:
export CUDA_VISIBLE_DEVICES=0 python -m paddle.distributed.launch --gpus "0" predict.py \ --params_path ./output/model_300/model_state.pdparams \ --batch_size 32 \ --device "gpu"结合 predict.py 源码可以看到预测流程的细节:脚本加载tags.txt构造标签索引(load_dict),从预训练权重wordtag初始化ErnieCtmWordtagModel与ErnieCtmTokenizer,再通过model.set_dict(state_dict)载入增量训练得到的model_state.pdparams;推理时每个样本按字粒度切分为 tokens,经过convert_example转换后,由ErnieCtmWordtagModel前向得到序列 logits,经viterbi_decoder解码出最优标签序列,最后由 utils.py 中的decode函数将 BIOES 标签还原为词条,并利用reset_offset计算每个词在原文中的 offset 与 length。
自定义模型一键预测
Taskflow 支持加载增量训练后的模型进行一键预测,通过task_path定义用户自定义路径即可。
自定义路径下文件组成:
custom_task_path/ ├── model_state.pdparams ├── model_config.json └── tags.txt一键预测示例:
from paddlenlp import Taskflow my_wordtag = Taskflow("knowledge_mining", task_path="./custom_task_path/") my_wordtag("美人鱼是周星驰执导的一部电影") # [{'text': '美人鱼是周星驰执导的一部电影', 'items': [{'item': '美人鱼', 'offset': 0, 'wordtag_label': '作品类_实体', 'length': 3, 'termid': '作品与出版物_eb_美人鱼'}, {'item': '是', 'offset': 3, 'wordtag_label': '肯定词', 'length': 1, 'termid': '肯定否定词_cb_是'}, {'item': '周星驰', 'offset': 4, 'wordtag_label': '人物类_实体', 'length': 3, 'termid': '人物_eb_周星驰'}, {'item': '执导', 'offset': 7, 'wordtag_label': '场景事件', 'length': 2, 'termid': '场景事件_cb_执导'}, {'item': '的', 'offset': 9, 'wordtag_label': '助词', 'length': 1, 'termid': '助词_cb_的'}, {'item': '一部', 'offset': 10, 'wordtag_label': '数量词', 'length': 2}, {'item': '电影', 'offset': 12, 'wordtag_label': '作品类_概念', 'length': 2, 'termid': '影视作品_cb_电影'}]}]从 knowledge_mining.py 的实现来看,"knowledge_mining" Taskflow 对应 WordTag 词类知识标注(可叠加 term-linking),支持model="wordtag"、linking=True、with_ie=True(叠加知识模板挖掘工具 wordtag-ie)等配置。当传入task_path时,Taskflow 会从该目录加载tags.txt构建标签集合、加载model_config.json(基于ErnieCtmConfig重建配置并设置num_labels)与model_state.pdparams,实现"训练即部署"的完整闭环。默认场景下 WordTag 会利用 termtree 数据完成 term-linking,为每个词条附上termid;如果用户基于自定义 TermTree 训练模型,可参照 termtree 文档 定制词表与映射关系。
ERNIE-CTM 后续计划
- 提升预训练语料的多样性(开源版主要使用了百度百科语料),持续优化预训练模型;
- 发布其他参数量的预训练模型(tiny、large 等),便于不同场景应用;
- 维护开源社区,探索模型优化方向,整合优秀 idea。
在论文中引用 ERNIE-CTM
如果您的工作成果中使用了 ERNIE-CTM,请增加下述引用:
@article{zhao2020TermTree, title={TermTree and Knowledge Annotation Framework for Chinese Language Understanding}, author={Zhao, Min and Qin, Huapeng and Zhang, Guoxin and Lyu, Yajuan and Zhu, Yong}, technical report={Baidu, Inc. TR:2020-KG-TermTree}, year={2020} }问题与反馈
ERNIE-CTM 在持续优化中,如果您有任何建议或问题,欢迎提交 issue 到项目仓库。
- 人工智能
- 大模型
- 预训练
- 微调
- LoRA
- RLHF
- 强化学习
- 分布式训练
【免费下载链接】PaddleNLP
Easy-to-use and powerful LLM and SLM library with awesome model zoo.
相关推荐
PaddleNLP 中的 ERNIE-CTM 模型:中文文本挖掘预训练模型权重与实战指南
PaddleNLP 中的 ERNIE CTM 模型:中文文本挖掘预训练模型权重与实战指南 ERNIE CTM(ERNIE for Chinese Text Mi
人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLPPaddleNLP ERNIE-CTM 模型全解析:预训练权重、模型结构与中文文本挖掘实战
PaddleNLP ERNIE CTM 模型全解析:预训练权重、模型结构与中文文本挖掘实战 ERNIE CTM(ERNIE for Chinese Text M
人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLPPaddleNLP ERNIE-CTM 模型详解:基于 content summary 的多任务中文预训练模型实现与使用指南
PaddleNLP ERNIE CTM 模型详解:基于 content summary 的多任务中文预训练模型实现与使用指南 ERNIE CTM(ERNIE f
人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLP
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考