✎ 引言
澜舟科技日前开源发布了轻量级中文预训练语言模型——孟子模型。相比于市面上已有的中文预训练模型,孟子模型具有轻量化和易部署的特点,性能上超越同等规模甚至更大规模的模型。此外,孟子模型采用通用接口、功能齐全、覆盖任务广,不仅可用于常规的语言理解和生成任务,亦可应用于金融垂直领域和多模态场景中。
本文由澜舟科技工程师杨二光撰写,以文本摘要任务为例,展示孟子预训练模型在下游任务上微调的流程。
自动文摘
自动文摘的目的是通过对原文本进行压缩、提炼,为用户供简明扼要的文字描述。自动文摘是一个信息压缩过程,将输入的一篇或多篇文档内容总结为一段简要描述。该过程中不可避免会有信息损失,但是要求保留尽可能多的重要信息。自动文摘也是自然语言生成领域中的一个重要任务。
本文中,我们以文本摘要任务为例,展示孟子预训练模型在下游任务上微调的流程。整体流程可以分为4部分:
  • 数据加载
  • 数据预处理
  • 模型训练
  • 模型推理
下面通过中文科学文献数据(CSL)文本摘要数据进行演示。
数据下载地址:
https://github.com/CLUEbenchmark/CLGE
      本文示例代码地址:
https://s.langboat.com/sum
01
数据加载
CSL数据以json的形式存储,我们可以通过定义read_json函数读取数据文件,将数据加载进内存。
defread_json(input_file: str) -> list:with open(input_file, 'r') as f: lines = f.readlines()return list(map(json.loads, tqdm(lines, desc='Reading...')))train = read_json("csl/v1/train.json")dev = read_json("csl/v1/dev.json")
数据集的具体信息如下:
每条数据包含三个字段:idtitleabst,其中id是唯一标识;abst是文本描述,也是摘要任务的输入;title是文本标题,也是摘要任务的期望输出。
02
数据预处理
数据预处理的目的是将原始数据处理为模型可以接受的输入形式,相当于在原始数据和模型输入之间建立管道。
模型输入,可接受的字段为input_idslabels,其中input_ids为输入文本的tokenized表示,可以直接通过transformers提供的Tokenizer进行转换;labels为模型期望输出文本的tokenized表示。
通过定义DataCollatorForSeq2Seq数据预处理类,并将其传递给模型完成上述流程。详情见代码。
03
模型训练
训练模型前需要指定模型训练的超参数,包括训练的轮数、学习率和学习率管理策略等等。
这一点可以通过实例化TrainingArguments类来实现,接着将其传递给Trainer来传入这些超参数;然后通过huggingface定义的trainer.train()方法来进行训练,训练完成后通过trainer.save_model()方法来保存最佳模型。
Mengzi_tokenizer = T5Tokenizer.from_pretrained(model_path)Mengzi_model = T5ForConditionalGeneration.from_pretrained(model_path)trainer = Trainer(tokenizer=Mengzi_tokenizer,model=Mengzi_model,args=training_args,data_collator=collator,train_dataset=trainset,eval_dataset=devset)trainer.train()trainer.save_model("test/best")
04
模型推理
最佳模型保存在了"test/best"位置,我们可以加载最佳模型并利用其进行摘要生成。
下面是我们利用模型进行推理的一种实现方式,将希望简化的文本tokenized后传入模型,得到经过tokenizer解码后即可获得摘要后的文本。当然,读者也可以利用自己熟悉的方式进行生成。
defpredict(sources, batch_size=8): _model = model.eval() #将模型转换为预测模式,使模型内部的droput失效。 kwargs = {"num_beams":4} outputs = []for start in tqdm(range(0, len(sources), batch_size)): batch = sources[start:start+batch_size] input_tensor = tokenizer(batch, return_tensors="pt", truncation=True, padding=True, max_length=512).input_ids.cuda() outputs.extend(model.generate(input_ids=input_tensor, **kwargs))return tokenizer.batch_decode(outputs, skip_special_tokens=True)
05

生成结果评测
采用自动文摘任务上常用的自动评测指标Rouge-1, Rouge-2, Rouge-L对生成文本的质量进行评测。
def rouge_score(candidate, reference): text1 = " ".join(list(candidate)) text2 = " ".join(list(reference)) score = rouge.get_scores(text1, text2) print(score)returnscoredef compute_rouge(preds, refs): r1=[] r2=[] R_L=[]for pred, refinzip(preds, refs): score = rouge_score(pred, ref) r1.append(scores[0]["rouge-1"]["f"]) r2.append(scores[0]["rouge-2"]["f"]) R_L.append(scores[0]["rouge-l"]["f"])return sum(r1)/len(r1), sum(r2)/len(r2), sum(R_L)/len(R_L)R_1, R_2, R_L = compute_rouge(generations, titles)
孟子开源社区
澜舟科技拥抱开源文本,期待跟社区一起成长。首次发布的模型发布均为base的alpha版本,对于不完善的地方欢迎反馈!除本文提到的技术细节以外,还有许多正在深入研究的前沿技术。经严谨评测稳定版本后,我们将会进一步开源发布最新成果。

孟子模型发布后,我们收到了许多反馈。为更好地回馈社区,我们在GitHub整理了常见问题的FAQ,并将不断更新,欢迎保持持续关注和反馈建议!
孟子预训练模型开源项目
澜舟科技已将孟子中文预训练系列模型开源!全面覆盖文本理解、文本生成、金融、多模态等不同技术应用领域。希望与开源社区一起让新一代文本智能技术落地各行各业,推动下一波认知智能生产力进化的浪潮。
扫码加入孟子开源社区微信群

直接访问开源项目地址

https://github.com/Langboat/Mengzi
访问澜舟科技官方网站
https://langboat.com

继续阅读
阅读原文