Модели и платформы ИИ

Прямая Оптимизация Предпочтений: Полное Руководство

mm
Добавьте Unite.AI в избранные источники в Google

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

В этом руководстве мы глубоко изучим DPO, исследуя его основы, реализацию и практические применения.

Необходимость Совместимости Предпочтений

Чтобы понять DPO, важно понять, почему совместимость LLM с человеческими предпочтениями так важна. Несмотря на их впечатляющие возможности, LLM, обученные на огромных наборах данных, иногда могут производить выходные данные, которые являются несоответствующими, предвзятыми или несовместимыми с человеческими ценностями. Это несоответствие может проявляться различными способами:

  • Генерация опасного или вредного контента
  • Предоставление неточной или вводящей в заблуждение информации
  • Проявление предвзятости, присутствующей в обучающих данных

Чтобы решить эти проблемы, исследователи разработали методы для тонкой настройки LLM с помощью человеческой обратной связи. Наиболее заметным из этих подходов является RLHF.

Понимание RLHF: Предшественник DPO

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

а) Надзорная тонкая настройка (SFT): Процесс начинается с тонкой настройки предварительно обученной LLM на наборе данных высококачественных ответов. Этот шаг помогает модели генерировать более релевантные и связные выходные данные для целевой задачи.

б) Моделирование награды: Отдельная модель награды обучается для предсказания человеческих предпочтений. Это включает:

  • Генерация пар ответов для заданных подсказок
  • Получение оценок от людей, которые предпочитают какой ответ
  • Обучение модели для предсказания этих предпочтений

в) Обучение с помощью подкрепления: Тонко настроенная LLM затем进一步 оптимизируется с помощью обучения с помощью подкрепления. Модель награды предоставляет обратную связь, направляя LLM для генерации ответов, которые соответствуют человеческим предпочтениям.

Вот упрощенный псевдокод на Python, иллюстрирующий процесс RLHF:

Хотя эффективен, RLHF имеет несколько недостатков:

  • Требуется обучение и поддержка нескольких моделей (SFT, модель награды и модель, оптимизированная с помощью RL)
  • Процесс RL может быть нестабильным и чувствительным к гиперпараметрам
  • Это вычислительно дорого, требуя многих прямых и обратных проходов через модели

Эти ограничения привели к поиску более простых и эффективных альтернатив, что привело к разработке DPO.

Прямая Оптимизация Предпочтений: Основные Концепции

Прямая Оптимизация Предпочтений https://arxiv.org/abs/2305.18290

Прямая Оптимизация Предпочтений https://arxiv.org/abs/2305.18290

Этот образ контрастирует два различных подхода к совместимости выходных данных LLM с человеческими предпочтениями: Обучение с помощью человеческой обратной связи (RLHF) и Прямая Оптимизация Предпочтений (DPO). RLHF полагается на модель награды для направления политики языковой модели через итеративные циклы обратной связи, в то время как DPO直接 оптимизирует выходные данные модели для соответствия человеческим предпочтениям с помощью данных о предпочтениях. Этот сравнение подчеркивает сильные стороны и потенциальные применения каждого метода, предоставляя информацию о том, как будущие LLM могут быть обучены для лучшей совместимости с человеческими ожиданиями.

Ключевые идеи за DPO:

а) Неявная модель награды: DPO устраняет необходимость в отдельной модели награды, рассматривая саму языковую модель как неявную функцию награды.

б) Формулировка на основе политики: Вместо оптимизации функции награды DPO直接 оптимизирует политику (языковую модель) для максимизации вероятности предпочитаемых ответов.

в) Замкнутый решение: DPO использует математический инсайт, который позволяет получить замкнутое решение для оптимальной политики, избегая необходимости итеративных обновлений RL.

Реализация DPO: Практический Код

Ниже приведен образец кода, реализующего функцию потерь DPO с помощью PyTorch. Эта функция играет решающую роль в уточнении того, как языковые модели отдают приоритет выходным данным на основе человеческих предпочтений. Вот разбор ключевых компонентов:

  • Сигнатура функции: Функция dpo_loss принимает несколько параметров, включая логарифмические вероятности политики (pi_logps), логарифмические вероятности модели-эталона (ref_logps) и индексы, представляющие предпочитаемые и непредпочитаемые завершения (yw_idxs, yl_idxs). Кроме того, параметр beta контролирует силу штрафа KL.
  • Извлечение логарифмических вероятностей: Код извлекает логарифмические вероятности для предпочитаемых и непредпочитаемых завершений из обоих политик и моделей-эталонов.
  • Расчет логарифмического отношения: Разница между логарифмическими вероятностями для предпочитаемых и непредпочитаемых завершений вычисляется для обоих политик и моделей-эталонов. Это отношение является решающим для определения направления и величины оптимизации.
  • Расчет потерь и наград: Потери вычисляются с помощью функции logsigmoid, в то время как награды определяются путем масштабирования разницы между логарифмическими вероятностями политики и модели-эталона на beta.
