RLHF란 무엇인가?
RLHF(Reinforcement Learning from Human Feedback)는 인간의 피드백을 활용하여 언어모델을 학습시키는 강화학습 기법입니다. ChatGPT와 Claude 같은 최신 AI 모델들이 우리의 의도를 정확히 이해하고 유용한 답변을 제공할 수 있는 이유가 바로 이 기술 덕분입니다.
RLHF는 단순히 다음 단어를 예측하는 언어모델을 “인간이 선호하는 방향”으로 정렬(alignment)시키는 핵심 기술입니다.
왜 RLHF가 필요한가?
일반적인 사전학습 언어모델(Pre-trained LM)은 방대한 텍스트 데이터로 학습되지만, 다음과 같은 문제가 있습니다:
- 유해한 콘텐츠 생성 가능성
- 사실이 아닌 정보를 그럴듯하게 생성 (할루시네이션)
- 사용자 의도와 무관한 장황한 답변
- 편향되거나 부적절한 응답
RLHF는 이러한 문제를 해결하여 모델을 안전하고, 유용하며, 정직한 방향으로 정렬합니다.
RLHF 3단계 파이프라인
RLHF는 크게 3단계로 구성됩니다:
| 단계 | 이름 | 목적 | 결과물 |
|---|---|---|---|
| 1단계 | Supervised Fine-tuning (SFT) | 고품질 데이터로 모델 미세조정 | SFT 모델 |
| 2단계 | Reward Model Training | 인간 선호도 학습 | 보상 모델 |
| 3단계 | PPO/DPO 최적화 | 보상 최대화 학습 | 정렬된 모델 |
1단계: Supervised Fine-tuning (SFT)
첫 번째 단계는 고품질의 프롬프트-응답 쌍으로 사전학습된 모델을 미세조정하는 것입니다.
# SFT 데이터 예시
sft_data = [
{
"prompt": "파이썬으로 리스트를 정렬하는 방법은?",
"response": "파이썬에서 리스트를 정렬하려면 sorted() 함수나 .sort() 메서드를 사용합니다..."
},
# 수천~수만 개의 고품질 예시
]
# Hugging Face Transformers로 SFT 수행
from transformers import AutoModelForCausalLM, TrainingArguments, Trainer
model = AutoModelForCausalLM.from_pretrained("gpt2")
trainer = Trainer(
model=model,
args=TrainingArguments(output_dir="./sft_model"),
train_dataset=sft_dataset
)
trainer.train()
2단계: Reward Model 학습
두 번째 단계는 인간의 선호도를 예측하는 보상 모델을 학습합니다.
데이터 수집 과정:
1. SFT 모델로 여러 응답 생성
2. 인간 평가자가 응답들을 순위 매김
3. 선호도 데이터셋 구축
# 선호도 데이터 예시
preference_data = [
{
"prompt": "강화학습을 설명해주세요",
"chosen": "강화학습은 에이전트가 환경과 상호작용하며...", # 더 선호됨
"rejected": "강화학습은 머신러닝의 한 종류입니다." # 덜 선호됨
}
]
# TRL 라이브러리로 보상 모델 학습
from trl import RewardTrainer
reward_trainer = RewardTrainer(
model=reward_model,
train_dataset=preference_dataset
)
reward_trainer.train()
보상 모델은 두 응답을 비교하여 어느 것이 더 나은지 스코어를 출력합니다.
3단계: PPO를 통한 강화학습
마지막 단계는 PPO(Proximal Policy Optimization) 알고리즘으로 보상을 최대화하도록 모델을 학습합니다.
from trl import PPOTrainer, PPOConfig, AutoModelForCausalLMWithValueHead
# PPO 설정
config = PPOConfig(
model_name="sft_model",
learning_rate=1.41e-5,
batch_size=256
)
# 모델과 트레이너 초기화
model = AutoModelForCausalLMWithValueHead.from_pretrained("sft_model")
ppo_trainer = PPOTrainer(config, model, reward_model=reward_model)
# PPO 학습 루프
for batch in dataloader:
query_tensors = batch["input_ids"]
# 응답 생성
response_tensors = ppo_trainer.generate(query_tensors)
# 보상 계산
rewards = reward_model(query_tensors, response_tensors)
# PPO 업데이트
stats = ppo_trainer.step(query_tensors, response_tensors, rewards)
PPO의 핵심 아이디어:
– 기존 모델에서 너무 멀리 벗어나지 않도록 제약 (KL divergence)
– 보상을 최대화하되 안정적인 학습 보장
최신 대안: DPO (Direct Preference Optimization)
최근에는 DPO라는 더 간단한 방법이 주목받고 있습니다.
| 특징 | PPO | DPO |
|---|---|---|
| 보상 모델 | 필요 ✅ | 불필요 ❌ |
| 학습 안정성 | 복잡함 | 단순함 |
| 구현 난이도 | 높음 | 낮음 |
| 성능 | 우수 | 비슷하거나 더 좋음 |
from trl import DPOTrainer
# DPO는 선호도 데이터로 직접 학습
dpo_trainer = DPOTrainer(
model=model,
ref_model=ref_model, # 참조 모델
train_dataset=preference_dataset,
beta=0.1 # KL 페널티 강도
)
dpo_trainer.train()
DPO는 보상 모델 없이도 선호도 데이터를 직접 활용하여 모델을 정렬할 수 있어, 실무에서 점점 더 많이 사용되고 있습니다.
실무 활용 사례
ChatGPT의 RLHF
OpenAI는 다음과 같은 기준으로 RLHF를 적용했습니다:
– Helpful: 사용자 의도에 맞는 유용한 답변
– Harmless: 유해하지 않은 안전한 콘텐츠
– Honest: 사실에 기반한 정직한 응답
Claude의 Constitutional AI
Anthropic(Claude 개발사)은 Constitutional AI라는 변형된 RLHF를 사용합니다:
1. AI 피드백 활용: 인간 대신 AI가 1차 피드백 제공
2. 헌법 원칙: 명시적인 가치 기준(“헌법”) 정의
3. 확장성: 대규모 데이터 수집이 더 효율적
구현 시 주의사항
데이터 품질이 핵심입니다:
– 평가자 간 일관성 확보
– 다양한 도메인과 시나리오 커버
– 편향 최소화를 위한 신중한 설계
하이퍼파라미터 튜닝:
– KL 페널티 계수 조정 (너무 크면 학습 안 됨, 너무 작으면 불안정)
– Learning rate 세밀하게 조정
– Reward 스케일 정규화
평가 지표:
– 인간 평가 (가장 중요)
– Win rate (A/B 테스트)
– 자동화된 벤치마크 (MMLU, HumanEval 등)
마무리
RLHF는 현대 언어모델을 인간의 가치와 정렬시키는 핵심 기술입니다. SFT → Reward Model → PPO/DPO의 3단계 파이프라인을 통해 모델을 안전하고 유용하게 만들 수 있습니다.
핵심 요약:
1. SFT로 기본 품질 확보
2. Reward Model로 인간 선호도 학습
3. PPO/DPO로 최종 정렬
4. DPO는 더 간단한 최신 대안
5. 데이터 품질이 성공의 열쇠
Hugging Face의 TRL 라이브러리를 활용하면 비교적 쉽게 RLHF를 구현할 수 있으니, 직접 실험해보시기 바랍니다!
이 글이 도움이 되셨나요? ☕
Buy me a coffee
답글 남기기