Мы в Точка Банке делаем свою LLM. Чтобы она работала хорошо, недостаточно просто обучить её на куче текстов. Для получения осмысленного и предсказуемого поведения модели, нужен Alignment — дообучение с учётом предпочтений и ограничений. В статье расскажу, какие методы применяют в современных моделях, и как мы адаптировали их под себя.

Кому нужен Alignment
Обучение языковой модели можно разделить на три этапа:
Unsupervised Learning — модель учится на больших объемах текстовых данных без явных меток или аннотаций. Основная цель — научиться предсказывать дальнейшие токены на основе предыдущих. Такая модель может выдавать грамматически верный текст, но при этом нести полную чушь с точки зрения смыслов.
Supervised Fine-tuning — модель учится на более узком наборе данных с метками. Настраиваем её так, чтобы она генерировала правильные ответы и следовала инструкциям: например, была не просто моделью, которая умеет генерить какой-то текст, а осмысленным чат-ботом. Такая модель уже может использоваться в проде, но иногда всё ещё ведёт себя непредсказуемо.
Preference Optimization — последний этап обучения. Задаём конкретное поведение модели: с одной стороны, ограничиваем нежелательное, с другой — поощряем корректное. На выходе получается предсказуемая и безопасная LLM.
Иногда можно ограничиться только первыми двумя этапами. Но оптимизация предпочтений нужна, когда есть конкретные ограничения поведения, к которым хочется прийти, или негативные сценарии, которых хочется избежать.
При этом, в претрейне размер обучающего датасета должен занимать миллиарды токенов. На уровне Supervised Fine-tuning достаточно датасета на сотни тысяч примеров. А для этапа Alignment хватит 100–1000 примеров, то есть собрать его под силу одному человеку.
Проблема предпочтений
Когда мы обучаем модель классификации, обычно достаточно, чтобы вероятность выбора правильного класса была наибольшей. Для языковых моделей, где можно каждый токен считать отдельным классом, важно определить, какие ошибки приемлемы, а какие нет, так как в естественном языке существует больше одного правильного ответа.
Даже для обычной задачи классификации подобное поведение может оказаться важным. Представим, что у нас есть картинка с котом, и нужно распознать, что на ней изображено — собака, кот или стол. Предикты могут быть примерно такими, и нас это устроит. Вероятность обнаружить целевой класс достаточно высока.

Но мы всё ещё можем ошибиться и предсказать что-то другое. Наверное, будет приятнее перепутать кота с собакой, нежели со столом. Особенно если предсказываем мы это чтобы, например, простроить маршрут беспилотного такси или робота-пылесоса.
Мы можем ранжировать наши ответы и настроить модель так, чтобы она в рамках конкретной ситуации «предпочитала» определённые классы. Например, отдадим большую часть предпочтений коту, меньшую — собаке и будем минимизировать «стол». В итоге, если модель ошибётся, то это будет не так критично.
При наличии множества правильных ответов модель будет выдавать что-то из области ответов, близких к правильному. А неверные и небезопасные ответы будут генерироваться реже.
Методы Alignment
Прародителями современного Alignment можно назвать эти два метода:
Direct Reinforcement Learning from Human Feedback: скорее гипотеза, чем реальный метод. Модель генерирует ответ на вопрос из обучающей выборки, а человек оценивает, насколько он хорош. На основе оценок обучаем модель-агента получать наибольшую награду.
С одной стороны, так можно создать идеальную модель. С другой, это будет очень дорого, потому что придётся круглосуточно оценивать ответы.
Proximal Policy Optimization: метод, который использовали в OpenAI. Здесь не нужны люди, чтобы оценивать ответы. Достаточно на основе уже размеченных данных обучить более простую модель выставлять оценку новым ответам. В таком случае, в процессе дообучения самой модели (нашей с вами LLM) и модели награды, LLM будет подстраиваться под наши предпочтения, чтобы каждый раз получать наибольшую награду. Кроме того, модель наград можно будет переиспользовать в дальнейшем.
Но такое обучение всё ещё требует много затрат, так как нужно оперировать сразу несколькими моделями и контролировать процесс обучения. Если на это есть ресурсы, то на выходе можно получить модель уровня GPT-4.
Эти методы доступны большим компаниям с кучей железа, но что делать тем, у кого нет таких возможностей? На этот случай тоже есть пара вариантов:
DPO — прямая оптимизация предпочтений. Здесь мы не ранжируем, а просто сравниваем вероятность генерации хорошего и плохого ответа. Обозначаем, какой ответ является предпочтительным, а какой — неверным или небезопасным. Затем, опираясь на вероятность генерации таких ответов, можем корректировать их в нужном направлении. Таким образом, получаем тот же результат, но быстрее и проще в обучении.
Этот метод используют открытые модели Llama 3 и Mistral. Но иногда он может даже вредить, так как модель будет быстро переобучаться. Ещё нужно учитывать, что данные для обучения должны быть сгенерированы самой моделью, и взять любой открытый датасет для обучения не получится без ущерба для результата.
Kahneman-Tversky Optimization (KTO) — концепция, основанная на идеях психологов Даниэля Канемана и Амоса Тверски. Использует принципы теории перспектив для оптимизации моделей машинного обучения. Её суть в том, что люди могут неправильно оценивать вероятности событий и величину приобретений и потерь. При этом ранее упомянутые методы не учитывают эту особенность, и результаты не соответствуют человеческим ожиданиям. Метод использует особый вид функции потерь, чтобы, во-первых, правильно отображать величину наград, а во-вторых, использовать для обучения не пары хороших и плохих ответов, а только пары «вопрос-ответ» с явной бинарной оценкой.
Метод считается быстрым и не требует много памяти, так как нужно учитывать всего один ответ — хороший или плохой. Работает это на небольших моделях до 7 миллиардов параметров, всё ли хорошо при увеличении размера - пока неясно.
Как сделали мы
В нашем случае хотелось не только сделать всё дешевле, чем в упомянутых выше методах, но ещё и сократить количество ресурсов на обработку данных. Поэтому решили сгенерировать ответы LLM и отранжировать их с использованием уже обученной модели.
Работа состояла из трёх этапов:
Обучение модели наград: мы использовали Qwen2.5 с 7 млрд параметров и собрали подходящий нам по тематикам датасет, состоящий из ответов с размеченными предпочтениями.
Обучение бинарного классификатора: на основе большой языковой модели и энкодера обучили бинарный классификатор, который определяет, какие ответы лучше, а какие — хуже.
Генерация и оценка: поочередно сгенерировали ответы с помощью LLM, оценивали их моделью наград и использовали для дообучения. Далее повторяли цикл.
Единственный недостаток этого метода — сложность настройки и работы с памятью из-за использования множества разных моделей. Однако после обучения модели наград датасет снова становится простым, как и в PPO (Proximal Policy Optimization).

