Перенос обучения

Коротко

Definition

Перенос обучения — это подход, при котором модель, предварительно обученная на одной задаче и большом датасете, используется как отправная точка для другой, обычно более узкой задачи.

Transfer Learning особенно полезен, когда для целевой задачи мало данных, но есть доступная предобученная модель на похожем типе данных.

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

Зачем нужен

Глубокие нейросети имеют много параметров. Чтобы обучить их с нуля и не получить сильное переобучение, обычно нужны большие датасеты.

В реальных задачах данных часто мало:

  • мало размеченных медицинских снимков;
  • мало изображений дефектов;
  • мало экспериментальных данных;
  • мало специализированных текстов;
  • мало материалов с нужными свойствами.

Идея transfer learning: не начинать обучение с нуля, а использовать знания, уже накопленные моделью на большой source-задаче.

Предобученная модель уже умеет извлекать полезные признаки. Новая задача использует эти признаки как стартовую точку.

Как работает

Transfer learning работает потому, что многие нейросети обучаются иерархически.

Для изображений это можно понимать так:

  1. Ранние слои выделяют универсальные примитивы: края, углы, простые текстуры.
  2. Средние слои собирают из примитивов части объектов.
  3. Поздние слои кодируют более специфичные признаки классов.
  4. Финальная голова делает предсказание под исходную задачу.

При переносе обучения обычно переиспользуют backbone — основную часть модели, которая извлекает признаки, — и заменяют task-specific head.

Например:

Backbone даёт полезное представление объекта, а новая голова обучается под целевую задачу.

Source task и target task

В transfer learning различают две задачи.

Source task — исходная задача, на которой модель была предварительно обучена.

Target task — новая задача, для которой мы хотим использовать предобученную модель.

Пример:

РольПример
Source taskклассификация 1000 классов ImageNet
Source datasetImageNet
Pretrained modelResNet-50
Target taskклассификация снимков на болен / здоров
Target datasetнебольшой медицинский датасет

Чем ближе source task и target task, тем вероятнее, что перенос обучения будет полезен.

Алгоритм

Типовой алгоритм transfer learning:

  1. Взять предобученную модель, например ResNet-50.
  2. Убрать исходную голову модели, которая решала source task.
  3. Добавить новую голову под target task.
  4. Решить, какие слои заморозить, а какие обучать.
  5. Обучить новую голову на целевом датасете.
  6. При необходимости разморозить часть backbone.
  7. Дообучить модель с маленьким learning rate.
  8. Оценить качество на validation и test.

В задачах классификации новая голова обычно имеет число выходов, равное числу классов target task.

Например, если нужно классифицировать снимки на два класса болен / здоров, новая голова может иметь 2 выхода.

Заморозка слоёв

Заморозка означает, что параметры части модели не обновляются во время обучения.

Замороженные слои работают как фиксированный экстрактор признаков. Градиенты через них могут проходить, но сами веса не меняются.

Общее правило:

  • чем меньше данных и чем больше похожи задачи, тем больше слоёв можно заморозить;
  • чем больше данных и чем сильнее отличается новая задача, тем больше слоёв стоит дообучать.
Размер target-датасетаTarget-задача похожа на sourceTarget-задача сильно отличается
МаленькийЗаморозить почти весь backbone, обучить только новую голову. Признаки уже подходят, а данных мало.Заморозить ранние слои, обучать поздние слои и голову. Универсальные признаки могут подойти, специфические нужно переучить.
БольшойFine-tuning всей сети. Данных достаточно, чтобы аккуратно подстроить модель.Обучить с нуля или делать полный fine-tuning. Старые признаки могут мешать, но данных уже достаточно.

Fine-tuning

Fine-tuning — это дообучение предобученной модели на новой задаче.

Есть несколько вариантов.

Feature extraction

Backbone заморожен, обучается только новая голова.

Это хорошо, если:

  • данных мало;
  • target task похожа на source task;
  • нужно быстро получить baseline;
  • важно снизить риск переобучения.

Partial fine-tuning

Часть backbone заморожена, а поздние слои и голова обучаются.

Это хорошо, если:

  • данных умеренно мало;
  • target task похожа, но не полностью;
  • нужно подстроить более специфичные признаки.

Full fine-tuning

Обучаются все параметры модели.

Это хорошо, если:

  • данных достаточно;
  • target task отличается от source task;
  • нужна максимальная адаптация модели;
  • есть ресурсы для аккуратного обучения.

Обычно fine-tuning делают с меньшим learning rate, чем обучение головы, чтобы не разрушить уже полезные предобученные веса.

