🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎
📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝
📣系列专栏 - 机器学习【ML】 自然语言处理【NLP】 深度学习【DL】
🖍foreword
✔说明⇢本人讲解主要包括Python、机器学习(ML)、深度学习(DL)、自然语言处理(NLP)等内容。
如果你对这个系列感兴趣的话,可以关注订阅哟👋
文章目录
一、什么是中文PEGASUS模型?
中文Pegasus模型是一种基于Transformer的预训练模型,用于文本生成任务,如摘要生成和文章重写。Pegasus模型最初由Google开发,是一种通用文本生成模型,但目前也有一些研究团队在中文NLP领域上对其进行了改进和调整。
中文Pegasus模型的主要结构与英文Pegasus相似,包括一个编码器和一个解码器,其中编码器将输入的文本编码成向量表示,解码器则将编码后的信息解码为所需的输出文本。不同于原始的Pegasus模型使用的是BERT编码器,中文Pegasus模型使用的是RoBERTa模型作为编码器,以更好地适应中文语言特点。此外,在训练中加入了针对中文文本的Masked Language Model(MLM)任务和Next Sentence Prediction(NSP)任务,进一步提高了模型的性能。
中文Pegasus模型可以被用于自然语言处理中的多项任务,例如文本摘要、长文本生成、问答系统等。同时,在一些特定情况下,中文Pegasus模型也能够作为一个有效的语言生成模型使用,如生成对话和生成诗歌等。
需要注意的是,中文Pegasus模型是一个比较大的模型,需要较大的计算资源和时间来训练和使用,同时也需要大量的数据来进行预训练。
二、中文PEGASUS模型的应用
中文PEGASUS模型可应用于多个自然语言处理任务,以下是一些常见的应用场景:
-
文本摘要:中文PEGASUS模型可以生成高质量的摘要,可以帮助用户快速阅读大量的文本内容,提高工作效率。在新闻、科技、金融等领域中,文本摘要非常有用,可以让读者更好地了解文章的主要内容。
-
文章重写:中文PEGASUS模型可以通过对输入文本进行改写,生成新的文本,使得新的文本保留原始的意思,但在结构、句子和词汇上与原始文本不同。这在生成新闻报道、创作小说等场景中非常有用。
-
问答系统:中文PEGASUS模型可以根据输入的问题生成相应答案,可以为用户提供指导、建议和信息。在智能客服、在线教育、医疗问答等领域中,问答系统非常有用。
-
对话生成:中文PEGASUS模型可以生成自然流畅的对话,模拟人类的语言交互,可以应用在智能语音助手、聊天机器人等领域中,为用户提供更加便捷的服务和体验。
-
生成诗歌:中文PEGASUS模型可以创作各种形式的诗歌,如唐诗、宋词、现代诗等,可以应用于文学创作、艺术教育等领域中。
除此之外,中文PEGASUS模型还可用于生成广告文案、电商推荐、网站生成等多个任务。然而,在应用中要注意数据的准备、模型的选择和调试,以及应用场景中的安全和隐私问题。
三、PEGASUS模型
学生的任务通常是阅读文档并生成摘要(例如读书报告),以展示阅读理解和写作能力。这种抽象文本摘要是自然语言处理中最具挑战性的任务之一,涉及理解长段落、信息压缩和语言生成。训练机器学习模型以执行此操作的主要范例是序列到序列(seq2seq) 学习,其中神经网络学习将输入序列映射到输出序列。虽然这些 seq2seq 模型最初是使用递归神经网络开发的,但 Transformer编码器-解码器模型最近受到青睐,因为它们可以更有效地对摘要中遇到的长序列中存在的依赖项进行建模。
结合自监督预训练的 Transformer 模型(例如,BERT、GPT-2、 RoBERTa、XLNet、ALBERT、T5、ELECTRA) 已被证明是产生通用语言学习的强大框架,在对广泛的语言任务进行微调时可实现最先进的性能。在之前的工作中,预训练中使用的自我监督目标在某种程度上与下游应用无关,有利于通用性;我们想知道如果自我监督的目标更接近最终任务,是否可以实现更好的性能。
在“ PEGASUS: Pre-training with Extracted Gap-sentences for Abstractive Summarization ”(将出现在2020 年国际机器学习会议上)中,我们设计了一个预训练自监督目标(称为gap-sentence generation) 用于 Transformer 编码器-解码器模型,以提高抽象摘要的微调性能,在 12 个不同的摘要数据集上取得最先进的结果。作为本文的补充,我们还在GitHub上发布了训练代码和模型检查点。
1、自我监督的总结目标
我们的假设是预训练自监督目标越接近最终的下游任务,微调性能越好。在 PEGASUS 预训练中,从文档中删除了几个完整的句子,模型的任务是恢复它们。预训练的示例输入是缺少句子的文档,而输出由串联在一起的缺失句子组成。这是一项极其艰巨的任务,甚至对于人来说似乎也是不可能的,我们也不期望模型能够完美地解决它。然而,这样一项具有挑战性的任务鼓励模型学习语言和世界的一般事实,以及如何从整个文档中提取信息以生成与微调摘要任务非常相似的输出。
预训练期间 PEGASUS 的自我监督示例。该模型被训练为输出所有被屏蔽的句子。 |
我们发现选择“重要”的句子来屏蔽效果最好,使自监督示例的输出更类似于摘要。我们根据称为ROUGE 的指标找到与文档其余部分最相似的句子,从而自动识别这些句子。ROUGE通过使用从 0 到 100 的分数计算n-gram重叠来计算两个文本的相似性(ROUGE-1、ROUGE-2 和 ROUGE-L 是三种常见变体)。
类似于其他最近的方法,例如T5,我们在一个非常大的网络抓取文档语料库上预训练了我们的模型,然后我们在 12 个公共下游抽象摘要数据集上对模型进行了微调,从而产生了新的最先进的结果,通过自动测量指标,而仅使用 T5 参数数量的 5%。选择的数据集多种多样,包括新闻文章、科学论文、专利、短篇小说、电子邮件、法律文件和操作指南,表明该模型框架适用于广泛的主题。
2、使用少量示例进行微调
虽然 PEGASUS 在大型数据集上表现出卓越的性能,但我们惊讶地发现该模型不需要大量示例即可进行微调以接近最先进的性能:
ROUGE分数(三个变体,越高越好)与四个选定摘要数据集中的监督示例数量。虚线显示了具有完全监督但没有预训练的 Transformer 编码器-解码器性能。 |
仅使用 1000 个微调示例,我们在大多数任务中的表现都优于使用完全监督数据的强基线(Transformer 编码器-解码器),后者在某些情况下有更多数量级的示例。这种“样本效率”大大提高了文本摘要模型的实用性,因为它显着降低了监督数据收集的规模和成本,而在摘要的情况下,监督数据收集的成本非常高。
3、人类素质总结
虽然我们发现 ROUGE 等自动指标是衡量模型开发过程中进度的有用代理,但它们只提供有限的信息,并不能告诉我们整个故事,例如流畅性或与人类表现的比较。为此,我们进行了人工评估,评估者被要求将我们模型的摘要与人类模型进行比较(不知道哪个是哪个)。这与图灵测试有一些相似之处。
人类评分者被要求在不知道哪个是哪个的情况下对模型和人工编写的摘要进行评分。该文件在此处被截断以供说明,但评分者可以看到全文。 |
我们用 3 个不同的数据集进行了实验,发现人类评分者并不总是喜欢人类摘要而不是我们模型中的摘要。此外,我们仅使用 1000 个示例训练的模型的表现也差不多。特别是,通过大量研究的XSum和CNN/Dailymail数据集,该模型仅使用 1000 个示例就实现了类似人类的性能。这表明监督示例的大型数据集不再需要进行总结,从而开辟了许多低成本的用例。
4、理解测试:计算船只
在这篇文章之后是一篇示例文章来自 XSum 数据集以及模型生成的抽象摘要。该模型正确地将四艘命名的护卫舰(HMS Cumberland、HMS Campbeltown、HMS Chatham 和 HMS Cornwall)抽象和解释为“四艘皇家海军护卫舰”,这是提取方法无法做到的,因为“四”在任何地方都没有提到。这是侥幸还是模型真的算数?找出答案的一种方法是添加和删除船只以查看计数是否发生变化。
如下图所示,该模型成功地将船只“数”为 2 到 5。但是,当我们添加第六艘船“HMS Alphabet”时,它会将其误算为“7”。因此,该模型似乎已经学会了对列表中的少量项目进行计数,但还没有像我们希望的那样优雅地概括。尽管如此,我们认为这种基本的计数能力令人印象深刻,因为它没有被明确编程到模型中,并且它展示了模型的有限数量的“符号推理”。
三、中文pegasus模型的pyotrch实现
以下是中文Pegasus模型的PyTorch实现示例代码,供参考:
import torch
import torch.nn as nn
from transformers import PegasusTokenizer, PegasusForConditionalGeneration
# 加载中文Pegasus预训练模型和分词器
tokenizer = PegasusTokenizer.from_pretrained('uer/pegasus-chinese')
model = PegasusForConditionalGeneration.from_pretrained('uer/pegasus-chinese')
# 定义输入文本
input_text = '你好,世界!'
# 对文本进行编码
input_ids = tokenizer.encode(input_text, return_tensors='pt')
# 使用Pegasus模型生成摘要
generated_summary = model.generate(input_ids, max_length=256, num_beams=2, length_penalty=0.5, early_stopping=True)
# 解码生成的摘要
summary_text = tokenizer.decode(generated_summary[0], skip_special_tokens=True)
# 打印生成的摘要
print(summary_text)
解释如下:
-
首先引入了需要的包,包括PyTorch、Transformers库中的PegasusTokenizer和PegasusForConditionalGeneration。
-
利用from_pretrained()方法加载中文Pegasus预训练模型和分词器。
-
定义输入的文本信息,并使用tokenizer对文本进行编码。
-
使用Pegasus模型的generate()方法生成摘要,在此处使用了max_length、num_beams、length_penalty、early_stopping等参数来控制生成的摘要。
-
最后,使用tokenizer的decode()方法将生成的摘要进行解码,并打印生成的摘要。
需要注意的是,这只是一个中文Pegasus模型的PyTorch实现示例代码,如果需要应用到具体的任务中,需要根据具体的需求和情况进行调整和修改。同时还需要注意模型和代码的版本匹配问题,不同的版本对应的API可能会有所不同。
四、中文PEGASUS模型简单微调实现
import torch
import torch.nn as nn
from transformers import PegasusTokenizer, PegasusForConditionalGeneration, AdamW
# 加载中文Pegasus预训练模型和分词器
tokenizer = PegasusTokenizer.from_pretrained('uer/pegasus-chinese')
model = PegasusForConditionalGeneration.from_pretrained('uer/pegasus-chinese')
# 定义微调数据的输入和输出
inputs = ["中文Pegasus模型是一种预训练模型,用于文本生成任务。", "它将输入的文本编码成向量表示,再将其解码成所需的输出文本。"]
outputs = ["中文Pegasus模型是什么?", "中文Pegasus模型的主要功能是什么?"]
# 对输入和输出进行编码
input_ids = tokenizer.batch_encode_plus(inputs, max_length=1024, return_tensors='pt', pad_to_max_length=True)["input_ids"]
output_ids = tokenizer.batch_encode_plus(outputs, max_length=1024, return_tensors='pt', pad_to_max_length=True)["input_ids"]
# 定义模型的微调参数
learning_rate = 2e-5
num_epochs = 3
batch_size = 8
# 使用AdamW优化器对模型进行微调
optimizer = AdamW(model.parameters(), lr=learning_rate)
# 微调模型
for epoch in range(num_epochs):
for i in range(0, len(input_ids), batch_size):
# 在微调数据集上每个batch都进行微调
input_ids_batch = input_ids[i:i+batch_size]
output_ids_batch = output_ids[i:i+batch_size]
# 将输入和输出传入模型,计算损失
loss = model(input_ids_batch, labels=output_ids_batch).loss
# 反向传播并更新梯度
loss.backward()
optimizer.step()
optimizer.zero_grad()
print("Epoch:", epoch+1)
# 保存微调后的模型
model.save_pretrained('model_finetuned/')
解释如下:
-
首先引入了需要的包,包括PyTorch、Transformers库中的PegasusTokenizer、PegasusForConditionalGeneration和AdamW。
-
加载中文Pegasus预训练模型和分词器,并定义微调的输入和输出数据,这里使用两个列表分别表示输入和输出文本,需要注意的是,这里要保证输入和输出的数据长度相同。
-
对输入和输出进行编码,这里使用了tokenizer的batch_encode_plus()方法,将多个序列组成的列表转化为张量。
-
定义模型的微调参数,包括学习率、训练轮数和批次大小等。
-
使用AdamW优化器对模型进行微调。在每一轮训练中,遍历微调数据集并逐个batch地进行微调。首先将input_ids和output_ids分批,然后将其输入模型计算损失,反向传播并更新权重。
-
微调完成后,可以使用model.save_pretrained()方法来保存微调后的模型。
需要注意的是,这只是一个中文Pegasus模型的微调PyTorch实现示例代码,如果需要应用到具体的任务中,需要根据具体情况进行调整和修改。同时还需要注意模型和代码的版本匹配问题,不同的版本对应的API可能会有所不同。
五、概要
中文PEGASUS模型是在英伟达公司提供的深度学习云计算平台上由北大和北航等机构联合研究团队开发的。该模型使用了预训练-微调的方式进行训练,使用了Transformer网络结构,并采用了多任务联合训练的方法,针对不同的自然语言处理任务进行了优化、微调。中文PEGASUS模型以高质量的生成结果、较小的体积和优秀的泛化能力而著称,已经在多个NLP领域取得了令人瞩目的成果。
近年来,中文PEGASUS模型在各种领域和场景中被广泛应用,取得了显著的进展。与此同时,随着计算机硬件性能的不断提高和深度学习技术的不断发展,中文PEGASUS模型的性能也在不断提升和完善。例如,2021年8月,中文PEGASUS模型第一次突破了4亿参数的规模,并刷新了多个中文NLP任务的最优性能记录。
总之,中文PEGASUS模型在多个领域都有广泛的应用前景,也会持续发展和优化,将为自然语言处理和机器学习领域带来更多的创新和进步。