Как обучить модель наград
Этот процесс можно разделить на четыре этапа:
**Сбор данных: **для начала нужно создать качественный датасет. В идеале там должны присутствовать ответы, размеченные людьми. Если таких данных нет, можно использовать синтетические ответы, сгенерированные более мощными моделями через API.
Генерация ответов: генерируем ответы на одни и те же вопросы с помощью LLM. Не все из них будут качественными. Мы можем намеренно создавать неверные ответы на моделях поменьше, чтобы затем использовать их для обучения модели наград.
Создание пар хороших и плохих ответов: это можно сделать путем перемножения множеств — chosen и rejected. Например, мы можем взять лучший синтетический ответ и сопоставить его с более сложным неверным ответом или простым неверным ответом. Таким образом, получаем модель наград, которую потом можно переиспользовать.
**Обновление параметров модели: **генерируем набор ответов при помощи LLM и оцениваем их моделью наград. Так в датасет для дообучения попадает только пара ответов — лучший и худший. Используем DPO (Direct Preference Optimization) или любой другой метод, который не использует модель наград, чтобы улучшить качество генерации и увеличить частоту появления правильных ответов.

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

Конкретные токены могут сильно обманывать модель наград: например, токен “sure”, который часто идёт в начале, заставляет считать плохой ответ более качественным, так как чаще встречается у более сильных моделей. Если исключить такие токены и ограничить величину градиентов для подобных случаев, результаты обучения будут лучше.
Не только LLM. Где ещё всё это применять?
Для работы с LLM можно использовать готовые библиотеки, но, помимо стандартных инструментов, методы можно применить и к задачам мультиклассовой классификации. В этом случае можно использовать собственные модификации лосса и получить аналогичный результат.
Если вы работаете с классическим машинным обучением, можно построить и своё собственное решение для обучения с подкреплением, где агент принимает решение о классификации, а среда предоставляет ему награды за правильные ответы. Несмотря на сложность задачи, она может позволить развить в модели свойства, которые нельзя получить другими методами.
Примеры таких решений в области, на которые можно обратить внимание, если вы работаете не с LLM:
Cost-sensitive classifications — классификация, в которой определённые ответы имеют свою цену, то есть цена ошибки может отличаться для разных классов.
Alignment as classification — рассматривает Alignment в целом, как форму классификации.
Vision language models alignment — применяет Alignment для моделей, которые работают с визуальными данными.
А вы работали с alignment? Делитесь опытом в комментариях!