1. 全量微调(SFT)实现详解

1.1 基本原理

全量微调(Supervised Fine-Tuning)是指在下游任务上对预训练模型的所有参数进行微调。这种方法能够充分利用预训练模型的知识,并通过微调使其适应特定任务。

1.2 实现步骤

  1. 数据准备
1
2
3
4
5
6
7
8
from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("bert-base-chinese")

def preprocess_function(examples):
return tokenizer(examples["text"], truncation=True, padding="max_length")

dataset = dataset.map(preprocess_function, batched=True)
  1. 模型加载
1
2
3
4
5
6
from transformers import AutoModelForSequenceClassification

model = AutoModelForSequenceClassification.from_pretrained(
"bert-base-chinese",
num_labels=2
)
  1. 训练配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from transformers import TrainingArguments, Trainer

training_args = TrainingArguments(
output_dir="./results",
per_device_train_batch_size=8,
num_train_epochs=3,
save_steps=10_000,
save_total_limit=2,
)

trainer = Trainer(
model=model,
args=training_args,
train_dataset=dataset["train"],
eval_dataset=dataset["test"],
)
  1. 开始训练
1
trainer.train()

2. LoRA微调实现详解

2.1 基本原理

LoRA(Low-Rank Adaptation)是一种高效的微调方法,它通过低秩分解在原始模型参数旁添加可训练的小型矩阵,只训练这些新增参数而冻结原始模型参数。

2.2 实现步骤

  1. 安装依赖
1
pip install peft
  1. 配置LoRA
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from peft import LoraConfig, get_peft_model

lora_config = LoraConfig(
r=8, # 低秩矩阵的维度
lora_alpha=16,
target_modules=["query", "value"],
lora_dropout=0.1,
bias="none",
task_type="SEQ_CLS"
)

model = AutoModelForSequenceClassification.from_pretrained(
"bert-base-chinese",
num_labels=2
)

model = get_peft_model(model, lora_config)
model.print_trainable_parameters()
  1. 训练配置(与全量微调类似)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
training_args = TrainingArguments(
output_dir="./lora_results",
per_device_train_batch_size=8,
num_train_epochs=3,
learning_rate=1e-3,
save_steps=10_000,
save_total_limit=2,
)

trainer = Trainer(
model=model,
args=training_args,
train_dataset=dataset["train"],
eval_dataset=dataset["test"],
)
  1. 开始训练
1
trainer.train()

3. 两种方法的对比

特性 全量微调(SFT) LoRA微调
训练参数 全部参数 仅新增的低秩矩阵
显存占用
训练速度
存储需求 大(保存整个模型) 小(仅保存适配器)
效果 通常更好 略低但接近
适用场景 数据充足、资源丰富 资源有限、快速迭代

4. 实际应用建议

  1. 选择全量微调当:

    • 有充足的计算资源
    • 下游任务与预训练任务差异较大
    • 追求最佳模型性能
  2. 选择LoRA当:

    • 计算资源有限
    • 需要快速实验和迭代
    • 需要微调多个不同任务
    • 需要共享基础模型

5. 总结

全量微调和LoRA微调各有优劣,实际应用中应根据具体需求和资源情况选择。对于大多数场景,LoRA提供了很好的性价比,而全量微调则适合追求极致性能的情况。随着参数高效微调技术的发展,LoRA及其变种正在成为越来越主流的微调方式。