Перенос обучения (transfer learning): как дообучить модель

Перенос обучения (transfer learning) - это приём, когда модель, обученную на одной большой задаче, переиспользуют как заготовку для другой, обычно более узкой. Вместо того чтобы учить нейросеть распознавать кошек с нуля на тысяче своих фотографий, берут сеть, уже натренированную на миллионах изображений ImageNet, и дообучают её под свою задачу за считанные эпохи. Идея проста: низкоуровневые признаки (края, текстуры, формы) универсальны, и заново их выучивать бессмысленно. Ниже разберём, когда перенос работает, чем feature extraction отличается от fine-tuning и как не переобучиться на маленькой выборке. Если нужно решить конкретную задачу про дообучение, опишите её в форме ниже.
Что такое перенос обучения
Формально перенос обучения - это перенос знаний из домена-источника с задачей в целевой домен с задачей , когда или . Цель - улучшить обучение целевой функции в , используя знания, добытые при решении .
На практике это значит вот что: глубокая сеть, обучаясь на большом датасете, выстраивает иерархию признаков. Первые слои ловят простые паттерны (границы, цветовые переходы), средние - комбинации (углы, текстуры, части объектов), последние - высокоуровневые понятия, специфичные для исходной задачи. Первые два уровня переносятся почти на любую визуальную задачу, и именно это делает перенос таким эффективным.

Выигрыш двойной. Во-первых, нужно меньше данных: размеченных примеров под узкую задачу обычно мало, а предобученная сеть уже «видела» миллионы картинок. Во-вторых, обучение идёт быстрее и сходится стабильнее, потому что стартовая точка в пространстве весов уже близка к хорошему решению, а не случайна.
Откуда берётся предобученная модель
Источник переноса - модель, обученная на большом универсальном корпусе. Для зрения это ImageNet (1,2 млн изображений, 1000 классов): на нём натренированы ResNet, VGG, EfficientNet, ViT. Для текста - корпуса в сотни миллиардов токенов, на которых обучены BERT, GPT, T5. Эти веса выложены в открытый доступ (torchvision.models, Hugging Face Hub), и их скачивание - первый шаг любого проекта с переносом.
Ключевое условие успеха - близость доменов. Сеть, обученная на естественных фотографиях, отлично переносится на медицинские снимки или спутниковые изображения, но хуже - на принципиально другой тип данных вроде звуковых спектрограмм. Чем дальше целевой домен от источника, тем больше слоёв придётся переучивать и тем больше данных понадобится.
Перед выбором стратегии оцените две вещи: размер вашей выборки и близость к домену-источнику. Малая выборка плюс близкий домен - замораживайте почти всё. Большая выборка плюс далёкий домен - размораживайте больше слоёв.
Feature extraction: заморозить и надстроить
Самый простой режим переноса - использовать предобученную сеть как фиксированный экстрактор признаков. Веса всех свёрточных слоёв замораживают (отключают вычисление градиента), последний классификационный слой выбрасывают и ставят на его место новый - под число классов своей задачи. Обучается только эта новая «голова».
Математически это означает: для слоёв-экстрактора градиент не считается, , и оптимизатор обновляет лишь параметры головы . Признаки на выходе замороженной части фиксированы, а обучаемое отображение - это линейный (или небольшой нелинейный) классификатор поверх них:
Этот режим оправдан, когда данных совсем мало (сотни примеров) и целевой домен близок к источнику. Обучение идёт быстро: считается прямой проход через тяжёлую часть один раз, а оптимизируется лишь лёгкая голова. Риск переобучения минимален - обучаемых параметров немного.

