TT Lab
블로그

한국어 English 日本語 中文

시작하기
블로그

블로그

RL 은 골라내는가: 0.5B 모델로 재 본 GRPO 와 pass@k

상태: 초안 (2026-10-31), 실측. 모든 학습과 평가는 필자가 8GB 노트북 GPU 한 장에서 직접 돌렸습니다. 조건과 판정 기준은 결과를 보기 전에 적어 두었고, 학습 전에 두 번 바꾼 것(과제와 채점)은 이유와 함께 4절에 밝혔습니다. 논문 수치는 arXiv 원문에서 표·그림 번호와 함께 옮겼습니다. 작성 규칙: 실측 데이터가 기본이고, 못 잰 것은 「미실측」, 확인하지 못한 것은 「미확인」으로 표시합니다.

목차

1. 질문: RL 은 새 능력을 만드는가

2025년 초 DeepSeek-R1 이후, 「정답을 기계적으로 확인할 수 있는 문제」(수학, 코드)에서 강화학습으로 추론 모델을 만드는 방법이 표준이 되었습니다. 이것을 RLVR(검증 가능한 보상을 쓰는 RL)이라고 부릅니다. 모델이 답을 여러 개 내고, 맞은 답은 확률을 올리고 틀린 답은 내립니다.

그런데 이 과정이 모델에 없던 능력을 만드는지, 아니면 이미 가끔은 낼 수 있던 정답을 더 자주 내게 하는지는 다른 이야기입니다. 이 차이를 재는 도구가 pass@k 입니다.

RL 이 「골라내기」만 한다면 pass@1 은 오르지만 pass@k(큰 k)는 거의 그대로일 것입니다. 베이스 모델도 많이 뽑으면 결국 그 답을 내기 때문입니다. 새 능력을 만든다면 pass@k 도 올라야 합니다.

2. 논문들이 말하는 것

GRPO: 가치망 없이, 같은 문제의 답끼리 비교하기

DeepSeekMath(arXiv 2402.03300)가 제안한 GRPO 는 PPO 에서 가치망(critic)을 뺀 방법입니다. 한 문제에 답을 G 개 뽑고, 각 답의 보상에서 그룹 평균을 빼고 표준편차로 나눈 값을 그 답의 모든 토큰의 어드밴티지로 씁니다. 같은 문제의 다른 답들이 기준선 노릇을 하는 것입니다. 원 논문의 설정은 학습률 1e-6, KL 계수 0.04, 문제당 64개였습니다. 같은 논문 그림 7 에는 이미 「RL 은 Maj@K 는 올리지만 Pass@K 는 올리지 않는다」는 관찰이 있습니다.

Dr. GRPO(arXiv 2503.20783)는 GRPO 식의 두 나눗셈이 편향을 만든다고 지적했습니다. 답의 길이로 나누면 틀린 답은 길수록 벌을 덜 받아 오답이 길어지고, 그룹 표준편차로 나누면 너무 쉽거나 어려운 문제에 가중이 커집니다. 둘 다 빼고 상수로 나누자는 것이 Dr. GRPO 입니다. 이 실험은 Dr. GRPO 를 따릅니다.

pass@k 곡선의 교차(2504.13837)

Yue 외의 「Does Reinforcement Learning Really Incentivize Reasoning Capacity in LLMs Beyond the Base Model?」은 여러 모델·과제에서 k 를 수백–천까지 키워 pass@k 를 그렸습니다. k 가 작으면 RL 모델이 이기지만 k 가 커지면 베이스가 따라잡고 앞섭니다. RL 모델이 푸는 문제는 거의 베이스가 푸는 문제의 부분집합이었습니다. 측정 설정은 온도 0.6, top-p 0.95, 문제당 n 개(n = 곡선의 가장 큰 k)를 뽑아 불편 추정량 1 − C(n−c, k)/C(n, k) 로 계산하는 것이고, 이 글도 그대로 씁니다. 다만 같은 논문 표 4 를 보면 Qwen2.5-7B 의 MATH500 pass@256 은 베이스 96.2, GRPO 150 스텝 97.2, 300 스텝 96.0, 450 스텝 95.4 였습니다. 짧게 학습한 시점에는 상한이 오히려 조금 올랐고, 길게 학습할수록 내려갔습니다. 이번 실험처럼 짧은 학습에서는 상한이 오를 수도 있다는 뜻입니다.

