AI 모델 및 플랫폼

직접적인 선호도 최적화: 완전한 가이드

mm
Unite.AI를 Google의 선호 소스에 추가

대형 언어 모델(Large Language Models, LLM)을 인간의 가치와 선호도에 맞추는 것은 어려운 일입니다. 전통적인 방법으로는 인간의 입력을 모델 출력에 통합하여 정교화하는 방법인 강화 학습에서 인간의 피드백(Reinforcement Learning from Human Feedback, RLHF)을 사용합니다. 그러나 RLHF는 복잡하고 자원 집중적이며大量의 계산 능력과 데이터 처리가 필요합니다. 직접적인 선호도 최적화(Direct Preference Optimization, DPO)는 이러한 전통적인 방법에 대한 효율적인 대안을 제공하는 새로운 접근법입니다. 최적화 과정을 단순화함으로써 DPO는 계산 부담을 줄이고 모델이 인간의 선호도에 빠르게 적응할 수 있도록 합니다.

이 가이드에서는 DPO의 기초, 구현, 실제 적용에 대해 깊이 있게 다룰 것입니다.

선호도 정렬의 필요성

DPO를 이해하기 위해서는 먼저 LLM을 인간의 선호도에 맞추는 것이 왜 중요하는지 알아야 합니다. 대규모 데이터셋에서 학습된 LLM은 때때로 인간의 가치와 일치하지 않거나 편향된 출력을 생성할 수 있습니다. 이러한 불일치는 다양한 방식으로 나타날 수 있습니다:

  • 안전하지 않거나 유해한 콘텐츠 생성
  • 부정확하거나 잘못된 정보 제공
  • 학습 데이터에 존재하는 편향성 나타내기

이러한 문제를 해결하기 위해 연구자들은 인간의 피드백을 사용하여 LLM을 미세 조정하는 기술을 개발했습니다. 이러한 접근법 중 가장 두드러진 것은 RLHF입니다.

RLHF 이해: DPO의 전구체

인간의 피드백에서 강화 학습(Reinforcement Learning from Human Feedback, RLHF)은 LLM을 인간의 선호도에 맞추는 데 사용된 주요 방법입니다. RLHF의 과정을 자세히 살펴보겠습니다:

a) 감독된 미세 조정(Supervised Fine-Tuning, SFT): 과정은 미리 학습된 LLM을 높은 품질의 응답 데이터셋에서 미세 조정하여 시작합니다. 이 단계는 모델이 더 관련性 있고 일관된 출력을 생성하도록 도와줍니다.

b) 보상 모델링(Reward Modeling): 인간의 선호도를 예측하는 별도의 보상 모델을 학습합니다. 이는 다음을 포함합니다:

  • 주어진 프롬프트에 대한 응답 쌍 생성
  • 인간이 어느 응답을 더 선호하는지 평가
  • 이러한 선호도를 예측하는 모델을 학습

c) 강화 학습(Reinforcement Learning): 미세 조정된 LLM을 강화 학습을 통해 추가로 최적화합니다. 보상 모델은 피드백을 제공하여 LLM이 인간의 선호도에 따라 응답을 생성하도록 지시합니다.

RLHF의 단순화된 파이썬 유사 코드는 다음과 같습니다:

그러나 RLHF에는 몇 가지 단점이 있습니다:

  • 여러 모델(SFT, 보상 모델, RL 최적화 모델)을 학습하고 유지해야 함
  • RL 과정은 불안정하고 하이퍼파라미터에 민감
  • 계산적으로 비용이 많이 들고 모델을 여러 번 전방 및 후방으로 전달해야 함

이러한 제한으로 인해 더 단순하고 효율적인 대안을 찾는 연구가 진행 중이며, 이는 DPO의 개발로 이어졌습니다.

직접적인 선호도 최적화: 핵심 개념

직접적인 선호도 최적화 https://arxiv.org/abs/2305.18290

직접적인 선호도 최적화 https://arxiv.org/abs/2305.18290

이 이미지는 두 가지 다른 접근법을 대조합니다. 하나는 인간의 피드백에서 강화 학습(Reinforcement Learning from Human Feedback, RLHF)이고, 다른 하나는 직접적인 선호도 최적화(Direct Preference Optimization, DPO)입니다. RLHF는 보상 모델을 사용하여 언어 모델의 정책을 반복적인 피드백 루프를 통해 지시합니다. 반면에 DPO는 선호도 데이터를 사용하여 모델 출력을 직접 최적화합니다. 이 비교는 각 방법의 강점과 잠재적인 응용 분야를 강조하며, 향후 LLM이 인간의 기대와 더 잘 일치하도록 훈련될 수 있는 방법에 대한 통찰력을 제공합니다.

