chenglou/handwired
Turn your regular JavaScript code into a neural net.
Handwired
Handwired は、通常の JavaScript プログラム(if-else、ループ、単純な算術で構成)を、行列乗算と ReLU 活性化のみで表現される完全に微分可能な計算に書き換えるライブラリです。結果のプログラムはこれら 2 つのプリミティブのみを使用するため、CPU、WebGPU、または行列演算を高速化する任意のハードウェアで実行でき、トレーニング時の重み学習なしで計算全体が微分可能なままです。
仕組み
- ソースの解析 – Handwired は JavaScript 関数の制御フローを分析します。
- 分岐を算術に置き換え – 条件文は ReLU トリック(
Math.max(0, x))を使用して線形結合として表現されます。例:a > 4は、真のとき1、偽のとき0の値になります。 - 操作の収集 – すべての加算、乗算、ReLU が単一の大きな行列乗算式に集約されます。
- 実行 – 結果の行列プログラムは JavaScript で直接実行するか、WebGPU にディスパッチして GPU アクセラレーション実行が可能です。
変換は正確(近似なし)であり、「重み」は元のコードにすでに存在する定数であるため、プログラムはそのまま微分可能です。
重要性
- レガシー JavaScript ロジックのエンドツーエンドの微分可能性により、勾配ベースの実験(定数の微調整、プログラムを学習可能なニューラルネットワークに接続するなど)が可能になります。
- 元々シングルスレッドだったコードの GPU レベルの並列性により、大規模な検索が可能になります(リポジトリでは、10 万ドキュメントの JSON 検索をミリ秒単位で実行することを実証)。
- トレーニング不要 – 「重み」は元の数値リテラルであるため、すぐに機能するモデルが得られます。
例
// 元のコード
const a = 5
const result = (a > 4) ? 10 : 12
Handwired は次のように書き換えます:
const a = 5
// ReLU ベースの分岐セレクタ
const above4 = Math.max(0, a - 4) - Math.max(0, a - 5)
// 両方の分岐が計算され、ブレンドされる
const result = above4 * 10 + (1 - above4) * 12
すべての操作は線形 + ReLU になり、行列乗算実行の準備が整います。
はじめに
# リポジトリをクローンして依存関係をインストール(bun を使用)
git clone https://github.com/chenglou/handwired.git
cd handwired
bun install
# ローカルでデモサーバーを実行
bun start
- ライブデモは https://chenglou.me/handwired/ でもホストされています。
- ソースは
src/、ドキュメントはdocs/、テンプレートプロジェクトはtemplate/にあります。 - 古い実験コードは
lab/フォルダにあります。
ユースケースのアイデア
- 定数を解凍してトレーニングし、勾配が何を達成できるかを確認します。
- ハイブリッドモデル:Handwired 変換プログラムをトレーニング可能なニューラルネット(例:小さな GPT)に接続し、システム全体をエンドツーエンドでトレーニングします。
- 高性能検索:大規模データセットに対して、従来の JavaScript ロジック(JSON フィルタリングなど)を GPU 速度で実行します。
ライセンスと貢献
リポジトリはオープンソースです。詳細は LICENSE ファイルを参照してください。プルリクエストによる貢献を歓迎します。
関連
- プロジェクト
- プロジェクト
- プロジェクト
- プロジェクト