1. 引言
1.1 认识BART
人工智能中的BART是一个预训练的序列到序列模型,全称为“Bidirectional and Auto-Regressive Transformers”,即“兼有双向语言建模和自回归机制的Transformer”:
-
模型架构:
- BART继承了Transformer的标准架构,包含6层编码器和6层解码器。
- 编码器像BERT那样,利用掩膜机制建立双向语言模型,从而可以从两个方向对输入语句进行编码,获得更多上下文信息。
- 解码器则像GPT那样以自回归的方式产生输出,即单词的预测只能基于其左侧的上下文。 -
预训练任务:
- BART的预训练目标是破坏文档恢复,即输入被“破坏”(例如通过遮掩、删除、重排等方式)的文档,然后让模型学习恢复原始文档。
- 这种预训练过程实际上是一种去噪操作,帮助模型学习从噪声数据中提取有用信息。 -
模型特点:
- BART结合了BERT的双向编码能力和GPT的自回归生成能力,使其在文本生成和理解任务中都表现出色。
- BART的编码器使用掩膜机制,而解码器采用自回归方式,这种结合使得BART在处理各种NLP任务时具有更高的灵活性和准确性。 -
应用场景:
- BART可用于各种NLP任务,如文本摘要、问答、机器翻译等。
- 由于BART的去噪自编码特性,它在处理带有噪声或不完整的数据时表现出色。 -
变体:
- BART有两种变体,基本模型在编码器和解码器中使用6层,而大型模型则每个使用12层。这使得BART可以根据任务需求选择合适的模型大小。
BART是一种功能强大的预训练序列到序列模型,它通过结合双向编码和自回归生成的能力,在各种NLP任务中都取得了优异的性能。
1.2 自动提取文章摘要的意义
使用人工智能技术自动提取文章摘要在当今信息时代具有重要意义。这种技术不仅能够显著提升处理大量文本的效率,减少人工阅读长篇文章并提取摘要的繁琐和耗时,而且能够显著降低人力成本,提高信息处理的准确性和效率。此外,通过人工智能技术,我们可以根据用户的个人偏好和需求,自动生成符合其需求的个性化摘要,提升用户体验。在商业、政治、科研等领域,自动提取的摘要也能为决策者提供快速、准确的信息支持,帮助他们做出更明智的决策。同时,这种技术还能加快知识传播的速度和范围,不受语言限制,适应多语言和多领域的文本处理需求。总之,使用人工智能技术自动提取文章摘要在提高效率、降低成本、满足个性化需求、辅助决策和促进知识传播等方面都具有重要的应用价值。
1.3 BART自动提取文章摘要的优势和局限
BART自动提取文章摘要的优势和局限可以总结如下:
1.3.1 优势
-
高效性:
- BART基于深度学习架构,能够快速处理大规模文本数据,极大地提高了信息处理的效率。
- 相比人工提取摘要,BART能在短时间内完成大量文章的摘要提取,节省了人力成本和时间。 -
准确性:
- BART通过去噪自编码预训练任务,学会了从噪声数据中提取有用信息,从而提高了摘要的准确性。
- BART的双向编码器和自回归解码器架构使其能够同时利用文本的上下文信息,生成更加准确、连贯的摘要。 -
创造性:
- 作为生成式摘要模型,BART不仅提取文章的关键信息,还能以创造性的方式重新组织这些信息,生成具有逻辑和流畅性的新文本。 -
适应性强:
- BART可以应用于多种语言和领域的文本处理任务中,包括新闻、科技、医学等领域的文章。 -
可扩展性:
- BART基于Hugging Face的Transformers库进行实现,易于与其他NLP工具和模型进行集成和扩展。
1.3.2 局限
-
对长文本的处理能力:
- 对于非常长的文本,BART可能会面临处理能力的挑战,生成的摘要可能无法全面反映原文的主要信息。 -
对原文理解的深度:
- 尽管BART能够生成高质量的摘要,但其对原文的理解仍然有限,特别是在处理复杂语境和抽象概念时。 -
摘要的多样性:
- 由于BART是基于预训练模型进行工作的,其生成的摘要可能会受到训练数据的影响,导致摘要的多样性和创新性受限。 -
对特定领域的适应性:
- 对于某些特定领域的文本(如专业术语丰富的领域),BART可能需要额外的领域适应训练才能生成准确的摘要。 -
模型的复杂性:
- BART模型的结构相对复杂,需要较高的计算资源和时间进行训练和推理。
综合来看,BART自动提取文章摘要在高效性、准确性、创造性、适应性和可扩展性等方面具有显著优势,但在处理长文本、理解原文深度、摘要多样性、特定领域适应性和模型复杂性等方面仍存在一定的局限。随着技术的不断进步和发展,这些局限有望在未来得到改进和优化。
2. BART抓取文章摘要的过程
在信息爆炸的时代,迅速把握长篇文档或对话的核心内容,并将其浓缩成几句话的摘要变得至关重要。鉴于摘要在众多领域的广泛应用,近年来它已成为自然语言处理(NLP)领域中的一个核心且备受关注的任务。
双向自回归转换器(BART)作为一种基于Transformer的编码器-解码器模型,在序列到序列的任务中表现出色,特别是摘要生成和神经机器翻译等领域。BART通过在大规模文本语料库上进行自监督预训练来学习语言知识。在预训练阶段,文本会被故意“破坏”,而BART的任务则是恢复这些被破坏的文本,从而成为一个强大的“去噪自编码器”。预训练任务通常包括遮盖部分词汇、删除词汇、打乱句子顺序等,以训练BART的重建能力。
在本例中,我们将展示如何利用KerasNLP框架对BART模型进行微调,使其专注于对话的抽象摘要生成任务。经过微调后,这个模型将能够自动为对话生成简洁准确的摘要。
2.1 准备及设置
2.1.1 安装必要的支持库
!pip install git+https://github.com/keras-team/keras-nlp.git py7zr -q
Keras 3 提供了跨多个深度学习框架的兼容性,包括 “tensorflow”、“jax” 和 “torch”。通过 KerasNLP,您可以轻松地在这些后端之间切换,只需设置 “KERAS_BACKEND” 环境变量即可。在下面的示例中,我们将展示如何使用 JAX 作为后端来微调 BART 模型以执行对话的摘要生成任务。
import os
os.environ["KERAS_BACKEND"] = "jax"
import py7zr
import time
import keras_nlp
import keras
import tensorflow as tf
import tensorflow_datasets as tfds
2.1.2 设置超参数
BATCH_SIZE = 8
NUM_BATCHES = 600
EPOCHS = 1 # Can be set to a higher value for better results
MAX_ENCODER_SEQUENCE_LENGTH = 512
MAX_DECODER_SEQUENCE_LENGTH = 128
MAX_GENERATION_LENGTH = 40
-
BATCH_SIZE = 8
: 这表示每次训练迭代(即每次梯度更新)中将使用8个样本。较小的批量大小可以加快训练过程,但可能不会充分利用GPU的并行能力,而较大的批量大小可以提高GPU利用率,但可能会增加内存需求和训练时间。 -
NUM_BATCHES = 600
: 这表示训练数据将被分成600个批次。这个参数通常与BATCH_SIZE
一起使用来确定训练数据集的大小。如果数据集很大,这个值可能需要相应增加。 -
EPOCHS = 1
: 这表示整个训练数据集将被遍历一次。在实践中,通常需要多个周期(epochs)来训练模型以获得更好的结果。EPOCHS
的值可以根据模型的收敛情况和训练时间进行调整。 -
MAX_ENCODER_SEQUENCE_LENGTH = 512
: 这表示编码器(encoder)将处理的最大输入序列长度为512。任何超过这个长度的序列将被截断,或者如果使用填充(padding),则较短的序列将被填充到这个长度。 -
MAX_DECODER_SEQUENCE_LENGTH = 128
: 这表示解码器(decoder)将生成的最大输出序列长度为128。这通常用于控制生成文本的长度。 -
MAX_GENERATION_LENGTH
: 这个参数没有赋值,但它可能用于控制生成文本的最大长度,特别是在解码阶段或在生成文本时。
这些参数通常需要根据具体的任务和数据集进行调整,以达到最佳的训练效果。如果EPOCHS
设置得太低,模型可能没有足够的时间学习数据中的模式。如果BATCH_SIZE
或NUM_BATCHES
设置得不合适,可能会导致训练效率低下或内存问题。序列长度的参数需要根据输入和输出数据的实际长度来设置。
2.2 数据预处理
2.2.1 载入数据集
请加载SAMSum数据集,它包含了大约15,000组对话及其对应的摘要。
import os
import py7zr
import tensorflow_datasets as tfds
from tensorflow.keras.utils import get_file
# 设置一个你有写权限的目录来存放解压后的文件
EXTRACT_DIR = "/path/to/your/extracted/data" # 修改为你自己的目录
# 确保目录存在
if not os.path.exists(EXTRACT_DIR):
os.makedirs(EXTRACT_DIR)
# 下载数据集
try:
filename = get_file(
"corpus.7z",
origin="https://huggingface.co/datasets/samsum/resolve/main/data/corpus.7z",
cache_dir=EXTRACT_DIR # 可选,指定下载文件缓存的目录
)
print(f"Dataset downloaded to {
filename}")
except Exception as e:
print(f"Error downloading dataset: {
e}")
exit