RL 이 바꾸는 토큰은 1–4%(2605.06241)

2026년의 「Rethinking RL for LLM Reasoning: It's Sparse Policy Selection, Not Capability Learning」은 같은 질문을 토큰 단위로 봤습니다. RL 전후 모델의 탐욕 디코딩을 비교하면, RL 이 다른 토큰을 고르는 자리는 전체의 1–4% 이고, 그 자리에서 RL 모델이 고른 토큰은 거의 언제나 베이스 모델의 상위 5개 후보 안에 있었습니다(표 2, 평균 순위 약 2). 바뀐 자리는 베이스 모델이 망설이는(엔트로피가 높은) 결정 지점에 몰려 있었습니다. 이 관찰에서 저자들은 RL 없이 문제 50개와 오프라인 롤아웃만으로 결정 지점의 선택을 고치는 ReasonMaxxer 를 만들었고, 전체 RL 과 비슷한 성능을 냈다고 보고합니다(표 3). 원문을 읽을 때 조심할 점이 둘 있습니다. ReasonMaxxer 는 GRPO 가 아니라 어드밴티지로 가중한 오프라인 학습이고, 본문 3.1절의 「이동한 위치는 하나도 없다」는 문장이 표 2 의 0.01–0.12% 와 맞지 않습니다. 같은 논문 표 3 에서 Qwen3-0.6B 에 GRPO 를 한 결과는 MATH500 0.338 → 0.372 로 조금만 올랐습니다.

예제 하나로도(2504.20571)

1-shot RLVR 은 Qwen2.5-Math-1.5B 에 문제 하나를 복제해 RLVR 을 했더니 MATH500 이 36.0 에서 73.6 으로 올라, 그 문제가 들어 있는 1.2k 문제로 학습한 결과와 같았다고 보고합니다. 고르는 기준은 학습 중 정답률의 분산이 큰 문제였고, 베이스가 한 번도 못 푸는 문제나 라벨이 틀린 문제는 효과가 없었습니다. 저자들은 형식 보상만 준 기준선과 비교해 「형식을 고친 몫」을 따로 뺐는데, 작은 모델 실험에서 이 몫이 크다는 점이 이번 실험의 핵심 교훈과 이어집니다.

작은 모델에서는 다를 수 있다(2607.16097)

체스로 5M–1B 모델의 사전학습부터 RL 까지 훑은 「Understanding Reasoning from Pretraining to Post-Training」은, RL 이 고르게 날카롭게 하는 것이 아니라 정답 증폭·드문 정답 발견·오답 증폭이 섞인 재분배라고 봤습니다. 그리고 20M 모델에서는 RL 초반에 pass@16 도 빠르게 올랐습니다(그림 2). 작은 모델로 재현할 때 교차가 꼭 나온다고 기대하면 안 된다는 경고입니다.

3. 실험 설계

8GB 노트북 GPU 한 장으로 할 수 있는 크기로 줄였습니다.

손실의 핵심은 몇 줄입니다.

rs = np.array([score(t, p) for t, _ in outs])     # 그룹 8개의 보상(0 또는 1)
adv = rs - rs.mean()                              # Dr. GRPO: 표준편차로 나누지 않는다
...
logp, mask = completion_logprobs(model, tok, prompts, completions)   # 응답 토큰의 log π
loss = -(A * logp * mask).sum() / (16 * 8 * 384)  # 응답 길이로 나누지 않는다(상수)
loss.backward()

세 조건과 기준선

