- MicroGPTは、200行の純粋なPythonコードで書かれたGPTモデルの最小実装であり、大規模言語モデルの中核構造を視覚的に理解できるよう構成されている
- 32,000件の人名データセットを学習して新しい名前を生成し、トークナイズ・予測・損失計算・逆伝播の過程を段階的に可視化する
- Softmax、Cross-Entropy Loss、Backpropagation、Embedding、Attentionなど、GPTの主要な構成要素をコードとともに説明する
- 学習過程ではAdamオプティマイザを使用して損失を徐々に減らし、その後**温度調整(Temperature Sampling)**を通じて多様な名前を生成する
- ChatGPTのような大規模モデルの中核アルゴリズムを単純化した形で、LLMの内部動作原理を理解できる教育用資料
MicroGPTの概要
- Andrej Karpathyが作成した200行のPythonスクリプトをベースに、GPTモデルの学習と推論の過程を視覚的に解説
- 外部ライブラリなしで純粋なPythonのみで実装
- ChatGPTのような大規模言語モデルの基本アルゴリズムをそのまま含む
- この記事は、初心者にやさしい視覚的アプローチを通じて、モデルの各段階を順を追って示す
データセットと学習目標
- 32,000件の人名(例: emma, olivia, ava など)を学習データとして使用
- 各名前は1つの文書とみなされ、モデルは名前の文字パターンを学習する
- 学習後には「kamon」「karai」「anna」「anton」などの新しい名前を生成
- モデルは文字間の統計的関係、名前の長さ、開始と終了の音韻パターンなどを学習する
テキストを数値に変換する過程
- ニューラルネットワークは数値しか扱えないため、各文字を整数IDに変換
- a–zは0–25、BOS(Beginning of Sequence)は26に設定
- BOSトークンは名前の開始と終了を示す
- 実際のGPT-4のtiktokenは文字ではなく文字片単位でトークン化するが、原理は同じ
次のトークン予測
- モデルは与えられた文脈から次の文字を予測する
- 例: [BOS] → “e”, [BOS, e] → “m”, [BOS, e, m] → “m”, [BOS, e, m, m] → “a”
- 各段階では入力(文脈)と目標(次の文字)のペアを生成し、この方式はChatGPTと同じ
Softmaxと確率計算
- モデル出力は27個の**ロジット(logit)**で構成され、Softmaxによって確率に変換される
- 各ロジットを指数化した後に合計で割って確率分布を生成
- 最大値を引く演算はオーバーフローを防ぐための安定化処理
- Softmaxの結果は、各トークンが次に出現する確率を表す
損失計算: Cross-Entropy
- 予測の正確さを**−log(p)**で計算
- 正解確率が高いほど損失は低く、0に近いほど損失は大きくなる
- p=1のとき損失は0、p→0のとき損失は無限大
- 学習はこの損失を最小化する方向で進む
逆伝播(Backpropagation)
- 損失を基準に、各パラメータが損失に与える影響を計算
- すべての演算(add, multiply, exp, log など)をノードとして構成した計算グラフを通じて微分を実行
- 各ノードは入力と局所微分値を保存し、逆方向に勾配を伝播する
- 例: L = a⋅b + a (a=2, b=3) → aの勾配は4.0(2つの経路の和)
- PyTorchの
loss.backward()と同じ原理
埋め込み(Embedding)
- 各トークンIDは16次元ベクトルに変換され、意味を学習する
- トークン埋め込みと位置埋め込みを足し合わせて入力として使用
- 位置によって同じ文字の役割が変わる
- 学習後には類似した文字(例: 母音)が類似したベクトルを持つようになる
アテンション(Attention)
- 各トークンはQuery、Key、Valueベクトルを生成
- QueryとKeyの内積によって関連性を計算し、Softmaxで重みを算出
- 重み付き和を取ったValueが出力として使われる
- Causal Maskを適用し、未来のトークンを参照しない
- 4つのアテンションヘッドが並列に動作し、それぞれ異なるパターンを学習する
GPT全体の構造
- 入力トークンは次の段階を経る
- 埋め込み + 位置埋め込み
- RMSNorm正規化
- マルチヘッドアテンション
- 残差接続(Residual)
- MLP(64次元に拡張 → ReLU → 16次元に縮小)
- 再び残差接続した後、出力ロジットを計算
- Residual接続は勾配消失を防ぐ
- RMSNormは活性値の大きさを一定に保ち、学習を安定化する
学習ループ
- 1,000回の反復学習
- 名前の選択 → トークナイズ → 順伝播 → 損失計算 → 逆伝播 → パラメータ更新
- Adamオプティマイザを使用
- 初期損失は約3.3から2.37へ減少
- 生成される名前はランダムなものから徐々に自然な形へ発展
推論(Inference)とサンプリング
- 学習後はBOSから始めて次のトークンを反復的に予測
- Temperatureでサンプリングの多様性を調整
- 低いほど決定的(平均的)で、高いほど創造的だが不安定
- 名前生成の適切な温度は約0.5
- 例示出力: “karai”
効率性と拡張性
- MicroGPTはGPTの中核アルゴリズムを単純化した完全実装
- ChatGPTとの違いは規模だけ
- 32,000件の名前の代わりに数兆個のトークン、4,192個のパラメータの代わりに数千億個のパラメータ
- CPUベースのスカラー演算の代わりにGPUのテンソル演算を使用
- 基本ループは同じ: トークナイズ → 埋め込み → アテンション → 予測 → 損失 → 逆伝播 → 更新
結論
- MicroGPTは、GPTの内部動作原理を直感的に学べる教育用モデル
- 大規模LLMの複雑な構造を単純化し、言語モデルの中核メカニズムを直接体験できるようにする
1件のコメント
Hacker Newsのコメント
学習が終わるとモデルが "kamon", "karai", "anna", "anton" のような名前を生成すると書いてあったが、実際にはこれらの名前はデータセットにも含まれている
別の名前を使ったほうがよさそう — データセットのリンク
初心者向けだと言っているが、こうした数学的な説明を理解できる初心者がどれほどいるのか分からない
たとえば cross-entropy loss の式を説明する部分は複雑すぎるように感じた
もう一度考え直してみる
私が理解できないのは、こうした単純なモデルがどうやって 任意のコード問題をデバッグ できるようになるのかという点だ
統計的推論がどうやって「推論能力」に変わるのか気になる
Claude Code を毎日使っていると、もう本当にそうなっているように思える
要点は「常に正しい次の単語を予測できるなら、結局はあらゆる質問に正しく答えられる」ということだ
そのため最近は、RLHF や RLVR のような 強化学習ベースのアプローチ で「正解」を見つける方向に発展している
数学的には 微積分ベースの最適化問題 により近い
単にテキスト統計を学習しているのではなく、次のトークンを予測するための複雑な解法を見つけているのだ
ニューラルネットワークには統計的な要素もあるが、人間の脳のようにそれ以上のものがある
記事全体を読んだが、有用な部分もあった一方で、『残りのフクロウを描け』 という感じでもあった
概念同士をつなぐ部分が抜けているように思えたが、インタラクティブな構成はよかった
もう少し掘り下げて扱ってほしかった
最近はわざと スペルミスや文法ミス を入れて、LLM が書いた文章ではないことを示すのが流行っているのだろうかと思う
Karpathy のブログやこの記事にもそういう誤字がかなり見られた
Elon の Full Self Driving プロジェクトを長いあいだ支えただけで、OpenAI にも長くはいなかった
最近はほとんど code golf や新語作りにばかり集中しているように見える
原文は Karpathy のブログにある — microGPT の記事リンク
基礎的すぎると言う人もいれば、深すぎると言う人もいたが
私のようにモデルの動作原理をよく分かっていない立場からすると、よい概説 だった
完全には理解できなかったが、学び始めるにはよい出発点だと思う
これまで見た中でも 最も役に立ったチュートリアル の一つだった
コーディングをしてこなかった私も、AI のおかげでコードを書くようになった
説明が単純で明快なので、AI に何を入力すべきか考えるときに大いに役立つ
T-Mobile がこのブログページをブロックしているようだ
ブロック警告ページのリンク
記事を読んで名前が出力されることは理解できたが、なぜわざわざ 名前生成 を例にしたのか気になった
他のどんなデータでも可能だ