Handwired, 평범한 자바스크립트를 미분 가능한 신경망으로 컴파일한다

Hacker News11일 전조회 1

Handwired는 개발자가 이미 쓰고 있는 자바스크립트 코드를 신경망 형태로 바꿔주는 도구다. Show HN 게시물로 소개됐으며, 핵심은 별도의 모델 정의 언어나 프레임워크를 새로 배우지 않고도 기존 JS 로직을 미분 가능한 계산 그래프로 컴파일한다는 점이다. 실행 환경도 가벼워서 GPU 없이 브라우저 안에서 그대로 돌아간다.

원문이 든 예시는 조건 분기를 relu로 표현하는 방식이다. `relu(a - 4) - relu(a - 5)`처럼 경계를 relu 두 개의 차이로 만들면, 값이 4와 5 사이일 때 1에 가까운 값이 나오고 그 밖에서는 0이 된다. 이 값을 `above4 * 10 + (1 - above4) * 12`에 넣으면 if 문 없이도 두 구간을 부드럽게 오가는 계산이 되고, 동시에 미분이 가능한 상태로 남는다. 딱 떨어지는 정확한 계산과 역전파를 위한 미분 가능성을 함께 가져가려는 설계다.

적용 범위는 단순한 수식에 그치지 않는다. 원문에 따르면 JS로 작성된 작은 데스크톱 애플리케이션 하나가 Handwired로 변환됐는데, 여기에는 대량의 리스트, 애니메이션, 스태킹, 스크롤, 드래그, 입력 처리, 이미지가 모두 포함되며 렌더링은 평범한 DOM으로 이뤄진다. 즉 UI를 그리는 코드 자체가 변환 대상이 된다.

학습도 가능하다. 컴파일된 프로그램의 가중치를 unfreeze(고정 해제)해서 실시간으로 훈련시킬 수 있다고 설명한다. 여기에 더해 정규식 매칭, JSON 파싱, 하이라이팅처럼 전통적으로 CPU 분기를 많이 타던 로직을 JS로 작성한 뒤 WebGPU 커널로 바꿔 대규모 병렬 처리를 하도록 만드는 경로도 제시된다.

배경에는 "미분 가능한 프로그래밍"이라는 흐름이 있다. 신경망을 별도 프레임워크의 층(layer)으로 쌓는 대신, 평범한 프로그램을 그대로 미분 가능한 그래프로 컴파일해서 학습 대상으로 삼겠다는 발상이다. 여기에 WebGPU가 브라우저에서 범용 병렬 연산을 가능하게 하면서, 별도 GPU 서버 없이 클라이언트에서 도는 계산 그래프라는 조합이 현실적인 선택지가 됐다.

개발자 입장에서 눈에 띄는 지점은 경계가 흐려진다는 것이다. 지금까지는 화면을 그리는 UI 코드와 학습되는 모델 코드가 서로 다른 세계에 있었지만, 이 방식에서는 같은 자바스크립트 소스가 렌더링 로직이면서 동시에 학습 가능한 파라미터를 품은 그래프가 된다. 기존 코드를 버리지 않고 일부 가중치만 풀어서 튜닝하는 식의 작업이 가능해진다는 뜻이다.

다만 원문은 성능 수치나 지원 범위, 어떤 자바스크립트 문법까지 변환되는지에 대한 구체적인 조건을 제시하지 않는다. 브라우저에서 GPU 없이 동작한다는 전제와, 학습 없이도 정확한 계산이 된다는 성질이 이 도구의 핵심 주장이므로, 실제 도입 전에는 자신의 코드가 어디까지 변환되는지 직접 확인하는 편이 안전하다.