迁移学习实战:预训练模型微调技巧
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)
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()
总结
| 策略 |
数据量 |
学习率 |
适用场景 |
| 特征提取 |
少 |
大 |
数据极少 |
| 微调 |
中 |
中 |
最常用 |
| 全量微调 |
多 |
小 |
数据充足 |