Handwired — JavaScript-логика в виде дифференцируемой нейросети
Handwired показывает, как представить логику JavaScript в виде нейросетевых вычислений: без обучения для точного поведения в заданных пределах и с возможностью дообучать отдельные параметры.
Handwired — экспериментальная библиотека, которая представляет логику обычной программы как набор нейросетевых вычислений. Условия, циклы и состояние кодируются числовыми операциями, а затем исполняются в JavaScript или, для некоторых задач, на WebGPU. Автор проекта показывает на примерах, что такая схема может воспроизводить заданное поведение без обучения, а её параметры при желании можно разморозить и оптимизировать.
Идея звучит как автоматический перевод JavaScript в нейросеть, но нынешний Handwired устроен иначе: разработчик вручную описывает вычислительную схему через функции библиотеки. Обычная JavaScript-версия может служить эталоном для сравнения, однако проект не берёт произвольный файл .js и не превращает его в нейросеть одной командой.
- Как программа становится вычислительной схемой
- Условия и циклы задаются через числовые операции
- Дифференцируемость позволяет обучать параметры
- Демонстрации Handwired
- Мини-операционная система с обычными веб-элементами
- Галерея с обучаемым размещением
- Поиск по JSON с использованием WebGPU
- Что означает «точный результат»
- Логические решения и числа — не одно и то же
- Запуск и статус проекта
- Попробовать в браузере или запустить локально
Как программа становится вычислительной схемой
Условия и циклы задаются через числовые операции
В Handwired логика выражается через матричные умножения, смещения и функции активации. Например, условие можно представить как выбор одного из двух результатов в зависимости от входного значения. Веса схемы задаются вручную так, чтобы получить нужное поведение, поэтому для исполнения такого варианта не нужен этап обучения.
Важное ограничение: схему проектируют для определённых входов и диапазонов состояний. Это не универсальный способ автоматически перенести любую программу с её библиотеками, вводом-выводом и произвольными ветвлениями.
Дифференцируемость позволяет обучать параметры
Поскольку вычисления построены из операций, для которых можно посчитать градиенты, часть весов можно разрешить менять и оптимизировать по функции ошибки. В демонстрации с фотогалереей пользователь двигает прямоугольники, а расположение изображений подстраивается во время работы. Это отдельный режим эксперимента: базовая схема сначала задаётся вручную, а обучение меняет выбранные параметры.
Демонстрации Handwired
Мини-операционная система с обычными веб-элементами
В демо Mini OS интерфейс состоит из обычных элементов DOM: окон, текста и панелей. При этом управляющая логика представлена числовой схемой. В опубликованной демонстрации автор указывает 9 909 весов, 130 слоёв и отсутствие обучения для этого примера. Это наглядная иллюстрация проекта, а не заявление о готовой замене нейросетями операционных систем или производственных интерфейсов.
Галерея с обучаемым размещением
В галерее можно менять прямоугольники и наблюдать, как изображения учатся располагаться в новой композиции. Параметров здесь мало, поэтому автор демонстрирует обновление прямо в браузере с помощью JavaScript, без отдельной видеокарты.
Поиск по JSON с использованием WebGPU
Ещё один пример преобразует логику поиска по структурированным данным в вычисления, подходящие для параллельного запуска через WebGPU. В демонстрации объединены сопоставление по регулярному выражению, разбор JSON и подсветка совпадений. Это показывает, как автор исследует применение числовых схем к задачам, которые обычно пишут традиционным кодом; универсального ускорения любых JavaScript-программ проект не обещает.
Что означает «точный результат»
Логические решения и числа — не одно и то же
Для заданных диапазонов входов схема может точно воспроизводить выбранную логику, например результат сравнения или ветвления. Однако вычисления с плавающей точкой выполняются в формате FP32, тогда как JavaScript обычно использует числа двойной точности. Поэтому в численных значениях, например координатах анимации, возможны небольшие расхождения округления. Точность нужно проверять на тех входах и пределах, для которых предназначена конкретная схема.
Таким образом, «без обучения» относится к вручную настроенным весам конкретной программы. А «дифференцируемая» означает, что параметры схемы можно менять методом оптимизации, если автор сценария хочет поэкспериментировать с обучением.
Запуск и статус проекта
Попробовать в браузере или запустить локально
На странице проекта доступны примеры и интерактивные демо. Для локального запуска репозиторий предлагает установить Bun, клонировать исходный код, выполнить bun install и запустить bun start. В репозитории также опубликовано руководство, которое пошагово показывает, как собрать простую схему.
Handwired распространяется по лицензии MIT. Проект стоит воспринимать как исследовательский эксперимент о границе между обычным программированием и дифференцируемыми вычислениями. Он интересен разработчикам, которые изучают нейросетевые представления программ, автоматическую настройку параметров и вычисления в браузере, но не заменяет привычный JavaScript-компилятор или готовый фреймворк машинного обучения.
Материалы проекта: исходный код Handwired и руководство с туториалом.