Условие
Опишите стратегию transfer learning от ImageNet к классификации товаров маркетплейса (1000 классов, 50k images).
Решение
Подход
50k images с 1000 классами — 50 примеров на класс в среднем. From scratch обучить ResNet50 нереально. Transfer learning:
- Pretrained на ImageNet (или CLIP, DINO).
- Replace head на 1000 классов.
- Train.
Стратегии fine-tuning
A. Linear probe (frozen backbone):
- Заморозить backbone, только classifier head.
- Быстро, мало данных нужно, baseline.
B. Full fine-tune:
- Все слои обучаемы.
- Лучшая accuracy, нужно больше данных и compute.
C. Gradual unfreezing:
- Сначала только head; потом размораживаем top-k слоёв; потом все.
- ULMFiT-style. Хорош на средних датасетах.
D. Discriminative learning rates:
- Low LR для backbone, high LR для head.
- Базовое правило: head_lr = 10× backbone_lr.
Реализация (PyTorch)
import torch.nn as nn
from torchvision import models
model = models.resnet50(weights='IMAGENET1K_V2')
# Замена head
model.fc = nn.Linear(2048, 1000)
# Freeze backbone
for p in model.parameters():
p.requires_grad = False
for p in model.fc.parameters():
p.requires_grad = True
# Stage 1: только head
optimizer = torch.optim.AdamW(model.fc.parameters(), lr=1e-3)
# train 5 epochs
# Stage 2: gradually unfreeze
for p in model.layer4.parameters():
p.requires_grad = True
optimizer = torch.optim.AdamW([
{'params': model.layer4.parameters(), 'lr': 1e-5},
{'params': model.fc.parameters(), 'lr': 1e-4},
])
# train 10 epochsВыбор backbone
| Backbone | Дано | Когда |
|---|---|---|
| ResNet50 | 25M params | Default baseline |
| EfficientNet-B0..B7 | scaling | Когда compute ограничено |
| ViT-base | 86M, attention | Большие датасеты |
| CLIP image encoder | open-vocab | Низкая выборка, zero-shot retrieval |
| DINOv2 | self-supervised | Когда labels noisy |
Когда use what
- n < 1000 на класс: linear probe + heavy augmentation.
- 1k-10k на класс: gradual unfreezing.
- >10k: full fine-tune.
- Domain очень специфический (рентген, satellite): сначала pretrain на domain corpus, потом fine-tune.
Подводные камни
- Input preprocessing должно совпадать с pretraining: ImageNet — mean [0.485, 0.456, 0.406], std [0.229, 0.224, 0.225]. Иначе backbone «не понимает» вход.
- BatchNorm в backbone: при small batch + frozen weights, BN running statistics не обновляются. На production drift. Либо unfreeze BN, либо replace на GroupNorm.
- Pretrained weights с другим input size (224×224) — при resize меняется effective receptive field. Заметно для small objects.
- Catastrophic forgetting: при aggressive fine-tune backbone «забывает» ImageNet features → хуже generalization. Discriminative LR помогает.
- Domain gap: ImageNet vs медицинские снимки — generic features слабо переносятся. DINO/MAE self-supervised на domain images дают больше.
Эталонный ответ
Transfer learning: 1) pretrained backbone (ResNet/EfficientNet/ViT), 2) замена head, 3) gradual unfreezing с discriminative LR (backbone 1e-5, head 1e-4). Input preprocessing должно совпадать с pretraining. На малой выборке — linear probe + augmentation; на большой — full fine-tune. CLIP / DINO когда нужен zero-shot или labels noisy.