본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
Direct Preference Optimization, DPO; 직접 선호 최적화
보상 모델과 강화 학습 단계 없이, 선호 쌍 데이터에 대한 분류 손실 하나로 언어 모델을 사람 선호에 맞추는 학습 기법

직접 선호 최적화(Direct Preference Optimization, DPO)는 2023년 스탠퍼드 대학교 연구진이 발표한 선호 학습 기법이다.[1] 인간 피드백 기반 강화 학습(RLHF)은 선호 데이터로 보상 모델을 학습한 뒤 PPO로 정책을 최적화하는 두 단계 공정인데, DPO는 KL 제약이 걸린 RLHF 목적 함수의 최적해가 닫힌 형태로 쓰인다는 점을 이용해 두 단계를 하나의 지도 학습 손실로 합쳤다. 학습 중 모델에서 응답을 생성할 필요가 없고, 메모리에 올릴 모델도 정책과 참조 모델 둘뿐이다.

논문 부제 "여러분의 언어 모델은 사실 보상 모델이다"는 이 재매개화를 가리킨다. 정책과 참조 정책의 로그 확률비가 곧 암묵적 보상이 되므로, 정책을 학습하는 일과 보상 모델을 학습하는 일이 같은 일이 된다. 구현이 쉽고 안정적이어서 공개 모델의 사후 학습에 자리 잡았다. 앨런 AI 연구소의 튈루 3(Tülu 3)는 SFT, DPO, RLVR 순서의 공개 레시피를 냈다.[2] RLHF 전체 흐름과 다른 기법과의 비교는 인간 피드백 기반 강화 학습 문서에 있고, 이 문서는 DPO의 유도, 구현, 변형을 다룬다.

출발점: KL 제약 보상 최대화

편집 원본 편집

RLHF의 강화 학습 단계는 프롬프트 x에 대해 정책 π가 낸 응답 y의 보상을 높이되, 참조 정책 πref(보통 SFT 모델)에서 너무 멀어지지 않게 한다.

maxπ𝔼x∼D,y∼π(⋅|x)[r(x,y)]−β𝔻KL[π(y|x)‖πref(y|x)]

이 문제는 정책 공간 전체에서 최적화하면 해가 정확히 구해진다.

π*(y|x)=1Z(x)πref(y|x)exp⁡(1βr(x,y)),Z(x)=∑yπref(y|x)exp⁡(1βr(x,y))

분배 함수 Z(x)는 가능한 모든 응답에 대한 합이라 직접 계산할 수 없다. 그래서 RLHF는 이 해를 바로 쓰지 못하고 PPO 같은 강화 학습으로 근사한다.

보상을 정책으로 다시 쓰기

편집 원본 편집

위 식의 양변에 로그를 취해 보상에 대해 풀면 다음과 같다.

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

선호 데이터는 브래들리-테리(Bradley-Terry) 모형으로 다룬다. 선호 응답 yw가 비선호 응답 yl보다 선택될 확률은 두 보상 차이의 시그모이드다.

p(yw≻yl∣x)=σ(r(x,yw)−r(x,yl))

여기에 위의 보상 식을 넣으면 두 응답에 공통인 βlog⁡Z(x)가 뺄셈에서 사라진다. 계산할 수 없던 분배 함수가 없어지고, 선호 확률이 정책의 확률만으로 표현된다. 최적 정책 π* 자리에 학습할 정책 πθ를 두고 음의 로그 가능도를 최소화하면 DPO 손실이 된다.[1]

ℒDPO(πθ;πref)=−𝔼(x,yw,yl)∼D[log⁡σ(βlog⁡πθ(yw|x)πref(yw|x)−βlog⁡πθ(yl|x)πref(yl|x))]

응답 여러 개의 순위 데이터라면 브래들리-테리 모형을 일반화한 플래킷-루스(Plackett-Luce) 모형에 같은 치환을 해서 손실을 얻는다.[1] r^θ(x,y)=βlog⁡πθ(y|x)πref(y|x)를 암묵적 보상(implicit reward)이라 부른다. DPO 손실은 결국 이 암묵적 보상으로 브래들리-테리 보상 모델을 학습하는 이진 교차 엔트로피 손실이고, 보상 모델의 손실과 모양이 같다.

기울기의 의미

편집 원본 편집

손실의 기울기는 다음과 같다.[1]

∇θℒDPO=−β𝔼[σ(r^θ(x,yl)−r^θ(x,yw))(∇θlog⁡πθ(yw|x)−∇θlog⁡πθ(yl|x))]

