Maksim Sekretov氏は、Node.js上で動作し、学習中のすべてのスカラー、重み、勾配を表示する、極めて小規模で純粋なJavaScriptによるトランスフォーマーを公開しました。リポジトリ tiny-language-model-neuro-js を使えば、誰でもランダムなモデルから開始し、「can human read ?」のようなプロンプトを入力して失敗する様子を観察した後、単一のコマンドで学習を実行し、回答が正解に変わっていく様子を見ることができます。

なぜほとんどのLLMデモは数学的な仕組みを隠してしまうのか

典型的な言語モデルのチュートリアルは、TensorFlowやPyTorchに依存しています。これらのフレームワークは、計算グラフを自動的に構築し、背後で勾配を計算するため、学習者はハイレベルなコードと損失曲線(loss curves)しか目にすることはありません。各トークンがいかにして埋め込み(embedding)になるのか、アテンション・スコアがいかに計算されるのか、勾配がいかにしてすべての行列を逆伝播していくのかといった、基盤となる演算は不可視のままです。

JavaScriptモデルが他と異なる点

Sekretov氏の実装は、依存関係のない単一のNode.jsスクリプトへとすべてを削ぎ落としています。学習パイプラインは、以下の明快なシーケンスに従います。

  • Tokenization(トークン化)
  • Embeddings(埋め込み)
  • Causal transformer blocks(因果的トランスフォーマー・ブロック)
  • Multi-head self-attention(マルチヘッド自己注意)
  • Feed-forward networks (FFN)(フィードフォワード・ネットワーク)
  • Language-model head and softmax(言語モデル・ヘッドとsoftmax)
  • Cross-entropy loss(交差エントロピー誤差)
  • Backpropagation(誤差逆伝播法)

node src/train.js --generalize --adaptive-teach を実行すると、フル学習ループが開始されます。コードはプレーンなJavaScriptであるため、各テンソルは単純な配列であり、各行列演算は明示的なループであり、すべての勾配がそのソースとなる重みのすぐ隣に存在しています。

ランダムな推測から正解へ

モデルの開始時、すべてのパラメータはランダムです。「can human read ?」と問いかけても、意味不明な文字列が返ってくるだけです。しかし、短い事前学習フェーズと一連の教師あり微調整(SFT)を経ると、同じプロンプトに対して理にかなった回答が返るようになります。損失関数を通じて入力される正しいトークンシーケンスである「教師信号」が、埋め込み、アテンション・ヘッド、FFNレイヤーへと逆伝播し、各スカラーを順次更新していくのです。

破滅的忘却への対処

初期の実行では、典型的な問題が見られました。新しい事実を学習すると、以前に学習した内容が消えてしまうのです。Sekretov氏は、新しいデータを導入しながら古い例を再提示する「リハーサル(rehearsal)」によってこれを解決しました。学習は、すべてのターゲット・トークンが少なくとも95%の確率に達し、かつ10回連続のチェックを通過したときにのみ停止します。このシンプルなループは、外部ライブラリを一切使わずに、研究における核心的な課題を実証しています。

誰に恩恵があり、誰が対象外となるのか

このプロジェクトは、数十億のパラメータとGPUクラスターで動作する商用LLMと競合するものではありません。その性能差ゆえに、本番環境のワークロードには適していませんが、それゆえにこのモデルは透明性の高い教材へと変貌します。ブラックボックス化されたフレームワークの中身が見えず苦労している学生、ホビーユーザー、研究者にとって、数学が文字通りのコードとして存在するサンドボックスが提供されたのです。

不足している点と今後の展望

実装が意図的に最小限に抑えられているため、コードの可読性は高いものの、スケーラビリティには制限があります。

今後の注目点

リポジトリはすでにGitHubで公開されています。

まとめ: トランスフォーマーを純粋なJavaScriptへと削ぎ落とすことで、Sekretov氏は、悪名高いほど不透明な技術を、読みやすく編集可能なスクリプトへと変えました。トレードオフは速度ですが、得られるのは洞察です。今や誰もが、言語モデルがスカラー単位で学習し、忘れ、そして再学習していく様子を観察できるのです。