EssayAI
Блог
Блог
Математика и алгоритмы

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

19 июня 2026Время чтения: 8 минут
#перенос обучения#transfer learning#fine-tuning#предобученная модель#нейросети
Перенос обучения (transfer learning): как дообучить модель

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

Что такое перенос обучения

Формально перенос обучения - это перенос знаний из домена-источника DSD_S с задачей TST_S в целевой домен DTD_T с задачей TTT_T, когда DSDTD_S \neq D_T или TSTTT_S \neq T_T. Цель - улучшить обучение целевой функции fTf_T в DTD_T, используя знания, добытые при решении TST_S.

На практике это значит вот что: глубокая сеть, обучаясь на большом датасете, выстраивает иерархию признаков. Первые слои ловят простые паттерны (границы, цветовые переходы), средние - комбинации (углы, текстуры, части объектов), последние - высокоуровневые понятия, специфичные для исходной задачи. Первые два уровня переносятся почти на любую визуальную задачу, и именно это делает перенос таким эффективным.

Схема переноса знаний из большой задачи-источника в узкую целевую задачу через общие признаки нижних слоёв
Схема переноса знаний из большой задачи-источника в узкую целевую задачу через общие признаки нижних слоёв

Выигрыш двойной. Во-первых, нужно меньше данных: размеченных примеров под узкую задачу обычно мало, а предобученная сеть уже «видела» миллионы картинок. Во-вторых, обучение идёт быстрее и сходится стабильнее, потому что стартовая точка в пространстве весов уже близка к хорошему решению, а не случайна.

Откуда берётся предобученная модель

Источник переноса - модель, обученная на большом универсальном корпусе. Для зрения это ImageNet (1,2 млн изображений, 1000 классов): на нём натренированы ResNet, VGG, EfficientNet, ViT. Для текста - корпуса в сотни миллиардов токенов, на которых обучены BERT, GPT, T5. Эти веса выложены в открытый доступ (torchvision.models, Hugging Face Hub), и их скачивание - первый шаг любого проекта с переносом.

Ключевое условие успеха - близость доменов. Сеть, обученная на естественных фотографиях, отлично переносится на медицинские снимки или спутниковые изображения, но хуже - на принципиально другой тип данных вроде звуковых спектрограмм. Чем дальше целевой домен от источника, тем больше слоёв придётся переучивать и тем больше данных понадобится.

Перед выбором стратегии оцените две вещи: размер вашей выборки и близость к домену-источнику. Малая выборка плюс близкий домен - замораживайте почти всё. Большая выборка плюс далёкий домен - размораживайте больше слоёв.

Feature extraction: заморозить и надстроить

Самый простой режим переноса - использовать предобученную сеть как фиксированный экстрактор признаков. Веса всех свёрточных слоёв замораживают (отключают вычисление градиента), последний классификационный слой выбрасывают и ставят на его место новый - под число классов своей задачи. Обучается только эта новая «голова».

Математически это означает: для слоёв-экстрактора градиент не считается, θbaseL=0\nabla_{\theta_{\text{base}}} L = 0, и оптимизатор обновляет лишь параметры головы θhead\theta_{\text{head}}. Признаки ϕ(x)\phi(x) на выходе замороженной части фиксированы, а обучаемое отображение - это линейный (или небольшой нелинейный) классификатор поверх них:

y^=softmax(Wϕ(x)+b)\hat{y} = \text{softmax}(W \phi(x) + b)

Этот режим оправдан, когда данных совсем мало (сотни примеров) и целевой домен близок к источнику. Обучение идёт быстро: считается прямой проход через тяжёлую часть один раз, а оптимизируется лишь лёгкая голова. Риск переобучения минимален - обучаемых параметров немного.

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

Fine-tuning: дообучить веса

Когда данных побольше или домен заметно отличается, переходят к тонкой настройке (fine-tuning). Здесь размораживают часть или все слои предобученной сети и продолжают обучение на целевых данных, но с маленьким темпом обучения - обычно в 10–100 раз меньше, чем при обучении с нуля. Малый шаг важен принципиально: большой learning rate быстро разрушит аккуратно выстроенные предобученные веса, и перенос потеряет смысл.

Типичная схема - постепенное размораживание (gradual unfreezing): сначала обучают только голову с замороженной базой, затем размораживают верхние блоки, ещё снижают темп и дообучают, и так слой за слоем сверху вниз. Нижние слои с самыми универсальными признаками часто оставляют замороженными до конца.

Часто применяют дифференцированные темпы обучения: для верхних, более специфичных слоёв η\eta больше, для нижних - меньше:

ηl=η0αLl\eta_l = \eta_0 \cdot \alpha^{\,L - l}

где ll - номер слоя, LL - общее число слоёв, α<1\alpha < 1. Так нижние универсальные признаки почти не трогаются, а верхние адаптируются под новую задачу.

Сколько слоёв размораживать

Это главный практический вопрос, и ответ зависит от двух осей - размера выборки и близости доменов:

  • Мало данных, близкий домен - feature extraction, обучаем только голову. Размораживать слои не нужно, риск переобучения слишком велик.
  • Много данных, близкий домен - fine-tuning всей сети с малым темпом. Данных хватает, чтобы аккуратно подстроить все веса.
  • Мало данных, далёкий домен - самый сложный случай: feature extraction даёт плохие признаки, а полный fine-tuning переобучается. Компромисс - разморозить только верхние блоки.
  • Много данных, далёкий домен - fine-tuning большой части сети или даже обучение почти с нуля с предобученной инициализацией.

Эта матрица «выборка × домен» - основа любого решения. Почему именно нижние свёрточные слои переносятся лучше всего, понятнее, если посмотреть на устройство свёрточной нейросети (CNN) - там иерархия признаков от краёв к объектам видна напрямую.

Практический пайплайн

Типичный порядок действий при переносе обучения выглядит так:

  1. Загрузить предобученную сеть без верхнего классификатора (include_top=False или pretrained=True).
  2. Заменить голову на новую под своё число классов.
  3. Заморозить базу, обучить только голову несколько эпох - пусть голова «настроится» на признаки.
  4. Разморозить верхние блоки, снизить learning rate в 10 раз, дообучить.
  5. Подобрать аугментации под целевой домен - для малой выборки это критично.
  6. Следить за валидацией: расхождение train/val loss - сигнал переобучения, пора остановиться или заморозить обратно.

Важная деталь - нормализация входов должна совпадать с той, что была при предобучении (те же среднее и дисперсия по каналам). Иначе признаки нижних слоёв «поедут», и весь смысл переноса теряется.

Частые ошибки

  • Слишком большой learning rate при fine-tuning. Большой шаг за пару итераций стирает предобученные веса, и сеть фактически учится с нуля, но уже на малой выборке - то есть переобучается.
  • Размораживание всей сети при сотне примеров. Миллионы обучаемых параметров против сотни примеров - гарантированное переобучение. Начинайте с заморозки.
  • Игнорирование нормализации входов. Если подать данные с другим масштабом, чем при предобучении, активации нижних слоёв искажаются и признаки становятся бесполезными.
  • Перенос между слишком далёкими доменами без проверки. Сеть с ImageNet не обязана помогать на табличных данных или аудио - иногда обучение с нуля работает не хуже.
  • Забыть про режим eval для слоёв BatchNorm. При заморозке базы статистики BatchNorm должны быть зафиксированы, иначе они «плывут» на малых батчах.

FAQ

Чем перенос обучения отличается от обучения с нуля? При обучении с нуля веса инициализируются случайно и сеть учит всё с чистого листа, требуя много данных. При переносе стартовая точка - уже осмысленные веса с большой задачи, поэтому нужно меньше данных и эпох. По сути это разница между «выучить язык с нуля» и «адаптировать знание родственного языка».

Можно ли применять перенос обучения к языковым моделям? Да, и именно там он сейчас доминирует. Предобучение на огромном корпусе плюс дообучение под конкретную задачу (классификация, ответы на вопросы) - стандарт для BERT и GPT-подобных моделей. Это тот же принцип: универсальные представления языка переносятся на узкую задачу.

Что делать, если целевой домен совсем не похож на источник? Сначала всё равно попробуйте перенос: даже далёкие признаки нижних слоёв часто полезны как инициализация. Если не помогает - размораживайте больше слоёв, увеличивайте долю обучаемых весов, а при достаточном объёме данных сравните с обучением с нуля.

Коротко

Перенос обучения (transfer learning) переиспользует предобученную модель как заготовку для новой задачи, экономя данные и время. Два основных режима: feature extraction (заморозить базу, обучить только новую голову) - для малой выборки и близкого домена; fine-tuning (разморозить часть слоёв и дообучить с малым темпом) - когда данных больше или домен дальше. Решение «сколько слоёв размораживать» определяется матрицей «размер выборки × близость доменов». Главные грабли - слишком большой learning rate, разморозка всей сети на малой выборке и рассогласованная нормализация входов.

Доверьте текст нейросети EssayAI

Открыть EssayAI

Бесплатно, на русском языке и без VPN

Читайте также