Моделі та платформи ШІ
Прямая Оптимизация Відповідності: Повний Посібник
Вирівнювання великих мовних моделей (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.
Прямая Оптимизация Відповідності: Основні Концепції
Цей зображення порівнює два різні підходи до вирівнювання виходів 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, щоб зрозуміти, як вона досягає цих цілей.
Математика DPO
DPO є хитрим переформулюванням задачі навчання переваг. Ось крок за кроком:
а) Початкова точка: Максимальна винагорода з обмеженням KL
Оригінальна мета RLHF може бути виражена як:
- πθ – це політика (мовна модель), яку ми оптимізуємо
- r(x,y) – це функція винагороди
- πref – це модель-відповідник (зазвичай початкова модель SFT)
- β контролює силу обмеження розбіжності 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):
"""
pi_logps: логарифмічні ймовірності політики, форма (B,)
ref_logps: логарифмічні ймовірності моделі-відповідника, форма (B,)
yw_idxs: індекси переваг для кожного запиту, форма (T,)
yl_idxs: індекси непереваг для кожного запиту, форма (T,)
beta: температура, що контролює силу штрафу KL</p>
<p>Кожна пара (yw_idxs[i], yl_idxs[i]) представляє індекси однієї пари переваг.
"""</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"Втрата: {loss}")
Виклики та Майбутні Напрямки
Хоча DPO пропонує суттєві переваги над традиційними підходами RLHF, все ще існують виклики та області для подальших досліджень:
a) Масштабованість до Більших Моделей:
Як мовні моделі продовжують зростати в розмірах, ефективне застосування 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=["q_proj", "v_proj"], lora_dropout=0.05, bias="none", task_type="CAUSAL_LM" ) 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)
b) Адаптація до Багатьох Задач та Небагатьох Виконань:
Розробка технік DPO, які можуть ефективно адаптуватися до нових задач або доменів з обмеженими даними переваг, є активною областю досліджень. Підходи, які досліджуються, включають:
- Мета-навчання для швидкої адаптації
- Доопрацювання на основі промптів для DPO
- Передача знань від загальних моделей переваг до конкретних доменів
c) Обробка Незрозумілих або Протирічних Переваг:
Реальні дані переваг часто містять незрозумілість або протиріччя. Покращення стійкості 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% впевненості в перевазі
d) Комбінування DPO з Іншими Техніками Вирівнювання:
Інтеграція DPO з іншими підходами до вирівнювання може привести до більш стійких та потужних систем:
- Принципи Конституційної AI для явного задоволення обмежень
- Дебати та рекурсивне моделювання винагороди для складного виокремлення переваг
- Обратне навчання з винагородами для виведення підляжних функцій винагороди
Приклад комбінування DPO з Конституційною AI:
<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) # Штрафування, якщо небезпечний бал більше 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 можна застосовувати ітеративно:
- Тренуйте початкову модель за допомогою DPO
- Генеруйте нові відповіді за допомогою тренованої моделі
- Зберіть нові дані переваг щодо цих відповідей
- Перетренуйте з розширеним набором даних
Це зображення показує продуктивність 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 у створенні більш комплексних систем AI, здатних обробляти складні багатомодальні завдання.
















