自动摘要生成指南——孟子模型下游任务微调
澜舟科技日前开源发布了轻量级中文预训练语言模型——孟子模型。相比于市面上已有的中文预训练模型,孟子模型具有轻量化和易部署的特点,性能上超越同等规模甚至更大规模的模型。此外,孟子模型采用通用接口、功能齐全、覆盖任务广,不仅可用于常规的语言理解和生成任务,亦可应用于金融垂直领域和多模态场景中。
本文由澜舟科技工程师杨二光撰写,以文本摘要任务为例,展示孟子预训练模型在下游任务上微调的流程。
自动文摘
自动文摘的目的是通过对原文本进行压缩、提炼,为用户供简明扼要的文字描述。自动文摘是一个信息压缩过程,将输入的一篇或多篇文档内容总结为一段简要描述。该过程中不可避免会有信息损失,但是要求保留尽可能多的重要信息。自动文摘也是自然语言生成领域中的一个重要任务。
本文中,我们以文本摘要任务为例,展示孟子预训练模型在下游任务上微调的流程。整体流程可以分为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")
数据集的具体信息如下:
每条数据包含三个字段:id,title,abst,其中id是唯一标识;abst是文本描述,也是摘要任务的输入;title是文本标题,也是摘要任务的期望输出。
02
数据预处理
数据预处理的目的是将原始数据处理为模型可以接受的输入形式,相当于在原始数据和模型输入之间建立管道。
模型输入,可接受的字段为input_ids、labels,其中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)
returnscore
def 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
最新评论
推荐文章
作者最新文章
你可能感兴趣的文章
Copyright Disclaimer: The copyright of contents (including texts, images, videos and audios) posted above belong to the User who shared or the third-party website which the User shared from. If you found your copyright have been infringed, please send a DMCA takedown notice to [email protected]. For more detail of the source, please click on the button "Read Original Post" below. For other communications, please send to [email protected].
版权声明:以上内容为用户推荐收藏至CareerEngine平台,其内容(含文字、图片、视频、音频等)及知识版权均属用户或用户转发自的第三方网站,如涉嫌侵权,请通知[email protected]进行信息删除。如需查看信息来源,请点击“查看原文”。如需洽谈其它事宜,请联系[email protected]。
版权声明:以上内容为用户推荐收藏至CareerEngine平台,其内容(含文字、图片、视频、音频等)及知识版权均属用户或用户转发自的第三方网站,如涉嫌侵权,请通知[email protected]进行信息删除。如需查看信息来源,请点击“查看原文”。如需洽谈其它事宜,请联系[email protected]。