微调脚本(Fine-Tuning Script) 是用来对预训练的模型进行 任务特定的调整,以便使其在某个特定的任务(如文本分类、情感分析、命名实体识别等)上表现得更好。微调是迁移学习中的一部分,通常是在预训练模型的基础上进行少量的额外训练,以便模型能适应新的任务和数据。
Hugging Face Transformers 库提供了非常简洁和高效的微调脚本。你只需要准备好数据和模型,使用 Hugging Face 的 Trainer
API 就可以方便地完成微调。
微调脚本的步骤
下面是一个简单的微调脚本的基本结构。我们将以 文本分类任务 为例,使用一个预训练的 BERT 模型来进行微调。
1. 安装必要的库
首先,安装必要的库:transformers
和 datasets
(用于加载数据)以及 torch
(用于训练模型)。
pip install transformers datasets torch
2. 导入库
导入你所需的库和模块。
import torch
from transformers import BertTokenizer, BertForSequenceClassification, Trainer, TrainingArguments
from datasets import load_dataset
from sklearn.model_selection import train_test_split
BertTokenizer
:用于对文本进行分词。BertForSequenceClassification
:BERT 模型的变体,适用于文本分类任务。Trainer
:Hugging Face 提供的训练框架,简化了训练和评估过程。TrainingArguments
:指定训练过程中使用的参数(如学习率、批量大小等)。load_dataset
:用于加载数据集,Hugging Face 提供了多种标准数据集。
3. 加载数据集
你可以使用 datasets
库加载现成的数据集,或者自己加载数据集。这里我们使用 datasets
库加载一个常见的文本分类数据集 imdb
。
# 加载 IMDb 数据集
dataset = load_dataset('imdb')
# 分割训练集和验证集
train_dataset = dataset['train']
test_dataset = dataset['test']
4. 加载预训练模型和 Tokenizer
加载预训练的 BERT 模型以及相应的 Tokenizer。这里我们使用 bert-base-uncased
作为预训练模型。
model_name = "bert-base-uncased"
# 加载 BERT 模型和 Tokenizer
tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertForSequenceClassification.from_pretrained(model_name, num_labels=2) # 二分类任务
num_labels=2
:我们将任务定义为二分类任务(正面、负面),所以num_labels=2
。
5. 数据预处理
对于文本分类任务,首先需要对文本数据进行分词和编码,以适配 BERT 模型。
# 定义文本预处理函数
def preprocess_function(examples):
return tokenizer(examples['text'], padding='max_length', truncation=True)
# 应用预处理
train_dataset = train_dataset.map(preprocess_function, batched=True)
test_dataset = test_dataset.map(preprocess_function, batched=True)
# 设置格式以适应 PyTorch
train_dataset.set_format(type='torch', columns=['input_ids', 'attention_mask', 'label'])
test_dataset.set_format(type='torch', columns=['input_ids', 'attention_mask', 'label'])
padding='max_length'
:将所有句子填充到相同的最大长度。truncation=True
:如果文本超过最大长度,将其截断。- 使用
.map()
方法批量处理数据集。
6. 设置训练参数
使用 TrainingArguments
来定义训练过程的超参数,如学习率、批量大小、训练轮数等。
training_args = TrainingArguments(
output_dir='./results', # 输出路径
num_train_epochs=3, # 训练轮次
per_device_train_batch_size=8, # 每个设备的训练批次大小
per_device_eval_batch_size=16, # 每个设备的评估批次大小
warmup_steps=500, # 预热步数
weight_decay=0.01, # 权重衰减
logging_dir='./logs', # 日志目录
logging_steps=10,
evaluation_strategy="epoch", # 每个 epoch 评估一次
save_strategy="epoch" # 每个 epoch 保存一次
)
num_train_epochs
:指定训练轮数。per_device_train_batch_size
和per_device_eval_batch_size
:训练和评估时的批次大小。evaluation_strategy="epoch"
:在每个训练轮次结束时进行评估。
7. 使用 Trainer
进行训练
在 Hugging Face 中,Trainer
是一个高层次的 API,用来简化训练和评估的过程。
trainer = Trainer(
model=model, # 训练的模型
args=training_args, # 训练参数
train_dataset=train_dataset, # 训练数据
eval_dataset=test_dataset, # 验证数据
)
# 开始训练
trainer.train()
8. 评估模型
训练完成后,你可以使用训练过程中的验证集进行模型评估:
# 评估模型
results = trainer.evaluate()
# 打印评估结果
print(results)
9. 保存模型
训练完成后,你可以保存微调后的模型,以便以后使用或进行推理。
# 保存微调后的模型
model.save_pretrained('./fine_tuned_model')
tokenizer.save_pretrained('./fine_tuned_model')
- 这将保存微调后的模型和 Tokenizer,以便在未来的任务中加载。
完整示例代码
import torch
from transformers import BertTokenizer, BertForSequenceClassification, Trainer, TrainingArguments
from datasets import load_dataset
# 加载数据集
dataset = load_dataset('imdb')
train_dataset = dataset['train']
test_dataset = dataset['test']
# 加载预训练模型和Tokenizer
model_name = "bert-base-uncased"
tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertForSequenceClassification.from_pretrained(model_name, num_labels=2)
# 数据预处理
def preprocess_function(examples):
return tokenizer(examples['text'], padding='max_length', truncation=True)
train_dataset = train_dataset.map(preprocess_function, batched=True)
test_dataset = test_dataset.map(preprocess_function, batched=True)
train_dataset.set_format(type='torch', columns=['input_ids', 'attention_mask', 'label'])
test_dataset.set_format(type='torch', columns=['input_ids', 'attention_mask', 'label'])
# 训练参数
training_args = TrainingArguments(
output_dir='./results',
num_train_epochs=3,
per_device_train_batch_size=8,
per_device_eval_batch_size=16,
warmup_steps=500,
weight_decay=0.01,
logging_dir='./logs',
logging_steps=10,
evaluation_strategy="epoch",
save_strategy="epoch"
)
# Trainer
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_dataset,
eval_dataset=test_dataset
)
# 开始训练
trainer.train()
# 评估模型
results = trainer.evaluate()
print(results)
# 保存微调后的模型
model.save_pretrained('./fine_tuned_model')
tokenizer.save_pretrained('./fine_tuned_model')
总结
微调脚本 使得使用预训练模型来解决具体任务变得非常简单。在 Hugging Face Transformers 库中,Trainer
和 TrainingArguments
提供了高效的接口,能够方便地进行模型的微调。微调的过程包括加载预训练模型、数据预处理、设置训练参数、进行训练和评估,最后保存训练好的模型。通过微调,你可以将一个大规模预训练的模型应用到特定的任务中,从而大幅度提高任务的性能。