Ещё одна причина, почему нейросети развиваются так быстро.
Обучать нейросети долго и дорого: нужно собрать много данных, разметить их, запустить модель и ждать, пока она научится принимать правильные решения. Но в некоторых случаях можно схитрить: взять уже обученную, «умную» модель и использовать её знания. В этой статье рассказываем про трансферное обучение — метод повторного использования обученных нейросетей для решения смежных задач.
Иван Сметанников
Тимлид команды машинного обучения и искусственного интеллекта в Serokell, кандидат технических наук, работал доцентом на факультете информационных технологий и программирования ИТМО.
Что такое трансферное обучение
Представьте, что шеф-повар пиццерии попросил вас разработать нейросеть, которая могла бы по фотографии отличать пиццу «Пепперони» от «Гавайской».
В классическом подходе вам пришлось бы собрать большой датасет, обучить нейросеть распознавать изображения и только после этого объяснить ИИ, чем различаются две пиццы. Это заняло бы много времени, а итоговая модель могла бы решать только одну задачу. Например, если в меню появится пицца «Четыре сыра», то весь процесс обучения придётся начинать сначала.
В случае с трансферным обучением можно взять уже готовую нейросеть для работы с изображениями и дообучить её определять начинку пиццы, а в будущем адаптировать для распознавания других блюд. Идея простая: система уже знает, как классифицировать изображения определённого типа, поэтому этот навык можно будет применить к любым картинкам.
Модель уже научилась понимать, что картинки ― это картинки и что на них бывают признаки, на которые надо смотреть: линии, формы и чёрточки. Часть из них она переиспользует, когда начинает дообучаться на новых данных. Благодаря трансферному обучению мы можем быстро получать точные результаты.
Подходы к трансферному обучению
В трансферном обучении есть несколько основных подходов, которые применяют в зависимости от задач.
Выделение признаков
Представьте, что нам надо создать нейросеть для поиска на изображениях кошек и собак. У нас уже есть размеченный датасет с фотографиями животных, но данных слишком мало, что обучить модель с нуля. В этом случае можно использовать метод выделения признаков.
Для этого возьмём модель ResNet, которую до нас уже обучили распознавать картинки и выделять из них универсальные векторные признаки, например края, текстуры и формы. В ней мы «заморозим» веса классификационных слоёв, чтобы на выходе получать только массивы векторных признаков.
Такая система будет принимать на вход датасет, извлекать из каждого изображения ключевые признаки и сохранять их в векторном виде, который хорошо понимают нейросети. После на полученных данных можно переобучить классификационные слои ResNet с заморозкой базовых. Так нейросеть научится различать кошек и собак на фотографиях и не забудет, как выделять векторные признаки изображений.
Заморозка слоёв — это приостановка обновления весов в некоторых слоях, чтобы они не менялись во время обучения на новых данных. На первых этапах мы используем лишь часть старой сети, например 20% начальных слоёв, а остальную часть заменяем случайными числами.
Если начать обучение без заморозки, то случайные значения повлияют на веса начальных слоёв и нейросеть перестанет распознавать базовые признаки изображений. Позже слои можно разморозить и слегка дообучить, чтобы улучшить качество работы сети.
Файн-тюнинг
Представьте, что нам надо обучить нейросеть определять, какая тональность у отзывов на сайте: нейтральная, положительная или отрицательная. Для этого, например, можно использовать BERT — языковую модель, которая уже умеет анализировать текст. Ещё потребуется размеченный датасет, состоящий из примеров отзывов с одной из возможных оценок. Чем больше данных будет в обучающем наборе, тем лучше BERT будет определять тональность текста.
У языковой модели уже есть собственный токенизатор, поэтому нам не придётся его создавать самим. Надо будет только поверх предобученной нейросети установить дополнительный слой-классификатор с числом выходных нейронов, равных количеству возможных оценок тональности отзыва, и запустить обучение. BERT уже очень многое умеет, поэтому во время файн-тюнинга можно выбрать меньший learning rate и запускать обучение всего на паре эпох.
Для ещё большего ускорения можно также заморозить нижние слои. В BERT они определяют базовые языковые конструкции, например порядок слов в предложении. Мы не собираемся заново учить нейросеть понимать текст, поэтому достаточно будет обучить только верхние слои.
В результате у нас получится всё та же языковая модель BERT со всеми своими лингвистическими знаниями, но лучше определяющая тональность отзывов. При этом благодаря файн-тюнингу мы сэкономили время на обучении.
Адаптация предметной области
В этом случае надо будет работать с двумя доменами: исходным и целевым. В исходном собраны данные, на которых нейросеть уже обучена, а в целевом — для которых хотим адаптировать систему. Во время дообучения в нейросеть подаются батчи как из исходного, так и из целевого домена, чтобы модель научилась выявлять закономерности.
Межъязыковой трансфер
Например, нам всё так же надо обучить нейросеть определять тональность отзывов на сайте, но уже на корейском языке. У нас есть два размеченных датасета: в первом несколько десятков тысяч отзывов на русском, которые мы собрали на маркетплейсах, а во втором всего несколько тысяч отзывов на корейском. Обучить с нуля нейросеть для работы с корейским языком мы не можем — слишком мало данных. Поэтому используем межъязыковой трансфер.
Для этого обучим BERT определять тональность отзывов на русском языке, как уже делали в примере с файн-тюнингом, и запустим дообучение на датасете с корейскими отзывами. Нейросеть с самого начала умела работать с текстами — просто мы перенесли умение на новый язык.
Главная фишка метода в том, что нейросети не надо знать корейский язык, чтобы научиться с ним работать. Модель уже хорошо работает с русским, а во время дообучения найдёт паттерны и поймёт, как их можно использовать с другим языком.
Zero-shot-обучение
С такими задачами хорошо справляется ChatGPT — языковая модель, которую уже обучили на большом количестве текстов. Например, нам надо разделить электронные письма по трём классам: запрос на возврат, вопрос о продукте и жалоба на качество. Мы можем просто текстом описать классы и попросить ChatGPT рассортировать их.
Описать классы можно так:
- класс 1: «Электронное письмо связано с запросом на возврат»;
- класс 2: «Электронное письмо связано с жалобой на качество»;
- класс 3: «Электронное письмо связано с вопросом о продукте».
С этими вводными нейросеть будет читать письма и на основе содержания определять их в соответствующую группу. Например, письмо с текстом «Здравствуйте, я хочу вернуть бракованный товар» попадёт в первый класс. Изначально нейросеть не учили сортировать письма, но она умеет анализировать текст и понимает его смысл.
В этом примере лучше обрабатывать данные в два этапа. Сначала использовать большую языковую модель для сбора данных, а после обучить на них небольшую и шуструю нейросеть для классификации отзывов по тональности. В долгосрочной перспективе это поможет сэкономить ресурсы без снижения качества.
Плюсы и минусы трансферного обучения
Плюсы:
- Экономия ресурсов. Обучать нейросети с нуля долго и дорого. Если использовать предобученные модели, то можно значительно уменьшить затраты.
- Нужно меньше данных. Для трансферного обучения можно использовать небольшие датасеты. Основная нейросеть уже умеет выполнять базовые задачи, поэтому её надо только адаптировать.
- Удобство прототипирования. На базе уже готовой модели можно быстро создать прототип и протестировать его на реальных задачах. Благодаря этому становится проще экспериментировать с нейросетями.
Минусы:
- Зависимость от предобученных моделей. Не для каждой задачи есть базовая нейросеть с открытым исходным кодом, которую можно дообучить на собственных данных.
- Проблемы совместимости. Если предобученная нейросеть работает со специфическим форматом данных, то придётся адаптировать весь датасет.
- Риск переобучить нейрость. Во время трансферного обучения можно случайно задеть важные знания базовой модели, что плохо скажется на качестве ответов нейросети.
Где используют трансферное обучение
Разработчики используют трансферное обучение в задачах, в которых мало данных для обучения нейросети, но их можно получить из других моделей:
- Компьютерное зрение. Если надо создать нейросеть для классификации изображений или обнаружения объектов, то за основу можно взять модель, которая уже умеет работать с картинками.
- Обработка текстов. Трансферное обучение подходит для подстройки больших языковых моделей под конкретные задачи. Например, так создают чат-ботов для генерации кода.
- Генерация изображений. Большую нейросеть для генерации картинок можно дообучить создавать работы в стиле известных художников.
- Распознавание речи. Если нейросеть уже умеет обрабатывать речь, то можно дополнительно научить её понимать специфические термины.
- Рекомендательные системы. Нейросети в онлайн-магазинах анализируют паттерны поведения пользователя в одной категории товаров, а после применяют их для рекомендации чего-то нового.
Чаще всего трансферное обучение используют в компьютерном зрении и обработке языков. В других сферах метод плохо прижился. В частных задачах до сих пор вручную анализируют данные и создают признаки.
Что в итоге
- Трансферное обучение — это подход в машинном обучении, когда модель переиспользует имеющиеся знания, чтобы решить новую задачу.
- Благодаря этому подходу разработчики могут быстрее обучать нейросети, экономить ресурсы и использовать меньше данных в датасетах.
- Трансферное обучение используется в компьютерном зрении, обработке естественного языка, медицине и других сферах.
- Сильные стороны метода — высокая точность, быстрая адаптация и возможность работы с малым объёмом данных.
- Слабые стороны метода — низкая эффективность при большой разнице между исходными и целевыми задачами.
Датасет — структурированный набор данных, который используют для обучения нейросетей.
Веса нейросети — числовые коэффициенты, определяющие связи между нейронами. Модель просчитывает их во время обучения, чтобы делать правильные предсказания.
Слой нейросети — упорядоченная группа нейронов, которая получает данные, выделяет в них важные признаки и передаёт результат следующему слою.
Токенизатор — система, которая разбивает текст на небольшие части, токены. Токенами могут быть слова, слоги или даже отдельные символы.
Learning rate, или темп обучения, — параметр, который определяет, насколько сильно надо изменять веса модели после ошибки. Чем выше темп, тем быстрее обучается нейросеть.
Эпоха (epoch) — цикл, за который датасет проходит через нейросеть.
Батч — небольшая часть датасета, которая проходит через нейросеть за одну итерацию.