[RLHF] DPO(Direct Preference Optimization) 정리

Soeon Park·2025년 7월 15일
0

개요

RLHF(Reinforcement Learning from Human Feedback)은 인간의 피드백을 바탕으로 언어 모델을 최적화시키는 대표적인 방식이다. 이때, 학습 방식은 크게 두 가지로 나눌 수 있는데,

- 보상 모델 기반 접근(Reward Model Based)

  • 인간 피드백 데이터를 이용해 보상 모델(Reward Model)을 학습한 뒤, 이를 기반으로 PPO(Proximal Policy Optimization)등의 강화학습 기법을 적용해 언어 모델을 튜닝

- 보상 모델이 없는 직접 최적화 접근

  • Reward Model을 따로 학습하지 않고, 인간 선호쌍(Preferred vs. Dispreferred)만을 이용해 직접 모델 최적화

으로 나눌 수 있다.

이번 포스팅에서 알아볼 Direct Preference Optimization(이하 DPO) 학습 방식은 명시적이 듯, 두 번째 방식에 해당되며, '직접적으로 선호도를 학습하는 최적화 기법'이다.

이러한 학습 방식이 제안된 배경은 다음과 같다:
기존의 RLHF에서는 보상 모델을 만들고, Proximal Policy Optimization(PPO)와 같은 알고리즘으로 fine-tuning을 진행하였음.
이때,

  • Reward Model을 별도로 학습해야하므로 Train Pipeline이 복잡하다.
  • PPO는 안정성 이슈와 구현 복잡성이 존재한다.
  • Reward Model 자체의 Bias가 LLM의 최종 출력에 예측 불가한 왜곡을 줄 가능성이 있다.

이러한 문제점을 해결하기 위해, DPO는

- 보상모델 없이 직접 LLM Fine-tuning

- 최적화 관점에서 보다 단순하고 수렴이 안정적

이라는 개선점을 보이는 학습 방식이다.

💁 배경 지식 한 입.... 작지만 큰... 한 입....

강화학습과 RLHF

* 강화학습(Reinforcement Learning, RL)

Agent가 Environment와 상호작용하며 Reward를 최대화하는 행동을 학습하는 방식
이때, Agent는 학습 주체, Environment는 상호작용 대상으로 생각하면 쉽다.
(좀 더 쉬운 이해를 위해 아래에서 예시를 적용하겠다.)
이는 보상 신호를 최대화하는 정책(Policy)을 학습하는 것으로, 좋은 행동(Reward를 받는 행동)은 강화되며, 그렇지 않은 행동은 억제되는 식의 학습 방식이다.

* RLHF(Reinforcement Learning from Human Feedback)

RL의 한 분야로, Environment의 Reward 대신 Human Feedback(Preference)을 이용해 Agent를 튜닝
e.g.,) LLM Tuning
인간이 A, B 두 응답 중 어떤 것이 더 좋은지 평가 → 이를 기반으로 보상 모델(RM)을 학습
이후 PPO 등을 사용해 LLM을 fine-tuning
(대표 사례) ChatGPT

[RL Example]

  • Agent: 학습 주체 (예: 로봇, AI, 아이)
  • Environment: Agent가 상호작용하는 외부 시스템 (예: 게임, 교실)
  • State: 현재 환경의 상태 정보 (예: 지금이 수학 시간인지 국어 시간인지)
  • Action: Agent가 선택할 수 있는 행동들 (예: 손들기, 조용히 있기)
  • Reward: 행동 결과로 받는 수치적 피드백 (예: 칭찬, 점수)

즉, RL은 환경 보상 기반이며 RLHF는 인간의 주관적 평가를 보상처럼 사용

* PPO(Proximal Policy Optimization)