DPO의 핵심 아이디어:

a) 암시적 보상 모델링(Implicit Reward Modeling): DPO는 별도의 보상 모델을 제거하고 언어 모델 자체를 암시적 보상 함수로 취급합니다.

b) 정책 기반 형식화(Policy-Based Formulation): DPO는 보상 함수를 최적화하는 대신 직접 정책(언어 모델)을 최적화하여 선호도 응답의 확률을 최대화합니다.

c) 닫힌 형식 해법(Closed-Form Solution): DPO는 수학적 통찰력을 활용하여 최적 정책에 대한 닫힌 형식 해법을 제공하여 반복적인 RL 업데이트의 필요성을 피합니다.

DPO 구현: 실제 코드 살펴보기

아래 이미지는 PyTorch를 사용하여 DPO 손실 함수를 구현하는 코드 조각을 보여줍니다. 이 함수는 언어 모델이 인간의 선호도에 따라 출력을優先하는 방법을 정교화하는 데 중요한 역할을 합니다. 주요 구성 요소는 다음과 같습니다:

  • 함수 시그니처: dpo_loss 함수는 여러 매개 변수를 받습니다. 정책 로그 확률(pi_logps), 참조 모델 로그 확률(ref_logps), 선호 및 비선호 완성 인덱스(yw_idxs, yl_idxs) 및 beta 매개 변수가 있습니다. beta는 KL 패널티의 강도를 제어합니다.
  • 로그 확률 추출: 코드는 선호 및 비선호 완성에 대한 로그 확률을 정책 및 참조 모델에서 추출합니다.
  • 로그 비율 계산: 정책 및 참조 모델에서 선호 및 비선호 완성에 대한 로그 확률 차이를 계산합니다. 이 비율은 최적화의 방향과 크기를 결정하는 데 중요합니다.
  • 손실 및 보상 계산: 손실은 logsigmoid 함수를 사용하여 계산되고, 보상은 정책 및 참조 모델의 로그 확률 차이를 beta로 스케일링하여 결정됩니다.
PyTorch를 사용한 DPO 손실 함수

PyTorch를 사용한 DPO 손실 함수

DPO의 수학적 배경을 살펴보겠습니다.

DPO의 수학

DPO는 선호도 학습 문제의 재구성입니다. 단계별 설명은 다음과 같습니다:

a) 시작점: KL 제약 보상 최대화

원래 RLHF 목표는 다음과 같이 표현될 수 있습니다:

직접적인 선호도 최적화(DPO)에서 사용하는 손실 함수를 나타내는 복잡한 수학적 공식

여기서:
  • πθ는 최적화하는 정책(언어 모델)입니다
  • r(x,y)는 보상 함수입니다
  • πref는 참조 정책(일반적으로 초기 SFT 모델)입니다
  • β는 KL 발산 제약의 강도를 제어합니다

b) 최적 정책 형식: 이 목표에 대한 최적 정책은 다음과 같은 형식을 갖습니다:

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

여기서 Z(x)는 정규화 상수입니다.

c) 보상-정책 쌍대성: DPO의 핵심 통찰력은 보상 함수를 최적 정책으로 표현하는 것입니다:

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

d) 선호도 모델 가정 선호도가 Bradley-Terry 모델을 따른다고 가정하면, y1을 y2보다 선호하는 확률은 다음과 같이 표현될 수 있습니다:

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

여기서 σ는 로지스틱 함수입니다.

e) 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: 정책 로그 확률, shape (B,)
ref_logps: 참조 모델 로그 확률, shape (B,)
yw_idxs: 선호 완성 인덱스, shape (T,)
yl_idxs: 비선호 완성 인덱스, shape (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&quot;손실: {loss}&quot;)

도전과 미래 방향

DPO는 전통적인 RLHF 접근법에 비해 상당한 이점을 제공하지만, 여전히 도전과 연구가 필요한 영역이 있습니다:

a) 더 큰 모델에 대한 확장성:

언어 모델의 크기가 계속 증가함에 따라, 수백억 개의 매개 변수를 갖는 모델에 DPO를 효율적으로 적용하는 것은 여전히 열린 도전입니다. 연구자들은 다음과 같은 기술을 탐색하고 있습니다:

  • 효율적인 미세 조정 방법(예: LoRA, Prefix Tuning)
  • 분산 훈련 최적화
  • 그라디언트 체크포인트 및 混合 정밀도 훈련

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)

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를 구현할 때 다음 팁을 고려하십시오:

