본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
Group Relative Policy Optimization, GRPO; GRPO
같은 질문에 대해 응답을 여러 개 생성하고, 그 묶음 안의 상대적 보상을 어드밴티지로 써서 가치 모델 없이 언어 모델을 강화 학습하는 PPO 변형

GRPO(Group Relative Policy Optimization)는 딥시크가 2024년 2월 DeepSeekMath 논문에서 제안한 강화 학습 알고리즘이다.[1] PPO는 어드밴티지를 계산하려고 정책만 한 크기의 가치 모델(크리틱)을 따로 학습하는데, GRPO는 질문 하나에 응답 G개를 뽑아 그 보상의 평균을 기준선으로 삼아 가치 모델을 없앴다. 메모리와 계산이 줄고, 보상이 응답 끝에 한 번만 주어지는 언어 모델 환경에서 토큰마다 정확한 가치를 추정해야 하는 어려움도 피한다.

2025년 1월 DeepSeek-R1 논문에서 R1-Zero와 R1의 강화 학습에 쓰이면서 추론 모델 학습의 대표 알고리즘이 되었고,[2] 그 뒤 손실 정규화와 클리핑을 고친 Dr. GRPO, DAPO, GSPO 같은 변형이 이어졌다. 딥시크 모델 안에서의 위치는 딥시크 문서, 정답 확인 보상과의 결합은 검증 가능한 보상 강화 학습 문서를 참고한다.

질문 q마다 이전 정책 πθold로 응답 묶음 {o1,…,oG}를 뽑고 다음 목적 함수를 최대화한다.[1]

𝒥GRPO(θ)=𝔼[1G∑i=1G1|oi|∑t=1|oi|{min⁡(ρi,tA^i,t,clip⁡(ρi,t,1−ϵ,1+ϵ)A^i,t)−β𝔻KL[πθ‖πref]}]

ρi,t=πθ(oi,t∣q,oi,<t)πθold(oi,t∣q,oi,<t)

클리핑 부분은 PPO와 같다. 다른 점은 두 가지다.

  • 어드밴티지: 가치 모델 대신 묶음 안의 상대 보상을 쓴다.
  • KL 항: PPO 기반 RLHF는 참조 모델과의 KL 벌점을 토큰별 보상에 섞지만, GRPO는 KL을 손실에 직접 더해 어드밴티지 계산을 단순하게 유지한다.

그룹 상대 어드밴티지

편집 원본 편집

결과 보상(outcome supervision)만 있을 때, 응답 i의 보상 ri를 묶음의 평균과 표준편차로 정규화한 값을 그 응답의 모든 토큰에 같은 어드밴티지로 준다.[1]

A^i,t=r~i=ri−mean⁡({r1,…,rG})std⁡({r1,…,rG})

보상 모델이 보통 같은 질문에 대한 응답 간 비교로 학습된다는 점과 잘 맞는다. 묶음 안 모든 응답의 보상이 같으면(모두 정답이거나 모두 오답) 어드밴티지가 0이 되어 그 질문은 학습 신호를 주지 않는다.

과정 보상 모델로 단계마다 보상을 받는 과정 감독(process supervision) 버전도 있다. 단계 보상을 묶음 전체에서 정규화하고, 각 토큰의 어드밴티지를 그 토큰 이후 단계들의 정규화 보상 합으로 둔다. DeepSeekMath 실험에서는 과정 감독이 결과 감독보다 나았다.[1]

KL은 다음 추정량으로 토큰마다 계산한다. 슐먼이 정리한 k3 추정량으로, 항상 0 이상이고 편향이 없다.[1][3]

𝔻KL[πθ‖πref]=πref(oi,t∣q,oi,<t)πθ(oi,t∣q,oi,<t)−log⁡πref(oi,t∣q,oi,<t)πθ(oi,t∣q,oi,<t)−1

  1. 질문 배치를 뽑고 πθold←πθ로 둔다.
  2. 질문마다 응답 G개를 생성한다.
  3. 보상 함수나 보상 모델로 각 응답을 채점한다.
  4. 묶음별로 보상을 정규화해 어드밴티지를 구한다.
  5. 같은 생성 결과로 μ번 정책을 갱신한다. μ=1이면 확률비가 항상 1이라 클리핑이 작동하지 않고, 목적 함수는 어드밴티지 가중 정책 경사가 된다.
  6. 반복 학습(iterative GRPO)에서는 정책의 새 응답으로 보상 모델을 계속 학습하고(과거 데이터 10%를 재생), 참조 모델을 현재 정책으로 바꾼다.[1]

어드밴티지 계산 부분이다(PyTorch 2.5에서 실행 확인).

