18. GRPO의 변종들 — 부품을 하나씩 의심하다

(c) 비율의 단위: GSPO와 GMPO

보상은 응답 하나에 하나인데, 확률 비율은 토큰마다 하나씩 계산한다. 응답 단위로 받은 점수에 토큰 단위의 보정값을 곱해도 괜찮을까? 짧은 응답에서는 문제가 잘 드러나지 않는다. 수천 토큰짜리 응답에서는, 그리고 토큰마다 다른 전문가 층을 쓰는 모델에서는 어떨까?

GSPO(Zheng et al., “Group Sequence Policy Optimization”, arXiv:2507.18071, 2025년 7월, Qwen 팀)는 이 불일치를 문제 삼았다. 토큰 비율은 토큰 하나의 샘플로 만든 분산 큰 보정값이고, 긴 응답에서는 이 잡음이 쌓여 학습이 되돌릴 수 없이 붕괴할 수 있다. 논문이 세운 원칙은 「최적화의 단위는 보상의 단위와 같아야 한다」였다.

그렇다면 비율도 응답 하나에 하나로 만들면 된다. 가장 먼저 떠오르는 것은 토큰 비율을 모두 곱한 응답 전체의 확률 비율이다. 그런데 토큰마다 비율이 1.01씩만 어긋나도 곱은 100토큰이면 1.01100≈2.71.01^{100} \approx 2.7, 1,000토큰이면 약 2만 1천이 된다. 응답이 길수록 비율이 폭발한다. 처방은 곱 대신 기하평균, 곧 곱의 1/∣oi∣1/\textcolor{#915a08}{|o_i|} 제곱을 쓰는 것이다. 같은 예에서 기하평균은 길이와 상관없이 1.01이다.

si(θ)=(πθ(oi∣q)πold(oi∣q))1/∣oi∣=exp⁡ ⁣(1∣oi∣∑tlog⁡ri,t),J=E[1G∑imin⁡(siA^i, clip(si,1−ε,1+ε)A^i)]\textcolor{#c2185b}{s_i(\theta)} = \left(\frac{\textcolor{#1565c0}{\pi_\theta}(\textcolor{#1c9c60}{o_i} \mid \textcolor{#0093b8}{q})}{\textcolor{#6f6f78}{\pi_\text{old}}(\textcolor{#1c9c60}{o_i} \mid \textcolor{#0093b8}{q})}\right)^{1/\textcolor{#915a08}{|o_i|}} = \exp\!\Big(\frac{1}{\textcolor{#915a08}{|o_i|}}\sum_t \log \textcolor{#c2185b}{r_{i,t}}\Big), \qquad \textcolor{#d62728}{J} = \mathbb{E}\Big[\frac{1}{\textcolor{#5f970c}{G}}\sum_i \min\big(\textcolor{#c2185b}{s_i} \textcolor{#8e44ad}{\hat A_i},\ \text{clip}(\textcolor{#c2185b}{s_i}, 1-\textcolor{#1f6d7a}{\varepsilon}, 1+\textcolor{#1f6d7a}{\varepsilon})\textcolor{#8e44ad}{\hat A_i}\big)\Big]
si(θ)시퀀스 단위 확률 비율 (토큰 비율의 기하평균)πθ학습 중인 정책πold샘플을 만든 직전 정책ri,t토큰 단위 확률 비율JGSPO 목적함수A^i응답 i의 어드밴티지 (그룹 정규화)q, oi프롬프트, i번째 응답G, ∣oi∣그룹 크기, 응답 i의 토큰 수ε클리핑 폭 (시퀀스 비율이라 아주 좁다) \small\begin{array}{ll} \textcolor{#c2185b}{s_i(\theta)} & \text{시퀀스 단위 확률 비율 (토큰 비율의 기하평균)} \\ \textcolor{#1565c0}{\pi_\theta} & \text{학습 중인 정책} \\ \textcolor{#6f6f78}{\pi_\text{old}} & \text{샘플을 만든 직전 정책} \\ \textcolor{#c2185b}{r_{i,t}} & \text{토큰 단위 확률 비율} \\ \textcolor{#d62728}{J} & \text{GSPO 목적함수} \\ \textcolor{#8e44ad}{\hat A_i} & \text{응답 i의 어드밴티지 (그룹 정규화)} \\ \textcolor{#0093b8}{q},\ \textcolor{#1c9c60}{o_i} & \text{프롬프트, i번째 응답} \\ \textcolor{#5f970c}{G},\ \textcolor{#915a08}{|o_i|} & \text{그룹 크기, 응답 i의 토큰 수} \\ \textcolor{#1f6d7a}{\varepsilon} & \text{클리핑 폭 (시퀀스 비율이라 아주 좁다)} \end{array}

클리핑도 응답 단위로 한다. 범위는 아주 좁다(왼쪽 3×10−43 \times 10^{-4}, 오른쪽 4×10−44 \times 10^{-4}). 그 결과 GRPO보다 잘리는 토큰의 비율이 두 자릿수(약 100배) 많은데도 학습 효율은 더 좋았다.

GSPO가 특히 겨냥한 것은 MoE(Mixture of Experts, 토큰마다 일부 전문가 층만 쓰는 모델)다. Qwen3-30B-A3B에서 그래디언트 업데이트 한 번마다 같은 응답에 활성화되는 전문가의 약 10%가 바뀌었다. 같은 토큰인데 옛 정책과 새 정책이 다른 전문가를 쓰니 토큰 비율이 크게 요동친다. GRPO로 이 모델을 수렴시키려면 옛 정책의 라우팅(토큰마다 어느 전문가 층으로 보낼지 정하는 선택)을 저장해 새 정책에서 그대로 재생하는 "Routing Replay"가 필요했지만, GSPO는 필요 없었다. Qwen 팀은 GSPO를 최신 Qwen3 모델의 RL 학습에 썼고, 성능 향상에 기여했다고 밝혔다.

GMPO(Zhao et al., “Geometric-Mean Policy Optimization”, arXiv:2507.20673, 2025년 7월)는 며칠 뒤에 나온 다른 팀의 답이다. 이 팀이 본 증상도 비슷했다. GRPO로 학습할수록 토큰 비율의 범위가 넓어져, 극단적인 비율을 가진 몇 개의 토큰이 업데이트를 휘둘렀다. 고치는 자리가 GSPO와 다르다. GSPO는 비율을 응답 하나로 뭉치고 클리핑도 응답 단위로 하지만, GMPO는 토큰마다의 항을 그대로 두고 그것을 모으는 평균만 산술평균에서 기하평균으로 바꾼다. 기하평균은 튀는 값 몇 개에 덜 휘둘린다. 클리핑은 토큰 단위로 하되 로그 공간에서 넓게(e±0.4e^{\pm 0.4}) 잡는다. DeepSeek-R1-Distill-Qwen-7B에서 다섯 개 수학 벤치마크 평균 pass@1(한 번 뽑아 맞힐 확률)이 GRPO 59.3 → 63.4로 올랐다.

부드러운 클리핑 — SAPO. 응답 단위 클리핑에도 대가가 있다. 응답 안에 크게 어긋난 토큰이 몇 개만 있어도 s가 좁은 범위를 넘어 그 응답의 그래디언트가 통째로 사라진다. 나머지 수천 개의 멀쩡한 토큰까지 함께다. Qwen 팀의 SAPO(Gao et al., “Soft Adaptive Policy Optimization”, arXiv:2511.20347, 2025년 11월)는 이 손실을 줄이려고 딱딱한 클리핑 대신 부드러운 게이트를 쓴다. 비율이 1에서 멀어질수록 그 토큰의 가중치를 0으로 끊지 않고 서서히 줄인다.

wi,t=4 pi,t(1−pi,t),pi,t=σ(τ (ri,t−1))\textcolor{#8e44ad}{w_{i,t}} = 4\,\textcolor{#993600}{p_{i,t}}\big(1-\textcolor{#993600}{p_{i,t}}\big), \qquad \textcolor{#993600}{p_{i,t}} = \sigma\big(\textcolor{#cc00ff}{\tau}\,(\textcolor{#c2185b}{r_{i,t}} - 1)\big)
wi,t토큰 i,t의 그래디언트에 곱하는 가중치 (비율 1에서 최대 1)pi,t비율을 시그모이드에 넣은 값 (비율 1이면 0.5)τ게이트의 가파름. 클수록 빨리 줄어든다ri,t토큰 단위 확률 비율 \small\begin{array}{ll} \textcolor{#8e44ad}{w_{i,t}} & \text{토큰 i,t의 그래디언트에 곱하는 가중치 (비율 1에서 최대 1)} \\ \textcolor{#993600}{p_{i,t}} & \text{비율을 시그모이드에 넣은 값 (비율 1이면 0.5)} \\ \textcolor{#cc00ff}{\tau} & \text{게이트의 가파름. 클수록 빨리 줄어든다} \\ \textcolor{#c2185b}{r_{i,t}} & \text{토큰 단위 확률 비율} \end{array}

가중치는 비율 1에서 최대 1이고 멀어질수록 부드럽게 줄어든다. 양의 어드밴티지와 음의 어드밴티지에 서로 다른 가파름 τ를 준다(음 쪽을 더 빨리 줄임). 음의 업데이트는 엉뚱한 토큰 여럿의 로짓을 함께 올리기 쉬워 더 불안정하다는 것이 까닭이다. 그래서 크게 어긋난 토큰만 줄이고 나머지 토큰의 신호는 살린다. Qwen3-VL 학습에 쓰였다.

문제 6 — 토큰 비율과 응답 비율

네 토큰짜리 응답의 토큰 비율이 [1.1, 0.9, 1.5, 0.8][1.1,\ 0.9,\ 1.5,\ 0.8]이고 A^>0\textcolor{#8e44ad}{\hat A} > 0이다. (가) GRPO(ε=0.2\textcolor{#1f6d7a}{\varepsilon} = 0.2)에서 그래디언트가 끊기는 토큰은? (나) GSPO의 응답 비율 si\textcolor{#c2185b}{s_i}를 구하고, 클리핑 범위 [1−3×10−4, 1+4×10−4][1 - 3\times10^{-4},\ 1 + 4\times10^{-4}]에서 어떻게 되는지 쓰시오.

김민준 (평상)
김민준
 > 0이면 1.2를 넘는 토큰이 잘리니까 1.5 하나요. 0.8은 딱 경계인데,  > 0에서는 아래쪽은 안 잘리죠. min이 작은 쪽을 고르니까.
선생님 (평상)
선생님
좋아요. GSPO는요?
김민준 (평상)
김민준
로그 평균이 0.043이라 s = 1.044요. 범위가 1.0004까지니까 한참 넘었어요. 응답 전체가 잘리네요.
김민준 (의심)
김민준
근데 이상한데요. 범위가 0.0004면 거의 모든 응답이 잘릴 텐데, 그럼 학습이 안 되지 않아요?
이서연 (평상)
이서연
그건 s가 길이로 나눈 기하평균이라서 그래. 4토큰이라 1.044지, 1,000토큰 응답이면 토큰 비율이 이 정도로 흔들려도 평균 로그비율이 훨씬 0에 가까워져. 범위가 좁은 게 이상한 게 아니라 s의 스케일 자체가 작은 거야.
선생님 (평상)
선생님
그래요. 그리고 실제로 논문에서도 GRPO보다 훨씬 많은 토큰이 잘렸는데 효율은 더 좋았어요. 몇 개가 잘리느냐보다 남은 그래디언트가 얼마나 깨끗하냐가 중요했던 거죠.
김민준 (평상)
김민준
과제 채점할 때 이상한 제출물을 과감히 빼니까 오히려 평균이 믿을 만해지는 거랑 비슷하네요.

정리 (가) 1.5인 토큰만 끊긴다(A^>0\textcolor{#8e44ad}{\hat A} > 0이면 하한 쪽은 자르지 않는다). (나) si=exp⁡(평균 로그비율)≈1.044\textcolor{#c2185b}{s_i} = \exp(\text{평균 로그비율}) \approx 1.044 — 범위를 한참 넘어 응답 전체가 잘린다. si\textcolor{#c2185b}{s_i}는 길이로 나눈 기하평균이라 긴 응답에서는 1에 매우 가깝고, 그래서 범위도 좁게 잡는다. GSPO는 더 많이 자르지만 남은 그래디언트의 분산이 작다.