Машинное обучение
Transfer Learning и fine-tuning
Обучение state-of-the-art классификатора изображений с нуля требует миллионов картинок и недель GPU-времени стоимостью в десятки тысяч долларов. Transfer learning позволяет достичь 95% того же качества со 100 изображениями и 10 минутами на ноутбуке. Это самая практически значимая техника в современном deep learning.
- **Медицинская диагностика** - модели, предобученные на ImageNet, дообучаются на тысячах рентгеновских снимков и достигают точности радиолога в обнаружении пневмонии, переломов и опухолей, хотя ImageNet не содержит ни одного медицинского изображения
- **Автопилот на малых данных** - стартапы в области автономного вождения используют модели, предобученные на огромных датасетах (COCO, nuScenes), и дообучают их на специфичных дорожных условиях своего региона, сокращая потребность в данных в 100 раз
- **NLP в бизнесе** - BERT, предобученный на всей англоязычной Википедии и BookCorpus, дообучается за 30 минут на 1000 размеченных отзывов и определяет тональность клиентских обращений с accuracy 95%+
Предварительные знания
От многозадачного обучения до базовых моделей
Мысль о том, что знание из одной задачи помогает другой, восходит к 1997 году, когда Рич Каруана изучил многозадачное обучение и показал, что тренировка сети сразу на нескольких связанных задачах улучшает каждую из них, потому что общие представления улавливают структуру, которую упускают однозадачные модели. Идея нашла своё убойное применение после ImageNet: сеть, обученная на миллионе размеченных изображений, выучивала настолько общие зрительные примитивы, что исследователи могли отрезать последний слой, прицепить небольшой новый и достичь высокой точности на новой задаче при доле прежних данных. Предобучение на ImageNet стало рутиной в компьютерном зрении. Тот же рецепт позже захватил NLP и в масштабе породил сегодняшние базовые модели, единые большие сети, предобученные один раз на широких данных и адаптируемые под бесчисленные задачи через дообучение или промптинг.
Предобученные модели
Зачем тренировать модель с нуля, если кто-то уже потратил недели GPU-времени и миллионы изображений на обучение? **Предобученные модели (pretrained models)** - это нейросети, обученные на огромных датасетах (чаще всего ImageNet с 14 миллионами изображений и 1000 классов) и выложенные в открытый доступ. Их веса содержат **универсальные визуальные признаки**, которые полезны практически для любой задачи компьютерного зрения.
Первые слои CNN учат распознавать **края, углы, градиенты** - эти признаки универсальны для любых изображений. Средние слои выделяют **текстуры, повторяющиеся паттерны, части объектов**. И только последние слои становятся специфичными для конкретного датасета: "это золотистый ретривер", "это школьный автобус". Поэтому transfer learning работает: низкоуровневые и среднеуровневые признаки переносятся между задачами практически без потерь.
**Model Zoo - каталоги предобученных моделей:** - **torchvision.models** - ResNet, VGG, EfficientNet, Vision Transformer (ViT) для PyTorch - **timm (PyTorch Image Models)** - 700+ архитектур с предобученными весами, золотой стандарт для CV - **HuggingFace Hub** - тысячи моделей для CV, NLP, аудио; удобный API для загрузки - **TensorFlow Hub** - экосистема моделей для TensorFlow/Keras Все они предоставляют модели, обученные на ImageNet-1K (1000 классов) или ImageNet-21K (21000 классов), с разными размерами и точностью.
Предобученные веса - это **кристаллизованное знание** о визуальном мире. ResNet-50 обучалась на ImageNet около 90 эпох, что заняло примерно 29 часов на 8 GPU V100. Один час такого GPU стоит около $3, итого - порядка $700 только за вычисления, не считая стоимости разметки 14 миллионов изображений. Transfer learning позволяет **переиспользовать эти инвестиции** для конкретной задачи, даже при наличии всего 100-1000 изображений.
**Важно: предобработка данных должна совпадать!** Предобученная модель ожидает входные данные в том же формате, в каком она обучалась. Для ImageNet-моделей это: - Размер: 224x224 (или 299, 384 - зависит от архитектуры) - Нормализация: mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225] - Порядок каналов: RGB (не BGR!) Если подать данные без правильной нормализации, предобученные веса будут бесполезны - это как пытаться читать текст вверх ногами.
Почему низкоуровневые слои предобученной CNN (края, градиенты) полезны практически для любой задачи компьютерного зрения?
Feature Extraction
Самый простой подход к transfer learning - **feature extraction**: берём предобученную модель, **замораживаем все её слои** (запрещаем обновление весов) и используем как фиксированный экстрактор признаков. Заменяем только последний полносвязный слой (classifier head) на новый, который обучаем под нашу задачу. По сути, мы используем предобученную CNN как умный конвертор: она превращает изображение 224x224x3 в компактный вектор признаков (например, 2048 чисел), а наш маленький классификатор уже работает с этим вектором.
**Когда использовать feature extraction?** Это лучший выбор при двух условиях: 1. **очень маленький датасет** (десятки-сотни изображений на класс) и (2) **ваши данные похожи на ImageNet** (фотографии обычных объектов, не медицинские снимки или спутниковые фото). При маленьком датасете fine-tuning всех слоёв приведёт к переобучению: 25 миллионов параметров на 500 изображениях - это катастрофа. А заморозка позволяет обучать только тысячи параметров нового классификатора.
**Продвинутый приём: предвычисление признаков** Если модель полностью заморожена, можно один раз прогнать все изображения через предобученные слои и **сохранить векторы признаков на диск**. После этого обучение классификатора сводится к обучению маленькой полносвязной сети на табличных данных - это занимает секунды. Это также позволяет экспериментировать с разными архитектурами классификатора (Linear, MLP, SVM) без повторного прогона через CNN.
Feature extraction - это **baseline для transfer learning**. Начинайте всегда с него: если результат достаточно хорош, нет смысла усложнять. Если точность недостаточна (данные сильно отличаются от ImageNet или их достаточно много), переходите к fine-tuning - постепенному размораживанию слоёв.
Дано 200 фотографий 5 пород собак. Почему feature extraction (заморозка всех слоёв) здесь лучше, чем fine-tuning всей модели?
Стратегии fine-tuning
Когда feature extraction не даёт нужной точности, переходим к **fine-tuning** - размораживанию и дообучению части предобученных слоёв. Ключевая идея: **не все слои одинаково полезны для переноса**. Ранние слои (универсальные признаки) нужно менять минимально, поздние слои (специфичные для ImageNet) - сильнее. Поэтому fine-tuning делают постепенно: сначала размораживаем последние слои, потом при необходимости - более ранние.
**Discriminative learning rates** - ключевая техника fine-tuning. Вместо одного learning rate для всей модели, мы назначаем **разные learning rate разным группам слоёв**. Ранние слои получают маленький lr (1e-5), потому что их универсальные признаки менять не нужно. Поздние слои получают lr побольше (1e-3), потому что их нужно адаптировать сильнее. Новый classifier head обучается с самым большим lr.
**Gradual unfreezing - постепенное размораживание:** 1. **Эпохи 1-3:** Заморозить всё, обучать только classifier head 2. **Эпохи 4-6:** Разморозить layer4, обучать head + layer4 3. **Эпохи 7-9:** Разморозить layer3, обучать head + layer4 + layer3 4. **Эпохи 10+:** Разморозить остальное с очень маленьким lr Этот подход (из библиотеки fast.ai) не даёт случиться "catastrophic forgetting" - когда модель забывает выученные признаки из-за резких обновлений весов на первых эпохах.
**Практический рецепт выбора стратегии** основан на двух факторах: размере датасета и похожести на данные, на которых модель предобучалась. Маленький датасет + похожий домен = feature extraction. Маленький датасет + другой домен = feature extraction от средних слоёв (пропустить последние). Большой датасет + похожий домен = fine-tune последние слои. Большой датасет + другой домен = fine-tune всю модель с gradual unfreezing.
Почему при fine-tuning ранним слоям CNN назначают меньший learning rate, чем поздним?
Domain Adaptation
Transfer learning отлично работает, когда source domain (откуда берём знания) и target domain (куда переносим) похожи. Но что если они кардинально отличаются? Фотографии обычных объектов vs рентгеновские снимки, текст из Википедии vs юридические документы. Разница в распределении данных между доменами называется **distribution shift (domain shift)**, и она может свести на нет все преимущества предобученных моделей. **Domain adaptation** - это набор техник для преодоления этого разрыва.
**Self-training (pseudo-labeling)** - одна из самых практичных техник domain adaptation. Идея проста: 1. обучаем модель на размеченных данных source domain 2. делаем предсказания на неразмеченных данных target domain 3. берём предсказания с высокой уверенностью как **pseudo-labels** 4. дообучаем модель на смеси настоящих и pseudo-меток. Этот цикл повторяется: с каждой итерацией модель лучше адаптируется к target domain.
**Zero-shot transfer с CLIP:** CLIP (Contrastive Language-Image Pre-training) от OpenAI - прорыв в domain adaptation. Вместо обучения на фиксированных классах, CLIP учит совместное представление текста и изображений. Это позволяет: - **Zero-shot классификация:** описываем классы текстом, CLIP классифицирует без единого примера - **Произвольные домены:** "рентгеновский снимок с пневмонией", "спутниковый снимок леса" - **Без дообучения:** работает из коробки на 400+ миллионах пар (изображение, текст) CLIP показывает, что transfer learning выходит за рамки одной модальности - знания из текста переносятся в зрение и наоборот.
Domain adaptation - это активная область исследований. Помимо self-training и CLIP, существуют **adversarial domain adaptation** (обучаем feature extractor так, чтобы discriminator не мог отличить source от target domain), **domain-specific normalization** (отдельные BatchNorm слои для каждого домена), и **test-time adaptation** (адаптация модели прямо во время инференса). Выбор метода зависит от доступности данных: есть ли размеченные данные в target domain, или только неразмеченные, или вообще ничего (zero-shot).
Transfer learning работает только для изображений
Transfer learning одинаково эффективен в NLP (BERT, GPT), аудио (wav2vec), рекомендательных системах, и даже в reinforcement learning
Transfer learning - это общий принцип переноса знаний между задачами. BERT и GPT предобучены на огромных текстовых корпусах и дообучаются под конкретные NLP-задачи (классификация, NER, QA). wav2vec2 предобучен на аудио и дообучается для распознавания речи. Даже в RL агенты, обученные в одном окружении, переносят навыки в похожие. Везде работает тот же принцип: базовые признаки универсальны, специфичные - нужно адаптировать.
Что такое pseudo-labeling в контексте domain adaptation?
Итоги
- **Предобученные модели** содержат универсальные визуальные признаки (края, текстуры, формы), выученные на миллионах изображений - model zoo (torchvision, timm, HuggingFace) даёт доступ к сотням архитектур с готовыми весами
- **Feature extraction** замораживает все предобученные слои и обучает только новый classifier head - лучший выбор при маленьком датасете (десятки-сотни примеров) и похожем домене, обучая 0.04% параметров вместо 100%
- **Fine-tuning стратегии** постепенно размораживают слои от последних к первым, используя discriminative learning rates (маленький lr для ранних универсальных слоёв, большой для поздних специфичных) - gradual unfreezing предотвращает catastrophic forgetting
- **Domain adaptation** преодолевает distribution shift между source и target доменами через pseudo-labeling, adversarial обучение и zero-shot CLIP - и всё это работает не только для изображений, но и для текста, аудио и других модальностей, как те 95% качества на ноутбуке из нашего введения
Связанные темы
Transfer learning связывает базовые архитектуры нейросетей с практическими приложениями, позволяя применять крупные модели в условиях ограниченных данных:
- Image Classification — Предобученные CNN (ResNet, EfficientNet) изначально обучались именно для классификации изображений на ImageNet - transfer learning переносит эти знания на новые задачи классификации с минимальными данными
- BERT и GPT — Transfer learning в NLP следует тому же принципу: BERT предобучен на текстовых корпусах и дообучается под конкретные задачи (классификация, NER, QA) - аналогия с feature extraction и fine-tuning из CV
- Сегментация изображений — Модели сегментации (U-Net, DeepLab) используют предобученные encoder-ы из ImageNet как backbone - это прямое применение transfer learning, где feature extractor остаётся, а decoder обучается с нуля
- CNN архитектуры — Понимание иерархии слоёв CNN (низкоуровневые признаки, средние, высокоуровневые) - основа для выбора стратегии fine-tuning: какие слои замораживать, какие размораживать
Вопросы для размышления
- Почему transfer learning работает между совершенно разными доменами (фотографии обычных объектов и рентгеновские снимки)? Что общего в визуальных признаках, выученных на ImageNet, с медицинскими изображениями?
- Дано 10,000 спутниковых снимков для классификации типов земной поверхности. Какая стратегия transfer learning подойдёт: feature extraction, fine-tune последние слои или fine-tune всё? Какой learning rate schedule использовать?
- CLIP может классифицировать изображения по текстовому описанию без единого обучающего примера. Означает ли это, что сбор и разметка данных больше не нужны? Когда zero-shot подход проигрывает обычному supervised fine-tuning?
Связанные уроки
- ml-29-cnn — Переиспользует признаки предобученных CNN
- ml-38-image-classification — Дообучает классификаторы на новых данных
- ml-37-bert-gpt — Fine-tuning LLM - это transfer learning
- ml-08-regularization — Заморозка слоёв регуляризует обучение на малых данных
- aie-36-fine-tuning — Fine-tuning LLM применяет тот же принцип