Diary - Weight-Space Programming 느낀점
08 Nov 2026최근에 동료분들과 커피를 마시다가 Sparks of Weight-Space Programming: LLMs can natively read & write neural network weights 글에 대한 이야기가 나왔다. 학습 없이 벤치마크 스코어를 올렸다고? 안읽어볼 수 없지. 마침 프로젝트도 좀 널널해져서, 오랜만에 글을 읽고 느낀점을 정리해본다.
차근차근 읽어보기
저자들은 GPT-6 Astra에게 모델 parameter를 텍스트로 주거나 Python 세션으로 읽을 수 있도록 하고, 학습(gradient descent) 없이 “모델 목적 맞추기”, “모델 성능 고치기”, “모델 만들기” 세 가지 분류의 문제들을 풀게 시켰다.
| 종류 | 실험 | 결과 |
|---|---|---|
| 모델 목적 맞추기 | Exp1 어떤 게임을 풀기 위한 모델인가 | 4/4 정답 |
| 모델 목적 맞추기 | Exp2 DDPM, 어떤 도형을 그리는 모델인가 | 정답 (단, 윤곽선으로 그림) |
| 모델 목적 맞추기 | Exp3 어떤 언어로 학습된 모델인가 | 3/3, 복사 헤드 전부 찾음 |
| 모델 목적 맞추기 | Exp7 sycophancy 모델인가 | 가중치만으로 실패, attention 패턴을 주면 성공 |
| 모델 성능 고치기 | Exp4 Kinetix 자동차 문제 (local minima) | 가중치 3.5% 수정, 성공률 0% → 100% |
| 모델 성능 고치기 | Exp8 Qwen3.5-0.8B 수학 (repetition) | 가중치 0.016% 수정, MATH-500 7.9% → 48.1% |
| 모델 만들기 | Exp5 MinAtar 게임 3종 모델 | PPO 100M 스텝보다 모두 높음 |
| 모델 만들기 | Exp6 9×9 바둑 모델 | forward pass 50번으로 같은 크기 PPO를 이김 |
처음에 이 본문을 AI한테 요약하라고 했던 결과를 봤을 때는, “오 이런게 된다고?” 싶었다. 근데 원문을 차근차근 읽으면서, Astra에게 시켰던 프롬프트와 모델의 답변을 봤을 때에는, neural network에 대해 알고 있는 사람이라면 생각보다 쉬운 문제들이었다는 사실을 알게 되었다.
Neural net은 사실 if 문과 같다.
2019년 딥러닝을 처음 배웠던 “머신러닝을 위한 기초 수학 및 프로그래밍 실습” 수업으로 돌아가보겠다. 첫 주차 수업에서 logistic regression이라는 것에 대해서 배웠다. σ(w·x + b)으로 이루어지는 perceptron을 통해 데이터를 구분해내는 경계선을 찾아내는 것. AND나 OR gate들은 단일 층 모델의 logistic regression으로 풀 수 있지만, XOR gate는 2개의 층이 필요하다는 개념이 아직도 기억난다.
결국 perceptron이라는 것은 “어떤 선형 경계의 어느 쪽에 있는가”를 판정하는 것이고, 이는 if문으로 무언가를 구별하는 것과 마찬가지다. 따라서 MLP(Multi Layer Perceptron)로 이루어지는 neural net은 if문의 무수한 중첩으로 이루어진 모델인 것이다. 그러나 neural net이 실제 if문으로 짜여진 코드와 다른 점은, 어떤 가중치가 어떤 if문을 의미하는지 알 수 없다는 점이다. 그것이 neural net을 blackbox라고 부르는 이유다.
그래서 blackbox는 아예 분석이 불가능한 것인가 라고 하면 그렇지만도 않다. 사람의 뇌는 neural net과 유사한 방식을 가지고 있다. neuron activation의 무수한 조합으로 지능을 만들어냈으나, 각각의 neuron activation의 의미를 분석해낼 수는 없다. 그러나 혈류 분석이나 뇌파 분석과 같은 어떤 장비를 통해서, 뇌의 특정 부분이 어떤 도메인이나 상황에서 활성화되는지 알 수 있다. Neural net도 마찬가지다. Weight-space programming 글은 이 부분들을 아주 잘 이용한다면 neural net을 학습없이도 조금은 컨트롤 할 수 있음을 주장하고 있는 것이다.
실험별로 다시 보기
Exp1, Exp2, Exp7: 작은 모델에서만 가능한 weight importance
Exp1에서 특정 채널의 1층 가중치가 맨 아래 줄에 몰려 있음으로부터 Breakout을 푸는 모델임을 추론한 것은, 게임에 대한 지식이 있기만 하다면 크게 어렵지 않은 추론이다. Exp2에서 출력층 각 뉴런의 픽셀 가중치를 12×12로 펼치면 도형의 테두리 조각이 나온다. 이건 CNN 시절에 필터나 채널 heatmap을 보고 그 채널이 어떤 feature를 잡는지 알아내던 것과 같은 작업이다.
결국 heatmap을 가지고 모델을 분석하는것과 같은 것인데, 문제는 확장성이 있냐는 것이다. 단순한 feature는 한 뉴런에 깔끔하게 대응하지만, 복잡한 feature는 여러 뉴런이 중첩되어 영향을 미치기 때문에 그 영향도를 쉽게 알아낼 수 없다.
실제로 언어모델(Gemma 270M)을 사용해 어떤 모델이 sycophancy를 하도록 학습된 모델인지 구별해내는 Exp7에서, Astra는 가중치만으로는 4번 모두 실패했다. 가중치만으로는 앞쪽에 있는 정확히 위치를 알 수 없는 특정 토큰(사용자가 제시한 답) 에 attention이 자주 걸릴지 아닐지 판단 할 수 없는 것이다.
Exp3: Transformer 모델에 대한 prior knowledge
잘 학습된 Transformer모델의 attention head에는 “previous token head”, “induction head” 같은 기능을 하는 head가 존재한다. 이 사실을 알면 기능을 찾는 것 자체가 어렵지 않다. Previous token head는 위치 패턴으로 보이고, induction head는 그 헤드의 출력 행렬과 다음 헤드의 입력 행렬을 곱해 보면 바로 알 수 있다.
특정 기능을 하는 head가 몇개나 있는지 찾고 나면, 모델이 어떤 언어로 학습되었는지 추론할 수도 있다. 코드는 변수 이름을 반복하니 copy head가 많고, 영어는 단어가 토큰의 합으로 이루어지는 경우가 많다보니 previous head가 생긴다. 이런 것들로 코드와 영어, 일본어 모델 정도는 구분이 가능한 것이다. 이 서로 다른 기능을 하는 attention head들에 관한 사전 연구와 지식들이 알려져 있지 않았다면 astra는 과연 이 문제를 풀 수 있었을까?
Exp4: 행동 하나를 끼워 넣는 일
학습된 PPO 정책은 앞으로만 그냥 돌진해서 멈추는 local minima에 빠져 있었다. Optimal 모델이 해야 할 액션은 “먼저 뒤로 가서 활주 거리를 확보한 뒤 앞으로 가는 것”이다. 이렇게 문제를 재정의하고 나서 보면 사실 난이도가 크게 내려간다.
Astra가 한 일은 기존 모델의 weight에서 차가 앞으로 가게 만드는 weight가 어디인지 파악한 뒤에, 차의 위치와 속도를 읽는 작은 별도 경로를 추가한 것이다. 이 경로는 바퀴가 빨간 띠를 지나기 전까지 후진 행동을 강하게 밀고, 지나면 꺼진다. 그 뒤는 원래 모델의 아웃풋으로 돌아간다. 다시 말해 if 위치 < 특정 기준: 후진 이라는 if 문 하나를 기존 network에 덧댄 것이다.
이 정도는 비선형이 좀 있어도 어렵지 않다. tanh이든 ReLU든 아무튼 단조함수라서, 특정 상태 영역에서 한 출력 logit을 압도하는 경로를 더하면 그 영역의 행동을 통째로 바꿀 수 있다. 어려워지는 건 여러 행동을 서로 다른 상태 조합에서 섞어야 할 때다. 그때는 새로 넣은 경로와 기존 망이 서로 간섭하고, 어느 가중치가 어느 행동에 기여하는지 분리하기 힘들어진다. 학습된 PPO 모델은 앞으로 가는 액션 하나만 만들어내고 있었기 때문에 해당 weight들을 분리할 수 있었지만, 특정 시점마다 앞뒤로 왔다갔다 하는 모델이었다면 weight만 보고는 분리해내기 어려웠을 것이다.
Exp5, Exp6: 규칙이 명확한 게임은 if 문으로 짤 수 있다
Breakout은 “공이 떨어질 곳으로 패들을 옮긴다”라는 로직만 제대로 구현하면 완벽하게 해결할 수 있는 문제다. Seaquest와 Asterix는 조금 복잡하지만, 결국 상하좌우 이동과 가장 가까운 위험/보상 물체를 보는 규칙으로 꽤 높은 점수를 받을 수 있다. 이런 게임들은 if문 알고리즘으로 짜도 점수를 꽤 받는다. 따라서 if 문으로 쓸 수 있는 전략이라면, weight space에서 구현해내는 것은 어렵지 않다. 그 반대가 어려운 것이다.
| 게임 | PPO 100M | PPO 500M | Astra |
|---|---|---|---|
| Breakout | 15.8 | 25.3 | 517.4 |
| Seaquest | 5.6 | 88.9 | 53.1 |
| Asterix | 25.8 | 55.2 | 53.2 |
점수를 보면 좀 더 명확한데, breakout처럼 규칙이 단순하면 Astra가 짠 모델이 PPO를 압도한다. Seaquest처럼 상황이 많아지면 if 문이 처리하지 못하는 경우들이 생기고, 거기서 점수를 잃는다.
9×9 바둑도 마찬가지다. 당연히 이세돌을 이길만한 모델을 바로 만들 수는 없지만, 기본적으로 동작하는 봇 정도는 만들 수 있다. “잡을 수 있으면 잡는다, 단수면 살린다, 자기 눈은 메우지 않는다” 같은 기본적인 바둑 규칙들을 if문으로 구현만 해내면, 어느 정도 실력은 만들어 낼 수 있다. weight만 보는 것이 아닌 forward pass를 허용하면 여기에 탐색이 더해진다. 연습 대국을 두고, 어떻게 졌는지 보고, 그 원인이 되는 부분을 고치고, 더 이기면 남긴다. 어떤 weight로 if 문을 만들었는지 알고 있는 상태이기 때문에, 현재 if문 조합 로직이 동작하지 않는 상황을 찾아 고치는 과정을 하는 것이다. 이건 마치 사람이 test case를 돌려보며 디버깅하는 것과 같다.
Exp8: 반복을 제거, 지능을 올리지는 못함
Qwen3.5-0.8B 모델의 Math-500 벤치마크 결과를 7.9%에서 48.1%로 올렸다. 근데 성능을 올린게 아니라 repetition을 고친 것이다. 기본 모델은 MATH-500 답의 93%가 32K 토큰 한도에 도달해서 답을 내지 못했는데, reasoning에서 문장 반복이 일어났기 때문이다. 작은 모델일 수록 긴 reasoning trace를 만들다보면 이런 repetition 문제가 자주 발생한다.
Astra는 이 repetition이 15th/19th MLP layer에서 발생하는 activation을 원인으로 추적했고, 이를 제거했다. 이건 refusal이 특정 activation direction으로 매개된다는 Refusal in Language Models Is Mediated by a Single Direction 방법론을 사용한 것인데, safety 관련 행동을 몇 번의 forward pass로 찾아 끄는 abliteration과 같은 방식이다.
실제 abliteration도 약 30~50개 정도의 forward pass가 필요한데, refusal 실험도 50번정도 forward pass를 시도해서 33%로 떨어뜨렸다. 그리고 반복이 거의 없는 Gemma 3 270M에서는 50번을 써도 MATH-500이 6.8%에서 7.0%로 거의 변하지 않았다. 따라서 지능을 더할 수는 없지만, 특정 현상을 제거하는 데에는 효과적으로 사용할 수 있다고 보인다.
4. 종합
이 글에서 제시된 모든 실험은 원래 학습 없이 풀 수 있는 것이다. 당연히 암산으로는 못풀지만, ML엔지니어에게 충분한 시간과 적절한 prior knowledge가 주어진다면 알고리즘으로도 짤 수 있는 문제들이라는 것이다. “Astra가 이정도까지 한다”를 보여주기에는 충분한 쇼케이스겠지만 말이다.
아무튼 이게 Weight-Space Programming이라는 이름을 붙일 것 까지야 있나 싶다. 다만 과적합되기 쉽고 소수의 가중치에 몰려 있는 특정 행동 (repetition, refusal, sycophancy) 같은 것을 찾고 제어하는 것을 Astra 딸깍으로 해결할 수 있다는 점은 LLM 엔지니어들에게 큰 도움이 되지 않을까 싶다. 실제로 2023-2025년 동안 LLM 개발하면서 repetition, refusal, sycophancy가 항상 문제가 되어 왔었다. 그 때마다 데이터 driven 방식으로 해결하려고 사람들 시켜서 데이터 모으고 온갖 짓을 다했던 기억이 새록새록 나는데, 딸깍으로 된다고 하니 약간 기분이 나쁠 지경이다.