![](https://habrastorage.org/webt/eh/dv/8n/ehdv8nyiaj2nhpf6q8kuknvug38.jpeg)
В быстро развивающейся сфере Natural Language Processing (NLP) fine-tuning стал мощным и эффективным инструментом адаптации предварительно обученных больших языковых моделей (Large Language Model, LLM) под конкретные задачи. Предварительно обученные LLM (например, семейство GPT) продемонстрировали существенный прогресс в понимании и генерации языка. Однако эти предварительно обученные модели обычно учатся на огромных объёмах текстовых данных при помощи обучения без учителя и могут быть не оптимизированы под узкую задачу.
Fine-tuning позволяет закрыть этот пробел, воспользовавшись преимуществами общего понимания языка, полученными во время предварительного обучения, и адаптировав их к целевой задаче при помощи обучения с учителем. Благодаря fine-tuning предварительно обученной модели на специфичном для задачи датасете разработчики NLP могут достигать впечатляющих результатов с гораздо меньшим объёмом данных обучения и вычислительных ресурсов, чем при обучении модели с нуля. В частности, для LLM fine-tuning крайне важен, так как повторное обучение на всём объёме данных вычислительно слишком затратно.
![](https://habrastorage.org/webt/4s/vp/r3/4svpr3dujmyyds4lx0zhdcercbi.jpeg)
Сравнение предварительного обучения 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".
![](https://habrastorage.org/webt/b2/ef/uw/b2efuwggcxuj-mesli42_ofksno.png)
Сухой и краткий ответ предварительно обученной LLM на вопрос в службу техподдержки
А теперь представьте, что вам нужно создать чат-бота для сервиса техподдержки. Хотя показанный выше ответ может быть корректным, он неадекватен в качестве ответа службы поддержки, который требует больше участия, другого формата, дополнительной контактной информации и прочих данных. И тут на помощь приходит supervised fine-tuning.
![](https://habrastorage.org/webt/j2/12/fy/j212fy7rjlfyvtgigsjpfnov1cq.png)
Более качественный ответ после 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 его можно использовать и иначе, поэтому он обязателен в таком виде обучения — он маскирует случайные токены для прогнозирования следующего токена.
![](https://habrastorage.org/webt/ih/rb/mo/ihrbmo1hnqmbmjjaesyh0r-12tm.png)
Fine-tuning предварительно обученной LLM при помощи класса Trainer
eval_dataset
и train_dataset
— это объекты класса Dataset. Dataset можно создавать из множества различных форматов. В данном случае предположим, что у меня есть датасеты в двух файлах txt
, находящихся в <TRAINING_DATASET_PATH>
и в <TEST_DATASET_PATH>
. Тогда чтобы получить Dataset для обоих блоков и также Collator, достаточно сделать следующее:![](https://habrastorage.org/webt/cy/-x/kr/cy-xkrh4nawlwul_cph5uzhqlem.jpeg)
Предварительная обработка данных — обязательный шаг перед обучением
Если нам нужно обучить LLM на основе инструкций, могут оказаться полезными следующие датасеты:
- GPT-4all Dataset: GPT-4all (пары, английский язык, 400 тысяч элементов) — комбинация некоторых подмножеств OIG, P3 и Stackoverflow, покрывающие общие вопросы QA и модифицированные творческие вопросы.
- RedPajama-Data-1T: RedPajama (PT, в основном английский язык, 1,2 триллиона токенов, 5 ТБ) — полностью открытый датасет предварительного обучения по методике LLaMA.
- OASST1: OpenAssistant (пары, диалог, многоязычный, 66497 ветвей разговоров) — большой написанный и аннотированный людьми высококачественный датасет разговоров, предназначенный для улучшения ответов LLM.
- databricks-dolly-15k: Dolly2.0 (пары, английский язык, больше 15 тысяч элементов) — датасет написанных людьми промтов и ответов, включающий в себя такие задачи, как ответы на вопросы и резюмирование.
- AlpacaDataCleaned: модели наподобие Alpaca/LLaMA (пары, английский язык) — очищенная версия Alpaca, GPT_LLM и GPTeacher.
- GPT-4-LLM Dataset: несколько моделей наподобие Alpaca (пары, RLHF, английский, китайский, 52 тысячи элементов на английском и китайском, 9 тысяч элементов unnatural-instruction) — датасет, сгенерированный GPT-4 и другими LLM для улучшения пар и RLHF, включающий данные инструкций и сравнений.
- GPTeacher: (пары, английский язык, 20 тысяч элементов) — датасет, содержащий сгенерированные GPT-4 задачи, включая порождающие задачи из Alpaca и новые задачи наподобие ролевых игр.
- 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
пришлось бы реализовывать вручную. Давайте посмотрим, на что это похоже.![](https://habrastorage.org/webt/st/q4/q1/stq4q14mq7coieewhsexinjyres.jpeg)
Fine-tuning предварительно обученной LLM при помощи класса trl.SFTTrainer
Возможно, вы не заметили в приведённом выше примере ничего нового. И вы действительно правы, потому что класс
SFTTrainer
наследует от функции Trainer
, что можно узнать, изучив исходный код. По сути, требуются те же модель, train_dataset, датасет оценки и collator.Однако в класс
SFTTrainer
добавлены некоторые возможности, упрощающие обучение при работе с LLM. Давайте перечислим их:- Поддержка
peft
: в SFTTrainer есть поддержка библиотеки Parameter Efficient Finetuning, включающей в себя Lora, QLora и так далее. Lora позволяет добавлять адаптеры (Adapter) с весами, то есть единственные параметры, подвергающиеся fine-tuned, с заморозкой остальных. QLora — это дискретизированная версия. Обе методики сильно снижают время fine-tuning, что особенно важно при fine-tuning LLM из-за высоких вычислительных затрат.
![](https://habrastorage.org/webt/dm/02/v1/dm02v1rhonn5bu9_5kdilhrby2c.jpeg)
Сравнение fine-tuning, Lora и QLora
Упаковка
батчей: вместо применения токенайзера для заполнения предложений до максимальной длины, поддерживаемой моделью,упаковка
позволяет комбинировать входные данные с другими, что расширяет ёмкость батчей.
![](https://habrastorage.org/webt/1x/88/7w/1x887weujm8s7aca3ihdukn-zky.jpeg)
Упакованные сэмплы 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
) и упаковку
.Понравилась статья? Еще больше контента на темы разметки, Data Mining и ML вы можете найти в нашем Telegram канале “Где данные, Лебовски?”
- Как подготовиться к сбору данных, чтобы не провалиться в процессе?
- Как работать с синтетическими данными в 2024 году?
- В чем специфика работы с ML проектами? И как разметить 1500 пузырьков руды на одном фото и не сойти с ума?