논문은 절반에서 멈췄습니다. 4분의 1은 30점이 아니라 4점을 잃고, 재정규화 없이 학습된 모델이 이유를 알려줍니다
arXiv:2609.04575가 돌리지 않은 두 칸을 채웠습니다. Qwen3.6-35B-A3B에서 k₁=2·3, 그리고 재정규화 없이 학습된 OLMoE에 k₂ 기법을 통째로 적용한 결과입니다. 두 번째가 논문 메커니즘의 반증 시험입니다.

앞 글의 재현에 이어지는 글입니다. 논문은 Xing Chen, Hengshuai Yao, arXiv:2609.04575. 패치, A100, 시드 0으로 뽑은 MMLU 2,000문항과 GSM8K 50문항 모두 앞 글과 같습니다. 별도 표시가 없는 수치는 전부 저희 측정값입니다.
앞 글에서 확인한 것은 논문의 핵심 주장이었습니다. Qwen3.6-35B-A3B에서 학습 때 쓰던 8개 expert 중 4개만 켜고, 나눌 때 상위 4개가 아니라 상위 16개의 확률 합으로 나누면 MMLU가 0.30점 움직입니다. paired 검정은 이 차이를 0과 구분하지 못합니다. 논문은 딱 이 "절반" 지점까지만 평가하고 멈춥니다. 그러면 질문이 바로 둘 생기는데, 둘 다 논문에 없습니다.
첫째, 절반에서 통하면 4분의 1에서도 통하는가. 둘째, 논문의 설명은 재정규화를 하면서 학습했기 때문에 expert 출력 크기가 학습 k에 맞춰 굳어졌다는 것입니다. 그 설명이 맞다면, 재정규화 없이 학습한 모델은 이 기법이 필요 없어야 하고, 오히려 적용하면 나빠져야 합니다. 그런 모델이 있습니다. OLMoE-1B-7B는 설정에 norm_topk_prob: false가 박혀 있고, 64개 중 상위 8개의 softmax 확률을 한 번도 다시 나누지 않고 그대로 씁니다. 저자들이 Qwen 체크포인트 두 개로는 할 수 없었던 반증 시험이 됩니다.
Qwen3.6-35B-A3B에서 4분의 1과 8분의 3
| k₁:k₂ | MMLU (n=2,000) | 8:8 대비 | McNemar p | GSM8K (n=50) |
|---|---|---|---|---|
| 8:8 (원본) | 82.45 | — | — | 84 |
| 3:3 | 70.00 | −12.45 | — | 62 |
| 3:16 | 81.25 | −1.20 | 0.13 | 90 |
| 2:2 | 53.00 | −29.45 | — | 24 |
| 2:16 | 78.50 | −3.95 | 6.2e-06 | 84 |