Функция потерь DPO с помощью PyTorch

Функция потерь DPO с помощью PyTorch

Давайте глубже изучим математику за DPO, чтобы понять, как оно достигает этих целей.

Математика DPO

DPO является умной переформулировкой проблемы обучения предпочтений. Вот пошаговый разбор:

а) Начальная точка: Максимизация награды с ограничением KL

Оригинальная цель RLHF может быть выражена как:

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

Где:
  • πθ является политикой (языковой моделью), которую мы оптимизируем
  • r(x,y) является функцией награды
  • πref является моделью-эталоном (обычно исходной моделью SFT)
  • β контролирует силу ограничения разnicения KL

б) Оптимальная форма политики: Можно показать, что оптимальная политика для этой цели имеет вид:

π_r(y|x) = 1/Z(x) * πref(y|x) * exp(1/β * r(x,y))

Где Z(x) является нормализующей константой.

в) Дуальность награды и политики: Ключевым инсайтом DPO является выражение функции награды через оптимальную политику:

r(x,y) = β * log(π_r(y|x) / πref(y|x)) + β * log(Z(x))

г) Предположение о модели предпочтений, предполагая, что предпочтения следуют модели Брэдли-Терри, мы можем выразить вероятность предпочтения y1 над y2 как:

p*(y1 ≻ y2 | x) = σ(r*(x,y1) - r*(x,y2))

Где σ является логистической функцией.

е) Цель DPO Подставив дуальность награды и политики в модель предпочтений, мы получаем цель DPO:

L_DPO(πθ; πref) = -E_(x,y_w,y_l)~D [log σ(β * log(πθ(y_w|x) / πref(y_w|x)) - β * log(πθ(y_l|x) / πref(y_l|x)))]

Эта цель может быть оптимизирована с помощью стандартных методов градиентного спуска, без необходимости в алгоритмах RL.

Реализация DPO

Теперь, когда мы понимаем теорию за DPO, давайте посмотрим, как реализовать ее на практике. Мы будем использовать Python и PyTorch для этого примера:

import torch
import torch.nn.functional as F

<p>class DPOTrainer:
def __init__(self, model, ref_model, beta=0.1, lr=1e-5):
self.model = model
self.ref_model = ref_model
self.beta = beta
self.optimizer = torch.optim.AdamW(self.model.parameters(), lr=lr)</p>

<p>def compute_loss(self, pi_logps, ref_logps, yw_idxs, yl_idxs):
&quot;&quot;&quot;
pi_logps: логарифмические вероятности политики, форма (B,)
ref_logps: логарифмические вероятности модели-эталона, форма (B,)
yw_idxs: индексы предпочитаемых завершений в [0, B-1], форма (T,)
yl_idxs: индексы непредпочитаемых завершений в [0, B-1], форма (T,)
beta: температура, контролирующая силу штрафа KL</p>

<p>Каждая пара (yw_idxs[i], yl_idxs[i]) представляет индексы одной пары предпочтений.
&quot;&quot;&quot;</p>

<p># Извлечение логарифмических вероятностей для предпочитаемых и непредпочитаемых завершений
pi_yw_logps, pi_yl_logps = pi_logps[yw_idxs], pi_logps[yl_idxs]
ref_yw_logps, ref_yl_logps = ref_logps[yw_idxs], ref_logps[yl_idxs]</p>

<p># Расчет логарифмических отношений
pi_logratios = pi_yw_logps - pi_yl_logps
ref_logratios = ref_yw_logps - ref_yl_logps</p>

<p># Расчет потерь DPO
losses = -F.logsigmoid(self.beta * (pi_logratios - ref_logratios))
rewards = self.beta * (pi_logps - ref_logps).detach()</p>

return losses.mean(), rewards

<p>def train_step(self, batch):
x, yw_idxs, yl_idxs = batch
self.optimizer.zero_grad()</p>

<p># Расчет логарифмических вероятностей для модели и модели-эталона
pi_logps = self.model(x).log_softmax(-1)
ref_logps = self.ref_model(x).log_softmax(-1)</p>

<p># Расчет потерь
loss, _ = self.compute_loss(pi_logps, ref_logps, yw_idxs, yl_idxs)
loss.backward()
self.optimizer.step()</p>

return loss.item()

