世界を動かす技術を、日本語で。

インタラクティブに解説するMicrogpt

概要

  • Andrej Karpathyが作成した 約200行のPythonスクリプト でGPTの基本アルゴリズムを解説
  • 32,000件の人名データセット を使い、文字単位でモデルを訓練
  • トークナイズ、予測、損失計算、逆伝播 の仕組みを丁寧に説明
  • Attention、埋め込み、残差接続 などTransformerのコア要素を視覚的に解説
  • ChatGPTのような大規模モデルとの 違いは規模と効率化のみ で、原理は同じ

Karpathyの200行GPTスクリプト入門

  • Andrej Karpathy が公開した 200行のPythonスクリプト

    • ライブラリ・外部依存なし、 純粋なPython のみで動作
    • ChatGPTの基盤となる LLMアルゴリズム を実装
  • データセット

    • 32,000件の 人名リスト (例: emma, olivia, ava, ...)
    • 各名前が 1ドキュメント 扱い
    • モデルは 名前の統計的パターン を学習し、新たな名前を生成可能
  • トークナイズ

    • ニューラルネットワークは 数値 のみ扱うため、文字を整数IDへ変換
    • 26文字+ BOS(開始記号) で計27トークン
    • 例: "emma" → [BOS, e, m, m, a, BOS](両端にBOSを付与)
    • 整数ID自体に意味はなく、単なる記号 として扱う
  • 予測タスク

    • スライディングウィンドウ方式 で、各位置で「次の文字」を予測
    • 例: "emma"なら5組の入力-ターゲットペアが生成
    • ChatGPTを含む全ての言語モデル がこの手法で訓練
  • Softmaxによる確率化

    • モデル出力は 生のスコア(ロジット) (正負・大小さまざま)
    • Softmax関数 で確率に変換
      • exp関数で増幅、合計で割ることで合計1に正規化
      • 最大値を引いてからexp することでオーバーフロー防止
  • 損失関数(クロスエントロピー)

    • 予測がどれだけ外れたかを -log(p) で計算
    • 正解トークンの確率が高いほど損失は低く、低いと損失は高くなる
    • モデルはこの損失を最小化するよう訓練
  • 逆伝播(Backpropagation)

    • 各パラメータを微調整した場合の 損失変化量(勾配) を計算
    • 演算ごとに計算グラフを構築 し、損失から逆方向に勾配を伝播
    • 変数が複数経路で利用される場合、 勾配は経路ごとに加算 (多変数の連鎖律)
    • PyTorchの loss.backward() と同じ仕組みを スカラー値で手作業 実装

モデル構造とTransformerの仕組み

  • 埋め込み(Embedding)

    • トークンIDを 16次元ベクトル に変換(学習可能な表現)
    • 位置埋め込み も加算し、位置情報も考慮
    • 似た役割のトークンは 似たベクトル に収束
  • Attention(注意機構)

    • 各トークンが Query・Key・Value ベクトルを生成
    • Queryと全Keyの 内積 で関連度を計算
    • Softmaxで重み付け し、Valueの加重平均を出力
    • Causal Mask により未来のトークンは参照不可
    • 複数の Attention Head で多様なパターンを並列学習
      • 例: 直前トークン重視、BOS記憶、母音検出など
  • ネットワーク全体の流れ

    • 埋め込み→正規化→Attention→残差加算→正規化→MLP→残差加算→出力射影
    • MLP(多層パーセプトロン) は各位置で独立に思考
      • 2層構造、ReLU活性化で非線形性
    • 残差接続 により勾配消失を防止し、深いネットワークでも学習安定
    • RMSNorm で出力のスケールを正規化、訓練安定化

学習と生成

  • 訓練ループ

    • 1,000回繰り返し
      • 名前を選択→トークナイズ→モデル順伝播→各位置の損失計算→平均損失→逆伝播→パラメータ更新
    • Adamオプティマイザ で学習効率向上
      • モーメンタム・適応学習率で安定収束
    • 損失は初期3.3(ランダム予測)→2.37程度まで低下
    • 生成される名前も 徐々に自然なものへ進化
  • 生成(推論)

    • BOSから開始し、 順伝播とサンプリングを繰り返し 新トークンを生成
    • 温度パラメータ で多様性を制御
      • 低温度:最頻出トークン優先(平均的な出力)
      • 高温度:ランダム性増加(創造性とノイズのバランス)
      • 名前生成の最適温度は 0.5前後

ChatGPTとの違いと本質

  • アルゴリズム自体は同じ
    • 違いは 規模・効率化・実装技術 のみ
      • トークン数:数兆 vs 32,000
      • サブワード分割(10万語彙)
      • GPUテンソル計算
      • パラメータ数:数千億 vs 4,192
      • 層数:数百 vs 1
      • 分散学習・大規模最適化
    • 根本の原理は200行スクリプトと変わらない

このスクリプトを通じて、 GPTの本質的な仕組み を直感的かつ視覚的に理解可能。 ChatGPTの“魔法”の正体 が、シンプルな計算と統計的パターン学習の積み重ねであることが実感できる。

Hackerたちの意見

