当前位置:   article > 正文

AGI 之 【Hugging Face】 的【文本摘要】的 [评估PEGASUS ] / [ 微调PEGASUS ] / [生成对话摘要] 的简单整理

AGI 之 【Hugging Face】 的【文本摘要】的 [评估PEGASUS ] / [ 微调PEGASUS ] / [生成对话摘要] 的简单整理

AGI 之 【Hugging Face】 的【文本摘要】的 [评估PEGASUS ] / [ 微调PEGASUS ] / [生成对话摘要]  的简单整理

目录

AGI 之 【Hugging Face】 的【文本摘要】的 [评估PEGASUS ] / [ 微调PEGASUS ] / [生成对话摘要]  的简单整理

一、简单介绍

二、文本摘要

三、在CNN/DailyMail数据集上评估PEGASUS

四、训练摘要模型

1、评估PEGASUS在SAMSum上的性能

2、微调PEGASUS

3、生成对话摘要


一、简单介绍

AGI,即通用人工智能(Artificial General Intelligence),是一种具备人类智能水平的人工智能系统。它不仅能够执行特定的任务,而且能够理解、学习和应用知识于广泛的问题解决中,具有较高的自主性和适应性。AGI的能力包括但不限于自我学习、自我改进、自我调整,并能在没有人为干预的情况下解决各种复杂问题。

  • AGI能做的事情非常广泛:

    跨领域任务执行:AGI能够处理多领域的任务,不受限于特定应用场景。
    自主学习与适应:AGI能够从经验中学习,并适应新环境和新情境。
    创造性思考:AGI能够进行创新思维,提出新的解决方案。
    社会交互:AGI能够与人类进行复杂的社会交互,理解情感和社会信号。

  • 关于AGI的未来发展前景,它被认为是人工智能研究的最终目标之一,具有巨大的变革潜力:

    技术创新:随着机器学习、神经网络等技术的进步,AGI的实现可能会越来越接近。
    跨学科整合:实现AGI需要整合计算机科学、神经科学、心理学等多个学科的知识。
    伦理和社会考量:AGI的发展需要考虑隐私、安全和就业等伦理和社会问题。
    增强学习和自适应能力:未来的AGI系统可能利用先进的算法,从环境中学习并优化行为。
    多模态交互:AGI将具备多种感知和交互方式,与人类和其他系统交互。

Hugging Face作为当前全球最受欢迎的开源机器学习社区和平台之一,在AGI时代扮演着重要角色。它提供了丰富的预训练模型和数据集资源,推动了机器学习领域的发展。Hugging Face的特点在于易用性和开放性,通过其Transformers库,为用户提供了方便的模型处理文本的方式。随着AI技术的发展,Hugging Face社区将继续发挥重要作用,推动AI技术的发展和应用,尤其是在多模态AI技术发展方面,Hugging Face社区将扩展其模型和数据集的多样性,包括图像、音频和视频等多模态数据。

  • 在AGI时代,Hugging Face可能会通过以下方式发挥作用:

        模型共享:作为模型共享的平台,Hugging Face将继续促进先进的AGI模型的共享和协作。
        开源生态:Hugging Face的开源生态将有助于加速AGI技术的发展和创新。
        工具和服务:提供丰富的工具和服务,支持开发者和研究者在AGI领域的研究和应用。
        伦理和社会责任:Hugging Face注重AI伦理,将推动负责任的AGI模型开发和应用,确保技术进步同时符合伦理标准。

AGI作为未来人工智能的高级形态,具有广泛的应用前景,而Hugging Face作为开源社区,将在推动AGI的发展和应用中扮演关键角色。

(注意:以下代码运行,可能需要科学上网)

二、文本摘要

你可能曾经需要总结一份文件,包括研究文章、财务收益报告、一系列电子邮件。如果你仔细思考,这需要一系列的能力,包括理解长篇内容、推理内容、然后产生一段流畅的、包括原始文档主要主题的文本。此外,准确地总结新闻文章与总结法律合同非常不同,因此需要复杂的领域泛化能力。出于这些原因,总结文本(专业术语为文本摘要)对于神经语言模型,包括Transformer模型来说是一项困难的任务。尽管面临这些挑战,文本摘要因为能够显著加速领域专家的工作流程,企业可以通过文本摘要压缩内部知识、总结合同、自动生成社交媒体发布内容等。因此文本摘要NLP任务很有价值。

