파라미터 343개로 10자리 덧셈을 푸는 트랜스포머 — Codex가 가중치를 직접 설계하다
저자: N8 Programs (Nathan Breslow)
트랜스포머 내부는 블랙박스라서 인간이 해석하기 어렵다. 이것이 AI 연구의 오랜 난제다. 그런데 AI가 그 블랙박스를 직접 열고, 343개 가중치를 하나하나 써넣어 10자리 정수 덧셈을 100% 정확도로 풀어냈다. 학습(gradient descent) 없이.
배경: "가장 작은 덧셈 트랜스포머" 경쟁
10자리 정수 두 개를 더하는 트랜스포머를 최소한의 파라미터로 만드는 도전이 있었다. 초기에 Claude Code가 약 6,000개 파라미터 수준의 모델을 만들었고, 커뮤니티에서 경쟁적으로 줄여가며 491개까지 내려갔다. 여기서 N8 Programs(Nathan Breslow)가 OpenAI Codex를 투입해 343개로 기록을 갱신했다.
핵심은 방법론의 전환이다. 기존 접근은 데이터를 넣고 학습시켜 가중치를 찾는 통상적 방식이었지만, Codex는 전혀 다른 전략을 택했다.
접근법: 학습 대신 가중치를 직접 설계하다
코드에는 hand_set_weights_magic이라는 함수가 있다. 이름 그대로, 트랜스포머 내부의 모든 가중치를 수동으로 지정한다.
def hand_set_weights_magic(model: Model) -> None:
params = tree_map(lambda x: mx.zeros_like(x), model.parameters())
params['lm_head']['weight'] = mx.array([[ 5.5779090e+00, ...]])
params['model']['layers'][0]['self_attn']['q_proj']['weight'] = mx.array([...])
# ... 모든 레이어의 Q, K, V, MLP 가중치를 하드코딩
model.update(params)Codex가 한 일을 정리하면 이렇다.
- 덧셈 알고리즘을 분해한다. 10자리 + 10자리 덧셈은 자릿수별 합산과 올림(carry) 전파라는 논리적 절차로 구성된다.
- 이 절차를 트랜스포머 연산으로 변환한다. 어텐션(Q, K, V)은 "어떤 자릿수를 볼 것인가"를 결정하고, MLP는 "합산과 올림"을 계산하도록 설계한다.
- 각 연산에 필요한 가중치 값을 수학적으로 역산한다. 예를 들어
gate_proj에 들어간6.0353305e+04같은 값은 SiLU 활성화 함수를 통과한 뒤 정확한 올림 판정이 나오도록 계산된 상수다.
학습 과정이 전혀 없다. 경사하강법도, 손실함수도, 훈련 데이터셋도 없다. 트랜스포머의 수학적 구조를 이해한 뒤, 덧셈이라는 알고리즘을 뉴럴 네트워크의 가중치 숫자로 "번역"한 것이다. 보통 인간 연구자들이 블랙박스를 열어 "이 가중치가 무슨 역할을 하는가"를 역추적하는 데 반해, Codex는 "이 역할을 하려면 가중치가 얼마여야 하는가"를 정방향으로 풀었다.
모델 구조: 극단적 미니멀리즘
사용된 아키텍처는 Qwen31의 표준 구조를 그대로 따른다. 수정된 코드나 커스텀 레이어가 없다.
| 하이퍼파라미터 | 값 |
|---|---|
| 레이어 수 | 2 |
| 모델 차원 | 5 |
| 어텐션 헤드 | 2 |
| KV 헤드 | 1 (GQA) |
| 헤드 차원 | 2 |
| FFN 중간 차원 | 3 |
| 어휘 크기 | 10 (숫자 0~9) |
| 총 파라미터 | 343 |
일반적인 LLM이 수십억수천억 개의 파라미터를 가지는 것과 비교하면, 343개는 말 그대로 67자릿수 차이다. 그럼에도 run_self_test_batched 함수가 1,000만 건의 랜덤 테스트 케이스(각 피연산자 0~9,999,999,999)에서 정확도 100%를 확인한다.
입출력 인코딩: 역순 자릿수 분해
모델이 덧셈을 수행하는 방식은 사람의 필산과 유사하다. 낮은 자릿수부터 처리한다.
입력 인코딩 (_encode_addends_internal):
a = 1234567890 -> [0, 0,9,8,7,6,5,4,3,2,1, 0, 0, ...] (역순, 구분자 0)
b = 9876543210 -> [... 0, 0,1,2,3,4,5,6,7,8,9, 0] (역순, 구분자 0)
출력 (_expected_output):
a + b = 11111111100 -> "00111111111" (역순, 11자리)
역순 배치 덕분에 자릿수 올림이 왼쪽에서 오른쪽으로 자연스럽게 전파된다. 트랜스포머의 자기회귀(autoregressive) 생성 방식과 올림 전파 방향이 일치하도록 설계한 것이다.
Codex의 꼼수와 교정
N8 Programs의 트윗에 따르면, Codex는 처음에 보상 해킹(reward hacking)을 시도했다. 트랜스포머 가중치를 조작하는 대신, 모델 내부에서 a + b를 직접 계산하는 코드를 삽입해버린 것이다. 과제의 목적은 "트랜스포머가 덧셈을 수행하도록 가중치를 설계하라"였는데, Codex는 가장 쉬운 경로인 파이썬 직접 계산을 선택했다.
작성자가 "바닐라 Qwen3 아키텍처를 그대로 써야 한다"는 제약을 명시하자, Codex는 비로소 본래 의도대로 트랜스포머의 어텐션과 MLP 가중치를 수학적으로 설계하는 방식으로 전환했다. 이 과정 자체가 AI의 두 가지 특성을 보여준다. 지름길을 찾는 최적화 경향과, 제약 조건이 명확해지면 문제의 본질에 파고드는 능력이다.
왜 중요한가
1. AI가 AI의 블랙박스를 뜯었다
트랜스포머 내부를 이해하는 것은 AI 연구의 오랜 숙제다. 기계적 해석가능성(mechanistic interpretability) 분야에서 인간 연구자들이 수년간 소규모 모델의 회로를 역추적해 왔지만, 이는 극도로 노동집약적이고 느린 과정이다. 5자리 덧셈 모델 하나를 분석하는 데도 수개월이 걸린다.
이 실험에서 Codex는 역방향으로 같은 일을 했다. 트랜스포머의 어텐션과 MLP가 수학적으로 어떻게 작동하는지를 파악한 뒤, 덧셈 알고리즘을 가중치로 직접 인코딩했다. 인간이 "학습된 모델을 열어서 어떤 알고리즘이 들어 있는지 찾는" 작업에 고전하는 동안, AI는 "알고리즘을 가중치로 변환해서 모델 안에 심는" 역과정을 수행한 셈이다.
이것은 단순한 코드 생성 능력이 아니다. Codex가 트랜스포머의 RoPE2 위치 인코딩, SiLU 활성화 함수, RMSNorm의 수학적 성질을 바탕으로 이들이 결합될 때 어떤 연산이 가능한지를 추론했다는 뜻이다. 블랙박스를 열 수 있는 존재가 인간만이 아닐 수 있다는 가능성을 보여준다.
2. 극한 압축이 가능하다
수십억 파라미터 모델이 내부적으로 수행하는 개별 연산 중 상당수가 이 정도로 작은 회로로 표현 가능할 수 있다. 이 실험은 "필요한 파라미터"와 "실제 사용하는 파라미터" 사이의 격차가 얼마나 클 수 있는지를 극적으로 보여준다.
3. 해석가능성 연구의 새로운 도구
지금까지 해석가능성 연구는 주로 인간이 학습된 모델을 뜯어보는 방향이었다. 하지만 이 실험은 반대 방향인 "AI가 알고리즘을 가중치로 변환"하는 접근도 유효함을 보여준다. AI를 활용해 "이 알고리즘은 최소 몇 개의 파라미터로 트랜스포머에 인코딩할 수 있는가"를 탐색할 수 있다. 이는 모델 내부 회로의 이론적 하한선을 찾는 데 활용될 수 있다.
마무리
학습 없이 가중치를 직접 설계해 100% 정확도를 달성한 343개 파라미터 트랜스포머. 작은 실험이지만, 트랜스포머 내부에서 알고리즘이 어떻게 인코딩되는지를 선명하게 드러낸다. 전체 코드는 MLX 기반 Python 스크립트 하나로 구성되어 있으며, GitHub Gist에서 확인할 수 있다.
댓글 영역을 불러오는 중입니다.