トレーニングの終わりには、モデルは「kamon」、「karai」、「anna」、「anton」みたいな名前を生成するんだ。どれもデータセットからのコピーじゃないよ。え、データセットにkamon、karai、anna、antonがあるの見えるんだけど、他の名前使った方がいいんじゃない?

その通りだね。全体的にAIが生成したみたいに感じる。

ありがとう、修正するね。

俺が理解できないのは、どうやってこれが任意のコーディング問題をデバッグする能力に繋がるのかってこと。統計的推論がどうやって推理になるの?長い間、答えは「ならない」って感じだったけど、今は毎日Claudeコードを使ってると、どうやらそうみたい。

これは単語や文字の統計的推論ではなく、むしろ非常に複雑な意味概念に対する統計的推論の層を積み重ねて、それを再帰的に行っているからなんだよね。

個人的には、君の質問は機械学習の研究分野での最大の未知数だと思う(ニューラルネットの解釈可能性も関連する分野だけど)。最も基本的な説明をすると、「もし次の『正しい』単語を常に正確に予測できるなら、質問には常に正しく答えられる」ってこと。多くの研究やエンジニアリング(最前線のラボのほとんどの仕事)が、その『正しい』修飾子を実現するために注がれていて、単に『インターネット』から次のトークンを予測するのではないんだ(単純な元のトレーニングコーパス)。この作業は、改善されたトレーニングデータ(例えば、専門家の注釈)、人間のフィードバックによるファインチューニング(例えば、RLHF)、最近では強化学習(例えば、RLVR、検証可能な報酬を伴うRL)という形を取っていて、モデルは『トークンレベルのガイダンス』なしで問題の正しい答えを見つけるように訓練されている。LLMのためのRLは非常にホットな研究分野で、正しく解決するのがとても難しいんだ。

一つの問題は、「統計的推論」が過度に単純化されていることだよね。確かに、ニューラルネットワークの計算には統計的な側面があるけど、それだけじゃないんだよね。人間の脳にも同じことが言えるし。

この記事全部読んだよ。いくつかの価値はあったけど、「残りのフクロウを描いて」って感じだった。概念的な要素の紹介や、ちゃんとしたつなぎがカットされてるように思えた。でも、インタラクティブな部分は良かった。

最初は良かったけど、すぐに「MLP(多層パーセプトロン)は二層のフィードフォワードネットワークで、64次元に投影して、ReLU(負の値をゼロにする)を適用して、16次元に戻す」ってなって、かなりフクロウっぽくなってきた。全体をもっと深く掘り下げて説明できると思う。

Karpathyの元の記事はこちら: https://karpathy.github.io/2026/02/12/microgpt/

初心者向けって書いてあるけど、こんな複数の段落を理解できる初心者ってどんな人なんだろう。「予測はどれくらい間違ってた?『モデルは正しい答えがありそうにないと思った』ってことを示す一つの数字が必要だ。モデルが次のトークンに0.9の確率を割り当てたら、損失は低い(0.1)。0.01なら損失は高い(4.6)。式は− log(p)で、pはモデルが正しいトークンに割り当てた確率。これをクロスエントロピー損失って呼ぶ。」って。

なるほど。私がこれを書くときの問題は、専門家じゃないけど、いくつかのことについては少し知識があるから、自分には分かることを言っちゃうことなんだよね。でも初心者には通じないこともあるから、考え直す必要があるな。

関連: Microgpt https://news.ycombinator.com/item?id=47202708

LLMがブログ記事を書いてないことを示すために、わざとスペルミスや文法ミスをするのが流行りつつあるのかな?この記事の元になっているKarpathyのブログ記事にもいくつかスペルミスがあったのに気づいたし、この記事にもあったよ。

こういうカウンターシグナルが今後数年でもっと一般的になると思う。

それに気づき始めたばかりだね。

これを言うと不満に思う人もいるだろうけど、Karpathyは「ザ・デュード」じゃないよ。彼は大きなTwitterフォロワーを持っているから、何か重要なことがあると思われがちだけど、実際はそうじゃない。彼のキャリアで一番大きなことは、何年も何年もElonのフルセルフドライビングの妄想を助長してきたことだよ。OpenAIにどれだけ長くいたか、そしてどれだけコードゴルフに時間を使っているかを考えてみて。これを読んで怒ってるなら、少し時間を取って、彼からA) コードゴルフ B) フレーズを作る以外の何かを見たのはいつか教えてほしい。

記事を読んでみたけど、出力として名前が出てくるのは理解できるけど、なんで名前を使う必要があるの?

名前はモデルを示すためのランダムな問題に過ぎないよ。何でもいいと思う。

これまで読んだ中で、一番役に立ったウォークスルーだったよ。すごく分かりやすく、ステップを丁寧に説明してくれてありがとう。私はコーダーじゃなかったけど、AIのおかげで実際にコードを書いてる。色々なことに慣れていくほど、学ぶのが楽になってきたよ。AIって本当に面白い。シンプルで明確にしてくれるから、何を与えればいいか考えるのが助かるんだ。

多くのコメントで、あまりにも入門的すぎるとか、逆に深すぎるって言われてたけど、これらのモデルの仕組みをあまり理解していない私にとっては、この概要はかなり良かったと思う。いくつかの概念はちょっと理解できなかったけど、これがこのトピックについてもっと学ぶための良い出発点だと思う。