Fine-tuning: дообучить веса
Когда данных побольше или домен заметно отличается, переходят к тонкой настройке (fine-tuning). Здесь размораживают часть или все слои предобученной сети и продолжают обучение на целевых данных, но с маленьким темпом обучения - обычно в 10–100 раз меньше, чем при обучении с нуля. Малый шаг важен принципиально: большой learning rate быстро разрушит аккуратно выстроенные предобученные веса, и перенос потеряет смысл.
Типичная схема - постепенное размораживание (gradual unfreezing): сначала обучают только голову с замороженной базой, затем размораживают верхние блоки, ещё снижают темп и дообучают, и так слой за слоем сверху вниз. Нижние слои с самыми универсальными признаками часто оставляют замороженными до конца.
Часто применяют дифференцированные темпы обучения: для верхних, более специфичных слоёв больше, для нижних - меньше:
где - номер слоя, - общее число слоёв, . Так нижние универсальные признаки почти не трогаются, а верхние адаптируются под новую задачу.
Сколько слоёв размораживать
Это главный практический вопрос, и ответ зависит от двух осей - размера выборки и близости доменов:
- Мало данных, близкий домен - feature extraction, обучаем только голову. Размораживать слои не нужно, риск переобучения слишком велик.
- Много данных, близкий домен - fine-tuning всей сети с малым темпом. Данных хватает, чтобы аккуратно подстроить все веса.
- Мало данных, далёкий домен - самый сложный случай: feature extraction даёт плохие признаки, а полный fine-tuning переобучается. Компромисс - разморозить только верхние блоки.
- Много данных, далёкий домен - fine-tuning большой части сети или даже обучение почти с нуля с предобученной инициализацией.
Эта матрица «выборка × домен» - основа любого решения. Почему именно нижние свёрточные слои переносятся лучше всего, понятнее, если посмотреть на устройство свёрточной нейросети (CNN) - там иерархия признаков от краёв к объектам видна напрямую.
Практический пайплайн
Типичный порядок действий при переносе обучения выглядит так:
- Загрузить предобученную сеть без верхнего классификатора (
include_top=Falseилиpretrained=True). - Заменить голову на новую под своё число классов.
- Заморозить базу, обучить только голову несколько эпох - пусть голова «настроится» на признаки.
- Разморозить верхние блоки, снизить learning rate в 10 раз, дообучить.
- Подобрать аугментации под целевой домен - для малой выборки это критично.
- Следить за валидацией: расхождение train/val loss - сигнал переобучения, пора остановиться или заморозить обратно.
Важная деталь - нормализация входов должна совпадать с той, что была при предобучении (те же среднее и дисперсия по каналам). Иначе признаки нижних слоёв «поедут», и весь смысл переноса теряется.
Частые ошибки
- Слишком большой learning rate при fine-tuning. Большой шаг за пару итераций стирает предобученные веса, и сеть фактически учится с нуля, но уже на малой выборке - то есть переобучается.
- Размораживание всей сети при сотне примеров. Миллионы обучаемых параметров против сотни примеров - гарантированное переобучение. Начинайте с заморозки.
- Игнорирование нормализации входов. Если подать данные с другим масштабом, чем при предобучении, активации нижних слоёв искажаются и признаки становятся бесполезными.
- Перенос между слишком далёкими доменами без проверки. Сеть с ImageNet не обязана помогать на табличных данных или аудио - иногда обучение с нуля работает не хуже.
- Забыть про режим
evalдля слоёв BatchNorm. При заморозке базы статистики BatchNorm должны быть зафиксированы, иначе они «плывут» на малых батчах.
FAQ
Чем перенос обучения отличается от обучения с нуля? При обучении с нуля веса инициализируются случайно и сеть учит всё с чистого листа, требуя много данных. При переносе стартовая точка - уже осмысленные веса с большой задачи, поэтому нужно меньше данных и эпох. По сути это разница между «выучить язык с нуля» и «адаптировать знание родственного языка».
Можно ли применять перенос обучения к языковым моделям? Да, и именно там он сейчас доминирует. Предобучение на огромном корпусе плюс дообучение под конкретную задачу (классификация, ответы на вопросы) - стандарт для BERT и GPT-подобных моделей. Это тот же принцип: универсальные представления языка переносятся на узкую задачу.
Что делать, если целевой домен совсем не похож на источник? Сначала всё равно попробуйте перенос: даже далёкие признаки нижних слоёв часто полезны как инициализация. Если не помогает - размораживайте больше слоёв, увеличивайте долю обучаемых весов, а при достаточном объёме данных сравните с обучением с нуля.
Коротко
Перенос обучения (transfer learning) переиспользует предобученную модель как заготовку для новой задачи, экономя данные и время. Два основных режима: feature extraction (заморозить базу, обучить только новую голову) - для малой выборки и близкого домена; fine-tuning (разморозить часть слоёв и дообучить с малым темпом) - когда данных больше или домен дальше. Решение «сколько слоёв размораживать» определяется матрицей «размер выборки × близость доменов». Главные грабли - слишком большой learning rate, разморозка всей сети на малой выборке и рассогласованная нормализация входов.
Читайте также

Архитектура VGG: как устроена сеть из блоков 3x3
Разбор архитектуры VGG: почему свёртки 3x3, как считать число параметров, чем отличаются VGG-16 и VGG-19 и где сеть применяют как backbone для transfer learning.

Автоэнкодер (autoencoder): как сеть сжимает данные
Автоэнкодер (autoencoder) простыми словами: энкодер, латентное пространство и декодер, функция потерь реконструкции, виды сетей и где их применяют для сжатия и поиска аномалий.

Нейросети в учёбе: как использовать ИИ легально и с пользой
Как студенту применять нейросети в учёбе честно: где ИИ реально помогает в учёбе, где проходит грань академической этики и как грамотно работать с нейросетями.