これはマイクロディープラーニングライブラリだ——数学の基礎から、度を超えた好奇心と、*「とりあえず動けばいい」*という言葉への嫌悪感だけを材料にして、アルファが純粋に一から作り上げたもの。
.png)
せっかちな人間だけが味わえる、ある種のフラストレーションがある——使っているツールの仕組みをよく理解していないときの、あのもどかしさだ。ほとんどのプログラマーは機械学習を同じ方法で学ぶ:ライブラリをインストールして、関数を呼び出して、精度が上がるのを眺めて、終わり。すべては抽象化が処理してくれる。抽象化は何もかもを隠してしまう。昔のアルファもそうだった。あるとき、ある講義を観るまでは。
**MIT 6.S191: Introduction to Deep Learning。**スライドはきれいで、数学は凝縮されていて、公式の導出とアーキテクチャの図の間で、アルファの頭の中で何かが変わった。もうニューラルネットワークの単なるユーザーでいるのは嫌だった。アーキテクトになりたかった。何をしているかだけでなく、なぜそうしているのかを理解したかった。行列の積、活性化関数の曲線の一つひとつ、勾配の流れが、どうやって機械を「学習」させるのかを。その執着心が、AINO — Aino Is Neural Operation として生まれた。
最初の問いはシンプルだった:どこから始めるか?答えは明確だった——生物学だ。人間の脳にはニューロンがある。だからアルファはニューロンを作った。ネットワーク内の各計算ユニットのためにclass Perceptronを作った。各ニューロンは自分の重みベクトルとバイアスを持ち、メソッドの呼び出しとオブジェクトの参照を通して互いにやりとりする。コードは教科書のダイアグラムそのものに見えた。正しくて、とても満足のいくものだった。
しかし……とんでもなく遅かった。
おもちゃのデータセットで小さなネットワークを学習させるだけで、32分もかかった。32分間、ただのろのろと進むプログレスバーを眺め、CPUがたいして役立つ計算もしていないのにラップトップのファンが轟音を立てているのを聞き続けた。プロセッサは行列計算で忙しいのではなかった——Pythonのオーバーヘッドで忙しかったのだ。オブジェクトを作り、属性を探し、実行を順番待ちする何千もの小さなオブジェクトの官僚主義をこなしていた。生物学的に最も正確なニューラルネットワークを作ることに成功したが、そのシステムは「エレガントすぎる」ために自分自身を締め上げていた。
啓示は、コードを増やすことではなく、計算とは何かという考え方を変えることで訪れた。一つのレイヤーにある一群のニューロンは、実は別々の個体ではない——それは一つの変換だ。入力ベクトルを受け取り、出力ベクトルを返す関数だ。そしてその変換は、全体として、たった一つの数学的演算だけで実行できる:np.dot(W, X) + b。一行。一回の行列積。ループなし、オブジェクトなし、待ち行列なし。
アルファはclass Perceptronを削除した。すべてのロジックを純粋なベクトル演算を使ってlayer.pyに移した。そして実行すると、信じられないことが起きた——計算処理が遅いPythonレベルからC言語レベルのSIMD実行へと一気に降りていった。そこでは現代のCPUが、Pythonプログラマーが直接触れることの少ないハードウェア命令を使って、データの塊を並列処理する。32分かかっていた学習時間が19秒にまで落ちた。20でも25でもなく。19秒だ。信じられなくて3回も実行し直した。この教訓はアルファの頭にしっかりと刻み込まれた:最も速いコードは、ほぼ常に最も数学的に誠実なコードだ。