선호 응답의 가능도는 올리고 비선호 응답의 가능도는 내리되, 앞의 가중치 σ(r^l−r^w) 때문에 암묵적 보상이 순서를 틀리게 매긴 예제일수록 크게 갱신한다. 논문은 이 가중치 없이 가능도 차이만 키우는 단순한 방식은 언어 모델이 퇴화할 수 있다고 보고했다.

하이퍼파라미터 β

편집 원본 편집

β는 원래 목적 함수의 KL 계수다. 작으면 참조 모델에서 멀리 벗어나는 것을 허용하고, 크면 참조 모델 가까이에 묶는다. 논문 실험의 기본값은 β=0.1, 배치 크기 64, RMSprop, 학습률 10−6였다.[1] TRL의 DPOConfig도 beta=0.1, learning_rate=1e-6이 기본값이다.[3]

  1. SFT 모델을 준비한다. 이 모델이 정책의 초기값이자 참조 모델이 된다.
  2. 프롬프트마다 선호 응답(chosen)과 비선호 응답(rejected)이 있는 데이터셋을 준비한다. 사람 평가, AI 평가, 보상 모델 점수로 만든다.
  3. 배치마다 정책과 참조 모델로 두 응답의 시퀀스 로그 확률(응답 토큰 로그 확률의 합)을 계산한다. 참조 모델은 기울기를 계산하지 않으므로 미리 계산해 두어도 된다.
  4. 위 손실로 정책만 갱신한다.

논문은 선호 데이터의 응답이 SFT 모델에서 생성된 경우 그 SFT 모델을 참조 모델로 쓰고, 그런 모델이 없으면 선호 응답의 가능도를 최대화하는 학습으로 참조 모델을 먼저 만들어 데이터와 참조 모델의 분포 차이를 줄였다.[1]

손실 계산 부분만 PyTorch로 쓰면 다음과 같다(PyTorch 2.5에서 실행 확인).

import torch
import torch.nn.functional as F

def sequence_logprob(logits, labels, mask):
    """logits: [B, L, V], labels: [B, L], mask: [B, L] (응답 토큰만 1)."""
    logp = torch.log_softmax(logits, dim=-1)
    tok = torch.gather(logp, 2, labels.unsqueeze(-1)).squeeze(-1)
    return (tok * mask).sum(-1)                     # 응답 토큰 로그 확률의 합

def dpo_loss(pi_w, pi_l, ref_w, ref_l, beta=0.1):
    """각 인자는 [B] 크기의 시퀀스 로그 확률. w=선호, l=비선호."""
    chosen = beta * (pi_w - ref_w)                  # 암묵적 보상 r(x, y_w)
    rejected = beta * (pi_l - ref_l)
    loss = -F.logsigmoid(chosen - rejected).mean()
    acc = (chosen > rejected).float().mean()        # 보상 정확도
    return loss, chosen.detach(), rejected.detach(), acc

로짓은 다음 토큰 예측이므로 실제 구현에서는 로짓과 레이블을 한 칸 어긋나게 맞춰야 하고, 프롬프트와 패딩 토큰은 마스크로 뺀다.

허깅 페이스 TRL v1.16.0(2026년 10월) 기준이다. 대화 형식 데이터를 주면 채팅 템플릿을 자동으로 적용한다.[4]

# pip install "trl==1.16.0" peft
from datasets import load_dataset
from peft import LoraConfig
from trl import DPOConfig, DPOTrainer

# 형식: {"prompt": [...], "chosen": [...], "rejected": [...]}
dataset = load_dataset("trl-lib/ultrafeedback_binarized", split="train")

args = DPOConfig(
    output_dir="qwen3-0.6b-dpo",
    beta=0.1,                 # KL 계수
    loss_type=["sigmoid"],    # 원래 DPO 손실. "ipo", "robust" 등으로 바꿀 수 있다
    learning_rate=1e-6,
)
trainer = DPOTrainer(
    model="Qwen/Qwen3-0.6B",
    args=args,
    train_dataset=dataset,
    peft_config=LoraConfig(),  # LoRA로 학습하면 별도 참조 모델 없이 어댑터를 끈 상태를 참조로 쓴다
)
trainer.train()

