迁移学习实战:预训练模型微调技巧

Source

迁移学习实战:预训练模型微调技巧

1. 迁移学习原理

迁移学习策略:
├── 特征提取:冻结预训练层,只训练新分类头
├── 微调:解冻部分预训练层,低学习率训练
└── 全量微调:解冻所有层,极低学习率训练

2. 图像分类微调

import torch
import torch.nn as nn
from torchvision import models

# 加载预训练模型
model = models.resnet50(pretrained=True)

# 冻结所有层
for param in model.parameters():
    param.requires_grad = False

# 替换分类头
num_classes = 10
model.fc = nn.Linear(model.fc.in_features, num_classes)

# 只训练分类头
optimizer = torch.optim.Adam(model.fc.parameters(), lr=0.001)

# 阶段 2:微调
for param in model.layer4.parameters():
    param.requires_grad = True

optimizer = torch.optim.Adam([
    {
    
      'params': model.layer4.parameters(), 'lr': 0.0001},
    {
    
      'params': model.fc.parameters(), 'lr': 0.001},
])

3. NLP 微调(BERT)

from transformers import BertTokenizer, BertForSequenceClassification
from transformers import Trainer, TrainingArguments

tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
model = BertForSequenceClassification.from_pretrained(
    'bert-base-chinese', num_labels=2
)

# 数据处理
def tokenize(examples):
    return tokenizer(examples['text'], padding='max_length', truncation=True, max_length=128)

# 训练
training_args = TrainingArguments(
    output_dir='./results',
    num_train_epochs=3,
    per_device_train_batch_size=16,
    learning_rate=2e-5,
    warmup_steps=500,
    evaluation_strategy='epoch',
)

trainer = Trainer(model=model, args=training_args, train_dataset=train_dataset)
trainer.train()

总结

策略 数据量 学习率 适用场景
特征提取 少 大 数据极少
微调 中 中 最常用
全量微调 多 小 数据充足