import torch

def grpo_advantages(rewards, group_size, scale=True, eps=1e-4):
    """rewards: [B*G] (프롬프트마다 G개 응답이 연속으로 놓임)."""
    r = rewards.view(-1, group_size)
    mean = r.mean(dim=1, keepdim=True)
    adv = r - mean
    if scale:                                        # Dr. GRPO는 scale=False
        adv = adv / (r.std(dim=1, keepdim=True) + eps)
    return adv.view(-1)                              # 응답의 모든 토큰에 같은 값을 쓴다

# 첫 프롬프트는 4개 중 2개 정답, 둘째 프롬프트는 4개 모두 정답
print(grpo_advantages(torch.tensor([1., 0., 0., 1., 1., 1., 1., 1.]), 4))
# tensor([ 0.8659, -0.8659, -0.8659,  0.8659,  0.0000,  0.0000,  0.0000,  0.0000])
항목 PPO(RLHF) GRPO
메모리에 올리는 모델 정책, 가치, 보상, 참조 정책, 참조(KL을 쓸 때), 보상 모델(보상 함수면 불필요)
기준선 학습된 가치 함수 V(st) 같은 질문 응답 묶음의 평균 보상
어드밴티지 GAE로 토큰마다 다름 결과 감독이면 응답 안 모든 토큰이 같음
KL 처리 토큰별 보상에 벌점으로 포함 손실에 직접 더함
질문당 생성 수 보통 1개 G개(예: 8, 16, 64)
주 비용 가치 모델 학습과 메모리 생성(롤아웃) 시간
항목 DeepSeekMath-RL 7B[1] DeepSeek-R1-Zero[2]
시작 모델 DeepSeekMath-Instruct 7B DeepSeek-V3-Base
보상 학습된 보상 모델 규칙 기반(정답 + 형식), 신경망 보상 모델 미사용
학습률 10−6 3×10−6
KL 계수 β 0.04 0.001
질문당 응답 G 64 16
최대 길이 1,024 32,768(8.2천 단계 이후 65,536)
배치 1,024 질문 32개 × 16 = 512
갱신 탐색마다 1회 롤아웃 8,192개를 미니배치 16개로 나눠 1에포크. 400단계마다 참조 모델 교체
결과 GSM8K 82.9%→88.2%, MATH 46.8%→51.7% AIME 2024 pass@1 15.6%→77.9%, 자기 일관성 86.7%

DeepSeekMath는 데이터가 GSM8K와 MATH 관련 질문 약 14만 4천 개뿐이었는데도 영역 밖 수학 시험에서 성능이 올랐다. 다만 강화 학습 뒤 Maj@K(다수결)는 올랐지만 Pass@K(K번 중 한 번이라도 정답)는 오르지 않아, 논문은 강화 학습이 새 능력을 만들기보다 출력 분포를 더 안정적으로 만든다고 해석했다.[1] R1-Zero는 신경망 보상 모델이 대규모 강화 학습에서 보상 해킹에 취약하고 재학습 비용이 든다는 이유로 추론 과제에 규칙 기반 보상만 썼다.[2]

허깅 페이스 TRL v1.16.0(2026년 10월) 기준이다. 보상 함수는 prompts, completions, 데이터셋의 다른 열 이름을 키워드 인자로 받아 응답별 실수 목록을 돌려주면 된다.[4]

# pip install "trl[vllm]==1.16.0" math-verify
from datasets import load_dataset
from trl import GRPOConfig, GRPOTrainer
from trl.rewards import accuracy_reward      # math-verify로 \boxed{} 답을 solution과 비교

dataset = load_dataset("trl-lib/DeepMath-103K", split="train")   # prompt, solution 열

def length_penalty(completion_ids, **kwargs):
    """직접 만든 보상 함수 예: 2,000토큰을 넘는 응답에 벌점."""
    return [-1.0 if len(ids) > 2000 else 0.0 for ids in completion_ids]

args = GRPOConfig(
    output_dir="qwen2.5-0.5b-grpo",
    num_generations=8,        # 질문당 응답 수 G
    beta=0.0,                 # KL 계수. 0이면 참조 모델을 올리지 않는다
    epsilon=0.2,              # 클리핑 범위
    loss_type="dapo",         # "grpo", "dr_grpo", "dapo" 등
    scale_rewards="group",    # 묶음 표준편차로 나눔. False면 Dr. GRPO 방식
    use_vllm=True,            # 생성은 vLLM으로
)
trainer = GRPOTrainer(
    model="Qwen/Qwen2.5-0.5B-Instruct",
    reward_funcs=[accuracy_reward, length_penalty],   # 여러 보상은 가중 합산(reward_weights)
    args=args,
    train_dataset=dataset,
)
trainer.train()