expert 3개에 보통 재정규화를 쓰면 12점이 빠집니다. 3개에 k₂=16을 쓰면 1.2점이 빠지는데, paired 검정은 유의 수준에 못 미칩니다(p=0.13. 정답에서 오답으로 127문항, 오답에서 정답으로 103문항). 2개에 보통 재정규화는 53점으로 무너집니다. 2개에 k₂=16은 78.5점입니다. 3.95점은 분명한 손실이지만(p=6e-6) 모델은 멀쩡히 돌아갑니다. GSM8K는 n=50에서 2:16과 3:16을 기준과 전혀 가르지 못했고, 2:2와 3:3만 무너졌습니다(24와 62).
논문에 없는 구간을 이어 보면 이렇습니다. 분모를 16으로 고정하고 expert를 8개에서 3개로 줄이면 1점쯤, 2개로 줄이면 4점쯤 잃습니다. 기법 없이 줄이면 3개에서 12점, 2개에서 30점을 잃습니다. "expert 브랜치의 세기"가 내부적으로 정확히 무엇이든, expert를 줄일 때 생기는 손실은 대부분 빠진 expert 때문이 아니라 세기가 어긋나서 생깁니다. 학습 k의 4분의 1까지 내려가도 그렇습니다.
속도도 같은 A100의 vLLM에서 쟀습니다. 디코딩 tok/s를 batch 1 / 8 / 32 순으로, 순정 vLLM(148.6 / 523 / 1,387) 대비 배율과 함께 적고 괄호 안에 패치 기준 k=8 대비 배율을 적으면 이렇습니다. k₁=3은 149.9 / 785 / 2,189로 1.01배 / 1.50배 / 1.58배(1.12배 / 1.61배 / 1.63배), k₁=2는 153.2 / 847 / 2,131로 1.03배 / 1.62배 / 1.54배(1.14배 / 1.74배 / 1.59배)입니다. batch 1에서는 routed FLOP의 4분의 3을 없애도 실제 쓰는 엔진 기준 3%이고, batch 8에서는 k₁=2까지 계속 이득이 붙습니다. batch 32에서는 expert 2개가 3개보다 느리게 나오는데, 그 뒤집힘이 앞 글에 적은 생성 텍스트 교란의 크기입니다. 그 주의점은 batch 8에도 해당됩니다.
k₁=2와 3에서 k₂를 따로 튜닝하지는 않았습니다. 16은 저자들이 k₁=4에서 찾은 최적값이고 그대로 썼습니다. 더 좋은 값이 있을 수 있습니다.
한 번도 재정규화된 적 없는 모델
OLMoE-1B-7B-0125-Instruct입니다. expert 64개, 학습 top-8, 재정규화 없음. 우리 표기로는 원래 라우터가 8:64입니다. 같은 9칸 격자를 돌렸습니다. 원래 설정인 k₂=E, 강제 재정규화 k₂=k₁, 논문의 k₂=16을 k₁=8, 4, 2에서 각각 봤습니다.
| k₁:k₂ | MMLU (n=2,000) | GSM8K (n=50) |
|---|---|---|
| 8:64 (원래) | 55.00 | 70 |
| 8:8 | 24.55 | 0 |
| 8:16 | 37.70 | 14 |
| 4:64 | 49.65 | 60 |
| 4:4 | 24.75 | 2 |
| 4:16 | 38.10 | 16 |
| 2:64 | 38.15 | 8 |
| 2:2 | 26.05 | 0 |
| 2:16 | 32.90 | 2 |