为了帮助你理解相关的挑战,本节将探讨如何利用Transformer预训练模型来进行文本摘要。摘要是一种经典的序列到序列(seq2seq)任务,需要输入文本和目标文本。

文本摘要是一种自然语言处理任务,其目标是从一个长文本中提取出简洁、重要的信息,生成一个简短的版本。文本摘要可以分为两种主要类型:抽取式摘要和生成式摘要。

  • 抽取式摘要

抽取式摘要通过选择原始文本中的重要句子或段落,直接提取这些内容作为摘要。这种方法不改变原始文本中的词语和句子结构。

实现原理:

  1.     特征提取:首先,需要提取文本的各种特征,例如词频、句子位置、关键词、命名实体等。
  2.     重要性评分:基于提取的特征,计算每个句子的得分,以确定其重要性。
  3.     句子选择:根据重要性得分,选择最重要的句子来构建摘要。

难点:

  1.     重要性衡量:如何准确衡量句子的相对重要性。
  2.     冗余消除:避免选择内容重复的句子。

实现方式:

  1.     基于规则的方法:使用预定义的规则和统计方法来选择句子。
  2.     机器学习方法:使用有监督的学习算法,根据训练数据学习如何选择重要句子。
  • 生成式摘要

生成式摘要通过理解原始文本并生成新的句子来概括其内容。这种方法可以创建更为自然和连贯的摘要,但也更加复杂。

实现原理:

  1.     编码器-解码器架构:使用序列到序列(Seq2Seq)模型,其中编码器将输入文本编码成上下文向量,解码器根据上下文向量生成摘要。
  2.     注意力机制:在解码过程中,模型可以关注输入文本的不同部分,从而生成更相关的内容。
  3.     预训练模型:使用预训练的语言模型(如BERT、GPT等)来提高生成摘要的质量。

难点:

  1.     内容连贯性:生成的摘要需要保持逻辑连贯,避免内容断裂。
  2.     信息完整性:确保生成的摘要包含原始文本中的关键信息。
  3.     模型复杂度:生成式摘要模型通常比抽取式摘要模型更复杂,需要更多的计算资源和训练数据。

实现方式:

  1.     经典的 Seq2Seq 模型:如基于 LSTM 的编码器-解码器模型。
  2.     预训练的 Transformer 模型:如 BERTSUM、T5、BART 等。
  • Hugging Face 中的文本摘要

Hugging Face 提供了多种预训练模型和工具,可以方便地实现文本摘要任务。以下是一些常用的文本摘要模型和使用方法:

  1.  使用预训练模型进行摘要

以下是使用 Hugging Face 提供的 BART 模型进行文本摘要的示例代码:

  1. from transformers import BartForConditionalGeneration, BartTokenizer
  2. # 加载预训练的BART模型和对应的tokenizer
  3. model_name = "facebook/bart-large-cnn"
  4. model = BartForConditionalGeneration.from_pretrained(model_name)
  5. tokenizer = BartTokenizer.from_pretrained(model_name)
  6. # 输入文本
  7. input_text = """Your text to summarize goes here."""
  8. # 对输入文本进行tokenize,并添加必要的模型输入
  9. inputs = tokenizer([input_text], max_length=1024, return_tensors='pt')
  10. # 使用模型生成摘要
  11. summary_ids = model.generate(inputs['input_ids'], num_beams=4, max_length=150, early_stopping=True)
  12. # 将生成的token序列转换回文本
  13. summary = tokenizer.decode(summary_ids[0], skip_special_tokens=True)
  14. print(summary)
  1. 支持的摘要模型

Hugging Face 提供了多种用于文本摘要的预训练模型,包括但不限于:

  1.     BART (facebook/bart-large-cnn)
  2.     T5 (t5-small, t5-base, t5-large, t5-3b, t5-11b)
  3.     PEGASUS (google/pegasus-xsum, google/pegasus-cnn_dailymail)
  •     训练自己的摘要模型