TRL의 기본값은 원 논문과 다르다. beta 기본값은 0.0으로 KL 항을 쓰지 않는데, 최근 연구들에서 GRPO에 KL 항이 필수가 아니라는 결과가 나왔기 때문이라고 문서는 설명한다. 손실 정규화 기본값도 원 논문 방식("grpo")이 아니라 "dapo"다.[4][5] 학습 중에는 frac_reward_zero_std(묶음 보상의 표준편차가 0인 비율)를 보는 것이 좋다. 이 값이 크면 대부분의 질문이 너무 쉽거나 어려워 학습 신호가 없다는 뜻이다.

원래 GRPO의 정규화와 클리핑에 편향이 있다는 지적이 나오면서 여러 변형이 제안되었다.

변형 바꾼 점 근거
Dr. GRPO[6] 응답 길이 |oi|로 나누지 않고 상수(최대 생성 길이)로 나눔. 묶음 표준편차로도 나누지 않음 길이로 나누면 틀린 응답이 길수록 벌점이 희석되어 응답이 불필요하게 길어지고, 표준편차로 나누면 질문 난이도에 따라 가중치가 왜곡된다
DAPO[7] 비대칭 클리핑(ϵlow=0.2, ϵhigh=0.28), 전부 정답이나 전부 오답인 질문을 걸러내는 동적 표본 추출, 토큰 단위 손실 평균, 너무 긴 응답의 보상 조정, KL 항 제거 엔트로피 붕괴와 기울기 소실을 막음. Qwen2.5-32B 기반 모델로 AIME 2024 50점, DeepSeek-R1-Zero-Qwen-32B의 47점을 학습 단계 절반으로 넘음
GSPO[8] 토큰 단위 확률비 대신 시퀀스 가능도로 정의한 확률비로 시퀀스 단위 클리핑 알리바바 Qwen 팀 제안. 전문가 혼합(MoE) 모델의 강화 학습을 안정시켰고 Qwen3 학습에 쓰였다고 밝힘

TRL은 loss_type("grpo", "dr_grpo", "dapo", "sapo" 등), scale_rewards, epsilon_high, importance_sampling_level="sequence"(GSPO) 같은 설정으로 이들 변형을 지원한다.[4]

  • 생성 비용: 질문마다 응답을 여러 개, 추론 모델이면 수만 토큰씩 생성해야 해서 학습 시간의 대부분이 생성에 들어간다. 그래서 학습 프레임워크는 vLLM 같은 추론 엔진을 붙인다. 이때 생성 엔진과 학습 코드의 로그 확률이 미세하게 달라지는 문제가 생겨, TRL은 vLLM 생성 시 절단 중요도 표본 추출(Truncated Importance Sampling) 보정을 기본으로 켠다.[4]
  • 희소한 신호: 결과 보상이 0과 1뿐이면 묶음 전체가 같은 점수일 때 신호가 없다. 난이도 조절과 동적 표본 추출이 필요하다.
  • 보상 설계 의존: 기준선이 상대 비교일 뿐이므로 보상의 허점은 그대로 학습된다. 무작위 보상으로도 Qwen2.5-Math의 MATH-500 성능이 오른다는 연구는 클리핑 편향이 사전 학습에서 익힌 행동을 증폭할 수 있음을 보였다.[9]
  1. ↑ 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 Zhihong Shao 외, 〈DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models〉, 2024. arXiv:2402.03300
  2. ↑ 2.0 2.1 2.2 DeepSeek-AI, 〈DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning〉, 2025. 《네이처》 645권 633~638쪽에 게재. arXiv:2501.12948
  3. ↑ John Schulman, Approximating KL Divergence, 2020.
  4. ↑ 4.0 4.1 4.2 4.3 GRPO Trainer, 허깅 페이스 TRL 문서(v1.16.0 원문 grpo_trainer.md).
  5. ↑ trl/trainer/grpo_config.py, 허깅 페이스 TRL v1.16.0.
  6. ↑ Zichen Liu 외, 〈Understanding R1-Zero-Like Training: A Critical Perspective〉, 2025. arXiv:2503.20783
  7. ↑ Qiying Yu 외, 〈DAPO: An Open-Source LLM Reinforcement Learning System at Scale〉, 2025. arXiv:2503.14476
  8. ↑ Chujie Zheng 외, 〈Group Sequence Policy Optimization〉, 2025. arXiv:2507.18071
  9. ↑ Rulin Shao 외, 〈Spurious Rewards: Rethinking Training Signals in RLVR〉, 2025. arXiv:2506.10947