Собесов

Сценарий ML: transfer learning в CV

ML / Data ScienceComputer VisionСредняяMiddle

Условие

Опишите стратегию transfer learning от ImageNet к классификации товаров маркетплейса (1000 классов, 50k images).

Решение

Подход

50k images с 1000 классами — 50 примеров на класс в среднем. From scratch обучить ResNet50 нереально. Transfer learning:

  1. Pretrained на ImageNet (или CLIP, DINO).
  2. Replace head на 1000 классов.
  3. 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.

Подводные камни

  1. Input preprocessing должно совпадать с pretraining: ImageNet — mean [0.485, 0.456, 0.406], std [0.229, 0.224, 0.225]. Иначе backbone «не понимает» вход.
  2. BatchNorm в backbone: при small batch + frozen weights, BN running statistics не обновляются. На production drift. Либо unfreeze BN, либо replace на GroupNorm.
  3. Pretrained weights с другим input size (224×224) — при resize меняется effective receptive field. Заметно для small objects.
  4. Catastrophic forgetting: при aggressive fine-tune backbone «забывает» ImageNet features → хуже generalization. Discriminative LR помогает.
  5. 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.

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти