Как с помощью supervised fine-tuning кастомизировать LLM

Как с помощью supervised fine-tuning кастомизировать LLM

В быстро развивающейся сфере Natural Language Processing (NLP) fine-tuning стал мощным и эффективным инструментом адаптации предварительно обученных больших языковых моделей (Large Language Model, LLM) под конкретные задачи. Предварительно обученные LLM (например, семейство GPT) продемонстрировали существенный прогресс в понимании и генерации языка. Однако эти предварительно обученные модели обычно учатся на огромных объёмах текстовых данных при помощи обучения без учителя и могут быть не оптимизированы под узкую задачу.

Fine-tuning позволяет закрыть этот пробел, воспользовавшись преимуществами общего понимания языка, полученными во время предварительного обучения, и адаптировав их к целевой задаче при помощи обучения с учителем. Благодаря fine-tuning предварительно обученной модели на специфичном для задачи датасете разработчики NLP могут достигать впечатляющих результатов с гораздо меньшим объёмом данных обучения и вычислительных ресурсов, чем при обучении модели с нуля. В частности, для LLM fine-tuning крайне важен, так как повторное обучение на всём объёме данных вычислительно слишком затратно.

Сравнение предварительного обучения LLM и fine-tuning
Сравнение предварительного обучения LLM и fine-tuning

Успех fine-tuning привёл ко множеству передовых результатов в широком спектре задач NLP и сделал его стандартной практикой в разработке высокоточных языковых моделей. Исследователи и практики продолжают исследовать варианты и оптимизации методик fine-tuning, чтобы ещё больше расширить возможности NLP.

В этой статье мы глубже изучим процесс fine-tuning LLM на основе инструкций при помощи библиотеки transformers двумя разными способами: просто с библиотекой transformers и с модулем trl.

Supervised fine-tuning (SFT)

Supervised fine-tuning — это адаптация предварительно обученной LLM к конкретной задаче при помощи размеченных данных. При supervised fine-tuning данные для fine-tuning собираются из множества ответов, предварительно валидированных вручную. В этом заключается основное методики отличие от методик без учителя, при которых данные заранее не валидируются. Обучение LLM обычно выполняется без учителя (unsupervised), а fine-tuning обычно происходит с учителем (supervised).

В процессе supervised fine-tuning предварительно обученная LLM подстраивается под этот размеченный датасет при помощи методик обучения с учителем. Веса модели выравниваются на основании градиентов, полученных из специфичной для задачи функции потерь, измеряющей разность между прогнозами LLM и эталонной разметкой.

Процесс supervised fine-tuning позволяет модели выучивать специфичные для задачи паттерны и нюансы, присутствующие в размеченных данных. Адаптируя её параметры согласно распределению специфичных данных и требованиям задачи, модель становится специализированной, обеспечивая высокую точность в выполнении целевой задачи.

Допустим, у нас есть предварительно обученная LLM. В ответ на вопрос Я не могу войти в свой аккаунт. Что мне делать? она отвечает простым Попробуйте сбросить пароль при помощи опции "Forgot Password".

Сухой и краткий ответ предварительно обученной LLM на вопрос в службу техподдержки
Сухой и краткий ответ предварительно обученной LLM на вопрос в службу техподдержки

А теперь представьте, что вам нужно создать чат-бота для сервиса техподдержки. Хотя показанный выше ответ может быть корректным, он неадекватен в качестве ответа службы поддержки, который требует больше участия, другого формата, дополнительной контактной информации и прочих данных. И тут на помощь приходит supervised fine-tuning.

Более качественный ответ после fine-tuning на вопрос в техподдержку, соответствующий требованиям бизнеса
Более качественный ответ после fine-tuning на вопрос в техподдержку, соответствующий требованиям бизнеса

Если предоставить модели множество валидированных обучающих примеров, то она научится лучше отвечать на промты и вопросы. В примере на рисунке выше мы научили модель эмпатии сотрудника техподдержки.

Вот некоторые из причин, по которым вам может понадобится fine-tuning моделей LLMs:

  • Обеспечение более качественных ответов, соответствующих принципам ведения бизнеса.
  • Предоставление модели новых специфичных/конфиденциальных данных, недоступных на этапе обучения, чтобы модель LLM адаптировалась под вашу конкретную базу знаний.
  • Обучение LLM умению отвечать на новые (неизвестные ей) промты.

Supervised fine-tuning (SFT) при помощи библиотеки Transformers

Библиотека transformers Hugging Face с большим отрывом от остальных стала самой популярной библиотекой для обучения и fine-tuning моделей, в том числе и LLM. Finetuning моделей всегда был одной из его базовых функций, которая практически прозрачным образом включена в его вспомогательный класс Trainer.

Однако в последнее время, с выходом модуля trl для обучения с подкреплением, был выпущен новый класс SFTTrainer, который более узко направлен на Supervised fine-tuning моделей LLM. Давайте разберём их разницу.

Fine-tuning при помощи класса Trainer

Класс Trainer упрощает предварительное обучение и fine-tuning моделей, в том числе и LLM. Ему требуются следующие аргументы:

  • model, загружаемый при помощи AutoModelWithLMHead.from_pretrained;
  • TrainingArgs;
  • обучающий датасет и оценочный датасет;
  • Data collator, применяющий к датасетам различные преобразования. Одно из них — это Padding (для создания батчей одинаковой длины), но это можно выполнить и при помощи токенизатора. Однако в случае LLM его можно использовать и иначе, поэтому он обязателен в таком виде обучения — он маскирует случайные токены для прогнозирования следующего токена.
Fine-tuning предварительно обученной LLM при помощи класса Trainer
Fine-tuning предварительно обученной LLM при помощи класса Trainer

eval_dataset и train_dataset — это объекты класса Dataset. Dataset можно создавать из множества различных форматов. В данном случае предположим, что у меня есть датасеты в двух файлах txt, находящихся в <TRAINING_DATASET_PATH> и в <TEST_DATASET_PATH>. Тогда чтобы получить Dataset для обоих блоков и также Collator, достаточно сделать следующее:

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

Если нам нужно обучить LLM на основе инструкций, могут оказаться полезными следующие датасеты:

  1. GPT-4all Dataset: GPT-4all (пары, английский язык, 400 тысяч элементов) — комбинация некоторых подмножеств OIG, P3 и Stackoverflow, покрывающие общие вопросы QA и модифицированные творческие вопросы.
  2. RedPajama-Data-1T: RedPajama (PT, в основном английский язык, 1,2 триллиона токенов, 5 ТБ) — полностью открытый датасет предварительного обучения по методике LLaMA.
  3. OASST1: OpenAssistant (пары, диалог, многоязычный, 66497 ветвей разговоров) — большой написанный и аннотированный людьми высококачественный датасет разговоров, предназначенный для улучшения ответов LLM.
  4. databricks-dolly-15k: Dolly2.0 (пары, английский язык, больше 15 тысяч элементов) — датасет написанных людьми промтов и ответов, включающий в себя такие задачи, как ответы на вопросы и резюмирование.
  5. AlpacaDataCleaned: модели наподобие Alpaca/LLaMA (пары, английский язык) — очищенная версия Alpaca, GPT_LLM и GPTeacher.
  6. GPT-4-LLM Dataset: несколько моделей наподобие Alpaca (пары, RLHF, английский, китайский, 52 тысячи элементов на английском и китайском, 9 тысяч элементов unnatural-instruction) — датасет, сгенерированный GPT-4 и другими LLM для улучшения пар и RLHF, включающий данные инструкций и сравнений.
  7. GPTeacher: (пары, английский язык, 20 тысяч элементов) — датасет, содержащий сгенерированные GPT-4 задачи, включая порождающие задачи из Alpaca и новые задачи наподобие ролевых игр.
  8. Alpaca data: Alpaca, ChatGLM-fine-tune-LoRA, Koala (диалог, пары, английский язык, 52 тысяч элементов, 21,4 МБ) — датасет, сгенерированный text-davinci-003 для расширения возможностей языковых моделей по выполнению человеческих инструкций.

Fine-tuning при помощи класса SFTTrainer библиотеки trl

Как говорилось выше, существует ещё один класс — SFTTrainer, который позже был добавлен в библиотеку Hugging Face trl, предназначенную для обучения с подкреплением. Так как supervised fine-tuning — это первый этап Reinforcement Learning by Human Feedback (RLHF), разработчики решили выделить его в отдельный класс, в то же время добавив вспомогательные функции, которые при использовании библиотеки Trainer пришлось бы реализовывать вручную. Давайте посмотрим, на что это похоже.

Fine-tuning предварительно обученной LLM при помощи класса trl.SFTTrainer
Fine-tuning предварительно обученной LLM при помощи класса trl.SFTTrainer

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

Однако в класс SFTTrainer добавлены некоторые возможности, упрощающие обучение при работе с LLM. Давайте перечислим их:

  1. Поддержка peft: в SFTTrainer есть поддержка библиотеки Parameter Efficient Finetuning, включающей в себя Lora, QLora и так далее. Lora позволяет добавлять адаптеры (Adapter) с весами, то есть единственные параметры, подвергающиеся fine-tuned, с заморозкой остальных. QLora — это дискретизированная версия. Обе методики сильно снижают время fine-tuning, что особенно важно при fine-tuning LLM из-за высоких вычислительных затрат.
Сравнение fine-tuning, Lora и QLora
Сравнение fine-tuning, Lora и QLora
  1. Упаковка батчей: вместо применения токенайзера для заполнения предложений до максимальной длины, поддерживаемой моделью, упаковка позволяет комбинировать входные данные с другими, что расширяет ёмкость батчей.
Упакованные сэмплы 1,2,3
Упакованные сэмплы 1,2,3

Выводы

Fine-tuning изначально был механизмом для оптимизации архитектур трансформеров. При обучении языковой модели на прогнозирование следующего токена и/или маскирование, или для обучения классификатора последовательностей токенов (а также других задач) fine-tuning выполняется с учителем, потому что ему требуются данные, проверенные живыми разметчиками.

В случае LLM обычно требуется подстройка их ответов под требования заказчика, поскольку они обычно обучаются на больших объёмах открытых/доступных данных.

Fine-tuning модели LLM можно выполнять множеством разных способов. Один из самых простых вариантов — класс Trainer из библиотеки transformers, который уже довольно долгое время применяется для fine-tuning любых моделей на основе трансформеров.

Недавно Hugging Face выпустила новую библиотеку trl, предназначенную для обучения с подкреплением на основе человеческой обратной связи (Reinforcement Learning by Human Feedback, RLHF). Один из основных этапов такого обучения — это именно supervised fine-tuning, поэтому разработчики создали новый класс SFTTrainer, управляющий процессом и оптимизирующий эффективное использование параметров (peft ) и упаковку.

Понравилась статья? Еще больше информации на тему данных, AI, ML, LLM вы можете найти в моем Telegram канале “Роман с данными”

  • Как подготовиться к сбору данных, чтобы не провалиться в процессе?
  • Как работать с синтетическими данными в 2024 году?
  • В чем специфика работы с ML проектами? И какие бенчмарки сравнения LLM есть на российском рынке?

Обо всем этом читайте в “Роман с данными”

Начать дискуссию