TRL은 rewards/chosen, rewards/rejected(암묵적 보상 평균), rewards/margins, rewards/accuracies(선호 응답의 암묵적 보상이 더 큰 비율), logps/chosen 등을 기록한다.[4] 정확도와 마진이 오르는지와 함께 logps/chosen이 계속 떨어지는지를 같이 본다(아래 한계 참고).

  • 선호 응답 확률도 함께 떨어진다: DPO 손실은 두 응답의 로그 확률 차이만 보므로, 둘 다 떨어져도 차이가 벌어지면 손실이 줄어든다. TRL 문서는 실제로는 선호 응답을 올리기보다 비선호 응답을 누르는 방식으로 마진이 벌어지는 경우가 많다고 설명하고,[4] RLHF 재현 연구도 학습 중 선호와 비선호의 암묵적 보상이 함께 내려가는 현상을 보고했다.[5] 이 때문에 SFT 손실을 섞거나(TRL에서 loss_type=["sigmoid", "sft"]) 다른 변형을 쓰기도 한다.
  • 결정적 선호에서의 과적합: IPO 논문은 선호가 거의 항상 한쪽으로 기우는 데이터에서는 브래들리-테리 가정 때문에 최적해가 참조 정책을 무시하고 극단으로 가며, KL 정규화가 사실상 작동하지 않는다고 분석했다.[6]
  • 오프라인 학습: 미리 모은 응답 쌍만 보므로, 학습이 진행되며 정책이 실제로 내는 응답과 데이터의 분포가 달라진다. 정책 응답을 새로 뽑아 평가받는 온라인 DPO나, 몇 차례 데이터를 다시 만드는 반복 DPO는 이 문제를 줄이려는 방법이다.
  • 길이 편향: 시퀀스 로그 확률의 합을 쓰므로 응답 길이가 보상에 섞인다. SimPO는 길이로 나눈 평균 로그 확률을 써서 이 문제를 다뤘다.[7]
  • PPO와의 우열: 원 논문은 감성 제어에서 PPO보다 높은 보상-KL 효율을, TL;DR 요약에서 GPT-4 기준 승률 약 61%(온도 0)로 PPO의 최고 57%보다 높은 결과를 보고했다.[1] 반면 2024년 ICML 논문은 PPO를 제대로 조정하면 대화부터 코드 생성까지 모든 시험 환경에서 DPO를 앞섰다며, DPO가 분포 밖 응답에 치우친 해를 찾을 수 있다는 이론적 한계를 지적했다.[8]

DPO 이후 손실 모양이나 필요 데이터를 바꾼 직접 정렬(direct alignment) 기법이 많이 나왔다. 아래 식에서 hθ=log⁡πθ(yw|x)πref(yw|x)−log⁡πθ(yl|x)πref(yl|x)로 둔다.

기법 손실(요약) 참조 모델 데이터 특징
DPO[1] −log⁡σ(βhθ) 필요 선호 쌍 기준점
IPO[6] (hθ−12τ)2 필요 선호 쌍 로그 확률비 차이를 목표값 1/(2τ)로 회귀시켜 무한히 벌어지지 않게 정규화
KTO[9] 좋은 응답은 1−σ(β(rθ−z0)), 나쁜 응답은 1−σ(β(z0−rθ)) 필요 응답별 좋음/나쁨 카너먼과 트버스키의 전망 이론을 본뜬 효용 최대화. 쌍이 아니어도 된다. z0는 배치에서 추정한 KL 기준점
ORPO[10] ℒSFT−λlog⁡σ(log⁡oddsθ(yw|x)oddsθ(yl|x)) 불필요 선호 쌍 오즈 P/(1−P)의 비로 비선호 응답에 작은 벌점을 주며 SFT와 선호 학습을 한 단계로 합침
SimPO[7] −log⁡σ(β|yw|log⁡πθ(yw|x)−β|yl|log⁡πθ(yl|x)−γ) 불필요 선호 쌍 길이 정규화 평균 로그 확률을 보상으로, 목표 마진 γ 추가
  • KTO: 좋음/나쁨 표시만 있으면 되므로 서비스에서 엄지 위/아래 같은 피드백을 바로 쓸 수 있다. 논문은 10억~300억 매개변수 규모에서 선호 쌍 기반 방법과 같거나 나은 성능을 보고했다.[9] TRL 문서는 좋은 예와 나쁜 예의 수가 불균형하면 가중치(desirable_weight, undesirable_weight)를 조정해 (좋은 쪽 가중치×개수):(나쁜 쪽 가중치×개수)가 1:1~4:3 범위가 되게 하라고 권한다.[11]
  • ORPO: 참조 모델도 별도 SFT 단계도 없어 메모리와 공정이 가장 단순하다. 논문은 Phi-2(27억), 라마 2(70억), 미스트랄(70억)을 UltraFeedback만으로 학습해 AlpacaEval 2.0 최대 12.20%, MT-Bench 7.32를 보고했다.[10]
  • SimPO: 참조 모델을 없애 계산과 메모리를 줄였다. 논문은 AlpacaEval 2에서 DPO보다 최대 6.4점, Arena-Hard에서 최대 7.5점 높았고, β는 2.0~2.5, γ는 0.5~1.5가 대체로 잘 맞았다고 보고했다.[7] 참조 모델이 없으므로 원래 분포에서 멀어지는 것을 막는 장치가 약하다는 점은 감안해야 한다.

