2023-2024년 RLHF(Reinforcement Learning from Human Feedback)의 지형은 크게 두 가지로 나뉘었습니다:
- PPO (Proximal Policy Optimization): ‘정석’이지만 비용이 매우 많이 듭니다. 학습 안정성을 위해 Policy 모델과 동일한 크기의 Critic 모델(Value Network)을 로드해야 하며, 이는 메모리 점유율을 즉시 두 배로 높입니다(2x Parameters + Optimizer States). 70B 이상의 모델을 학습하려면 고가의 H100 클러스터가 필수적입니다. 또한
kl_coeff,clip_range와 같은 하이퍼파라미터 민감도가 높아 엔지니어의 피로도가 극심합니다. - DPO (Direct Preference Optimization): ‘효율적’인 대안입니다. RL 문제를 이진 분류(Preference Learning) 문제로 변환하여 Critic 모델을 제거했습니다. 그러나 2025년에 들어서며 DPO가 추론 집약적 작업(Reasoning/CoT)에서 명확한 한계를 보인다는 것이 증명되었습니다. DPO는 진정한 ‘탐색과 활용(Exploration & Exploitation)’보다는 ‘스타일 정렬’에 가깝습니다. 즉, DeepSeek-R1과 같은 고도의 추론 능력을 이끌어내기에는 부족합니다.
현재의 과제: RL의 강력한 ‘탐색’ 능력은 유지하면서(DeepSeek-R1 수준의 추론), PPO와 같은 막대한 메모리 비용이 들지 않는 알고리즘이 필요합니다.
해답은 Group-Based Policy Optimization 제품군: GRPO, DAPO, 그리고 GSPO입니다.
🏗️ 아키텍처 진화: Token 단위에서 Group 단위로
1. GRPO (Group Relative Policy Optimization)
출처: DeepSeek-Math / DeepSeek-R1 Paper
GRPO는 이 패러다임 전환의 초석입니다. 핵심 혁신은 Critic 모델을 완전히 제거한 것입니다.
작동 원리:
PPO처럼 Value Network를 통해 Baseline $V(s)$를 추정하는 대신, GRPO는 ‘그룹 통계’를 Baseline으로 사용합니다.
동일한 Prompt 에 대해 모델이 출력 그룹 (예: )을 생성합니다. 각 출력의 Advantage 함수는 그룹 내 정규화를 통해 계산됩니다.
핵심 장점:
- 메모리 절약: Policy 모델과 Reference 모델(KL 발산 계산용)만 로드하면 됩니다.
- 추론 최적화: 여러 경로를 샘플링함으로써 모델은 어떤 추론 단계가 더 나은지 스스로 학습합니다.
2. DAPO (Decoupled Clip & Dynamic Sampling)
GRPO가 메모리 문제를 해결했지만, 긴 사고 사슬(Long CoT) 학습 시 엔트로피 붕괴(Entropy Collapse) 현상이 발생할 수 있습니다. DAPO는 대규모 추론 학습을 위한 최적화 버전입니다.
핵심 개선 사항:
- Clip-Higher: 기존 PPO/GRPO는 업데이트 폭을 엄격히 제한(Clip)하지만, DAPO는 상한선을 완화하여 모델이 국소 최적해에 빠지지 않고 다양성을 유지하도록 합니다.
- Dynamic Sampling: 보상이 모두 같거나(모두 정답 혹은 오답) 변별력이 없는 샘플 그룹을 동적으로 필터링하여 학습 효율을 극대화합니다.
3. GSPO (Group Sequence Policy Optimization)
Qwen3-MoE나 DeepSeek-V3와 같은 MoE (Mixture of Experts) 아키텍처에서는 토큰 단위의 GRPO 업데이트가 라우팅의 희소성으로 인해 불안정할 수 있습니다.
핵심 로직:
GSPO는 최적화 단위를 토큰 레벨에서 시퀀스 레벨로 격상합니다.
이 방식은 초거대 모델 학습 시, 특히 MoE 모델의 Router가 붕괴되는 것을 방지하는 데 탁월한 성능을 보입니다.
📊 알고리즘 결정 매트릭스
| 특성 | PPO | DPO | GRPO | DAPO | GSPO |
|---|---|---|---|---|---|
| Critic 모델 | ✅ 필요 (고비용) | ❌ 불필요 | ❌ 불필요 | ❌ 불필요 | ❌ 불필요 |
| 주요 시나리오 | 일반 RLHF | 대화/스타일 정렬 | 수학/코드/추론 | 장문 추론 (CoT) | MoE/초거대 모델 |
| 메모리 점유 | 높음 | 낮음 | 낮음 | 낮음 | 낮음 |
| 구현 복잡도 | 매우 높음 | 낮음 | 중간 | 높음 | 높음 |
| 안정성 | 낮음 (민감) | 높음 | 중간 | 높음 | 매우 높음 |
💻 구현: TRL을 사용한 GRPO 적용
2025년 말 현재, Hugging Face의 trl 라이브러리는 GRPO를 기본적으로 지원합니다.
핵심 코드 구현 (GRPOTrainer)
from trl import GRPOTrainer, GRPOConfig
# 1. 보상 함수 정의 (Reward Functions)
def correctness_reward_func(prompts, completions, answer, **kwargs):
rewards = []
for completion, gold_answer in zip(completions, answer):
if str(gold_answer) in completion:
rewards.append(1.0)
else:
rewards.append(0.0)
return rewards
# 2. GRPO 설정
training_args = GRPOConfig(
output_dir="./grpo_model",
per_device_train_batch_size=4,
num_generations=8, # G: 그룹 사이즈
max_completion_length=1024,
beta=0.04, # KL 페널티 계수
fp16=True,
)
# 3. 트레이너 초기화 및 실행
trainer = GRPOTrainer(
model=model_id,
args=training_args,
train_dataset=dataset,
reward_funcs=[correctness_reward_func],
)
trainer.train()
🛠️ 실행 체크리스트
- 데이터 정제 (필수): GRPO는 탐색 중 우연히 정답을 맞히는 것에 의존합니다. 베이스 모델의 정답률이 0%라면 학습이 시작되지 않습니다. 반드시 고품질 CoT 데이터로 SFT를 선행하십시오.
- 보상 엔지니어링: 단순히 맞고 틀림(Outcome Reward)뿐만 아니라, 사고 과정의 형식이 맞는지(Process Reward)를 함께 설계하십시오.
- Group Size (): 메모리가 허용하는 한 를 크게 잡으십시오. 권장 범위는 8~64입니다.
🔚 결론
추론(Reasoning)과 코드 생성 영역에서 GRPO 및 그 변체(DAPO/GSPO)는 이미 PPO를 대체했습니다. 적은 메모리로 더 강력한 탐색 성능을 제공하는 이 알고리즘들은 현재 LLM 엔지니어링의 표준입니다.
