같은 2025년 3월, 다른 팀은 수천 스텝짜리 긴 사고 학습에서 다른 증상을 봤다. 학습이 진행될수록 정책(답을 내는 모델)의 엔트로피(다음 토큰을 얼마나 고르게 나눠 고르는가 — 한 토큰만 고르면 0)가 무너지고, 배치의 상당수가 아무것도 가르치지 않았다. 그대로 GRPO를 돌린 Qwen2.5-32B는 AIME 2024에서 30점에 머물렀는데, DeepSeek가 같은 크기 모델로 보고한 47점에 한참 못 미쳤다. 원인은 목적함수의 어느 부품에 있었을까?
DAPO(Yu et al., “DAPO: An Open-Source LLM Reinforcement Learning System at Scale”, arXiv:2503.14476, 2025년 3월, ByteDance Seed·칭화대. 이름은 Decoupled Clip and Dynamic sAmpling Policy Optimization, 곧 「상한과 하한을 따로 자르고 동적으로 샘플링하는 정책 최적화」의 줄임)는 대규모 긴 사고(long-CoT) 학습에서 GRPO를 고친 네 가지를 한꺼번에 제시하고 코드까지 공개했다.
1. Clip-Higher — 클리핑 상한을 따로 높인다. GRPO 목적함수에서 비율 r을 [1−ε,1+ε] 로 자르는 부분이다. PPO의 대칭 클리핑은 확률이 낮은 토큰에게 불리하다. 비율로 자르기 때문에, DAPO 논문이 든 예로 확률 0.01인 토큰은 한 라운드에 0.012까지밖에 못 오르고 0.9인 토큰은 1까지 오를 수 있다. 탐색에 필요한 "지금은 드물지만 좋은 토큰"이 자라지 못하고, 정책의 엔트로피가 급격히 무너진다. DAPO는 하한과 상한을 분리해 εlow=0.2, εhigh=0.28로 두었다. 하한은 올리지 않았다. 하한을 넓히면 드문 토큰의 확률이 0까지 눌려 뽑을 수 있는 답의 폭이 오히려 무너지기 때문이다.
2. 동적 샘플링 — 시그널 없는 그룹을 버리고 다시 뽑는다. 모두 맞히거나 모두 틀린 그룹은 어드밴티지가 0이다. 이런 그룹이 배치에 섞이면 실질 배치 크기가 줄어 그래디언트가 흔들린다. DAPO는 정답률이 정확히 0 또는 1인 그룹을 빼고, 배치가 찰 때까지 더 뽑는다.
3. 토큰 단위 손실 — 응답이 아니라 토큰으로 평균낸다.G1∑i∣oi∣1∑t 대신 ∑i∣oi∣1∑i∑t. 모든 토큰이 같은 무게를 가지므로 응답마다 자기 길이로 나눌 때 생기던 길이 편향이 사라진다. 아래 위젯은 (a) 절 「두 개의 나누기」에 있던 것과 같다. 짧은 정답·긴 정답·짧은 오답·긴 오답으로 된 그룹에서 "GRPO"와 "DAPO"를 번갈아 눌러 보라.
4. 과도한 길이 처리. 최대 길이에서 잘린 응답은 "틀려서"가 아니라 “잘려서” 보상 0을 받는다. 이 잡음을 막으려 잘린 샘플의 손실을 가리고(overlong filtering), 최대 길이 근처에 부드러운 길이 벌점을 준다(최대 생성 길이 20,480 토큰 가운데 마지막 4,096 토큰 구간에서 0부터 −1까지 선형으로).
그리고 KL 항을 뺐다. 논문의 근거는 "긴 사고 학습에서는 모델 분포가 초기 모델에서 크게 벗어날 수 있고, 따라서 이 제약이 필요하지 않다"는 것이다.
결과: Qwen2.5-32B 베이스 모델(프리트레인만 마친 모델)에서 AIME 2024 50점. DeepSeek-R1-Zero-Qwen-32B의 47점을 절반의 학습 스텝으로 넘었다. 기법을 하나씩 더한 효과가 특히 교육적이다.
구성
AIME 2024
순수 GRPO
30
+ 잘린 샘플 가리기
36
+ Clip-Higher
38
+ 부드러운 길이 벌점
41
+ 토큰 단위 손실
42
+ 동적 샘플링
50
문제 3 — 반려된 과제는 다시 반려될 수 있다
조교가 과제를 받으면 40%를 형식 미비로 반려하고, 반려된 학생은 다시 낸다. 다시 낸 과제도 똑같이 40%가 반려된다. 30명 모두의 과제가 통과될 때까지 조교가 받게 될 과제는 평균 몇 편인가?
김민준
30명의 40%면 12명이 반려되니까 12편 더 받아서 30 + 12 = 42편이요.
선생님
민준 학생, 다시 낸 12편은 전부 통과되나요?
김민준
아니요, 그것도 40%는 또 빠지죠. 채운 것도 또 빠지는구나.
이서연
30 × (1 + 0.4 + 0.4² + …) = 30 / 0.6 = 50편. 등비급수야. 한 번에 생각하면, 받은 것 가운데 60%만 남으니까 30편을 남기려면 30/0.6편을 받아야 하는 거고.
김민준
재제출도 채점 대상이라는 걸 까먹었네요. 조교님 일이 42편이 아니라 50편이었어요.
정리 평균 30/0.6=50편. 다시 낸 과제도 같은 비율로 반려되므로 받은 것 가운데 남는 비율(0.6)로 나눈다.
문제 4 — 동적 샘플링의 비용
배치에 프롬프트 512개를 넣었는데 30%는 모두 정답, 10%는 모두 오답이었다. (가) 시그널을 주는 프롬프트는 몇 개인가? (나) DAPO처럼 512개를 모두 시그널 있는 프롬프트로 채우려면 평균적으로 몇 개의 프롬프트를 뽑아야 하는가? (다) 학습이 진행되어 모두 정답인 프롬프트가 70%, 모두 오답인 프롬프트가 5%가 되었다. 512개를 채우는 데 드는 생성 비용은 (나)의 몇 배가 되는가?
빠지는 비율이 아니라 남는 비율로 나누잖아. 남는 게 25%니까 512/0.25 = 2048개. 853개의 2.4배야.
선생님
남는 비율이 0에 가까워지면요?
김민준
비용이 한없이 커지네요. 학습이 잘될수록 다 맞히는 문제가 늘어나니까, 동적 샘플링은 학습이 잘될수록 비싸지는 거고.
선생님
그래요. 그래서 큰 레시피들은 너무 쉬워진 문제를 아예 빼 두거나, 뽑는 방식을 더 효율적으로 바꿔요(Olmo 3의 “능동 샘플링”). 그런데도 DAPO의 표에서 동적 샘플링이 가장 큰 향상(42 → 50)을 줬죠. 배치가 들쭉날쭉하면 그래디언트 크기도 들쭉날쭉해지니까요.
이서연
확률 시간에 배운 기하분포네. 성공 확률이 p면 한 번 성공할 때까지 평균 1/p번 해야 하니까, p가 작아지면 1/p가 확 커지는 거고.
정리 (가) 약 307개. (나) 채운 프롬프트도 다시 40%가 빠지므로 평균 512/0.6≈853개(생성 비용 약 1.7배). (다) 남는 비율이 0.25이므로 512/0.25=2048개, (나)의 2.4배. 비용은 빠지는 비율에 비례하지 않고 남는 비율의 역수로 자라므로, 쉬운 문제가 늘어나는 학습 후반에 급격히 비싸진다. 그래도 실질 배치 크기가 일정해지는 이득이 커서 DAPO에서 가장 효과가 큰 기법이었다.
문제 5 — 남의 응답이 길어지면
그룹 G=4의 응답 길이가 50(정답), 500(정답), 50(오답), 500(오답) 토큰이고 A^는 차례로 +1,+1,−1,−1이다. (가) DAPO의 토큰 단위 손실에서 각 토큰이 받는 가중치를 구하시오. (나) 긴 오답 하나가 4,000토큰으로 늘어났다(A^는 그대로). 짧은 정답의 토큰 하나가 받는 가중치는 GRPO, DAPO, Dr. GRPO(최대 생성 길이 4,096으로 나눔)에서 각각 어떻게 되는가? (이 문제에서 DAPO의 분모는 이 그룹 하나의 토큰 수로 본다.)
이서연
(가)는 네 응답의 토큰을 모두 더한 Σ|o| = 50 + 500 + 50 + 500 = 1100으로 다 똑같이 나누니까, 정답 토큰은 +1/1100, 오답 토큰은 −1/1100. 길이와 상관없이 같아.
김민준
(나)도 쉽네요. DAPO는 길이 편향을 없앴으니까 짧은 정답은 그대로 1/1100이요.
선생님
분모를 다시 세어 볼까요?
김민준
50 + 500 + 50 + 4000 = 4600.
김민준
1/4600이네요. 남의 응답이 길어졌는데 내 가중치가 4배 넘게 줄었어요.
이서연
GRPO는 자기 길이로만 나누니까 1/(4 × 50) = 0.005 그대로고, Dr. GRPO는 상수 4 × 4096으로 나누니까 그대로. DAPO만 그룹 안 응답들이 서로 묶여 있어.
선생님
그래요. DAPO는 한 그룹 안에서는 모든 토큰을 공평하게 대하지만, 나누는 수가 그때그때의 토큰 총수라서 긴 응답 하나가 끼면 그 스텝의 다른 토큰들도 모두 작아져요. 실제 구현은 배치 전체의 토큰 수로 나누니 이 묶임이 배치 전체에 걸리고요. Dr. GRPO가 고정된 상수로 나눈 것은 이것까지 막는 선택이었어요.
김민준
조별 과제 점수를 조원 전체가 쓴 페이지 수로 나눠 매기면, 한 명이 100쪽을 써 오는 순간 나머지 조원 점수가 다 줄어드는 거랑 같네요.
정리 (가) 정답 토큰 +1/1100, 오답 토큰 −1/1100. 길이와 상관없이 같다. (나) GRPO 0.005, Dr. GRPO 1/(4×4096)으로 그대로이고, DAPO만 1/1100→1/4600으로 약 4.2배 작아진다. DAPO는 길이 편향을 없애는 대신 같은 그룹(구현에서는 배치) 안 응답들의 가중치를 서로 묶는다.