OpenAI에서 제안한 정책 기반 RL 알고리즘으로, 기존 Policy를 너무 급격히 바꾸지 않도록 하여 학습 안정성과 효율성을 동시에 확보한 방식

  • 주요 내용
    - KL-divergence 또는 clip function을 사용해 policy update 제한
    - 너무 급격한 정책 변화를 방지하여 안정적인 학습을 유도

  • Loss Function
    LCLIP(θ)=Et[min(rt(θ)A^t,clip(rt(θ),1ϵ,1+ϵ)A^t)]\mathcal{L}^{\text{CLIP}}(\theta) = \mathbb{E}_t \left[ \min\left( r_t(\theta) \hat{A}_t, \text{clip}(r_t(\theta), 1 - \epsilon, 1 + \epsilon) \hat{A}_t \right) \right]
    - rt(θ)=πθ(atst)πθold(atst)r_t(\theta) = \frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{\text{old}}}(a_t|s_t)}: 정책 비율
    - A^t\hat{A}_t: Advantage function (이 행동이 얼마나 좋은지)
    - clipclip: 정책이 급격히 바뀌는 것을 억제(비율이 [1ε,1+ε][1−ε, 1+ε] 범위를 넘지 않도록 제한)

  • 장점
    - 학습이 안정적이고 구현이 비교적 간단
    • 많은 RL 적용 분야에서 기본 선택지로 사용됨(범용성 Good~)

목적

LLM에 인간의 선호도를 반영한 응답 생성을 직접 최적화하기 위함이다.
PPO보다 더 안정적이고 간단하며, 효율적인 학습을 가능하게 함.


핵심 아이디어

한 줄 요약: 사용자 또는 평가자가 선호하는 응답(A)그렇지 않은 응답(B)이 있을 때, 모델이 A를 더 높은 확률로 생성하도록 학습하는 방식

DPO는 (입력 x, 선호 응답 y, 비선호 응답 y-)의 삼중쌍을 사용한다.
즉, 사용자 또는 평가자가 응답 A를 B보다 선호한다고 판단할 경우, 모델은 A를 더 높은 확률로 생성하도록 학습하는 방식이다.
이를 위해, DPO는 아래와 같은 loss를 최소화한다.

Loss Function:

LDPO=logeβlogπθ(ypreferredx)eβlogπθ(ypreferredx)+eβlogπθ(ydispreferredx)\mathcal{L}{\text{DPO}} = -\log \frac{e^{\beta \cdot \log \pi\theta(y_{\text{preferred}} | x)}}{e^{\beta \cdot \log \pi_\theta(y_{\text{preferred}} | x)} + e^{\beta \cdot \log \pi_\theta(y_{\text{dispreferred}} | x)}}

이때,

  • πθ(yx)\pi_\theta(y|x): 현재 모델이 입력 x에 대해 출력 y를 생성할 확률
  • y+,yy_+, y_-: 선호, 비선호 응답
  • β\betatemp Hyper-Parmeter으로, 선택성(sharpness)을 조절

이 식은 로지스틱 회귀(Logistic Regression) 기반 확률 모델과 유사한 식 형태를 가지며, 선호 응답이 더 높은 확률을 가지도록 모델을 업데이트하는 방향으로 학습된다.

