В нашей работе с большими языковыми моделями (LLMs), один из самых популярных вопросов касается их дообучения. Каждый второй клиент спрашивает, нужно ли проводить дополнительное обучение модели.
В большинстве случаев ответ — нет, это не требуется. Современные LLM достаточно хороши для многих коммерческих задач даже без до-обучения. Например, для бота, который помогает заказывать цветы в цветочном магазине. Более того, у них обычно нет данных для этого, и нет, 20 примеров диалогов которые у них есть (и даже 200) не подходят.
Обучение и дообучение моделей — это дорогостоящий процесс, и его действительно стоит избегать, если возможно. Сэкономленные средства лучше потратить на поездку на Арубу или любое другое место, где вы мечтаете провести отпуск.
Однако бывают случаи, когда до-обучение действительно необходимо. Например, если вы хотите, чтобы LLM следовала очень специфическому формату общения, имела знания в узкоспециализированной области или вы хотите снизить затраты, обучив небольшую модель для выполнения одной задачи вместо использования большой модели с сотнями миллиардов параметров. Все это обоснованные причины для создания адаптированной модели через дообучение.
Давайте рассмотрим, как это сделать.
Когда нужно дообучать модель
Как уже говорилось, дообучение стоит делать только в случае необходимости. Сначала попытайтесь решить задачу с помощью настройки запросов (prompt engineering) или построения RAG системы.
И только если это не сработает — рассматривайте вариант дообучения.
Дообучение имеет следующие недостатки:
Это стоит денег и занимает время.
Вам понадобятся качественные обучающие данные в больших количествах, иначе обучение не сработает.
Может привести к более частым "галлюцинациям" модели, даже если выполнено правильно, так как добавляется новое поведение, для которого модель изначально не предназначалась. Если вы будете регулярно обновлять модель, на каком-то этапе это почти неизбежно и называется "дрейфом", поэтому вам придется оценивать модель на предмет таких изменений.
Если вы учли все вышеперечисленное и всё ещё считаете, что стандартной LLM недостаточно, — пора приступать к дообучению.
Данные
Для дообучения вам понадобятся данные в определённом формате, называемом инструкционным набором данных (instruction dataset).
Где взять данные
Существует множество открытых наборов данных, которые вы можете использовать. Например:
Anthropic HH-RLHF для выравнивания моделей,
MIMIC-III для здравоохранения,
CodeSearchNet для программирования.
Существуют:
Датасеты для конкретных областей: медицина, право, программирование и другие.
Датасеты для конкретных задач: полезны для обучения модели выполнению одной специфической задачи, например, для создания RPAs.
Датасеты общего назначения: содержат общие знания, обычно создаются на основе данных, собранных из интернета.
Датасеты для выравнивания: используются для обучению формату, стилю общения и обеспечения безопасности.
На платформе Hugging Face Hub представлено множество инструкционных датасетов для различных областей. Рекомендую начать оттуда.
Но если вы решили заняться дообучением, вероятно, у вас уже есть собственные данные, иначе зачем вы это делаете?
Если у вас недостаточно примеров, вы можете сгенерировать синтетические данные, используя большие LLM, как ChatGPT, экстраполируя из имеющихся данных. Об этом я расскажу позже.
Требования к данным
Объем набора данных зависит от размера модели, сложности задачи и метода обучения. Компании вроде OpenAI используют огромные датасеты с миллионами инструкций, что для большинства компаний финансово неосуществимо. Реалистичный вариант — это несколько тысяч примеров.
Для простых изменений, таких как выравнивание стиля общения, вам не потребуется много данных, достаточно нескольких сотен. Для обучения знаниям в узкой области может понадобиться от нескольких тысяч до сотен тысяч примеров в зависимости от области. В общем, чем больше данных, тем лучше, но рекомендуется иметь как минимум несколько тысяч примеров.
Качество данных не менее важно, а может быть, даже важнее количества. Вам нужно убедиться, что данные корректно отражают поведение, которому вы хотите обучить модель, как по смыслу, так и по формату. Особо хочу подчеркнуть формат: модель должна выдавать информацию в понятной для ваших пользователей форме, с точки зрения ясности и стиля. Нет смысла в модели, которая передает истину в форме рэп-куплетов, если только вы не создаете двойника Эминема.
Подготовка данных
Подготовка данных — это критический этап, так как качество данных напрямую влияет на производительность и точность вашей модели. Подготовка данных включает несколько процессов, чтобы убедиться, что они чистые, релевантные и подходят для обучения:
1. Дедупликация (Deduplication)
Дублирование данных может привести к увеличению затрат на обучение, создает лишний шум что может вызвать деградацию или предвзятость модели. Вот основные подходы для устранения дубликатов:
Нормализация текста (Text Normalization):
Приведение текста к нижнему регистру.
Удаление специальных символов, лишних пробелов и знаков препинания для стандартизации контента.
Дедупликация на основе хэширования (Hash-Based Deduplication):
Генерация хэша нормализованного текста.
Один из популярных методов — MinHash, который создаёт "семантический отпечаток" текста вместо точного копирования. Это позволяет выявлять дубликаты, даже если их формат или мелкие детали различаются.
Можно использовать библиотеки, такие как datasketch, для реализации этого подхода.
Сравнение хэшей и удаление совпадающих записей.
Дедупликация на основе векторных представлений (Vector-Based Deduplication):
Элементы преобразовываются в векторные представления (эмбеддинги), чтобы измерить их семантическую схожесть.
Далее используются векторные базы данных, такие как Quadrant, Pinecone или Weaviate, для эффективного поиска схожих элементов.
Можно дополнительно использовать кросс-энкодер для точного вычисления коэффициента схожести между найденными элементами. Это поможет надёжно определить и удалить почти дублирующиеся по смыслу элементы.
2. Удаление персональной информации (Personal Information Removal)
Удаление персональных данных важно, чтобы модель не обучалась на них и не воспроизводила их. Это важно как с юридической, так и с этической точки зрения, особенно в условиях законодательства, такого как GDPR. Кроме того, личные данные, как правило, не имеют отношения к знаниям, необходимым для задачи.
Деидентификация (De-identification):
Используем регулярные выражения (Regex) для обнаружения по шаблонам таких вещей, как электронные адреса или номера телефонов.
Далее применяются заранее обученные NLP модели, такие как Named Entity Recognition (NER), для идентификации и сокрытия персональных данных.
Фильтрация, специфичная для домена (Domain-Specific Filtering):
Можно сделать фильтры, соответствующие контексту ваших данных. Например, в медицинских данных необходимо удалять идентификаторы, связанные со здоровьем, например в соответствии с требованиями HIPAA.
3. Очистка (Decontamination)
Ваш набор данных может содержать контент, который негативно влияет на поведение модели. Вот что важно учитывать:
Зловредный контент (Malicious Content): поиск и удаление команд, встроенные с целью манипулирования LLM, например, атаки с использованием инструкций (prompt injections), скрипты, XSS, SQL-инъекции и т.д.
Неподобающий язык (Inappropriate Language): фильтрация ругательств, оскорбительных слов, сленга и другие неприемлемых выражений.
4. Фильтрация на основе правил (Rule-Based Filtering)
Не все данные из вашего набора будут релевантны вашей задаче. Фильтрация по правилам помогает исключить нерелевантный или вредоносный контент.
Определите критерии исключения: основывайтесь на цели обучения. Например, если вы обучаете финансовую модель, исключите нефинансовые данные.
Общие рекомендации:
Я советую использовать гибридный подход:
Начните с простых инструментов:
Поиск с помощью регулярных выражений (Regex) или ключевых слов для обнаружения шаблонов, таких как электронные адреса или номера телефонов.
Для дальнейшей обработки применяйте продвинутые методы:
Используйте LLM как эксперта, чтобы оценить релевантность или качество данных. Например, попросите LLM определить, подходит ли элемент для задачи обучения.
Применяйте специализированные модели машинного обучения для сложных задач очистки, таких как обнаружение и фильтрация токсичного языка. На HuggingFace есть множество предобученных моделей для этого.
Оценка данных
После выполнения всех этих шагов я рекомендую создать отдельный конвейер для проверки качества данных. Это можно сделать вручную, и если у вас всего несколько сотен примеров. Но если у вас тысячи, это становится довольно сложно делать руками. В таком случае можно снова использовать подход "LLM как эксперт" или воспользоваться более простой моделью-классификатором для автоматической оценки. Например, вы можете использовать модели подобные HuggingFaceFW/fineweb-edu-classifier.
Пример использования LLM для оценки:
Вот промпт:
Скрытый текст
Ты — эксперт по оценке качества данных. Твоя цель — оценить качество инструкции и соответствующего ответа. Определи, насколько эффективно ответ выполняет поставленную задачу, а также оценьте его ясность, точность и полноту.
Критерии оценки:
1. Соответствие (Relevance): насколько ответ соответствует инструкции?
2. Ясность (Clarity): насколько понятно изложен ответ?
3. Полнота (Completeness): насколько ответ предоставляет всю необходимую информацию для выполнения инструкции?
4. Точность (Accuracy): насколько информация в ответе фактически верна?
Инструкция:
Тщательно прочитай предоставленные инструкцию и ответ.
Оцени их по шкале от 1 до 5 для каждого из критериев:
- 1 = Очень плохо
- 5 = Отлично
Обоснуй свою оценку, приведя конкретные примеры или наблюдения для каждого критерия.
Пример для оценки:
- Инструкция: Объясните круговорот воды в природе.
- Ответ: Круговорот воды включает испарение, конденсацию и осадки, перемещающие воду между поверхностью Земли и атмосферой.
Твоя оценка:
- Соответствие: 5 — Ответ напрямую объясняет круговорот воды.
- Ясность: 4 — Ответ понятный, но можно было бы подробнее раскрыть каждый этап.
- Полнота: 3 — Отсутствуют детали о таких процессах, как сток или грунтовые воды.
- Точность 5 — Приведённая информация верна.
Теперь оцени следующую пару "Инструкция-Ответ":
- Инструкция: [Вставь инструкцию здесь]
- Ответ: [Вставь ответ здесь]
Этот подход помогает объективно и систематически оценивать данные, сохраняя их качество на высоком уровне.
Какой порог приемлемости выбрать, зависит от вас, но в общем случае я бы рекомендовал начинать с 80–90%.
Также обратите внимание на то, какую LLM вы используете для оценки, поскольку у моделей есть свои предвзятости (почти как у людей):
Они предпочитают развернутые, длинные и аргументированные ответы кратким, даже если короткий ответ более точен.
Элементы, расположенные первыми в списке, часто предпочитаются моделью перед другими. Это явление известно как Синдром Утенка. Это важно учитывать, если вы создаете наборы данных с предпочтениями (подробнее об этом позже).
Предвзятость модели: LLM из одной и той же семейства моделей, как правило, предпочитают данные, сгенерированные другой моделью из того же семейства. Это важно учитывать, если вы планируете генерировать синтетические данные для обучения.
Форматы наборов данных
Существует несколько популярных форматов. Все они довольно похожи и используют JSON.
Формат OpenAI
Процесс дообучения в OpenAI использует формат JSONL (JSON Lines), где каждая строка представляет отдельный пример для обучения.
Пример:
{
"messages": [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Can you explain the concept of photosynthesis?"},
{"role": "assistant", "content": "Photosynthesis is the process by which green plants convert sunlight into chemical energy."}
]
}
Этот формат позволяет четко задавать контекст взаимодействия, который включает роли (например, "система", "пользователь", "ассистент") и соответствующий контент.
Формат набора данных Alpaca
Разработан Центром исследований моделей оснований Стэнфордского университета. Каждая запись в этом наборе данных имеет следующую структуру:
{
"instruction": "Describe the structure of an atom.",
"input": "",
"output": "An atom consists of a nucleus containing protons and neutrons, with electrons orbiting this nucleus."
}
Формат набора данных ShareGPT
Формат ShareGPT разработан для описания диалогов между пользователями и AI-ассистентами, включая различные роли, такие как "человек" (human), "gpt", "наблюдение" (observation) и "функция" (function). Этот формат позволяет представлять сложные диалоги, включая взаимодействия с инструментами и вызовы функций.
Каждый диалог представлен как объект JSON со следующими компонентами:
{
"conversations": [
{"from": "human", "value": "What is the capital of France?"},
{"from": "gpt", "value": "The capital of France is Paris."},
{"from": "human", "value": "Show me a map of Paris."},
{"from": "function_call", "value": "map_search('Paris')"},
{"from": "observation", "value": "<image of Paris map>"},
{"from": "gpt", "value": "Here is a map of Paris."}
],
"system": "You are a helpful assistant.",
"tools": "map_search"
}
Существуют также другие форматы, такие как OASST и другие. Логика их построения схожа, и основные принципы вам уже понятны.
Техники дообучения
Теперь, когда у вас есть обучающие данные, рассмотрим основные методы их использования:
Полное переобучение (Full re-training): полное обучение модели на новых данных.
LoRA: адаптация весов модели для дообучения на определенных задачах.
QLoRA: оптимизированная версия LoRA с меньшими затратами на вычисления.
RLHF: Дообучение с учетом (человеческих) предпочтений
Прямая оптимизация предпочтений (Direct Preference Optimization, DPO): используется для настройки моделей на основе данных предпочтений пользователей.
Эти методы помогают эффективно адаптировать модели под конкретные задачи.
Полное переобучение (Full re-training)
Это процесс обучения всей модели (всех слоев) на определённом наборе данных с целью оптимизации её под конкретную задачу или область. Теоретически, это самый эффективный метод, однако он требует значительных вычислительных ресурсов, поскольку необходимо выполнять обратное распространение ошибки (backpropagation) через всю модель.
Риски полного переобучения:
Риск переобучения (Overfitting):
Поскольку обновляются все веса, существует повышенный риск слишком сильной подгонки модели на данных для дообучения, особенно если набор данных небольшой.Потеря универсальности (Loss of Generality):
Дообученные модели могут утратить свои универсальные способности и ранее приобретённые знания.
Сколько памяти требуется для полного переобучения?
Для обучения необходимо загрузить как минимум следующие компоненты:
Параметры модели (Model Parameters)
Градиенты (Gradients)
Активации (Activations)
Состояние оптимизатора (Optimizer States)
Расчёт необходимого объёма памяти:
Параметры модели и градиенты:
7B модель: Около 7 миллиардов параметров.
12B модель: Около 12 миллиардов параметров.
Каждый параметр обычно занимает 4 байта (FP32) или 2 байта (FP16). Предположим использование FP16 (2 байта на параметр):
7B модель: 7×10^9×2=14 ГБ
12B модель: 12×10^9×2=24 ГБ
Градиенты добавляют ещё 2 байта на параметр:
7B модель: 7×10^9×2=14 ГБ
12B модель: 12×10^9×2=24 ГБ
Активации:
Размер пакета (batch size) и длина последовательности (sequence length) значительно влияют на объём памяти, необходимый для хранения активаций. Для типичного размера пакета 8-32 и длины последовательности 512 токенов память для активаций может составлять:7B модель: 10–20 ГБ.
12B модель: 15–30 ГБ.
3. Состояния оптимизатора (Optimizer States):
Оптимизаторы, такие как Adam, требуют дополнительной памяти для хранения состояний (например, градиентов и оценок моментов). Adam требует два дополнительных параметра, каждый из которых имеет 3 состояния. Расчёты следующие:
7B модель: 14 ГБ×2×3=42 ГБ
12B модель: 24 ГБ×2×3=72 ГБ
С учётом дополнительных факторов, потребляющих память, минимальные требования будут следующими: Для 7B модели:
14 ГБ (параметры)+14 ГБ (градиенты)+10 ГБ (активации)+42 ГБ (состояния оптимизатора)=80 ГБ
Это огромный объём памяти даже для небольшой модели. Вы можете себе представить, сколько потребуется для более крупных моделей. Так что, полное переобучение редко используется, поскольку оно непрактично из-за высоких требований к ресурсам. Так что же делать?
LoRa
Предположим, вы хотите изменить поведение модели, но не хотите менять всю модель. Изменение поведения модели по сути означает изменение её весов, чтобы изменились выходные данные. Но есть хитрость: а что, если бы мы могли каким-то образом модифицировать выходы модели, не изменяя её веса?
И, конечно, такой способ существует! Метод в лоб заключается в том, чтобы передавать выходы модели в другую модель, чтобы трансформировать их. И это сработает… только теперь у нас две модели вместо одной и много лишнего гемора.
Но что, если мы добавить фильтр поверх модели, который сохранит исходные слои нетронутыми, но изменит её выходы? Это как надеть AR-очки: вы видите мир по-другому, но сам мир не изменился.
Именно это делает LoRA. Мы "замораживаем" исходные веса модели и применяем трансформацию, добавляя дополнительную матрицу весов, называемую LoRA-матрицей. Она образует дополнительный обучаемый слой гораздо меньшего размера.
где:
Wnew — новые веса.
Wpre-trained — исходные веса модели.
ΔW — обучаемая поправка к весам.
Мы выполняем дообучение/тренировку только на этой дополнительной матрице вместо исходной модели, используя стандартные методы. LoRA-матрица обучается предсказывать разницу между желаемыми результатами и результатами исходной модели.
Преимущество LoRA
Замечательная особенность заключается в том, что LoRA-матрица может быть намного меньше, чем исходная матрица весов модели. Именно поэтому метод называется Low-Rank Adaptation — матрица имеет более низкий ранг по сравнению с оригинальной.
Предположим, у вас есть матрица весов размера d:
Она будет содержать d×d элементов. Если d равно одному миллиону, то матрица будет содержать один триллион элементов.
А вот как выглядит матрица LoRA:
Она будет содержать d×r+r×d элементов. Если d=1 000 000 и ранг (r) равен 8, то матрица будет содержать всего 16 миллионов элементов.
Как это работает:
y=x×(W+ΔW)=x×W+x×(A×B)
y: Выход после применения весов.
x: Вход слоя.
ΔW=A×B: Поправка к весам, где:
A: Матрица размера d×r, где r — это ранг (малая размерность, выбранная для дообучения с помощью LoRA), а d — размерность, соответствующая исходной матрице весов.
B: Матрица размера r×d.
Или в визуальной форме:
Обычно в качестве начального значения для ранга используют 8. В некоторых случаях значения до 256 дают хорошие результаты, но вам придётся экспериментировать, чтобы найти оптимальное значение для вашей задачи. Использование более высоких рангов может улучшить производительность в задачах, требующих большей выразительной способности для захвата сложных паттернов. Однако это также увеличивает риск переобучения, особенно на небольших наборах данных. Этот риск хорошо известен в машинном обучении, когда ёмкость модели превышает сложность данных.
Во время обучения нам нужно хранить в памяти веса W исходной модели и ΔW дообученной модели, вычисляя градиенты только для "новых" малых матриц A и B. Это существенно снижает требования к памяти и вычислительной мощности. Обучение будет значительно быстрее, и модели размером 7B можно легко дообучить на обычном ПК с настольным GPU.
Кроме того, мы можем иметь несколько различных "линз", подобных этой, которые можно применять к базовой модели без необходимости её изменения.
Можно даже нависить несколько адаптеров LoRa один за другим, если нужно несколько модификаторова, но тогда вероятность галлюцинаций сильно увеличивается.
Дообучение с помощью LoRA часто достигает производительности, сопоставимой с полным дообучением, особенно если низкоранговая аппроксимация хорошо соответствует задаче. Адаптеры LoRA можно тестировать или применять без риска деградации базовой модели.
QLoRA
QLoRA работает так же, как LoRA, но для уменьшения объёма используемой памяти базовая модель квантуется до специального типа данных, обычно NF4 (Normal Float 4-bit). Обычные модели используют 32-битный или 16-битный формат с плавающей точкой для хранения весов.
NF4 позволяет QLoRA сохранять большую часть точности базовой модели, значительно сокращая использование памяти и вычислительные ресурсы.
Идея квантизации:
Большинство весов в сети всё равно равны нулю и точость им не важна.
NF4 оптимизирует распределение значений на основе реальных статистических данных, а не использует линейное распределение значений с плавающей точкой.
Для прохода LoRA всё же будут использоваться обычные модели с 32-битной или 16-битной точностью, чтобы сохранить больший диапазон для обучения.
Преимущества и недостатки QLoRA:
Использование QLoRA может сократить объём памяти GPU на 40–70%.
Однако это имеет свою цену:
QLoRA примерно на 30% медленнее, чем LoRA, при обучении.
Качество квантизированной модели может незначительно снизиться.
QLoRA хорошо подходит даже для очень крупных моделей (например, архитектур на базе LLaMA или GPT).
Дообучение с учетом (человеческих) предпочтений и выравнивания
Дообучение хорошо подходит для обучения модели выполнению конкретных задач, но важно не только то, что делает модель, но и как она взаимодействует с людьми. Если мы хотим создать языкового ассистента, нельзя использовать предобученную модель как есть — она не сможет разумно отвечать на запросы пользователей, даже если обладает необходимыми знаниями.
Обучение модели общению с людьми называется выравниванием (alignment). Существует несколько способов определения этого термина. Здесь я использую определение Anthropic 3H:
Helpful — Ответ должен решать проблему пользователя.
Harmless — Ответ не должен причинять вред пользователю.
Honest — Ответ должен быть фактически точным.
Традиционные методы машинного обучения не очень помогают в этой области, поэтому были разработаны новые подходы.
Важно отметить что все ниже описанные методы совместимы с LoRa и QLoRa. Т.е. вы можете применять их для обучения LoRa адаптера а не всей модели.
Идея любого такого метода заключается в создании набора данных, похожего на описанный выше, где дополнительно явно указаны человеческие предпочтения. Такие данные могут включать обратную связь о качестве текста, тоне, стиле или фактической точности.
Обычно элементы таких наборов данных содержат несколько вариантов ответов, каждый из которых оценивается по степени предпочтения. Возможно, вы замечали, как ChatGPT предлагает вам несколько вариантов ответа на выбор — это делается для сбора аналогичных данных. Также популярные сайты вопросов и ответов с системами "лайков" или "дизлайков" могут служить источником данных для обучения. Если данные собираются из интернета, важно проводить их последующую очистку, так как в них может содержаться много мусора.
Пример:
Пользователь:
"Я чувствую себя подавленным из-за работы и жизни в целом."
Варианты ответов:
Вариант А: "Мне жаль, что вы так себя чувствуете. Вы думали о том, чтобы поговорить с кем-то, кому доверяете, или с профессиональным консультантом?"
Вариант B: "Будь мужиком!!! Просто выпей водки — и всё будет хорошо."
Предпочтение, предоставленное человеком:
Предпочтительный ответ: Вариант A (наивысший рейтинг за эмпатию и ясность).
Ранжирование: Вариант A > Вариант B.
Обоснование:
Вариант A демонстрирует эмпатию, признаёт чувства пользователя и предлагает практическое решение.
Вариант B игнорирует чувства пользователя и не предоставляет конструктивной помощи.
Или в формате JSON:
{
"context": "Я чувствую себя подавленным из-за работы и жизни в целом.",
"responses": [
{
"text": "Мне жаль, что вы так себя чувствуете. Вы думали о том, чтобы поговорить с кем-то, кому доверяете, или с профессиональным консультантом?",
"rank": 1
},
{
"text": "Будь мужиком!!! Просто выпей водки — и всё будет хорошо.",
"rank": 2
}
]
}
Как только у вас есть такие данные, вы можете использовать следующие техники:
Обучение с подкреплением с использованием обратной связи от человека (Reinforcement Learning with Human Feedback, RLHF)
Является основой выравнивания предпочтений. Этот метод похож на дрессировку собак, когда вы хвалите собаку за правильные действия и наказываете за неправильные, повторяя это много раз. В данном случае вы играете роль модели вознаграждения, а собака – роль базовой модели.
Существует отдельная модель вознаграждения, которая обучается предсказывать человеческие предпочтения, используя парные сравнения (например, «Ответ A лучше, чем Ответ B»). По сути, мы тренируем модель вознаграждения, которая предсказывает ранжирование ответов.
Это делается для того, чтобы после создания модели вознаграждения не было необходимости привлекать людей – она выступает в роли прокси для обратной связи от человека в дальнейших процессах обучения.
Затем основная модель дообучается с использованием обучения с подкреплением, где сигнал вознаграждения поступает от обученной модели вознаграждения. Это обычно происходит за несколько итераций. Базовая модель в этом процессе не приобретает новые знания, а учится использовать и правильно передавать уже имеющиеся знания. Исследования показали, что использование небольшого, но качественного набора данных гораздо эффективнее, чем использование большого объема данных плохого качества (см. исследование LIMA: «Less Is More for Alignment»).
Этот подход позволяет эмулировать сложные сигналы вознаграждения от модели, которые включают такие аспекты, как корректность, релевантность, безопасность и, к сожалению, различные политически мотивированные ограничения. Кроме того, этот метод позволяет использовать модель вознаграждения для обучения нескольких базовых моделей, чтобы выровнять их под заданные предпочтения.
Однако у метода есть очевидные недостатки. Теперь приходится обучать две модели вместо одной, а затем выполнять множество итераций дообучения базовой модели. Это дорого с точки зрения вычислительных ресурсов, сложно и занимает много времени.
Кроме того, существует риск переобучения модели вознаграждения, что может ухудшить производительность базовой модели.
Чтобы избежать этих сложностей, был предложен другой подход:
Прямая оптимизация предпочтений (Direct Preference Optimization, DPO)
Этот подход наиболее близок если вы хотите и рыбку съесть, и в воду не лезть.
Он был описан в статье "Direct Preference Optimization: Your Language Model is Secretly a Reward Model", автором которой является Рафаэль Рафаилов и несколько других исследователей. Они предложили гениальную идею: что, если пропустить этап тренировки модели вознаграждения и напрямую выровнять базовую модель под человеческие предпочтения, используя стандартное обучение с учителем?
Главное отличие здесь в том, что отсутствует отдельная модель вознаграждения, а обучение с подкреплением не используется. Вместо этого базовая модель обновляется напрямую с помощью supervised learning. Если вас интересует, чем это отличается от других подходов, вы можете прочитать об этом подробнее.
Обучение с учителем обычно использует градиентную оптимизацию (например, стохастический градиентный спуск, Stochastic Gradient Descent), чтобы напрямую корректировать веса базовой модели на основе размеченных данных.
DPO значительно выигрывает по времени и стоимости по сравнению с RLHF, так как не требует множества итераций и отдельной модели. При этом в большинстве случаев достигается схожая производительность и выравнивание базовой модели, хотя и с некоторыми ограничениями.
Этот подход требует качественных и детализированных данных. Он гораздо более чувствителен к качеству данных, чем RLHF. Предпочтения в наборе данных должны быть в достаточном объеме и максимально ясными. Если у вас есть такой набор данных или вы можете его создать, то DPO будет наилучшим выбором.
Что использовать для экспериментов с дообучением и хостинга
Вы можете, конечно, самостоятельно хостить и обучать/развёртывать модели локально, если у вас есть соответствующее оборудование. Настройка будет зависеть от вашего оборудования, модели и используемой виртуализации, поэтому я не буду вдаваться в это.
Оркестрация
В общем, рекомендую использовать оркестраторы, такие как ZenML, для развёртывания моделей. Это позволит вам легко менять провайдеров инфраструктуры и избежать привязки к одному облаку. Вы можете начать с бесплатного тарифа у одного провайдера для создания прототипа и при необходимости переключиться на масштабируемую облачную или локальную инфраструктуру.
Инфраструктура для дообучения
Для экспериментов рекомендую использовать бесплатные тарифы облачных платформ, в частности:
AWS SageMaker: Полностью управляемый сервис для создания, обучения и развёртывания моделей машинного обучения на базе AWS. Очень удобно, так как не нужно создавать собственную инфраструктуру и покупать GPU. У них есть бесплатный тариф для начала экспериментов.
Альтернативы:
Google Vertex AI
Azure Machine Learning
Databricks ML
MLflow (это open-source решение, которое можно развернуть локально)
На российском рынке:
СберCloud ML Space
Yandex DataSphere
VK Cloud Solutions
Хостинг моделей
Для экспериментов и коллаборации лучшим вариантом является Hugging Face – это платформа для совместного использования и поиска моделей машинного обучения, наборов данных и демо. Это своего рода GitHub для моделей. У них также есть бесплатный тариф.
Альтернативы: На самом деле достойных альтернатив практически нет, поэтому Hugging Face столь популярен. Все крупные игроки (Google, Azure AI Playground) предлагают что-то похожее, но не столь удобное.
Для продакшена можно использовать:
AWS SageMaker
Google Vertex AI
Microsoft Azure Machine Learning
MLflow (можно развернуть локально)
На российском рынке:
СберCloud ML Space
Яндекс DataSphere
VK Cloud Solutions