Где используется

Transfer learning используется во многих областях.

Компьютерное зрение

Частый сценарий:

  • взять предобученную CNN;
  • заменить классификационную голову;
  • дообучить на своём датасете изображений.

Примеры:

  • медицинские снимки;
  • дефекты на производстве;
  • микроскопия;
  • спутниковые изображения;
  • классификация пород животных;
  • распознавание объектов в малом датасете.

NLP

В NLP transfer learning стал основой современных подходов.

Примеры:

  • взять предобученный Трансформер;
  • добавить голову для классификации;
  • дообучить на задаче sentiment analysis, NER или question answering.

Большие языковые модели тоже являются примером переноса: сначала модель учится на огромном корпусе текстов, затем адаптируется под конкретные задачи.

Materials ML и химия

В Materials ML и химии transfer learning может использоваться, если модель обучена на большом наборе молекул, кристаллов или расчётных данных, а затем дообучается на более узкой задаче.

Примеры:

  • предобучить модель на больших данных Materials Project;
  • дообучить на конкретном классе материалов;
  • использовать pretrained graph model для молекул;
  • использовать representation learning для малых экспериментальных датасетов.

Это связано с ML для материалов, GNN для молекул и кристаллов и Геометрическое ML в химии.

Когда использовать

Transfer learning стоит использовать, если:

  • целевых данных мало;
  • есть предобученная модель на похожих данных;
  • обучение с нуля даёт переобучение;
  • нужно быстро получить сильный baseline;
  • данные имеют сложную структуру, например изображения, текст или графы;
  • есть ограниченные вычислительные ресурсы.

Особенно полезен transfer learning для изображений и последовательностей, где предобученные модели часто уже умеют извлекать сильные признаки.

Когда не использовать

Transfer learning может быть плохим выбором, если:

  • source task и target task почти не похожи;
  • предобученная модель обучалась на нерелевантных данных;
  • target-датасет большой и качественный;
  • есть риск негативного переноса;
  • модель слишком тяжёлая для задачи;
  • предобученная модель несёт нежелательные biases.

Negative transfer возникает, когда знания из source task мешают решать target task.

Например, модель, предобученная на обычных фотографиях, может плохо переноситься на специализированные научные изображения, если визуальная структура сильно отличается.

Минимальный пример

Допустим, нужно классифицировать медицинские изображения на два класса:

  • healthy;
  • disease.

Целевой датасет маленький: всего 1000 изображений.

Обучать большую CNN с нуля рискованно: модель может переобучиться.

Transfer learning pipeline:

ШагЧто делаем
1Берём ResNet-50, предобученную на ImageNet
2Удаляем старую голову на 1000 классов
3Добавляем новую голову на 2 класса
4Замораживаем backbone
5Обучаем новую голову
6Размораживаем последние блоки
7Дообучаем с маленьким learning rate
8Проверяем качество на test

Если данных очень мало, можно остановиться на обучении только головы. Если данных больше, можно разморозить часть backbone.

Практические замечания

Хороший workflow для transfer learning:

  1. Проверить, насколько source и target данные похожи.
  2. Начать с feature extraction.
  3. Обучить новую голову.
  4. Оценить качество на validation.
  5. Разморозить поздние слои backbone.
  6. Дообучить с маленьким learning rate.
  7. Использовать аугментации, если это изображения.
  8. Следить за переобучением.
  9. Сравнить с простым baseline.
  10. Проверить ошибки модели на реальных примерах.

Практически важно не размораживать всю модель слишком рано. Если данных мало и learning rate большой, можно быстро разрушить полезные предобученные веса.

Типичные ошибки понимания

Думать, что transfer learning всегда работает

Transfer learning полезен только тогда, когда source-задача дала признаки, применимые к target-задаче.

Если домены сильно отличаются, перенос может быть слабым или вредным.

Сразу размораживать всю модель

Если target-датасет маленький, полный fine-tuning может привести к переобучению или разрушению предобученных признаков.

Использовать слишком большой learning rate

Для fine-tuning обычно нужен меньший learning rate, чем для обучения с нуля. Иначе веса backbone могут измениться слишком резко.

Не менять голову модели

Исходная голова предобученной модели решала source task. Для новой задачи её почти всегда нужно заменить.

Сравнивать без baseline

Нужно сравнить transfer learning с простыми вариантами:

  • обучение только головы;
  • частичный fine-tuning;
  • обучение с нуля, если данных достаточно;
  • простая классическая модель, если признаки уже табличные.

Связанные понятия