조건 학습 문제 걸음당 150 걸음 동안
많은 문제 4,000개를 섞어 한 번씩 서로 다른 16문제 2,400문제를 한 번씩
16문제 베이스 통과율이 0 과 1 사이인 문제 중 p(1−p) 가 큰 16개 같은 16문제 각 문제 150번
1문제 그중 첫째 하나를 16번 복제(1-shot RLVR 방식) 같은 1문제 2,400번
RL 없음 베이스 모델을 그대로 32번 뽑아 pass@k

16문제·1문제는 학습 문제 앞 128개를 베이스로 16번씩 풀게 해(온도 1.0) 통과율이 섞인 문제를 골랐습니다. 128개 가운데 31개가 0 과 1 사이였습니다. 2605.06241 의 「edge of competence」, 1-shot RLVR 의 「정답을 가끔 내는 문제」와 같은 생각입니다.

학습률: LoRA 로 GRPO 를 할 때의 학습률은 논문들에 근거가 없어서, 「많은 문제」 조건 30 걸음으로 {1e-5, 5e-5, 2e-4} 를 짧게 보고 마지막 10 걸음 평균 보상이 가장 높은 값을 세 조건에 같게 썼습니다. 결과는 1e-5: 0.38, 5e-5: 0.60, 2e-4: 0.00 이었습니다. 2e-4 에서는 정책이 무너져 모든 답이 384 토큰 끝까지 같은 말을 되풀이했습니다.

평가: 테스트 128문제마다 32개(온도 0.6, top-p 0.95), 불편 추정량으로 pass@1–32. 베이스와 각 조건의 75·150 걸음. 판정은 문제 단위 부트스트랩(2,000번)으로 (RL − 베이스) 차이의 95% 구간을 냈습니다. 미리 정한 기준은 「pass@1 이 오른다 = 구간 하한 > 0」, 「상한이 그대로 = pass@32 차이 구간이 0 을 포함하거나 차이가 pass@1 차이의 1/3 미만」입니다.

4. 학습 전에 바꾼 것 두 가지

결과를 보기 전에 정한 조건을 학습 전에 두 번 바꿨습니다. 둘 다 RL 을 한 걸음도 돌리기 전이었고, 바꾼 시각과 이유를 사전 등록 문서에 남겼습니다.

1. 과제: 카운트다운 → 산수. 처음 계획은 카운트다운(숫자 셋을 사칙연산으로 조합해 목표 수 만들기)이었습니다. 베이스 통과율을 재 보니 0.5B 모델은 32문제 × 16개에서 거의 한 번도 맞히지 못했습니다(pass@16 0–3%). 그룹 8개가 모두 0 이면 어드밴티지가 0 이라 GRPO 는 배울 신호가 없습니다(2609.25463 이 정리한 p^G + (1−p)^G). 그래서 산수로 바꿨습니다.

2. 채점을 둘로 나눔, 그리고 더 어려운 산수로. 두 자리 × 두 자리 − 세 자리 산수에서 베이스의 pass@1 은 0.10 이었는데, 답 형식을 무시하고 「응답의 마지막 정수」로 채점하면 0.62 였고 pass@32 는 1.0 이었습니다. 모델은 이미 계산을 할 줄 알았고, 못 하는 것은 <answer> 태그 형식이었습니다(형식 준수율 25%). 이 과제로는 「RL 이 능력의 상한을 올리는가」를 물을 수 없습니다(이미 1.0). 그래서 두 가지를 바꿨습니다.

과제 후보(문제 32 × 32개) 엄격 pass@1 엄격 pass@32 느슨 pass@1 느슨 pass@32 형식 준수율
두 자리 × 두 자리 − 세 자리 0.097 0.875 0.623 1.000 24.5%
세 자리 × 두 자리 − 세 자리 0.010 0.281 0.179 0.812 16.3%
두 자리 넷: a×b − c×d 0.021 0.438 0.436 0.969 11.6%
세 자리 × 세 자리 − 네 자리 0.004 0.094 0.098 0.594 11.6%

