ステータス: ドラフト(2026-10-31)、実測値。 すべての学習は筆者が8GBのノートPC用GPU1基で直接実行しました。条件・学習率の候補・判定基準は初回実行前に書き留めておき(事前登録)、実行はそのルールに従って自動的に継続されました。論文の数値は 第1編と同じ原文の確認済みバージョンです。 作成ルール: 実測データを基本とし、測定できなかったものは「未測定」、確認できなかったものは「未確認」と表示します。
目次
- 1. 何を確認するか
- 2. 実験設計
- 3. 学習率の探索: オプティマイザごとに「良い領域」が異なる
- 4. 本実行: 1億トークン、3つのシード
- 5. 大きなバッチ: 格差が広がった
- 6. 事後検証: 結果を見た後に生じた3つの疑問
- 7. 解釈
- 8. 限界
- 生データ
1. 何を確認するか
第1編で見た論文の主張を3つの質問に絞り込みました。
- 同じモデル・データ・トークンでオプティマイザのみを変更した場合、 学習率をオプティマイザごとに個別に調整した後でも、 MuonはAdamWよりも低いロスに到達するか?
- MUON+の「直交化後の正規化1ステップ」はこの規模でも違いを生み出すか?
- バッチサイズを大きくするとAdamWとMuonの格差が広がるか(2505.02222、2608.25990の主張)?
規模は論文よりもはるかに小さいです。3400万パラメータのモデルに1億トークンです。そのため、この記事の結論は「この規模ではこうだった」であり、論文の検証や反駁ではありません。
2. 実験設計
モデルとデータ
- モデル: 自作のdecoder-onlyトランスフォーマー(nanoGPT系)。次元512、8層、ヘッド8個、コンテキスト512、RMSNorm(プレノーマライゼーション)、RoPE、GELU MLP(4倍)、バイアスなし、埋め込み層と出力層の分離。全体で3356万パラメータ、そのうち隠れ層の2次元行列が2517万。
- データ: FineWeb-Edu(ODC-By 1.0)の公開サンプルの最初の断片から先頭約10億文字。ここから語彙数8192のバイトBPEを直接学習しました。学習に2億6000万トークン(1トークン≈3.9文字)、検証には学習と重複しない4000件の文書から52万トークン。
- 語彙数を8kに縮小した理由: GPT-2の語彙(5万)を使用すると、この規模のモデルでは埋め込み層(2570万)が隠れ層の行列よりも大きくなってしまいます。比較したいのは隠れ層の行列のオプティマイザだからです。
- 韓国語は混入していません。英語のテキストで作成した8kの語彙では韓国語がバイト単位に分割され、混入割合がさらなる変数になってしまうためです。
同一に揃えた条件
データの順序(固定された順列、すべての実行で同じシーケンスを同じ順序で処理)、トークンの予算、バッチサイズ、bf16自動混合精度、torch.compile、勾配ノルムクリッピング1.0、学習率スケジュール(WSD:最初の2%は線形ウォームアップ、一定区間、最後の20%を0まで線形減少)、評価セット。シードは初期化のみを変更します。
3つのオプティマイザ
| 隠れ層の行列(q・k・v・o、MLP 2つ) | 埋め込み層・出力層・正規化層の利得 | |
|---|---|---|
| AdamW | AdamW β=(0.9, 0.95)、ウェイト減衰 0.1 | 同一のAdamW(正規化層の利得は減衰0) |
| Muon | ネステロフモメンタム 0.95 → Newton–Schulz 5回(bf16) → sqrt(max(1, 行/列)) による補正 | 補助AdamW、学習率 = AdamW探索の最適値 |
| MUON+ | Muonと同じだが、直交化結果を列ノルム → 行ノルムでさらに割る | 同上 |
2つの点を意図的に一致させました。第1に、Muon実行における補助AdamWの学習率をAdamW実行の最適値に固定し、2つの実行の違いが「隠れ層の行列のオプティマイザ」の1つだけになるようにしました。第2に、ウェイト減衰は1ステップあたりに重みが減少する割合(学習率 × λ)をAdamWと同一にしました。Muonの学習率の規約(0.02前後)はAdamW(1e-3前後)と約20倍異なるため、λを同じく0.1に設定すると実際の減衰に20倍の差が生じるためです(第1編第4節)。
MUON+は論文の疑似コードと2箇所異なります。論文ではネステロフを使用せず、サイズ補正がsqrt(行/列)であるのに対し、ここではMuonと全く同じに設定し、正規化ステップを1つ追加しただけです。論文が「変更したのはこの1ステップである」と述べているため、違いをそのステップに絞り込むための選択であり、サイズの差は学習率の探索が吸収します。
学習率の探索と本実行(事前定義ルール)
- 探索: 5000万トークン、バッチサイズ64シーケンス(32,768トークン、1525ステップ)、シード0。候補はAdamW {1e-3, 2e-3, 4e-3, 8e-3}、Muon {0.01, 0.02, 0.04, 0.08}、MUON+ {0.02, 0.04, 0.08, 0.16}。最も低い最後の検証ロスを選択し、それがグリッドの端にある場合はその方向にさらに1点実行します(1回のみ)。
- 本実行: 1億トークン(3051ステップ)、バッチサイズ64シーケンス、各最適学習率、シード0・1・2。
- 大きなバッチ: 1億トークン、バッチサイズ256シーケンス(131,072トークン、762ステップ)、AdamWとMuon、学習率はバッチ64の最適値の1倍および2倍。優れた方のシードをもう1つ追加。
- 判定: 最終ロスの差が2つのオプティマイザのシード標準偏差の合計より大きい場合は「優れている」、小さい場合は「区別不能」。
この順序は実行スクリプトによってルール通りに自動的に進められました。結果を見てから介入する余地をなくすためです。
環境
8GBのノートPC用GPU1基、PyTorch 2.9(CUDA 12.8)、Kubernetes上の学習ジョブ(Kubeflow Trainer)を使用して実行しました。1つの実行が終了するたびに、検証ロス曲線(約40ポイント)、スループット(最初の11ステップを除く)、GPU最大メモリを記録しました。
3. 学習率の探索: オプティマイザごとに「良い領域」が異なる
| オプティマイザ | 学習率 → 最後の検証ロス(50Mトークン) | 選択された値 |
|---|---|---|
| AdamW | 5e-4: 3.863 · 1e-3: 3.727 · 2e-3: 3.829 · 4e-3: 4.315 · 8e-3: 6.351 | 1e-3 |
| Muon | 0.005: 3.611 · 0.01: 3.602 · 0.02: 3.633 · 0.04: 3.973 · 0.08: 5.195 | 0.01 |
| MUON+ | 0.01: 3.612 · 0.02: 3.643 · 0.04: 4.105 · 0.08: 5.186 · 0.16: 6.463 | 0.01 |
3つのことがわかります。
- 最適値自体が約10倍異なります。 AdamWは1e-3、Muonは0.01です。第1編で見た「サイズ補正規約」のためです。同じ学習率の数値で比較すると、どちらか一方は必ず損をします。
- AdamWは最適値からわずか2倍外れるだけで0.10悪化し、4倍では0.59悪化しました。Muonは最適値の半分(0.005)と2倍(0.02)でそれぞれ0.009、0.032の差でした。この規模ではMuonの方が学習率に対して鈍感でした。AdamWの曲線を見ると、スパイクなしに最初から着実に遅かったです。ウォームアップが短いことが原因である可能性があるため、第6節で個別に確認しました。
- MUON+はMuonとほぼ同じ曲線でした。ただし、MUON+の最適値(0.01)は1度拡張したグリッドの端だったため、0.005側の方がより優れている可能性が残りました(第6節)。
4. 本実行: 1億トークン、3つのシード
| オプティマイザ | 学習率 | 最後の検証ロス(平均 ± 標準偏差) | シード別 | スループット(トークン/秒) | GPU最大メモリ |
|---|---|---|---|---|---|
| AdamW | 1e-3 | 3.4896 ± 0.0026 | 3.4902, 3.4867, 3.4918 | 99,583 | 3.24GB |
| Muon | 0.01 | 3.4085 ± 0.0033 | 3.4087, 3.4117, 3.4052 | 94,170 | 3.15GB |
| MUON+ | 0.01 | 3.4214 ± 0.0029 | 3.4181, 3.4227, 3.4236 | 93,610 | 3.15GB |
判定(事前定義基準: 差 > 2つの標準偏差の合計)
- AdamW − Muon = 0.081、標準偏差の合計 0.006 → Muonの方が優れている。 すべてのシードのセットにおいて、MuonはAdamWよりも0.07以上低くなりました。
- AdamW − MUON+ = 0.068 → MUON+もAdamWより優れている。
- Muon − MUON+ = −0.013、標準偏差の合計 0.006 → この規模・この学習率では、 Muonの方がMUON+よりもわずかに優れている。 論文のLLaMA-60Mの結果(MUON+が25.75 → 25.25 PPLとわずかに優れている)とは方向が逆です。学習率がグリッドの端であったという点を第6節で再確認します。
同じロスにどれだけのトークンがかかるか
曲線の中の一定の学習率区間(2M~80Mトークン)では、2つのオプティマイザが同じスケジュール上にあるため、同じロスに最初に到達するまでのトークン数を比較できます。2505.02222のトークン比率 R = T(AdamW) / T(Muon) と同じ定義です。
| 目標ロス | AdamWが消費したトークン | Muonが消費したトークン | 比率 |
|---|---|---|---|
| 4.2 | 27.4M | 16.8M | 1.63 |
| 4.0 | 37.4M | 23.6M | 1.59 |
| 3.8 | 58.9M | 39.4M | 1.50 |
| 3.7 | 78.1M | 54.2M | 1.44 |
AdamWは同じロスに達するまでにMuonよりも1.4~1.6倍のトークンを消費し、学習が進むにつれて比率は少しずつ減少しました。最後の減少区間まで含めると、MuonはAdamWの最終ロス(3.490)に9020万トークンで到達しました(すべてのシードのセットにおいて)。ただし、減少区間ではロスがスケジュールの形状に沿って急激に低下するため、この「約10%の節約」は下限としてのみ解釈すべきです。9000万トークンの予算で最初からMuonを実行した場合、その時点ですでに減少が終了しており、さらに低くなっていたはずであるためです(その実行は未測定)。
論文の「同じロスに対して10~15%少ないトークン」(2505.02222、数億~数十億パラメータ、Chinchillaの数倍のトークン)よりも、この実験の優位性ははるかに大きいです。モデルが小さく(3400万)、トークンがパラメータの約3倍と非常に短い学習であるためだと考えられます。上記の表でも、学習が長期化するにつれて比率が減少しました。
時間とメモリ
- スループットは、MuonがAdamWよりも5.4%低くなりました(94,170対99,583トークン/秒)。Newton–Schulzの行列積がステップごとに発生するためです。MUON+の正規化ステップはさらに0.6%増加させました。
- それでも時間単位で計算するとMuonが優勢です。AdamWの最終ロスに到達するまでの学習時間は、Muonが15.9分、AdamWが16.5分(最後まで回さないと到達しない)でした。
- GPUメモリは、Muonの方が0.09GB少なくなりました。隠れ層の行列ごとに、AdamWは状態を2つ(1次・2次モーメント)、Muonは1つ(モメンタム)保持します。2517万パラメータ × 4バイト ≈ 0.1GB と一致します。
5. 大きなバッチ: 格差が広がった
バッチを4倍(131,072トークン)に増やし、同じ1億トークンを762ステップで学習しました。学習率はバッチ64の最適値の1倍と2倍を試して良かった方を選び(どちらも1倍の方が良かった)、その値でもう一つのシードを実行しました。
| バッチ | AdamW | Muon | AdamW − Muon |
|---|---|---|---|
| 32,768トークン(3,051ステップ) | 3.490(シード3) | 3.409(シード3) | 0.081 |
| 131,072トークン(762ステップ) | 3.727(1e-3、シード2:3.726・3.729) | 3.508(0.01、シード2:3.507・3.509) | 0.219 |
| 大きなバッチの2倍の学習率 | 3.936(2e-3) | 3.515(0.02) |
同じトークンを4分の1のステップで消費すると、どちらも損失が悪化しますが、悪化の度合いが異なります。AdamWは0.24悪化し、Muonは0.10悪化しました。差は0.081から0.219へと2.7倍になりました。一定学習率区間のトークンの比率も同じ傾向です。損失4.2に達するトークンの比率が、バッチ64で1.63、バッチ256で1.78でした(4.0では1.59対1.76)。「大きなバッチにおいてMuonのデータ効率が維持されるか向上する」(2505.02222)や「バッチが大きいほどAdamW–Muonの差が広がる」(2608.25990表5:0.048 → 0.110)という傾向と一致しています。
おまけとして、大きなバッチではMuonのスループットのオーバーヘッドが1.5%に減少しました(99,604対101,120トークン/秒)。Newton–Schulzはステップごとに1回実行されるため、ステップ数が減ればその分のコストも減少します。
6. 事後検証:結果を見た後に浮かんだ3つの疑問
以下の5つの実行は上記の結果を見た後に決定しました。そのため、上記の判定を覆すものではなく、「その判定をどれほど信用できるか」を確認するためだけに用います。すべて単一のシードです。
| 疑問 | 実行 | 結果 | 比較対象 |
|---|---|---|---|
| MUON+の学習率がグリッドの端だった | MUON+ 0.005、50Mトークン | 3.5953 | MUON+ 0.01:3.6120、Muon最適値0.01:3.6018 |
| AdamWはウォームアップ2%(30ステップ)で損をしたのか | AdamW 1e-3、ウォームアップ10% | 3.7723 | ウォームアップ2%:3.7270 |
| 〃 | AdamW 2e-3、ウォームアップ10% | 3.7235 | ウォームアップ2%:3.8286 |
| 大きなバッチでの差は短いウォームアップ(15ステップ)のせいか | AdamW 1e-3、バッチ256、ウォームアップ10% | 3.7082 | ウォームアップ2%:3.7271 |
| 〃 | Muon 0.01、バッチ256、ウォームアップ10% | 3.5192 | ウォームアップ2%:3.5082 |
- MUON+は学習率をさらに下げるとMuonを僅かに上回りました(50Mトークンで0.006)。第4節の「Muonの方がMUON+より優れている」という結果は、MUON+の学習率のチューニングが不十分だったためである可能性が高いです。ただし、差がシードのばらつき(標準偏差約0.003)の2倍程度であるため、この規模においては「両者はほぼ同じである」というのが正直な結論です。
- AdamWはウォームアップを増やすと最適学習率が2e-3に移行しましたが、到達した損失はほぼ同じでした(3.7235対3.7270)。短いウォームアップがAdamWのパフォーマンスを低下させていたわけではありませんでした。
- 大きなバッチでウォームアップを増やすと、差は0.219から0.189に減少しました。 短いウォームアップによってAdamWが0.02ほど不利になっていたものの、バッチ64での差(0.081)の2倍以上大きいという結論は変わりません。
7. 解釈
- この規模においても、Muonは明確に勝利しました。 学習率を個別に調整し、重み減衰の実効強度を合わせ、補助的なAdamWを同じ条件にした後でも、差はシードのばらつきの10倍を超えていました。
- このメリットは「短く大きなバッチ」の条件において大きくなりました。 学習の初期段階であるほど、バッチが大きいほど差が顕著でした。ステップ数が少ないときには、1ステップをすべての方向に均等に割り当てる方がより価値があるというパート1の図と一致しています。裏を返せば、長期の学習では差が縮小すると予想され、論文における10〜15%という数値もそれに合致します。
- MUON+による利益はこの規模ではノイズと区別がつきませんでした。 事前設定した探索で選択した学習率ではむしろ0.013悪化し、事後検証で学習率を下げたところ0.006上回りました。論文においても60Mモデルでの利得は小さくなっています(0.5 PPL)。「正規化の1ステップ」は学習率を再度調整して初めて効果が出る変更であり、小規模なモデルにおける効果はわずかです。差を正規化の1ステップだけで縮めようとして、Nesterov法とスケール補正をMuonと同一にした点が論文の設定と異なる部分です。
8. 制限
- 単一のモデル(3,400万)、単一のデータ(FineWeb-Edu英語)、1億トークン(パラメータ数の約3倍)での実験です。各論文の結論(数億〜数千億パラメータ、長期学習)を裏付けたり反論したりするものではありません。
- 学習率は50Mトークンで選択し、100Mトークンで使用しました。大きなバッチについては2つの学習率のみを確認しました。
- ウォームアップ(2%)・スケジュール・β・重み減衰はオプティマイザーごとに個別に調整せず、学習率のみを調整しました。
- 大きなバッチとMUON+についてはシードが2〜3個であり、探索は単一のシードで行いました。
- 「同一損失までのトークン数」は一定学習率の区間でのみ計測しました。損失減少期を含めた正確な削減率の算出には、より多くの予算を使った実行が必要です(未計測)。
一次データ
- コード:
train_gpt.py(モデル・オプティマイザー・学習ループ)、driver.py(事前設定した探索・本実行・大きなバッチの順)、prep_data.py(データ・トークナイザー)、analyze_a.py·token_ratio.py(表)。 - 一次データ:実行ごとの
log.csv(評価時点別のトークン・検証損失・時間)とdone.json(最終損失・スループット・メモリ)、事前登録ドキュメントPLAN.md. - データ:FineWeb-Edu sample-10BTの最初のフラグメントの行ブロック0〜213(ODC-By 1.0)。モデルとオプティマイザーのコードは独自に記述しました。