a) 데이터 품질: 선호도 데이터셋의 품질은 매우 중요합니다. 데이터셋이:

  • 다양한 입력 및 원하는 행동을 다룹니다
  • 일관적이고 신뢰할 수 있는 선호도 주석을 갖습니다
  • 다양한 유형의 선호도(예: 사실성, 안전성, 스타일)를 균형 있게 다룹니다

b) 하이퍼파라미터 조정: DPO에는 RLHF보다 적은 하이퍼파라미터가 있지만, 조정은 여전히 중요합니다:

  • β (베타): 선호도 만족과 참조 모델에서 발산 사이의 트레이드오프를 제어합니다. 0.1~0.5 사이의 값을 시작으로 사용하십시오.
  • 학습률: 표준 미세 조정보다 더 낮은 학습률을 사용하십시오. 일반적으로 1e-6에서 1e-5 사이입니다.
  • 배치 크기: 선호도 학습에는 일반적으로 더 큰 배치 크기(32~128)가 잘 작동합니다.

c) 반복적 정제: DPO를 반복적으로 적용할 수 있습니다:

  1. 초기 모델을 DPO로 훈련
  2. 훈련된 모델을 사용하여 새로운 응답 생성
  3. 새로운 응답에 대한 새로운 선호도 데이터 수집
  4. 확장된 데이터셋을 사용하여 재훈련

 

직접적인 선호도 최적화

직접적인 선호도 최적화 성능

이 이미지는 다양한 훈련 기술(직접적인 선호도 최적화, 감독된 미세 조정, 근접 정책 최적화)을 사용하여 훈련된 LLM(GPT-4)의 성능을 인간의 판단과 비교하여 보여줍니다. 표는 GPT-4의 출력이 인간의 선호도와 점점 더 일치한다는 것을 보여주며, 특히 요약 작업에서 그렇습니다. GPT-4와 인간 평가자의 일치 度는 인간이 생성한 콘텐츠와 거의 동일한 수준으로 인간 평가자와 резонانس하는 콘텐츠를 생성하는 모델의 능력을 보여줍니다.

사례 연구와 응용

DPO의 효과를 입증하기 위해 실제 응용과 변형을 살펴보겠습니다:

  • 반복적 DPO: Snorkel(2023)이 개발한 이 변형은 거부 샘플링과 DPO를 결합하여 훈련 데이터를 더 정교화하는 프로세스를 가능하게 합니다. 여러 라운드의 선호도 샘플링을 통해 반복적으로 모델은 일반화하고 노이즈나 편향된 선호도에 대한 과적합을 피할 수 있습니다.
  • IPO (반복적 선호도 최적화): Azar et al.(2023)이 도입한 IPO는 과적합을 방지하기 위해 정규화 항을 추가합니다. 이 확장은 모델이 선호도에 따라 일치하면서도 일반화 능력을 유지할 수 있도록 합니다.
  • KTO (지식 전이 최적화): Ethayarajh et al.(2023)이 최근 제안한 KTO는 이진 선호도를 완전히 제거하고, 대신 참조 모델에서 정책 모델로 지식을 전달하여 인간의 가치와 더 일치하는 모델을 만드는 데 중점을 둡니다.
  • 다중 모달 DPO를 통한 크로스 도메인 학습 by Xu et al.(2024): DPO를 다양한 모달리티(텍스트, 이미지, 오디오)에서 적용하여, 인간의 선호도에 따라 모델을 다양한 데이터 유형에서 일치시키는 잠재력을 보여주는 접근법입니다. 이 연구는 다중 모달 작업을 처리할 수 있는 더 포괄적인 AI 시스템을 만들기 위한 DPO의 가능성을 강조합니다.

결론

직접적인 선호도 최적화는 언어 모델을 인간의 선호도에 맞추는 데 상당한 발전을 나타냅니다. 그 단순성, 효율성, 효과는 연구자와 실무자 모두에게 강력한 도구를 제공합니다.

직접적인 선호도 최적화의 힘과 이러한 원칙을 염두에 두고, 언어 모델을 만들 수 있습니다. 이러한 모델은 인상적인 능력을 보여주지만 인간의 가치와 의도와도 잘 일치합니다.

지난 5년 동안私は Machine Learning과 Deep Learning의 매혹적인 세계에 몰두해 왔습니다.私の熱情と専門知識は私を50以上의多様한 소프트웨어 엔지니어링 프로젝트에 기여하게 했으며, 특히 AI/ML에 중점을 두었습니다.私の継続的な 호기심은 또한私를自然어 처리로 끌어들였습니다.私は이 분야를さらに 탐구하기를熱望합니다.