"이 답이 저 답보다 낫다"는 선호 쌍 데이터만으로 모델을 직접 학습시키는 정렬 방법으로, RLHF와 달리 보상 모델과 강화학습이 필요 없어 구현이 간단하고 학습이 안정적이다. SFT로 지시 따르기를 먼저 가르친 모델에 말투·형식·도메인 선호를 입힐 때 쓴다.
| 방법 | 필요한 데이터 | 학습 과정 | 난이도 |
|---|---|---|---|
| SFT | 질문 + 모범 답안 | 정답을 따라 쓰게 학습 | 쉬움 |
| DPO | 질문 + 좋은 답 + 나쁜 답 | 손실 함수 하나로 바로 학습 | 쉬움 |
| RLHF (PPO) | 선호 데이터 + 보상 모델 | 보상 모델 학습 후 강화학습 | 어려움 |
RLHF는 사람의 선호로 보상 모델을 먼저 학습한 뒤, PPO로 그 점수가 오르도록 모델을 고친다. 모델 여러 개를 함께 띄워야 하고 설정에 민감해서 학습이 쉽게 불안정해진다.
DPO는 이 과정을 하나로 줄였다. 좋은 답이 나올 확률은 올리고 나쁜 답이 나올 확률은 내리면서, 학습 전 모델을 기준(reference) 모델로 고정해 두고 거기서 너무 멀어지지 않게 한다. 논문 제목처럼 언어 모델이 스스로 보상 모델 역할을 하는 셈이다.
Hugging Face TRL 라이브러리의 DPOTrainer를 쓰면 바로 시작할 수 있다. 보통 아래 순서로 진행한다.
| 단계 | 할 일 |
|---|---|
| 1. 기반 모델 | SFT까지 마친 모델을 준비한다 |
| 2. 데이터 | prompt, chosen, rejected 세 열로 정리한다 |
| 3. 설정 | beta로 기준 모델에서 벗어나는 정도를 정한다 |
| 4. 평가 | 실제 질문을 넣어 학습 전 모델과 답을 비교한다 |
GPU 메모리가 부족하면 LoRA 같은 PEFT와 함께 쓴다. 어댑터만 학습하므로 어댑터를 끈 원래 모델을 기준 모델로 쓸 수 있어, 모델을 하나 더 띄우지 않아도 된다.
beta를 크게 잡으면 원래 모델에 가깝게 남고, 작게 잡으면 선호 데이터 쪽으로 더 많이 바뀐다. 기본값에서 시작한 뒤 답변이 무너지거나 변화가 너무 적으면 조정한다.
더 중요한 건 데이터다. chosen과 rejected의 차이가 분명해야 한다. 좋은 답이 늘 더 길기만 하면 모델은 품질 대신 길게 쓰는 버릇을 배운다. 같은 데이터로 너무 오래 학습하면 과적합되어 답변이 어색해질 수 있다.
DPO는 모델이 이미 낼 수 있는 답 가운데 어떤 쪽을 고를지 다듬는 방법이다. 모르는 지식이나 처음 보는 형식은 넣지 못하므로 그런 건 SFT로 먼저 가르친다.
| 상황 | 선택 |
|---|---|
| 새 지식이나 형식을 처음 가르칠 때 | SFT |
| 답변 비교 피드백이 쌓였을 때 | DPO |
| 좋아요/싫어요만 있고 짝이 없을 때 | KTO 같은 변형 |
사내 피드백을 비교 쌍 형태로 모아 두었다가 주기적으로 DPO 학습을 돌리면, 우리 도메인에서 선호하는 답변 방식을 모델에 꾸준히 반영할 수 있다.
가장 흔한 건 SFT 바로 다음 단계로 DPO를 한 번 더 돌리는 방식이다. 선호 쌍만 모이면 GPU 몇 장으로도 돌릴 수 있어서, 오픈 모델을 직접 튜닝하는 사람들이 많이 쓴다.
| 어디서 | 어떻게 쓰나 |
|---|---|
| 오픈 모델 파인튜닝 | SFT로 지시 따르기를 가르친 뒤, 공개 선호 데이터셋으로 DPO를 돌려 대화 품질을 다듬는다 |
| 사내 챗봇·문서 검색 답변 | 담당자가 고른 답과 버린 답을 쌍으로 모아 회사 말투와 답변 형식을 맞춘다 |
| 안전한 답변 조정 | 적절히 거절한 답을 chosen, 위험한 답을 rejected로 두고 학습한다 |
| AI 피드백으로 데이터 만들기 | 사람 대신 더 큰 모델이 두 답 중 나은 쪽을 골라 선호 쌍을 싸게 만든다 |