如果需要更好地适应特定领域的文本摘要任务,可以使用自己的数据集对预训练模型进行微调。以下是一个简单的微调示例:

  1. from transformers import Trainer, TrainingArguments, BartForConditionalGeneration, BartTokenizer
  2. from datasets import load_dataset
  3. # 加载数据集
  4. dataset = load_dataset("cnn_dailymail", "3.0.0")
  5. # 加载预训练的BART模型和tokenizer
  6. model_name = "facebook/bart-large-cnn"
  7. model = BartForConditionalGeneration.from_pretrained(model_name)
  8. tokenizer = BartTokenizer.from_pretrained(model_name)
  9. # 数据预处理
  10. def preprocess_function(examples):
  11. inputs = [doc for doc in examples['article']]
  12. model_inputs = tokenizer(inputs, max_length=1024, truncation=True)
  13. # 设定摘要作为目标
  14. with tokenizer.as_target_tokenizer():
  15. labels = tokenizer(examples['highlights'], max_length=150, truncation=True)
  16. model_inputs['labels'] = labels['input_ids']
  17. return model_inputs
  18. tokenized_dataset = dataset.map(preprocess_function, batched=True)
  19. # 定义训练参数
  20. training_args = TrainingArguments(
  21. output_dir="./results",
  22. evaluation_strategy="epoch",
  23. learning_rate=2e-5,
  24. per_device_train_batch_size=4,
  25. per_device_eval_batch_size=4,
  26. num_train_epochs=3,
  27. weight_decay=0.01,
  28. )
  29. # 使用Trainer进行训练
  30. trainer = Trainer(
  31. model=model,
  32. args=training_args,
  33. train_dataset=tokenized_dataset["train"],
  34. eval_dataset=tokenized_dataset["validation"],
  35. )
  36. trainer.train()

文本摘要是一个复杂且具有挑战性的自然语言处理任务。通过使用 Hugging Face 提供的预训练模型和工具,可以大大简化文本摘要的实现过程。用户可以根据具体需求选择合适的模型,进行微调,以获得最佳的摘要效果。

在本节中,我们将建立自己的编码器-解码器模型,将多人对话压缩成简明的摘要。但在此之前,我们先来看看摘要领域中一个经典数据集:CNN/DailyMail语料库。

三、在CNN/DailyMailPEGASUS

现在充分评估模型的条件都齐全了:我们拥有CNN/DailyMail测试集数据集、评估用的ROUGE指标,以及一个摘要模型。

  1. # 导入所需的库
  2. import matplotlib.pyplot as plt # 导入 matplotlib.pyplot,用于绘制图形
  3. import pandas as pd # 导入 pandas,用于数据处理
  4. from datasets import load_dataset, load_metric # 从 datasets 库中导入 load_dataset 和 load_metric 函数
  5. from transformers import AutoModelForSeq2SeqLM, AutoTokenizer # 从 transformers 库中导入 AutoModelForSeq2SeqLM 和 AutoTokenizer
  6. # 加载 CNN/DailyMail 数据集,版本为 3.0.0
  7. dataset = load_dataset("cnn_dailymail", "3.0.0")
  8. # 加载 ROUGE 评价指标,用于计算文本摘要的质量
  9. rouge_metric = load_metric("rouge", cache_dir=None)
  10. # 定义要计算的 ROUGE 分数的名称列表
  11. rouge_names = ["rouge1", "rouge2", "rougeL", "rougeLsum"]

我们只需要把这些部分组合起来。首先,我们评估三句话基准模型的性能:

  1. # 定义一个函数,用于评估基线模型生成的摘要
  2. def evaluate_summaries_baseline(dataset, metric, column_text="article", column_summary="highlights"):
  3. # 使用 three_sentence_summary 函数对数据集中的每篇文章生成摘要
  4. summaries = [three_sentence_summary(text) for text in dataset[column_text]]
  5. # 将生成的摘要和参考摘要添加到评价指标中
  6. metric.add_batch(predictions=summaries, references=dataset[column_summary])
  7. # 计算评价指标的分数
  8. score = metric.compute()
  9. # 返回评价指标的分数
  10. return score