그 밖에, 모델 파일의 generation_config.json 에 반복 벌점 1.1 이 들어 있어 샘플링에 끼어들고 있던 것을 학습 전에 찾아 1.0 으로 고정했습니다. RL 의 기울기 식은 표본이 정책 그대로라는 가정 위에 있어서, 숨은 샘플링 설정은 결과를 조용히 바꿉니다. 메모리 한도 때문에 파드가 두 번 죽은 일도 있었지만 조건과는 무관합니다.

5. 결과

학습 곡선

학습 중 보상(정답 비율, 5스텝 이동 평균) 스텝마다 문제 16개 × 응답 8개, 온도 1.0, 실측 0 0.2 0.4 0.6 0.8 1 1 25 50 75 100 125 150 GRPO 스텝 평균 보상 16문제 1문제 많은 문제
그림: 학습 중 보상
조건 처음 10걸음 평균 보상 마지막 10걸음 응답 길이(처음 → 끝) 걸음당 시간
많은 문제 0.17 0.68 131 → 173 토큰 8.4초
16문제 0.63 1.00 118 → 384(최대) 10.7초
1문제 0.80 1.00 76 → 62 3.5초

16문제·1문제는 50걸음 안에 학습 문제를 모두 맞혔습니다. 그 뒤로는 그룹 8개가 모두 1 이라 어드밴티지가 0, 곧 더 배울 신호가 없었습니다.

pass@k: 두 가지 채점으로

pass@k, 느슨한 채점(마지막 정수) 0.5B 지시 모델, 테스트 128문제 × 32개, 온도 0.6, 따로 적지 않으면 150걸음, 실측 0 0.2 0.4 0.6 0.8 1 1 2 4 8 16 32 k(뽑는 개수, 로그 눈금) pass@k 베이스 많은 문제 75걸음 많은 문제 1문제 16문제
그림: pass@k 느슨한 채점
pass@k, 엄격 채점(태그 안의 답) 0.5B 지시 모델, 테스트 128문제 × 32개, 온도 0.6, 따로 적지 않으면 150걸음, 실측 0 0.2 0.4 0.6 0.8 1 1 2 4 8 16 32 k(뽑는 개수, 로그 눈금) pass@k 많은 문제 75걸음 많은 문제 1문제 베이스 16문제
그림: pass@k 엄격한 채점
모델 채점 pass@1 pass@4 pass@32 형식 준수율
베이스 엄격 0.019 0.066 0.258 16.2%
베이스 느슨 0.248 0.466 0.836
많은 문제 75걸음 둘 다 같음 0.660 0.741 0.805 100%
많은 문제 150걸음 둘 다 같음 0.610 0.642 0.680 100%
16문제 150걸음 둘 다 같음 0.141 0.166 0.195 100%
1문제 150걸음 둘 다 같음 0.182 0.231 0.297 99.9%

RL 뒤의 모델은 모두 형식을 거의 100% 지켜서 엄격한 채점과 느슨한 채점이 같아졌습니다. 차이가 나는 것은 베이스뿐입니다.

미리 정한 판정(문제 단위 부트스트랩, 95% 구간)

모델 채점 Δpass@1 Δpass@32 판정
많은 문제 75 느슨 +0.412 [+0.341, +0.484] −0.031 [−0.109, +0.047] pass@1 오름, 상한 그대로
많은 문제 150 느슨 +0.361 [+0.269, +0.447] −0.156 [−0.250, −0.055] pass@1 오름, 상한 내려감
16문제 150 느슨 −0.107 [−0.154, −0.060] −0.641 [−0.727, −0.547] pass@1 내려감
1문제 150 느슨 −0.067 [−0.116, −0.019] −0.539 [−0.625, −0.453] pass@1 내려감
많은 문제 75 엄격 +0.641 [+0.567, +0.709] +0.547 [+0.445, +0.641] 둘 다 오름
16문제 150 엄격 +0.122 [+0.072, +0.175] −0.062 [−0.133, +0.016] pass@1 오름
1문제 150 엄격 +0.163 [+0.110, +0.223] +0.039 [−0.031, +0.109] pass@1 오름

