Transfer learning: чужая сеть для своей задачи

Самый практичный приём современного CV: не учить сеть с нуля, а взять уже обученную и приспособить под себя.

Transfer learning (перенос обучения) — использование сети, обученной на большой задаче, как основы для новой задачи с малым объёмом данных.

Проблема: данных и ресурсов мало

Обучить мощную CNN с нуля — это миллионы размеченных картинок, дни на дорогих GPU и опыт. У типичного проекта (распознать 5 видов своей продукции) нет ни миллиона картинок, ни такого бюджета. Учить с нуля на 500 фото — гарантированное переобучение.

Идея: признаки переносимы

Вспомните иерархию признаков из раздела про CNN: ранние слои выучивают универсальные вещи — края, текстуры, простые формы. Эти признаки полезны почти для любой картинки, не только для тех классов, на которых сеть обучалась. Значит, сеть, обученную на ImageNet (1000 классов, миллионы фото), можно взять как готовый «экстрактор признаков» и приспособить под свою задачу.

Два режима

РежимЧто делаемКогда
Feature extractionзамораживаем все слои-экстракторы, обучаем только новый классификатор сверхуочень мало данных
Fine-tuningдообучаем и часть верхних слоёв экстрактора с маленьким шагомданных побольше

На практике: берут ResNet, обученную на ImageNet, отрезают её последний слой-классификатор (на 1000 классов) и ставят свой — на нужное число классов. Тело сети либо замораживают, либо аккуратно дообучают.

# Псевдокод идеи (PyTorch-стиль, для чтения)
model = resnet50(pretrained=True)     # сеть с ImageNet
for param in model.parameters():
    param.requires_grad = False       # заморозили экстрактор
model.fc = Linear(2048, num_classes)  # свой классификатор сверху
# обучаем только model.fc на своих данных

Почему это так выгодно

  • Мало данных: хватает сотен примеров вместо миллионов.
  • Быстро: обучается минуты-часы, а не дни.
  • Качественно: готовые признаки сильнее, чем выученные с нуля на крошечном датасете.

Transfer learning — стандарт индустрии. Почти никто не учит CV-модели с нуля: берут предобученную из библиотеки (torchvision, timm) и дообучают. Та же идея позже расцвела в мире LLM, где «дообучение фундаментальной модели» стало основным рабочим приёмом.

Итог

  • Transfer learning: берём сеть, обученную на большой задаче, под свою.
  • Работает, потому что ранние признаки (края, текстуры) универсальны.
  • Feature extraction (заморозка) — при очень малых данных; fine-tuning — когда данных больше.
  • Это стандарт: с нуля CV-модели почти не учат.
Проверьте себя
1. Почему transfer learning вообще работает?
AПотому что все картинки одинаковые
BРанние слои выучивают универсальные признаки (края, текстуры), полезные почти для любой картинки
CПотому что ImageNet содержит все возможные объекты
DПотому что сеть не нужно дообучать
2. В чём разница между feature extraction и fine-tuning?
AЭто одно и то же
BFeature extraction замораживает экстрактор и учит только новый классификатор; fine-tuning дообучает и часть верхних слоёв
CFine-tuning не использует предобученную сеть
DFeature extraction требует больше данных
3. Какое практическое преимущество даёт transfer learning?
AТребует миллионы примеров
BПозволяет добиться качества на сотнях примеров за минуты-часы вместо обучения с нуля на миллионах
CДелает сеть медленнее
DУбирает необходимость в классификаторе
Поддержать проект