然后我们把该函数应用于数据的一个子集。由于CNN/DailyMail数据集的测试部分包含大约10 000个样本,生成所有这些文章的摘要需要很多时间。回顾第5章,每个生成的词元都需要通过模型进行前向传递。为每个样本生成100个词元将需要100万次前向传递,如果我们使用束搜索,则此数字还需要乘以束的数量。为了让计算更快一些,我们将对测试集进行子采样,最终使用1000个样本进行评估。这样我们使用单个GPU上不到一小时就能完成PEGASUS模型的评估,而且得到稳定的分数估计:

  1. # 从测试集中随机抽取1000条样本,用于评估
  2. test_sampled = dataset["test"].shuffle(seed=42).select(range(1000))
  3. # 使用基线模型生成摘要并评估其质量
  4. score = evaluate_summaries_baseline(test_sampled, rouge_metric)
  5. # 将评价指标的分数存储在字典中
  6. rouge_dict = dict((rn, score[rn].mid.fmeasure) for rn in rouge_names)
  7. # 将评价指标的分数转换为DataFrame格式,并转置以便显示
  8. pd.DataFrame.from_dict(rouge_dict, orient="index", columns=["baseline"]).T

运行结果:

 rouge1rouge2rougeLrougeLsum
baseline0.389280.1712960.2450610.354239

分数大多数比上一个示例差,但仍然比GPT-2实现的分数要好!现在我们依样画葫芦来评估PEGASUS模型:

  1. # 导入 tqdm 模块,用于显示进度条
  2. from tqdm import tqdm
  3. # 导入 torch 模块,用于使用 GPU 或 CPU 进行计算
  4. import torch
  5. # 设置设备为 GPU(如果可用)或 CPU
  6. device = "cuda" if torch.cuda.is_available() else "cpu"
  7. def chunks(list_of_elements, batch_size):
  8. """将 list_of_elements 按 batch_size 切分成多个小块"""
  9. for i in range(0, len(list_of_elements), batch_size):
  10. yield list_of_elements[i : i + batch_size]
  11. def evaluate_summaries_pegasus(dataset, metric, model, tokenizer,
  12. batch_size=16, device=device,
  13. column_text="article",
  14. column_summary="highlights"):
  15. """评估使用 Pegasus 模型生成的摘要"""
  16. # 将文章和摘要分别按 batch_size 切分成多个小块
  17. article_batches = list(chunks(dataset[column_text], batch_size))
  18. target_batches = list(chunks(dataset[column_summary], batch_size))
  19. # 使用 tqdm 显示进度条,遍历每个文章批次和相应的摘要批次
  20. for article_batch, target_batch in tqdm(
  21. zip(article_batches, target_batches), total=len(article_batches)):
  22. # 对文章批次进行标记,将其转换为模型输入的张量
  23. inputs = tokenizer(article_batch, max_length=1024, truncation=True,
  24. padding="max_length", return_tensors="pt")
  25. # 使用 Pegasus 模型生成摘要
  26. summaries = model.generate(input_ids=inputs["input_ids"].to(device),
  27. attention_mask=inputs["attention_mask"].to(device),
  28. length_penalty=0.8, num_beams=8, max_length=128)
  29. # 解码生成的摘要,将其从张量转换为字符串
  30. decoded_summaries = [tokenizer.decode(s, skip_special_tokens=True,
  31. clean_up_tokenization_spaces=True)
  32. for s in summaries]
  33. decoded_summaries = [d.replace("", " ") for d in decoded_summaries]
  34. # 将生成的摘要和目标摘要添加到评价指标中
  35. metric.add_batch(predictions=decoded_summaries, references=target_batch)
  36. # 计算评价指标分数
  37. score = metric.compute()
  38. return score

