ORPO — 참조 모델 없이 선호 최적화

ORPO

**ORPO(Odds Ratio Preference Optimization)**는 SFT와 선호 정렬을 하나의 단계로 합친 방법이에요. 별도의 참조 모델 없이, 선호 쌍에서 좋은 답의 오즈 비율을 높이는 방향으로 손실을 설계해서 파이프라인을 크게 줄여요.

왜 중요한가

DPO류는 보통 '참조 정책 대비 로그우도 차이'를 쓰기 때문에 참조 모델(또는 그 역할)이 필요해요. ORPO는 참조 정책 없이 선호 데이터만으로 목표를 정의하므로, 구현이 더 단순하고 SFT 단계가 뒤에 붙을 필요가 없어요.

사용 예제

from trl import ORPOConfig, ORPOTrainer
from transformers import AutoModelForCausalLM, AutoTokenizer

model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2-0.5B-Instruct")
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2-0.5B-Instruct")
train_dataset = load_dataset("trl-lib/ultrafeedback_binarized", split="train")

training_args = ORPOConfig(output_dir="Qwen2-0.5B-ORPO")
trainer = ORPOTrainer(model=model, args=training_args, processing_class=tokenizer, train_dataset=train_dataset)
trainer.train()

핵심 파라미터

  • beta: ORPO 손실에서 좋은/나쁜 답의 상대 비율 가중치(논문의 λ).
  • ORPO는 보통 max_length(프롬프트+완성) 지정이 필요해요.

언제 고를까

SFT → 정렬을 두 단계로 나누기 부담스러운 소규모 워크플로우라면 ORPO가 효율적이에요. UltraFeedback 같은 선호 데이터셋 하나로 바로 훈련할 수 있어요.

더 알아보기