<p># Использование
model = YourLanguageModel() # Инициализация вашей модели
ref_model = YourLanguageModel() # Загрузка предварительно обученной модели-эталона
trainer = DPOTrainer(model, ref_model)</p>

<p>for batch in dataloader:
loss = trainer.train_step(batch)
print(f&quot;Потери: {loss}&quot;)

Проблемы и Будущие Направления

Хотя DPO предлагает значительные преимущества над традиционными подходами RLHF, все еще существуют проблемы и области для дальнейших исследований:

а) Масштабируемость до Больших Моделей:

Когда языковые модели продолжают расти в размере, эффективное применение DPO к моделям с сотнями миллиардовов параметров остается открытой проблемой. Исследователи изучают методы, такие как:

  • Эффективные методы тонкой настройки (например, LoRA, префиксная настройка)
  • Оптимизации распределенного обучения
  • Градиентное чекпоинтинг и обучение с смешанной точностью

Пример использования LoRA с DPO:


<p>from peft import LoraConfig, get_peft_model</p>

<p>class DPOTrainerWithLoRA(DPOTrainer):
def __init__(self, model, ref_model, beta=0.1, lr=1e-5, lora_rank=8):
lora_config = LoraConfig(
r=lora_rank,
lora_alpha=32,
target_modules=[&quot;q_proj&quot;, &quot;v_proj&quot;],
lora_dropout=0.05,
bias=&quot;none&quot;,
task_type=&quot;CAUSAL_LM&quot;
)
self.model = get_peft_model(model, lora_config)
self.ref_model = ref_model
self.beta = beta
self.optimizer = torch.optim.AdamW(self.model.parameters(), lr=lr)</p>

<p># Использование
base_model = YourLargeLanguageModel()
dpo_trainer = DPOTrainerWithLoRA(base_model, ref_model)

б) Мультитасковая и Адаптация с Немногими Выстрелами:

Разработка методов DPO, которые могут эффективно адаптироваться к новым задачам или областям с ограниченными данными о предпочтениях, является активной областью исследований. Подходы, которые изучаются, включают:

  • Мета-обучение для быстрой адаптации
  • Настройка на основе подсказок для DPO
  • Перенос обучения из общих моделей предпочтений в конкретные области

в) Обработка Неоднозначных или Противоречивых Предпочтений:

Реальные данные о предпочтениях часто содержат неоднозначности или противоречия. Улучшение устойчивости DPO к таким данным является важным. Потенциальные решения включают:

  • Вероятностное моделирование предпочтений
  • Активное обучение для разрешения неоднозначностей
  • Агрегация предпочтений с помощью нескольких агентов

Пример вероятностного моделирования предпочтений:


<p>class ProbabilisticDPOTrainer(DPOTrainer):
def compute_loss(self, pi_logps, ref_logps, yw_idxs, yl_idxs, preference_prob):
# Расчет логарифмических отношений
pi_yw_logps, pi_yl_logps = pi_logps[yw_idxs], pi_logps[yl_idxs]
ref_yw_logps, ref_yl_logps = ref_logps[yw_idxs], ref_logps[yl_idxs]</p>

<p>log_ratio_diff = pi_yw_logps.sum(-1) - pi_yl_logps.sum(-1)
loss = -(preference_prob * F.logsigmoid(self.beta * log_ratio_diff) +
(1 - preference_prob) * F.logsigmoid(-self.beta * log_ratio_diff))
return loss.mean()</p>

<p># Использование
trainer = ProbabilisticDPOTrainer(model, ref_model)
loss = trainer.compute_loss(pi_logps, ref_logps, yw_idxs, yl_idxs, preference_prob=0.8) # 80% уверенность в предпочтении

г) Комбинирование DPO с Другими Методами Совместимости:

Интеграция DPO с другими методами совместимости может привести к более устойчивым и способным системам:

  • Принципы Конституционной ИИ для явного удовлетворения ограничений
  • Дебаты и рекурсивное моделирование наград для сложного выявления предпочтений
  • Обратное обучение с помощью подкрепления для вывода лежащих в основе функций награды

Пример комбинирования DPO с Конституционной ИИ:


<p>class ConstitutionalDPOTrainer(DPOTrainer):
def __init__(self, model, ref_model, beta=0.1, lr=1e-5, constraints=None):
super().__init__(model, ref_model, beta, lr)
self.constraints = constraints or []</p>

<p>def compute_loss(self, pi_logps, ref_logps, yw_idxs, yl_idxs):
base_loss = super().compute_loss(pi_logps, ref_logps, yw_idxs, yl_idxs)</p>

<p>constraint_loss = 0
for constraint in self.constraints:
constraint_loss += constraint(self.model, pi_logps, ref_logps, yw_idxs, yl_idxs)</p>

return base_loss + constraint_loss

<p># Использование
def safety_constraint(model, pi_logps, ref_logps, yw_idxs, yl_idxs):
# Реализация логики проверки безопасности
unsafe_score = compute_unsafe_score(model, pi_logps, ref_logps)
return torch.relu(unsafe_score - 0.5) # Штраф, если оценка безопасности &gt; 0.5</p>

<p>constraints = [safety_constraint]
trainer = ConstitutionalDPOTrainer(model, ref_model, constraints=constraints)</p>

Практические Рассмотрения и Лучшие Практики

Когда вы реализуете DPO для реальных приложений, учитывайте следующие советы:

а) Качество данных: Качество ваших данных о предпочтениях имеет решающее значение. Убедитесь, что ваш набор данных:

  • Покрывает широкий спектр входных данных и желаемого поведения
  • Имеет последовательные и надежные аннотации предпочтений
  • Балансирует разные типы предпочтений (например, фактичность, безопасность, стиль)

б) Настройка гиперпараметров: Хотя DPO имеет меньше гиперпараметров, чем RLHF, настройка все еще важна:

  • β (бета): Контролирует компромисс между удовлетворением предпочтений и отклонением от модели-эталона. Начните с значений около 0.1-0.5.
  • Скорость обучения: Используйте более низкую скорость обучения, чем при стандартной тонкой настройке, обычно в диапазоне 1e-6 до 1e-5.
  • Размер партии: Более крупные размеры партии (32-128) часто работают хорошо для обучения предпочтений.

в) Итеративное Уточнение: DPO можно применять итеративно:

  1. Обучите начальную модель с помощью DPO
  2. Сгенерируйте новые ответы с помощью обученной модели
  3. Соберите новые данные о предпочтениях на этих ответах
  4. Переобучите с помощью расширенного набора данных

 

Прямая Оптимизация Предпочтений

Прямая Оптимизация Предпочтений Производительность

Этот образ показывает производительность LLM, таких как GPT-4, по сравнению с человеческими суждениями на различных тренировочных методах, включая Прямую Оптимизацию Предпочтений (DPO), Надзорную Тонкую Настройку (SFT) и Проксимальную Оптимизацию Политики (PPO). Таблица показывает, что выходные данные GPT-4 все больше соответствуют человеческим предпочтениям, особенно в задачах суммаризации. Уровень согласия между GPT-4 и человеческими рецензентами демонстрирует способность модели генерировать контент, который резонирует с человеческими оценщиками, почти так же тесно, как и контент, сгенерированный человеком.

Кейсы и Применения

Чтобы проиллюстрировать эффективность DPO, давайте рассмотрим некоторые реальные применения и его варианты:

  • Итеративная DPO: Разработанная Snorkel (2023), этот вариант объединяет выборочную выборку с DPO, позволяя более тонкий процесс выбора данных для обучения. Итерируя над несколькими раундами выборки предпочтений, модель лучше обобщается и избегает переобучения на шумные или предвзятые предпочтения.
  • IPO (Итеративная Оптимизация Предпочтений): Введенная Azar et al. (2023), IPO добавляет член регуляризации для предотвращения переобучения, что является распространенной проблемой в оптимизации на основе предпочтений. Это расширение позволяет моделям сохранять баланс между удовлетворением предпочтений и сохранением способности обобщения.
  • KTO (Оптимизация Переноса Знаний): Более недавний вариант от Ethayarajh et al. (2023), KTO отказывается от бинарных предпочтений вообще. Вместо этого он фокусируется на переносе знаний из модели-эталона в модель политики, оптимизируя для более плавного и последовательного соответствия человеческим ценностям.
  • Мультимодальная DPO для Кросс-Доменного Обучения от Xu et al. (2024): Подход, в котором DPO применяется к различным модальностям – тексту, изображению и аудио – демонстрируя его универсальность в соответствия моделей человеческим предпочтениям на различных типах данных. Это исследование подчеркивает потенциал DPO в создании более комплексных ИИ-систем, способных обрабатывать сложные, мультимодальные задачи.

Заключение

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

Используя силу Прямой Оптимизации Предпочтений и учитывая эти принципы, вы можете создать языковые модели, которые не только демонстрируют впечатляющие возможности, но и соответствуют человеческим ценностям и намерениям.

Я провел последние пять лет, погружаясь в увлекательный мир машинного обучения и глубокого обучения. Моя страсть и экспертиза привели меня к участию в более чем 50 различных проектах программной инженерии, с особым акцентом на ИИ/МО. Мое непрекращающееся любопытство также привело меня к обработке естественного языка, области, которую я с нетерпением жду возможности изучить дальше.