느슨한 채점에서 「32개 중 하나라도 맞힌 문제」의 수(커버리지)는 베이스 107개에서 많은 문제 75걸음 103개(RL 에서만 푼 문제 12, 베이스에서만 푼 문제 16), 150걸음 87개(12 / 32)로 줄었습니다. 16문제는 25개, 1문제는 38개였습니다.

같은 문제를 어떻게 푸나

테스트 첫 문제 413 * 41 - 882(정답 16051)에 대한 응답입니다(150걸음, 온도 0.6, 32개 중 첫째, 줄바꿈은 / 로 표시).

6. 해석

1. 많은 문제로 한 GRPO 는 「골라냈다」. 계산 능력으로 본 pass@1 은 0.25 에서 0.66 으로 크게 올랐지만, 32번 뽑았을 때 하나라도 맞힐 확률(pass@32)은 0.84 에서 0.81 로 통계적으로 같았습니다. k 를 키우면 베이스가 따라잡아, 75걸음 모델은 k=16 과 32 사이에서, 150걸음 모델은 k=8 과 16 사이에서 베이스에 추월당했습니다(그림). Yue 외의 교차가 0.5B 모델·산수 과제에서도 나왔습니다. 학습을 150걸음까지 늘리자 pass@32 는 0.68 로 유의하게 내려갔고 커버리지도 107 → 87 문제로 줄었습니다. 같은 논문 표 4 의 「길게 학습할수록 pass@256 이 내려간다」와 같은 방향입니다. 무엇을 골랐는지도 응답에서 보입니다. 곱셈을 (40 + 1) 로 쪼개는, 베이스 분포 안에 이미 있던 풀이입니다. 2605.06241 이 말한 「베이스 상위 후보 가운데 결정 지점의 선택을 바꾼다」는 그림과 맞습니다(토큰 단위 분석은 미실측).

2. 엄격한 채점만 봤다면 결론이 달랐다. 엄격한 채점에서는 세 조건 모두 pass@1 이 올랐고, 많은 문제 조건은 pass@32 까지 0.26 → 0.81 로 크게 올랐습니다. 「RL 이 상한을 올렸다」고 읽을 수 있는 숫자입니다. 하지만 그 대부분은 <answer> 태그를 쓰게 된 몫이었습니다. 베이스의 형식 준수율은 16% 였고 RL 뒤에는 100% 였습니다. 1-shot RLVR 이 「형식 보상 기준선」을 따로 두고, Dr. GRPO 가 템플릿 문제를 짚은 까닭이 이것입니다. 작은 모델일수록 형식이 차지하는 몫이 큽니다.

3. 적은 문제로 한 GRPO 는 이 설정에서 실패했다. 16문제·1문제는 형식은 배웠지만(엄격 pass@1 +0.12·+0.16) 계산 능력은 오히려 떨어졌고(느슨 pass@1 −0.11·−0.07), 다양성이 무너져 pass@32 가 0.20·0.30 까지 내려갔습니다. 학습 문제를 50걸음 안에 다 맞힌 뒤에는 보상이 모두 1 이라 신호가 없었고, 그 사이에 「곱셈을 한 줄로 하는」 짧은 풀이나 「답 뒤에 태그를 되풀이하는」 버릇에 갇혔습니다. 2605.06241 의 「문제 수십 개로 충분하다」와 1-shot RLVR 의 결과를 반박하는 것은 아닙니다. 조건이 다릅니다.

결국 이 작은 실험이 보여 준 것은 「적은 문제로 RL 을 하려면 정책이 베이스에서 멀어지지 않게 묶는 장치가 필요해 보인다」입니다. 이것은 다음 실험의 가설이고 아직 미실측입니다.

7. 한계

원자료와 참고 문헌

로그인하면 좋아요를 누를 수 있습니다

댓글

아직 댓글이 없습니다.

로그인하면 댓글을 쓸 수 있습니다