迁移学习(Transfer Learning)是通过将源领域的知识迁移到目标领域,提升目标领域模型性能的机器学习范式。其演进路径为:
方法 | 数据需求 | 训练成本 | 适用场景 |
---|---|---|---|
传统训练 | 大量标注数据 | 高 | 数据充足场景 |
迁移学习 | 少量标注数据 | 低 | 数据稀缺领域 |
从头训练 | 海量标注数据 | 极高 | 研究级场景 |
场景类型 | 源域与目标域关系 | 技术挑战 |
---|---|---|
同领域同任务 | 数据分布差异 | 分布适配 |
跨领域同任务 | 特征空间不同 | 特征对齐 |
同领域跨任务 | 任务目标差异 | 参数解冻策略 |
跨领域跨任务 | 双重差异 | 联合优化 |
# 1. 预训练模型加载
model = models.resnet50(weights='IMAGENET1K_V2')
# 2. 网络结构调整
num_ftrs = model.fc.in_features
model.fc = nn.Sequential(
nn.Linear(num_ftrs, 512),
nn.ReLU(),
nn.Dropout(0.5),
nn.Linear(512, num_classes)
)
# 3. 差异训练策略
optimizer = torch.optim.Adam([
{'params': model.conv1.parameters(), 'lr': 1e-5},
{'params': model.fc.parameters(), 'lr': 1e-3}
])
# 4. 渐进解冻实现
def unfreeze_layers(model, epoch):
if epoch > 5:
for param in model.layer4.parameters():
param.requires_grad = True
if epoch > 10:
for param in model.layer3.parameters():
param.requires_grad = True
# 特征提取器封装
class FeatureExtractor(nn.Module):
def __init__(self, base_model):
super().__init__()
self.features = nn.Sequential(*list(base_model.children())[:-1])
def forward(self, x):
x = self.features(x)
return torch.flatten(x, 1)
# 特征空间可视化
from sklearn.manifold import TSNE
features = extractor(images).detach().numpy()
tsne = TSNE(n_components=2)
vis_features = tsne.fit_transform(features)
# 领域分类器
class DomainClassifier(nn.Module):
def __init__(self, input_dim):
super().__init__()
self.layer = nn.Sequential(
GradientReverseLayer(),
nn.Linear(input_dim, 256),
nn.ReLU(),
nn.Linear(256, 2)
)
# 梯度反转层
class GradientReverseLayer(torch.autograd.Function):
@staticmethod
def forward(ctx, x):
return x.view_as(x)
@staticmethod
def backward(ctx, grad_output):
return grad_output.neg()
# 动态适配权重计算
def calc_adapt_weight(source_feat, target_feat):
s_mean = source_feat.mean(dim=0)
t_mean = target_feat.mean(dim=0)
distance = torch.norm(s_mean - t_mean, p=2)
return torch.sigmoid(distance * 0.1)
from torch.cuda.amp import autocast, GradScaler
scaler = GradScaler()
with autocast():
outputs = model(inputs)
loss = criterion(outputs, labels)
scaler.scale(loss).backward()
scaler.step(optimizer)
scaler.update()
指标名称 | 计算公式 | 适用场景 |
---|---|---|
迁移增益 | TG = Acc_{TL} - Acc_{TL} | 通用评估 |
领域差异 | MMD = ∥E_s[φ(x_s)] - E_t[φ(x_t)]∥² | 特征空间分析 |
类间距离 | CID = 1/CΣ∥μ_c - μ∥² | 类别可分性 |
负迁移问题:
过拟合问题:
模型类型 | 代表架构 | 核心突破 |
---|---|---|
通用模型 | BERT, CLIP | 多模态融合 |
领域模型 | BioBERT, ChemBERT | 领域自适应预训练 |
高效模型 | MobileNet, EfficientNet | 参数量化压缩 |
# MAML核心实现
def maml_update(model, tasks, inner_lr):
fast_weights = OrderedDict(model.named_parameters())
for task in tasks:
# 内循环更新
outputs = model(task.x, fast_weights)
loss = F.mse_loss(outputs, task.y)
grads = torch.autograd.grad(loss, fast_weights.values())
fast_weights = {n: p - inner_lr*g for (n,p),g in zip(fast_weights.items(), grads)}
# 外循环更新
outputs = [model(t.x, fast_weights) for t in tasks]
meta_loss = sum(F.mse_loss(o, t.y) for o,t in zip(outputs, tasks))
meta_loss.backward()
迁移学习已成为现代AI工程落地的核心技术,掌握其核心原理并配合系统化的工程实践,可将模型开发效率提升3-5倍。建议结合NeurIPS、ICML等顶会最新论文,持续跟进领域自适应、元迁移等前沿方向的技术演进。