이 표에서 읽을 수 있는 것은 세 가지입니다.
재정규화된 적 없는 모델을 재정규화하면 망가집니다. 원래 k=8 그대로 두고 상위 8개 확률을 합으로 나누기만 해도(Qwen3 계열과 Mixtral 라우터가 기본으로 하는 그 연산입니다) OLMoE는 4지선다에서 55.0점에서 24.6점으로 떨어집니다. 우연 수준입니다. GSM8K는 0이 됩니다. expert는 하나도 안 바뀌었고 가중합의 크기만 바뀌었습니다. 앞 글에서 Qwen의 재정규화를 빼면 30점이 날아간 것과 정확히 반대 방향의 같은 현상입니다. 모델은 각자 학습 때 하던 방식에 맞춰져 있고, 그 차이는 미묘하지 않습니다.
k₂ 기법은 옮겨가지 않습니다. OLMoE에서는 어느 k₁에서든 가장 넓은 분모, 그러니까 원래 설정인 k₂=E가 가장 좋습니다. 16으로 좁히면 원래보다 k₁=8에서 17점, k₁=4에서 11.5점, k₁=2에서 5점 나쁩니다. 바로잡을 세기 오차가 애초에 없으니, 분모를 좁히면 expert 출력만 필요 이상으로 커집니다.
기법 없이 expert를 줄이면 OLMoE는 단순히 예상되는 만큼만 잃습니다. 절반에 원래 가중치: −5.35. 4분의 1: −16.85. k₂=16을 쓴 Qwen(−0.30, −3.95)보다는 훨씬 가파르고, 보통 재정규화를 쓴 Qwen(−6.15, −29.45)보다는 훨씬 완만합니다. 세기는 맞는데 expert만 빠졌을 때 MoE가 어떤 모습인지를 OLMoE가 보여 줍니다.
논문에 대해 말해 주는 것
저자들은 결과가 fine-grained MoE와 Qwen 시리즈에 국한될 수 있다고 조심스럽게 적었습니다. OLMoE 결과는 그보다 더 구체적으로 말해 줍니다. 이 기법은 top-k 재정규화를 하며 학습한 모델에 국한되고, 효과의 크기는 재정규화 학습이 남긴 세기 오차의 크기입니다. 모델 설정에 norm_topk_prob: false가 있으면 k₂로 고칠 것이 없습니다. true이면(Qwen3-MoE, DeepSeek-V3 계열 라우터가 그렇고, Qwen3.5/3.6은 코드에서 무조건 재정규화합니다. 반대로 Qwen1.5-MoE는 false입니다) 논문의 정수 하나를 써 볼 가치가 있고, 우리 숫자는 절반 아래에서도 써 볼 가치가 있다고 말합니다.
제가 틀렸다고 판정될 조건
재정규화 없이 학습한 모델을 하나만 봤습니다. 두 번째 모델(DeepSeek-V2-Lite도 norm_topk_prob: false, softmax 점수, 64 expert, top-6입니다)에서 k₁을 줄였을 때 k₂ 이득이 나타나면 "고칠 것이 없다"는 해석은 틀린 것이고, 그때는 그렇게 적겠습니다. Qwen에서 k₁=1은 안 봤고, k₁=4 아래에서 16 말고 다른 k₂도 안 봤습니다. k₁=2에서 k₂를 훑으면 3.95점 격차가 줄어들 수도, 벌어질 수도 있습니다.
약점
앞 글의 약점이 전부 그대로 적용됩니다. 시드 0 부분집합, 우리 프롬프트 형식의 GSM8K n=50, 긴 생성 미검증. OLMoE는 활성 1B 모델이라 MMLU 기준이 55점이고 우연 수준까지 떨어질 여지가 작습니다. 그래서 두 모델 사이의 절대 하락폭은 비교 대상이 아니고, 성립하는 비교는 모델 안에서 원래 설정 대 변경 설정입니다. OLMoE 속도는 vLLM에서 재지 않았습니다. HF 루프는 모든 칸에서 44에서 50 tok/s인데, 앞 글에서 보셨듯 그 숫자로는 아무것도 판단할 수 없습니다.
스크립트와 원시 결과는 drafts/moe-k2-exp.py, drafts/moe-k2-results.jsonl, drafts/moe-k2-olmoe-results.jsonl에 있습니다. 같은 자체 검사로 패치한 OLMoE 라우터가 8:64에서 원본과 비트 단위로 같음을 확인했습니다.
다음 글은 아래 폼으로 받아 보실 수 있습니다.
이메일로 받아보기
관련 포스트

Paper of the Week #3 — FLOP이 절반이라고 시간이 절반은 아닙니다
정수 하나로 MoE expert 연산을 절반으로 줄이는 논문(arXiv 2609.04575)의 표 5를 A100 한 장에서 1점 안쪽으로 재현했습니다. 논문에 없는 속도를 쟀더니 HF transformers에서는 0, 지금 쓰는 순정 vLLM의 batch 1에서도 0, batch 8에서 1.35배였습니다. 재정규화 없이 학습된 OLMoE 대조군과 2호가 약속한 iso-cost 정산도 실었습니다.

MoE expert를 절반만 켜는 정수 하나 — batch 1에서는 공짜가 아니었습니다
arXiv:2609.04575의 표 5를 A100 한 장으로 재현하고, 논문에 없는 처리량을 쟀습니다. HF transformers에서는 이득이 없고, 순정 vLLM의 batch 1에서도 없고, batch 8에서 1.35배입니다.

Paper of the Week #2 — 점수는 초록에, 청구서는 표 2에
HoH(arXiv 2609.01481)의 Planner→Developer→QA 루프를 Claude Code 둘레에 직접 지어 숨긴 테스트 8과제로 쟀습니다. 점수 차이는 재실행 노이즈 안, 토큰은 58k에서 177k로 3배. HoH 자신의 표 2도 3.25배입니다. 1호가 약속한 matched-loss 대조군 채점도 함께 실었습니다.