TRL에서의 위치

편집 원본 편집

TRL v1.16.0 기준으로 DPO와 KTO는 안정 API(trl.DPOTrainer, trl.KTOTrainer)이고, ORPO와 SimPO는 실험 모듈에 있다. SimPO는 trl.experimental.cpo.CPOTrainer에서 loss_type="simpo", cpo_alpha=0.0으로 쓰며, IPO와 Robust DPO 등은 DPOConfig의 loss_type 값으로 고른다. 실험 모듈은 예고 없이 바뀌거나 빠질 수 있다.[4][12]

실무 선택 기준

편집 원본 편집
상황 고를 만한 방법
선호 쌍 데이터가 있고 공정을 단순하게 유지하고 싶다 DPO. 기본값 β=0.1에서 시작
엄지 위/아래 같은 단일 응답 평가만 있다 KTO
SFT 단계를 따로 둘 여유가 없고 메모리가 빠듯하다 ORPO
응답이 길어지는 경향이 문제다 SimPO 또는 길이 정규화 손실
라벨에 잡음이 많다 IPO, Robust DPO(라벨 뒤집힘 확률을 모델링)
수학·코드처럼 정답 확인이 된다 DPO보다 GRPO 같은 온라인 강화 학습과 검증 가능한 보상 강화 학습
최고 성능이 목표이고 RL 인프라가 있다 온라인 방법(PPO, GRPO, 온라인 DPO)과 비교 실험
  1. ↑ 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 Rafael Rafailov 외, 〈Direct Preference Optimization: Your Language Model is Secretly a Reward Model〉, NeurIPS 2023. arXiv:2305.18290
  2. ↑ Nathan Lambert 외, 〈Tulu 3: Pushing Frontiers in Open Language Model Post-Training〉, 2024. arXiv:2411.15124
  3. ↑ trl/trainer/dpo_config.py, 허깅 페이스 TRL v1.16.0.
  4. ↑ 4.0 4.1 4.2 4.3 DPO Trainer, 허깅 페이스 TRL 문서(v1.16.0 원문 dpo_trainer.md).
  5. ↑ Shengyi Huang 외, 〈The N+ Implementation Details of RLHF with PPO: A Case Study on TL;DR Summarization〉, 2024. arXiv:2403.17031
  6. ↑ 6.0 6.1 Mohammad Gheshlaghi Azar 외, 〈A General Theoretical Paradigm to Understand Learning from Human Preferences〉, 2023. arXiv:2310.12036
  7. ↑ 7.0 7.1 7.2 Yu Meng, Mengzhou Xia, Danqi Chen, 〈SimPO: Simple Preference Optimization with a Reference-Free Reward〉, NeurIPS 2024. arXiv:2405.14734
  8. ↑ Shusheng Xu 외, 〈Is DPO Superior to PPO for LLM Alignment? A Comprehensive Study〉, ICML 2024. arXiv:2404.10719
  9. ↑ 9.0 9.1 Kawin Ethayarajh 외, 〈KTO: Model Alignment as Prospect Theoretic Optimization〉, ICML 2024. arXiv:2402.01306
  10. ↑ 10.0 10.1 Jiwoo Hong, Noah Lee, James Thorne, 〈ORPO: Monolithic Preference Optimization without Reference Model〉, 2024. arXiv:2403.07691
  11. ↑ KTO Trainer, 허깅 페이스 TRL 문서(v1.16.0).
  12. ↑ CPO Trainer, Experimental, 허깅 페이스 TRL 문서(v1.16.0).
  • Ralph Allan Bradley, Milton E. Terry, 〈Rank Analysis of Incomplete Block Designs: I. The Method of Paired Comparisons〉, Biometrika 39(3/4), 1952.
  • 허깅 페이스 TRL 저장소