
Handwiredとは?
Handwiredは、トレーニングを必要とせずに、通常のJavaScriptコードをニューラルネットワークのような計算へ変換します。プログラムを通常の制御フローとして表現する代わりに、条件分岐、ループ、状態などのロジックを、浮動小数点値に対する行列乗算とreglu演算へ変換します。
変換後のプログラムは完全に微分可能なままですが、重みは学習されるのではなく手動で記述されます。Handwiredでは、これらの計算をJavaScriptまたはWebGPUで実行できます。

なぜプログラムをニューラル計算へ変換するのか?
Handwiredは、プログラムの動作を主に加算、乗算、ReLU形式の演算という、少数の数学的プリミティブへ還元します。このアプローチには、次のような興味深い特性があります。
- プログラム全体が微分可能なままになります。
- 重みは手動で記述されるため、トレーニングする必要がありません。
- 融合、スパース性、演算の並べ替えなどのGPU最適化を、簡略化された計算に適用できます。
- この形式で表現すれば、従来のJavaScriptコードでもGPUレベルの並列性を実現できる可能性があります。
このプロジェクトは実験的な可能性も生み出します。手動で定義した重みを凍結解除してトレーニングによる変化を調べたり、凍結したプログラムを汎用ニューラルネットワークに接続して、統合システムをエンドツーエンドで学習させたりできます。
プロジェクトをセットアップする
Handwiredには、実装をローカルで調べるためのライブデモとソースコードが含まれています。システムにBunをインストールしておく必要があります。
- Handwiredリポジトリをクローンします。
- プロジェクトディレクトリに移動します。
bun installで依存関係をインストールします。bun startでローカルデモを起動します。
git clone <handwired-repository-url>
cd handwired
bun install
bun startプロジェクトを起動したら、Bunが表示するローカルアドレスを使ってデモを確認します。chenglou.me/handwiredでホストされているデモも試せます。
基本変換を理解する
単純なJavaScriptの条件分岐を考えてみましょう。
const a = 5
const result = (a > 4) ? 10 : 12Handwiredは条件を算術演算で表現します。整数値に対して、次のReLU演算の差分は、a > 4のとき1、a <= 4のとき0になるセレクターを生成します。
const a = 5
const above4 = Math.max(0, a - 4) - Math.max(0, a - 5)
const result = above4 * 10 + (1 - above4) * 12両方の分岐が計算されますが、above4が適切な結果を選択します。a = 5の場合、セレクターは1になるため、最終値は10となり、元の条件式と一致します。
数学的表現の仕組み
核心となる考え方は、分岐を連続的な算術プリミティブで置き換えることです。条件分岐は、次の組み合わせになります。

- 入力からセレクターを構成するReLU演算。
- 各分岐にセレクターを適用する乗算。
- 分岐の結果を組み合わせる加算。
これらの演算をまとめると、Handwiredは関連する活性化演算を伴う大規模な行列乗算として計算を表現できます。その後、同じプログラムをJavaScriptまたはWebGPUで評価できます。
両方の分岐が計算され、セレクターが出力に寄与する結果を選択します。
リポジトリを調べる
プロジェクトを進める際は、READMEで紹介されているディレクトリから始めましょう。
docs/には、プロジェクトを理解するためのドキュメントと資料があります。src/には実装があります。template/には、プロジェクトに慣れるための出発点が用意されています。lab/には古い実験があり、調べることも無視することもできます。
実践的な手順としては、まずデモを実行し、その動作を関連するソースファイルと比較します。これにより、目に見える例と、行列演算への基礎変換を結び付けて理解できます。
デモを試す
ホストされているデモは、Handwiredの動作を確認する最速の方法です。プロジェクトの説明では、100,000件のドキュメントを数ミリ秒で処理するJSON検索デモが特に紹介されています。これは、従来のシングルスレッド形式で記述されたコードに大規模な並列性をもたらすという、プロジェクトの目標を示しています。
デモを使って、元のプログラム構造と生成された数学的表現の違いを観察しましょう。ローカルのソースを変更する前の出発点としても役立ちます。
発展的なアイデア
学習可能な重みを試す
Handwiredは通常、手動で記述した重みを使用するため、プログラムを動作させるのにトレーニングは必要ありません。プロジェクトが提案する実験の1つは、それらの重みを凍結解除し、最適化プロセスによって何が生成されるかを確認することです。
凍結したプログラムをニューラルネットワークと組み合わせる
もう1つの可能性は、特定の凍結したHandwiredプログラムを汎用ニューラルネットワークに接続し、統合システムをエンドツーエンドで学習させることです。これにより、モデルは正確に定義されたプログラムを保持しながら、他の動作を学習できる可能性があります。
プリミティブ演算で考える
実験を設計する際は、制御フローを加算、乗算、ReLU形式の演算でどのように表現できるかに注目してください。結果として得られる計算が単純であるほど、融合、スパース性、並べ替えなどの技術から直接的に恩恵を受けやすくなります。
まとめ
Handwiredは、通常のJavaScriptロジックを微分可能な数学的計算へ書き換えられることを示します。制御フローを算術セレクターに置き換え、結果を行列乗算と活性化演算の組み合わせに還元することで、従来のプログラムをニューラルネットワークの手法や、JavaScriptおよびWebGPUでの実行に対応させます。Bunでインストールしてデモを試し、docs/、src/、template/を確認して実験を始めてください。