どれだけ速くても、ネットワークが学習できなければ意味がない。ニューラルネットワークにおける学習に必要なのはただ一つ:バックプロパゲーション——出力の誤差を測定し、その誤差を各レイヤーに逆向きに流し、誤差への貢献度に基づいて重みを調整するアルゴリズムだ。多くの人はこれをブラックボックスと見なし、使っているフレームワークに任せきりにする。しかしアルファにはフレームワークがなかった。あったのはメモ帳と微積分の教科書と、時間だけだった。
アルファは使いたい各活性化関数の連鎖律を手動で導出した。Sigmoidについては、入力の微小な変化が出力にどう影響するかを、曲線の傾きによって保持されながら計算した。ReLUについては、ロジックは至ってシンプルだった——ニューロンがアクティブなら勾配を通し、そうでなければ完全にシャットアウトする。Tanhについては、ゼロを中心とした対称性を解剖した。Sigmoidより安定しているが、端では勾配消失のリスクを依然として抱えている。これらの公式の導出は単なる数学ではなかった——理解そのものだった。なぜあるアーキテクチャでは誤差が爆発し(exploding)、なぜあるものが突然死に、そして学習率がただの当てずっぽうな数字ではなく、自分の勾配をどれだけ信頼するかという問いであることへの、理解だった。
数学に加えて、アルファはAINO用のハードウェア非依存バックエンドも構築した——起動時にハードウェアの性能を確認するランタイム検出システムだ。普通のノートパソコンでは、AINOはキャッシュとCPUを最大限に活用するため、連続したメモリブロックに配置されたNumPy配列で動く。しかしNVIDIAのGPUを搭載したノートパソコンなら、AINOはすべての数値計算をCuPy——GPUコア上で演算を実行し、何千もの並列スレッドを一度に展開するNumPy互換ライブラリ——にこっそり切り替える。最もクールな点は:アーキテクチャのコードは一行も変わらないことだ。同じlayer.py、同じバックプロパゲーションのロジック、同じ学習ループ——すべてが自動的にGPUに移行する。ハードウェア非依存の設計。スケーラブルなデフォルト。
速く、学習でき、ハードウェアを認識するフレームワークができたら、それに見合った問題が必要だった。アルファはチェスを選んだ。
少し無謀だったかもしれない。チェスは単なるパターン認識ではない——確率の爆発であり、今の一手が15手先に影響しうる。チェスの局面は断片的に評価できない。アルファはモンテカルロ木探索(MCTS)をゼロから作った:ランダムシミュレーションを通してゲームの分岐を探索し、新しい分岐の探索と有望な分岐の活用のバランスを取る確率的アルゴリズムだ。これをDual-Head ニューラルネットワークと組み合わせた——一つの「ヘッド」は合法手の確率を予測し、もう一つはボードポジションの価値を予測する。このアーキテクチャはAlphaZeroから直接インスピレーションを得たが、AINOを使って最も基礎的な概念から純粋に作られた。
AIが駒を気にするよう、ハイブリッドマテリアル計算機も追加した——各駒に古典的な価値を与えることで、ニューラルネットワークに「勝ち」の意味を教える評価関数だ。このシステムは動いた。計算した。そしてテスト対局では……フールズメイトにやられた——初心者がよくやられる4手詰めの最もお粗末なチェックメイトに。
解剖してみると、問題が見えた。誤りは計算ではなく、表現にあった。チェス盤には空間構造がある:マス同士の関係は座標、対角線、空いている通路に依存している。その表現を全結合レイヤーに入力するためのフラットベクトルにしたとき、すべての幾何学的要素が壊れた。MCTSの限界により、AIは目の前で形成されつつある脅威を見ることができなかった。マテリアル計算機はAIに「価値」の語彙を与えたが、「危険」の文法は教えなかった。考えることはできるが、見ることができないものを作ってしまった。
フールズメイトで負けたことは、このプロジェクトで最も教育的な瞬間だった。問題の構造とモデルのアーキテクチャを合わせることの重要性を、本当に思い知らされた——教科書を読むだけでは決してここまで効果的に学べなかった教訓だった。
最終的にアルファは言語(NLP)に方向転換した。具体的には、真にゼロから学習したニューラルネットワーク——事前学習済みの埋め込みなし、Transformerのアテンションなし、LSTMなし、純粋な生の数値と勾配降下法のみ——が、大喜びの映画レビューと深く失望したレビューを区別して学習できるかどうかを確かめたかった。
データセットはIMDbの映画レビュー50,000件で、ポジティブとネガティブのセンチメントが半々に分かれている。アルファはTF-IDFベクトル化を使った——各レビューの各単語を5,000次元のスパースベクトル(ゼロが多いベクトル)に変換する技術だ。「が」や「と」のようなフィラーワードは値がゼロに近づく。しかし「傑作」や「クズ」のような感情が込もったレアな単語は、鋭いシグナルになる。言語を幾何学に還元する。
最初のアーキテクチャはかなり野心的だった:[5000 → 512 → 128 → 1]——3つの隠れ層が徐々に小さくなり、最終出力を出す前に大きな次元を抽象的な表現に圧縮しようという意図だった。理論上は深いほど良いはずだった。実際は?勾配消失。TF-IDFベクトルはあまりにもスパースだった。ゼロに近い値のこの活性化が層を何度も通過するうち、勾配の値はどんどん縮んでいった。シグナルが最初の重みに届いたころには、意味のある更新を起こすには小さすぎた。ネットワークは止まってしまった。精度は50〜76%をさまよい続け、何万件ものデータセットで学習させているのに、コインを投げるのとさほど変わらなかった。
解決策はそこそこ自尊心を傷つけるものだった:「深いほど良い」という思い込みを捨てなければならなかった。アーキテクチャを超薄型に切り詰めた:[5000 → 64 → 1]。隠れ層一つ、64ニューロンだけ。馬鹿にしているように聞こえる。しかし数学的にはこれで十分だ——十分に広い単一の隠れ層は万能関数近似器になれる。そして5,000次元のTF-IDF空間は、スパースとはいえ、適切な線形変換さえ得られれば分類できるだけのシグナルを持っている。
積極的な学習率とGPUアクセラレーションで、AINOは40,000件のレビューを1エポックあたり数秒で処理した。精度はじわじわと上がり続け、最終的に**88.88%**で安定した。
AINOはついに人間の感情を理解できるようになった。完璧ではない——ゼロから作ったモデルに完璧なものはない——しかし一貫していて、大きなフレームワークを使って作られたモデルと同等のパフォーマンスを発揮した。これはすべて、一人だけで、すべての勾配を導出し、すべてのレイヤーを書き、すべての数値的不安定性をゼロからデバッグした人間が達成したものだ。
しかし、一つのセッションで一台のノートパソコンでしか動かないフレームワークは、フレームワークではなくスクリプトだ。最後のエンジニアリング課題:永続化。ニューラルネットワークの「脳」——重み、アーキテクチャ、バックエンドのメモリタイプをすべて含む——を保存し、異なるハードウェアを持つ別のマシンで問題なく読み込み直すにはどうすればいいか?
アルファは独自のバイナリファイル形式を作った:.dit——レイヤー設定、重みテンソル、活性化関数のID、デバイス履歴を一つのポータブルファイルに格納する構造化フォーマットだ。GPUで学習させたモデルの.ditファイルをCPUのみのノートパソコンで読み込んでも、変換もコード変更も必要ない。このフォーマットがすべてを自動的に処理する。脳の転送に成功した。
フレームワークが完成し、テストされ、ポータブルになったとき、アルファは公開した。今AINOはPyPIに公開されている——世界中の誰でも一つのコマンドでインストールできる:pip install aino。GitHubでは、ドキュメントは業界標準に相当する:きれいなREADME、32分から19秒への時間ベンチマーク、各レイヤー、活性化関数、損失関数、学習モジュールの明確なAPIリファレンス。
この研究を検証し、コミュニティに何かを還元するために、アルファは実験ノートブックをKaggleに公開した:“Sentiment Analysis from Scratch: Evaluating Deep vs. Shallow Architectures”。これは単なるポートフォリオのアピールではなく、深いアーキテクチャと浅いアーキテクチャの客観的な比較であり、損失曲線、メトリクス、失敗に対する正直なポストモーテムを含んでいる。エンジニアリングプロセスのリアルなドキュメントであり、成功したモデルよりも失敗したモデルの方がずっと多くを教えてくれた。
AINOは明らかにTensorFlowではない。PyTorchでもない。そしてそれらのライバルになるつもりも最初からなかった。
しかしAINOは証明だ——現代のAIを動かすエンジンはマジックではない。PhDチームやスーパーコンピューターの予算を持つ研究室だけが触れられる神秘的なものでもない。これは純粋な数学だ。線形代数。微積分。そして一つひとつの導出を根気強くこなすエンジニアリングだ。
そして、もしあなたが自分で公式を導出する手間をかける気があるなら——打ち込むすべてのコード行に勾配の流れを感じながら、午前2時に死んだ活性化をデバッグしながら、何十行ものクラスを削除して一行の行列積に置き換えながら、自分のロジックがなぜ間違っているかを理解するためにたった4手のチェスで負けることさえ厭わないなら——あなたはただAIを使っているだけではない。
**あなたはそれを理解している。**完全に。内側から。
その理解こそが、AINOを作り上げたものだ。すべてのコード行に、その理解がある。