共计 2829 个字符,预计需要花费 8 分钟才能阅读完成。
背景介绍
BART(Bidirectional and Auto-Regressive Transformers)是一种基于 Transformer 的序列到序列模型,结合了 BERT 的双向编码器和 GPT 的自回归解码器特点。这种架构使其在文本生成任务(如摘要、对话生成等)中表现出色,能够同时理解上下文信息并流畅生成文本。

- 双向编码器 :可全面捕捉输入文本的上下文信息
- 自回归解码器 :逐词生成输出时能参考已生成内容
- 去噪预训练 :通过重构被破坏的文本学习强大表示能力
环境准备
硬件要求
- GPU:建议至少 16GB 显存(如 NVIDIA V100)
- 内存:32GB 以上
- 存储:预留 50GB 空间用于模型和数据集
Python 库安装
pip install torch transformers datasets rouge-score nltk
数据预处理
1. 数据格式标准化
文本生成任务通常需要源文本 - 目标文本对。例如摘要任务中:
{
"source": "原始长篇文章内容...",
"target": "精简摘要文本..."
}
2. Tokenization 处理
使用 BART 专用 tokenizer:
from transformers import BartTokenizer
tokenizer = BartTokenizer.from_pretrained('facebook/bart-base')
# 示例编码
inputs = tokenizer("This is a sample text.",
truncation=True,
max_length=512,
return_tensors="pt")
关键参数说明:
– truncation=True:自动截断超长文本
– max_length=512:BART 最大支持长度
– return_tensors="pt":返回 PyTorch 张量
模型配置
加载预训练模型
from transformers import BartForConditionalGeneration
model = BartForConditionalGeneration.from_pretrained('facebook/bart-base')
关键训练参数
from transformers import Seq2SeqTrainingArguments
training_args = Seq2SeqTrainingArguments(
output_dir="./results",
per_device_train_batch_size=8,
per_device_eval_batch_size=8,
num_train_epochs=3,
learning_rate=5e-5,
warmup_steps=500,
weight_decay=0.01,
logging_dir="./logs",
evaluation_strategy="steps",
eval_steps=500,
save_steps=1000,
predict_with_generate=True
)
参数优化建议:
– batch_size:根据显存调整(8-32)
– learning_rate:文本生成任务建议 3e- 5 到 5e-5
– warmup_steps:避免初期训练不稳定
训练过程
完整训练示例
from transformers import Seq2SeqTrainer
trainer = Seq2SeqTrainer(
model=model,
args=training_args,
train_dataset=tokenized_datasets["train"],
eval_dataset=tokenized_datasets["validation"],
tokenizer=tokenizer
)
trainer.train()
# 保存最佳模型
model.save_pretrained("./best_model")
tokenizer.save_pretrained("./best_model")
模型加载与推理
# 加载微调后的模型
model = BartForConditionalGeneration.from_pretrained("./best_model")
# 生成文本
outputs = model.generate(inputs["input_ids"],
max_length=150,
num_beams=4,
early_stopping=True)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
评估指标
1. BLEU 评分
from nltk.translate.bleu_score import sentence_bleu
reference = ["this is a sample".split()]
candidate = "this is a test".split()
score = sentence_bleu(reference, candidate)
print(f"BLEU score: {score:.4f}")
2. ROUGE 指标
from rouge_score import rouge_scorer
scorer = rouge_scorer.RougeScorer(['rouge1', 'rougeL'])
scores = scorer.score("generated text", "reference text")
避坑指南
常见问题与解决方案
- 问题 1:显存不足
-
解决方案:减小 batch_size,启用梯度累积
training_args = Seq2SeqTrainingArguments( gradient_accumulation_steps=4, ... ) -
问题 2:过拟合
-
解决方案:增加 dropout 率,早停策略
model.config.dropout = 0.2 model.config.attention_dropout = 0.2 -
问题 3:生成重复内容
- 解决方案:调整 beam search 参数
outputs = model.generate( ..., no_repeat_ngram_size=2, diversity_penalty=1.0 )
生产部署
模型优化
- 使用 ONNX 格式加速推理
pip install onnxruntime
部署示例
from transformers import pipeline
summarizer = pipeline("summarization",
model="./best_model",
device=0)
result = summarizer("长文本内容...")
print(result[0]['summary_text'])
结语
通过本文的实践指南,你应该已经掌握了 BART 微调的核心流程。建议尝试:
- 在不同领域数据(如新闻、科技论文)上微调
- 调整 beam search 参数观察生成效果变化
- 结合领域词典优化 tokenization
欢迎在评论区分享你的微调经验和效果对比!
正文完