‣ 장점

  • 별도의 보상 모델이 불필요
  • PPO보다 안정적이고 Implementation이 간단함
  • 높은 Alignment 성능(GPT류 모델의 fine-tuning에 많이 사용됨

평가 지표

정량적 평가지표(Quantitative Metrics)

1. Win Rate/Preference Accuracy
평가자 혹은 GPT가 생성된 응답 A와 B 중 선호하는 답변을 투표
DPO로 학습한 모델의 응답이 기존 SFT나 모델보다 더 많이 선택되면 우수한 성능으로 판단

평가 방식:
• 각 질문에 대해 SFT, PPO, DPO 등 여러 모델의 응답을 생성
• 평가자 또는 GPT-4가 어떤 응답을 더 선호하는지 선택
• DPO 응답이 더 많이 선택된 비율 = Win rate

2. Pairwise Accuracy/Agreement Rate

  • 학습에 사용된 선호쌍 데이터셋에 대해,
    - DPO 모델이 선호 응답(y')을 더 높은 Log-prob로 생성하는지를 평가
    → log π(y⁺|x) > log π(y⁻|x) 여부를 통해 preference alignment 측정

    수식:
    Accuracy=1Ni=1N1[logπ(y+x)>logπ(yx)]\text{Accuracy} = \frac{1}{N} \sum_{i=1}^{N} \mathbb{1}\left[ \log \pi(y_+|x) > \log \pi(y_-|x) \right]

3. Language Quality Metrics
보통은 직접 평가가 아니지만, 생성 텍스트 퀄리티도 참고하기도 함
- BLEU, ROUGE
- BERTScore, BLEURT
- Toxicity Score: 응답이 공격/차별적 표현을 포함하는지 확인하기 위함

정성적 평가지표(Quailitative Evaluation)

1. GPT-4 등 LLM 기반 평가자 사용
사람 대신 GPT-4에게 각 응답에 대해 다음 기준을 평가하게 함:

  • Helpfulness (도움이 되는가?)
  • Relevance (질문과 관련 있는가?)
  • Correctness (사실 기반인가?)
  • Harmlessness (독성/편향이 없는가?)

2. Human Evaluation

  • 실제 사람에게 응답쌍을 보여주고 더 나은 응답을 고르게 함
  • 비용과 시간은 많이 들지만, 신뢰도는 가장 높음

구현

from transformers import AutoTokenizer, AutoModelForCausalLM, TrainingArguments
from trl import DPOTrainer
from datasets import load_dataset  
import torch

# 1. Load model & tokenizer
model_name = "meta-llama/Llama-2-7b-hf"  # HuggingFace Model
tokenizer = AutoTokenizer.from_pretrained(model_name, use_fast=True)
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    torch_dtype=torch.bfloat16,  # 혼합정밀도 가속
    device_map="auto"
)

# 2. Define TrainingArguments
training_args = TrainingArguments(
    output_dir="./dpo-checkpoints",
    per_device_train_batch_size=2,
    per_device_eval_batch_size=2,
    gradient_accumulation_steps=8,
    num_train_epochs=3,
    learning_rate=5e-6,
    logging_dir="./logs",
    logging_steps=10,
    save_strategy="epoch",
    eval_strategy="steps", 
    eval_steps=100,
    report_to="wandb",
)

# 3. Define triplet dataset: (prompt, chosen, rejected)
# Must be a HuggingFace `Dataset` object with columns: prompt, chosen, rejected
from datasets import Dataset

triplet_data = [
    {
        "prompt": "Explain the theory of relativity.",
        "chosen": "The theory of relativity, developed by Einstein, includes the special and general theories...",
        "rejected": "Relativity is when things are related, like people in a family."
    },
    ...
]

triplet_dataset = Dataset.from_list(triplet_data)

# 4. Initialize DPOTrainer
dpo_trainer = DPOTrainer(
    model=model,
    tokenizer=tokenizer,
    args=training_args,
    beta=0.1,  # temp: sharpness of preference
    train_dataset=triplet_dataset
)

# 5. Start training
dpo_trainer.train()

이때,

  • beta 값 조정이 학습 sharpness에 큰 영향을 줌
    β\beta가 클수록 “선호 응답과 비선호 응답 간 log 확률 차이를 더 크게 반영” → sharper decision boundary
    • 일반적으로 0.1 ~ 0.5 사이에서 튜닝
    • 낮추면 더 부드러운 학습, 높이면 강한 선호 반영
  • 데이터는 반드시 “Preferred vs. Dispreferred” Response 구조여야 함
  • triplet_dataset 주의
    • 반드시 prompt, chosen, rejected 세 개의 열(column) 필요
    • 문자열 말고 tokenized 형태를 넣으면 충돌 발생 가능 → tokenizer는 trainer가 내부에서 처리

추론 시,

from transformers import pipeline
pipe = pipeline("text-generation", model="./final-dpo-model", tokenizer=tokenizer)
pipe("Why is the sky blue?", max_new_tokens=50)
profile
베풀기 위해 더 많이 공부하고 성장하기 ᓚᘏᗢ: 공부 정리용

0개의 댓글