我们来详细解释一下这段评估代码。首先,我们将数据集分成较小的批量,以便可以同时处理。然后对于每个批量,我们对输入文章进行词元化,然后将它们提供给generate()函数,使用束搜索生成摘要。我们使用论文中的相同生成参数。惩罚参数新的长度确保模型不会生成过长的序列。最后,我们解码生成文本,替换<n>词元,并将解码的文本与参考文本一起添加到度量中。最后,我们计算并返回ROUGE分数。现在,我们再次使用用于seq2seq生成任务的AutoModelForSeq2SeqLM类来加载模型,并对其进行评估:

  1. # 从 transformers 库中导入用于序列到序列任务的模型和标记器
  2. from transformers import AutoModelForSeq2SeqLM, AutoTokenizer
  3. # 设置模型检查点名称,使用 Google 的 PEGASUS 模型,预训练于 CNN/DailyMail 数据集
  4. model_ckpt = "google/pegasus-cnn_dailymail"
  5. # 从预训练的模型检查点中加载标记器和模型,并将模型移动到指定的设备(CPU 或 GPU)
  6. tokenizer = AutoTokenizer.from_pretrained(model_ckpt)
  7. model = AutoModelForSeq2SeqLM.from_pretrained(model_ckpt).to(device)
  8. # 使用评估函数 evaluate_summaries_pegasus 评估 PEGASUS 模型生成的摘要
  9. # 输入参数包括测试数据、ROUGE 评价指标、模型、标记器和批处理大小
  10. score = evaluate_summaries_pegasus(test_sampled, rouge_metric,
  11. model, tokenizer, batch_size=8)
  12. # 从评估结果中提取 ROUGE 分数,将其转换为字典格式,其中键为 ROUGE 指标名称,值为 F-measure 分数
  13. rouge_dict = dict((rn, score[rn].mid.fmeasure) for rn in rouge_names)
  14. # 将 ROUGE 分数字典转换为 pandas 数据框,并以 "pegasus" 作为索引
  15. pd.DataFrame(rouge_dict, index=["pegasus"])

运行结果:

(这里暂时报错:

TypeError: Couldn't build proto file into descriptor pool: duplicate file name sentencepiece_model.proto

,使用例子参考的运行结果如下)

 rouge1rouge2rougeLrougeLsum
pegasus0.434380.2108830.3071950.373231

这些数字非常接近论文中的结果。这里需要注意的是,损失和每个词元的准确率在某种程度上与ROUGE分数解耦。损失与解码策略无关,而ROUGE分数则强耦合。

由于ROUGE和BLEU比人工评估的损失或准确率更好,因此在构建文本生成模型时应重点关注它们,并仔细探索和选择解码策略。然而,这些指标远非完美,因此应始终考虑人工评估。

现在我们已经有了评估函数,可以训练我们自己的摘要模型了。

四、

至此,我们已经仔细研究了文本摘要和评估的许多细节,现在我们使用这些知识来训练一个自定义的文本摘要模型!对于我们这个自定义应用,我们将使用三星开发的SAMSum数据集(https://oreil.ly/n1ggq),该数据集包含了一系列对话以及简短的摘要。这些对话可以代表客户与客服中心之间的互动,并以此生成准确的摘要以帮助改善客户服务,并检测客户请求中的常见模式。我们先加载数据集并查看一个样本:

  1. # 从 datasets 库中导入用于加载数据集的函数
  2. from datasets import load_dataset
  3. # 加载 SamSum 数据集,该数据集包含对话和相应的摘要
  4. dataset_samsum = load_dataset("samsum",trust_remote_code=True)
  5. # 获取数据集的每个划分(训练集、验证集、测试集)的长度,并存储在列表 split_lengths 中
  6. split_lengths = [len(dataset_samsum[split]) for split in dataset_samsum]
  7. # 打印每个数据集划分的长度
  8. print(f"Split lengths: {split_lengths}")
  9. # 打印训练集中列的名称(特征)
  10. print(f"Features: {dataset_samsum['train'].column_names}")
  11. # 打印测试集中第一个对话样本
  12. print("\nDialogue:")
  13. print(dataset_samsum["test"][0]["dialogue"])
  14. # 打印测试集中第一个对话样本的摘要
  15. print("\nSummary:")
  16. print(dataset_samsum["test"][0]["summary"])

(注意:可能需要安装 py7zr,pip install py7zr)

运行结果:

Split lengths: [14732, 819, 818]
Features: ['id', 'dialogue', 'summary']

Dialogue:
Hannah: Hey, do you have Betty's number?
Amanda: Lemme check
Hannah: <file_gif>
Amanda: Sorry, can't find it.
Amanda: Ask Larry
Amanda: He called her last time we were at the park together
Hannah: I don't know him well
Hannah: <file_gif>
Amanda: Don't be shy, he's very nice
Hannah: If you say so..
Hannah: I'd rather you texted him
Amanda: Just text him 
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/822163
推荐阅读
相关标签