GSPO: importance ratio를 토큰이 아니라 시퀀스 단위로
Group Sequence Policy Optimization (Zheng et al., Qwen Team·Alibaba, arXiv 2025)
Introduction
#21 GRPO 글에서 critic을 걷어내고 그룹 상대 advantage로 baseline을 만드는 법을 봤다. 그런데 GRPO가 advantage를 어떻게 만드는지와, 그 advantage를 실제 정책 업데이트에 어떻게 반영하는지는 별개의 문제다. advantage를 만든 뒤에도 여전히 #19 PPO 글에서 다룬 clipped surrogate objective가 남아 있고, 여기엔 이전 정책과 새 정책의 확률비 — importance ratio — 가 들어간다. GRPO는 이 비율을 토큰 하나하나마다 따로 계산한다.
\[w_{i,t}(\theta) = \frac{\pi_\theta(y_{i,t} \mid x, y_{i,<t})}{\pi_{\theta_{old}}(y_{i,t} \mid x, y_{i,<t})}\]이 글이 다루는 GSPO(Group Sequence Policy Optimization) 논문은 이 지점 하나를 정면으로 문제 삼는다. importance sampling은 원래 여러 샘플에 걸쳐 평균을 내야 분포를 보정하는 역할을 하는데, 토큰 단위 비율은 각 위치의 next-token 분포에서 뽑힌 샘플 단 하나에만 적용된다. 그 결과 이 비율은 의도한 “distribution-correction role”을 하지 못하고, 대신 학습 그래디언트에 high-variance noise를 주입한다는 것이 논문의 핵심 진단이다. 이 노이즈는 시퀀스가 길어질수록 누적되고, 토큰 단위 clipping은 이를 완화하기는커녕 오히려 악화시킨다.
미리 결론을 말하면 GSPO의 해법은 단순하다. 비율을 토큰이 아니라 응답 전체(시퀀스) 단위로 계산하고, 클리핑도 응답 전체를 통째로 한다. 근거는 개념적으로 명확하다 — 최적화 목적의 단위는 reward의 단위와 일치해야 한다. GRPO의 advantage가 응답 하나에 스칼라 값 하나로 broadcast되는 걸 이미 봤다(#21). reward는 시퀀스 전체에 주어지는데 off-policy 보정만 토큰 단위로 잘게 쪼개는 건 애초에 단위가 어긋난 설계였다는 것이다.
이 글에서 답할 질문은 세 가지다.
- 토큰 단위 비율이 왜 문제인가: importance sampling의 통계적 역할과 실제 계산 사이의 간극.
- GSPO는 이 비율을 어떻게 다시 정의하나: 길이 정규화가 왜 필수인지, 토이 예제로 직접 확인한다.
- 왜 하필 MoE에서 이 문제가 곪아 터졌나: Qwen3 학습 과정에서 드러난 구체적인 증상과, GSPO가 기존 우회책 없이 이를 해결하는 방식.
이 글은 시리즈 5부 “reward를 정책으로”에 속하며, GRPO(#21)가 만든 advantage 계산은 그대로 두고 그 위에 있는 clipped surrogate만 다시 설계한다.
Background
PPO에서 GRPO까지, 확률비는 늘 토큰 단위였다
#19 PPO 글의 clipped surrogate objective는 확률비 \(r_t(\theta) = \pi_\theta(a_t \mid s_t) / \pi_{\theta_{old}}(a_t \mid s_t)\)를 매 타임스텝마다 계산하고, 그 비율이 \([1-\epsilon, 1+\epsilon]\)를 벗어나면 클립한다. #21 GRPO 글은 advantage 계산 방식을 critic 없는 그룹 정규화로 바꿨을 뿐, 이 확률비 자체는 PPO의 구조를 토큰 단위 그대로 물려받았다. 위 \(w_{i,t}(\theta)\)가 그 비율이고, 목적함수는 이 비율을 각 토큰마다 개별적으로 클립한 뒤 응답 길이로 평균한다.
문제는 이 비율이 통계적으로 무엇을 하려는 장치였는지 되짚어보면 드러난다. importance sampling weight의 원래 역할은, 어떤 분포 \(q\)에서 뽑은 여러 샘플 각각에 \(p/q\) 가중치를 곱해 평균을 내면 그 평균이 분포 \(p\)에서의 기댓값에 가까워진다는 통계적 보정이다. 그런데 위치 \(t\)의 조건부 분포 \(\pi_{\theta_{old}}(\cdot \mid x, y_{i,<t})\)에서 실제로 관측되는 표본은, 그 시퀀스를 생성할 때 뽑힌 토큰 \(y_{i,t}\) 단 하나뿐이다. 같은 위치에서 다른 표본을 여러 개 더 뽑아 평균을 내는 과정이 없다. 단일 표본 하나에 비율을 곱하는 건 여러 표본에 걸친 평균화가 아니라 그 샘플 하나의 재가중일 뿐이라서, “분포를 보정한다”는 원래 취지를 통계적으로 달성하지 못한다.
단위가 어긋난다는 개념적 지적
여기에 더해 논문은 더 근본적인 지적을 한다. GRPO에서 advantage \(\hat{A}_i\)는 응답 \(i\) 전체에 대해 딱 하나의 값으로 계산되고, 그 값이 응답을 이루는 모든 토큰에 동일하게 broadcast된다(#21의 토이 예제에서 직접 봤다). 즉 최적화가 다루는 의사결정의 단위는 이미 시퀀스다. 그런데 그 시퀀스 단위 신호에 곱해지는 off-policy 보정(importance ratio)은 토큰 단위로 따로따로 계산되고 따로따로 클립된다. 논문의 표현을 옮기면, 최적화 목적의 단위는 reward가 주어지는 단위와 일치해야 하는데, reward는 시퀀스 전체에 주어지는데도 보정은 토큰 단위로 이뤄지는 것 자체가 개념적 불일치라는 것이다. GSPO는 이 불일치를 없애는 방향, 즉 보정의 단위를 reward의 단위(시퀀스)로 끌어올리는 방향을 택한다.
Method
GSPO의 정의: 길이 정규화된 시퀀스 비율
GSPO는 토큰별 비율 대신 응답 전체의 likelihood 비율을 쓴다. 다만 그냥 쓰는 게 아니라 응답 길이로 정규화한다.
\[s_i(\theta) = \left(\frac{\pi_\theta(y_i \mid x)}{\pi_{\theta_{old}}(y_i \mid x)}\right)^{1/|y_i|} = \exp\left(\frac{1}{|y_i|}\sum_t \log\frac{\pi_\theta(y_{i,t} \mid x, y_{i,<t})}{\pi_{\theta_{old}}(y_{i,t} \mid x, y_{i,<t})}\right)\]- \(\pi_\theta(y_i \mid x) / \pi_{\theta_{old}}(y_i \mid x)\): 응답 \(y_i\) 전체의 likelihood 비율. 정의상 각 토큰 비율 \(w_{i,t}(\theta)\)를 전부 곱한 값과 같다.
- \(\lvert y_i \rvert\): 응답 \(i\)의 토큰 길이.
- 지수 \(1/\lvert y_i \rvert\): 전체 비율에 이 거듭제곱을 취하는 것은 기하평균을 구하는 것과 같다. 로그를 취해 합을 길이로 나누고 다시 지수를 씌운 오른쪽 식이 이를 그대로 보여준다.
왜 정규화가 필요한가. 정규화 없이 \(\pi_\theta(y_i \mid x) / \pi_{\theta_{old}}(y_i \mid x)\)를 그대로 쓰면, 토큰 하나하나의 likelihood 변화가 곱셈으로 누적되면서 시퀀스 비율을 극단적으로 흔든다. 게다가 응답마다 길이가 다르므로, 짧은 응답과 긴 응답에 같은 클립 범위 \([1-\epsilon, 1+\epsilon]\)를 적용하는 게 의미가 없어진다 — 긴 응답일수록 더 쉽게 범위를 벗어난다. 길이 정규화는 분산을 줄이는 동시에 \(s_i(\theta)\)를 응답 길이와 무관한 통일된 수치 범위로 눌러준다.
토이 예제: 토큰 비율이 쌓이면 무슨 일이 일어나나
숫자로 직접 확인해보자. 정책이 한 번 업데이트된 뒤, 어떤 응답을 이루는 각 토큰의 확률이 평균적으로 2% 정도 높아졌다고 하자. 즉 매 토큰 위치의 비율이 \(w_t = 1.02\)로 일정하다고 가정한다. 이 정도 편차는 개별 토큰만 놓고 보면 PPO/GRPO의 표준 클립 범위(\(\epsilon = 0.2\), 즉 \([0.8, 1.2]\)) 안에 여유 있게 들어가는, 전혀 위험해 보이지 않는 수준이다.
이제 응답 길이 \(\lvert y_i \rvert\)를 바꿔가며, 토큰 비율을 그대로 곱한 정규화 전 시퀀스 비율 \(\prod_t w_t = 1.02^{\lvert y_i \rvert}\)과, GSPO의 길이 정규화 비율 \(s_i = (1.02^{\lvert y_i \rvert})^{1/\lvert y_i \rvert} = 1.02\)를 비교하면 다음과 같다. 토큰이 반대로 2% 낮아지는 경우(\(w_t = 0.98\))도 함께 본다.
| 길이 \(\lvert y_i \rvert\) | 정규화 전 (+2%/토큰) | \(s_i\) (+2%/토큰) | 정규화 전 (-2%/토큰) | \(s_i\) (-2%/토큰) |
|---|---|---|---|---|
| 1 | 1.020 | 1.020 | 0.980 | 0.980 |
| 4 | 1.082 | 1.020 | 0.922 | 0.980 |
| 8 | 1.172 | 1.020 | 0.851 | 0.980 |
| 16 | 1.373 | 1.020 | 0.724 | 0.980 |
| 32 | 1.885 | 1.020 | 0.524 | 0.980 |
| 64 | 3.551 | 1.020 | 0.274 | 0.980 |
정규화 전 비율은 응답 길이에 대해 지수적으로 폭주하거나 소멸한다. 토큰 하나하나는 매번 딱 2%씩만 변했을 뿐인데, 길이 16짜리 응답에서 이미 정규화 전 비율(1.373 또는 0.724)은 표준 클립 범위 \([0.8, 1.2]\)를 벗어난다. 길이 64에서는 3.551배로 불어나거나 0.274로 쪼그라든다. 반면 GSPO의 \(s_i\)는 길이와 무관하게 정확히 1.02(또는 0.98)로 고정된다. 애초에 기하평균이 토큰당 평균 편차 그 자체이기 때문이다.
이 표가 두 가지를 동시에 보여준다. 첫째, 왜 길이 정규화 없이 시퀀스 비율을 그대로 쓸 수 없는지 — 응답마다 필요한 클립 범위가 완전히 달라지고, 긴 응답일수록 미미한 토큰별 변화만으로도 비율이 통제 불능으로 튄다. 둘째, 왜 GRPO의 토큰 단위 클리핑이 이 누적을 막지 못하는지 — 각 토큰의 비율은 개별적으로 보면 클립 범위 안에 얌전히 들어가므로 단 한 번도 잘리지 않지만, 그 비율들이 응답 전체에 걸쳐 곱해지는 실제 효과는 전혀 통제되지 않는다. 토큰 단위 클리핑은 “각 토큰이 튀는지”만 보고 “시퀀스 전체가 튀는지”는 애초에 볼 수 있는 구조가 아니다.
목적함수: 응답 전체를 클립한다
GSPO는 이렇게 정의한 \(s_i(\theta)\)를 GRPO와 똑같은 clipped surrogate 형태에 넣는다.
\[\mathcal{J}_{GSPO}(\theta) = \mathbb{E}\left[\frac{1}{G}\sum_i \min\left(s_i(\theta)\hat{A}_i,\ \text{clip}(s_i(\theta), 1-\epsilon, 1+\epsilon)\hat{A}_i\right)\right]\]형태는 GRPO의 \(\mathcal{J}_{GRPO}\)(#21)와 거의 같아 보이지만 결정적인 차이가 있다. GRPO는 \(\min(\cdot)\)과 \(\mathrm{clip}(\cdot)\)이 토큰마다 따로 적용되고 그 결과를 길이로 평균한다. GSPO는 \(\min(\cdot)\)과 \(\mathrm{clip}(\cdot)\)이 응답 하나에 한 번만 적용된다. 클립이 걸리는 단위 자체가 토큰에서 응답으로 올라간 것이다. advantage \(\hat{A}_i\)를 만드는 방식(그룹 평균·표준편차 정규화)은 GRPO에서 그대로 가져온다 — GSPO가 다시 설계하는 건 advantage 계산이 아니라 그 위에 있는 off-policy 보정과 클리핑뿐이다.
MoE에서 곪아 터진 문제
이 설계 변경이 왜 중요한지는 MoE(Mixture-of-Experts) 모델을 학습시켜보면 분명해진다. MoE 모델의 각 층에는 게이팅 네트워크가 있고, 이 게이팅은 토큰마다 어떤 expert를 활성화할지 매번 새로 결정한다. 문제는 이 라우팅 결정 자체가 정책 업데이트에 따라 흔들린다는 점이다. 논문이 보고한 수치는 구체적이다 — 48층 Qwen3-30B-A3B-Base에서, 그래디언트 업데이트 한 번마다 활성화되는 expert의 약 10%가 이전 정책과 달라진다.
이게 토큰 단위 비율 \(w_{i,t}(\theta)\)에 직접 타격을 준다. 같은 토큰이라도 \(\pi_{\theta_{old}}\)와 \(\pi_\theta\)가 서로 다른 expert 조합으로 그 토큰을 처리했다면, 계산된 확률의 차이는 언어모델링 능력이 실제로 얼마나 바뀌었는지와는 무관하게, 순전히 “이번엔 어느 expert를 거쳤는가”라는 라우팅 스위치 하나 때문에 요동친다. 안 그래도 노이즈가 많은 토큰 단위 비율에, MoE 특유의 라우팅 불안정성까지 얹히는 셈이다.
기존 우회책 Routing Replay와 그 비용
이 문제에 대한 기존의 우회책이 Routing Replay다. 응답을 생성할 때 \(\pi_{\theta_{old}}\)가 각 토큰·각 층에서 어떤 expert를 활성화했는지 캐시해두고, \(\pi_\theta\)로 확률을 다시 계산할 때 그 캐시된 라우팅을 그대로 재생(replay)한다. 즉 \(\pi_\theta\)가 자기 라우팅 결정을 새로 내리지 못하게 강제로 막고, \(\pi_{\theta_{old}}\)가 썼던 경로를 그대로 따라가게 만드는 것이다. 이렇게 하면 비율의 차이가 순수하게 가중치 변화만 반영하게 되지만, 대가가 크다. 모든 토큰·모든 층의 라우팅 정보를 저장하고 분산 학습 환경에서 device 간에 옮겨야 하므로 메모리·통신 오버헤드가 크고, 무엇보다 \(\pi_\theta\)가 실제로는 다른 expert를 쓰고 싶어도 강제로 옛 라우팅을 따르게 되므로 모델이 가진 실제 용량을 제한한다.
GSPO가 Routing Replay 없이도 버티는 이유
GSPO는 이 우회책 자체가 필요 없다. \(s_i(\theta)\)는 개별 토큰의 확률이 아니라 응답 전체의 likelihood를 본다. 라우팅이 10% 바뀌어도 MoE 모델이 가진 전반적인 언어모델링 능력 자체는 크게 달라지지 않으므로 — \(\pi_{\theta_{old}}\)든 \(\pi_\theta\)든 여전히 능력 있는 언어모델이므로 — 응답 전체를 놓고 봤을 때의 likelihood는 급격히 튀지 않는다. 위 토이 예제에서 확인했듯 \(s_i\)는 애초에 토큰 단위의 국소적 요동에 둔감하게 설계된 양이다. 개별 토큰 하나의 라우팅 스위치가 전체 시퀀스 likelihood에 미치는 영향은 희석되고, 그 결과 Routing Replay 같은 별도의 안전장치 없이도 안정적으로 학습이 돌아간다.
Experiments
GRPO와 GSPO 비교
| 항목 | GRPO | GSPO |
|---|---|---|
| importance ratio 단위 | 토큰 | 시퀀스 (길이 정규화) |
| 클리핑 단위 | 토큰마다 개별 클립 | 응답 하나를 통째로 클립 |
| advantage 계산 | 그룹 평균·표준편차 정규화 | GRPO와 동일 |
| MoE 안정성 | Routing Replay 없이는 라우팅 스위치가 그대로 비율에 반영됨 | Routing Replay 불필요 |
| 클립되는 토큰 비율 | 상대적으로 낮음 | GRPO 대비 두 자릿수 배(수십~수백 배) 많음 |
| 실전 사용 | - | Qwen3 학습에 사용 |
반직관적 결과: 더 많이 클립하는데 더 잘 배운다
가장 눈에 띄는 실험 결과는 직관과 반대로 간다. GSPO는 GRPO보다 두 자릿수 배(two orders of magnitude) 더 많은 토큰을 클립한다 — 시퀀스 하나가 클립 대상이 되면 그 시퀀스를 이루는 토큰 전체가 함께 걸러지므로 당연한 결과이기도 하다. 그런데도 GSPO의 학습 효율은 GRPO보다 더 높다.
이 결과가 뒤집는 직관은 이렇다. “더 많이 클립한다 = 더 많은 그래디언트 정보를 버린다 = 학습이 비효율적이다”라는 통념과 달리, GSPO는 훨씬 많은 토큰의 그래디언트를 걸러내면서도 더 빠르고 안정적으로 학습이 진행된다. 이는 토큰 단위 그래디언트 추정 자체가 본질적으로 노이즈가 많고 비효율적이라서, 그중 상당수를 걸러내는 편이 오히려 남는 신호의 질을 높인다는 뜻으로 읽힌다. 시퀀스 단위로 뭉쳐서 결정하는 것이 토큰 하나하나를 세밀하게 반영하려는 시도보다 더 신뢰할 만한 학습 신호를 준다.
실전 배치
GSPO는 논문 안에서 그치는 제안이 아니라 실제 Qwen3 모델 학습에 사용됐다. Qwen3가 MoE 아키텍처를 채택한 라인업을 포함한다는 점을 생각하면, GSPO가 해결한 문제(토큰 단위 비율의 노이즈, 그리고 MoE 라우팅 불안정성)가 실험실 밖 실전 학습 파이프라인에서 실제로 마주친 문제였다는 뜻이다.
Conclusion
GSPO의 메시지는 한 줄로 압축된다 — off-policy 보정의 단위를 reward가 실제로 주어지는 단위(시퀀스)에 맞춰라. GRPO가 advantage는 시퀀스 단위로 만들어놓고 그 위의 importance ratio는 토큰 단위로 쪼개던 불일치를, GSPO는 길이 정규화된 시퀀스 비율 \(s_i(\theta)\) 하나로 정리했다. 그리고 이 개념적으로 깔끔한 선택이, 전혀 다른 층위의 실전 문제였던 MoE 라우팅 불안정성까지 부수 효과로 해결했다 — Routing Replay라는 무거운 우회책 없이도 Qwen3급 MoE 모델을 안정적으로 학습시킬 수 있게 됐다.
다만 이 선택이 유일한 정답으로 굳어진 건 아니다. #41 프론티어 모델의 reward 설계에서 보듯, Solar Open 2는 오히려 GSPO의 시퀀스 단위 비율이 아니라 GRPO의 토큰 단위 비율을 그대로 유지한다고 명시적으로 밝혔고, MiniMax의 CISPO는 토큰도 시퀀스도 아닌 importance sampling 가중치 자체를 클립하는 또 다른 길을 택했다. “무엇을 클립하는가”는 지금도 프론티어 모델들 사이에서 실제로 갈리는 설계 논점이다. GSPO는 그 논점에 대한 하나의 강력한 답이지, 이 논쟁을 끝낸 답은 아니다.
RLHF Reward 설계 시리즈
이 글은 RLHF Reward 설계 시리즈의 스물여섯 번째 글이다.
1부. 지형도
- Deep RL from Human Preferences (Christiano 2017) — 선호로 보상을 배우는 원형
- InstructGPT (Ouyang 2022) — RLHF 3단계 표준 레시피
- HH-RLHF (Bai 2022) — helpful·harmless preference model
2부. 스칼라 RM 해부
- Rethinking Bradley-Terry (2024) — reward 변환의 수학적 기반
- Secrets of RLHF II (2024) — 선호 데이터 노이즈와 RM 일반화
- Skywork-Reward (2024) — 데이터 큐레이션이 아키텍처를 이긴다
- ArmoRM (2024) — 다목적 분해와 MoE 게이팅
- Llama 2 (2023) — helpfulness·safety RM 분리 프로덕션 레시피
- RewardBench 2 (2025) — RM을 어떻게 평가할 것인가
3부. Reward Hacking
- Overoptimization Scaling Laws (2022) — Goodhart의 법칙 정량화
- Length Correlations in RLHF (2023) — 성능 향상의 얼마가 길이인가
- ODIN (2024) — 길이를 reward에서 분리
- WARM (2024) — weight averaging으로 hacking 방어
4부. 안전성 정렬
- Safe RLHF (2023) — 안전성을 reward가 아니라 제약으로
- Rule-Based Rewards (2024) — 안전 규칙을 reward로 직접 번역
- Deliberative Alignment (2024) — 안전 명세를 모델의 추론 안으로
- Shallow Safety Alignment (2024) — 정렬은 첫 몇 토큰에만 얹혀 있다
- OR-Bench (2024) — 과잉 거절을 어떻게 측정할 것인가
5부. reward를 정책으로
- PPO (2017) — clipped surrogate objective
- Secrets of RLHF I (2023) — PPO 학습 안정화 트릭
- GRPO / DeepSeekMath (2024) — value network를 버리다
- RLOO (2024) — REINFORCE로 충분한가
- DPO (2023) — reward를 없애면 어떻게 되는가
- SimPO (2024) — reference-free + 길이 정규화
- KTO (2024) — 선호 쌍 없이 이진 신호만으로
- (현재 글) GSPO (2025) — importance ratio를 시퀀스 단위로
- DAPO (2025) — 신호 없는 프롬프트를 버린다
6부. Process & Verifiable Reward
- Let's Verify Step by Step (2023) — 과정 감독이 결과 감독을 이긴다
- Math-Shepherd (2023) — 사람 라벨 없는 PRM
- DeepSeek-R1 (2025) — RLVR, 규칙이 reward가 될 때
7부. Generative Reward Model
- Prometheus 2 (2024) — 오픈 평가자 모델과 rubric 조건부 평가
- Generative Verifiers (2024) — reward를 next-token prediction으로
- Generative Reward Models (2024) — GenRM과 선호 학습의 결합
- Self-Taught Evaluators (2024) — 사람 라벨 없이 judge를 키우다
- DeepSeek-GRM / SPCT (2025) — inference-time scaling
8부. 생각하는 Judge, 그리고 그 신뢰
- ReasonGRM (2025) — reasoning 능력을 judge에 이식
- J1 (2025) — RL로 judge를 생각하게 만들기
- Rubrics as Rewards (2025) — 비검증 도메인으로
- CriticEval (2024) — judge 자체를 어떻게 평가하나
- One Token to Fool LLM-as-a-Judge (2025) — GenRM도 뚫린다
9부. 실전 종합
- 프론티어 모델의 reward 설계 (2025~2026) — 열 개 모델이 실제로 택한 것
- reward를 어떻게 설계할 것인가 — 시리즈를 관통한 RM 설계 원칙 한 장
본 시리즈는 42편으로 구성된다.
참고 문헌
- Zheng et al., 2025. Group Sequence Policy Optimization.
Enjoy Reading This Article?
Here are some more articles you might like to read next: