트랜스포머는 범용 미분 가능 컴퓨터다 — 카파시 강의를 2026년에 다시 보기
1. 이 글은 무엇에 관한 글인가?
안드레이 카파시(Andrej Karpathy)가 스탠포드 CS25에서 한 트랜스포머 특강 Introduction to Transformers를 보고 정리한 글입니다. 원 강의는 2023년 1월이고, 제가 본 건 한영 자막이 붙은 재업로드본입니다.
3년 전 강의를 지금 정리하는 게 이상해 보일 수 있습니다. 그런데 이 블로그가 최근에 쓴 글들을 늘어놓고 보면 이유가 분명해집니다.
스킬 거버넌스 · 스펙 쓰는 법 · 하네스 · 컨텍스트 엔지니어링
→ 전부 "모델을 어떻게 둘러쌀 것인가"에 대한 글이다둘러싸는 얘기만 계속하다 보면 둘러싸이는 물건이 무엇인지 가 흐릿해집니다. 이 강의는 그 물건을 정확히 300줄짜리 코드로 뜯어서 보여줍니다.
그리고 강의의 결론이 3년을 견뎠습니다. 한 줄로 줄이면 이렇습니다.
트랜스포머는 번역을 위한 신경망이 아니다. 표현력 있고, 최적화 가능하고, 하드웨어에서 효율적인 — 범용 미분 가능 컴퓨터다.
이 문장이 왜 예언이 됐는지가 이 글의 내용입니다.
2. 2012년 이전 — 작업마다 다른 도구였다
강의는 회고로 시작합니다. 딥러닝 이전에 AI 분야가 어떤 모양이었는지.
| 분야 | 당시의 표준 | 무엇을 손으로 했나 |
|---|---|---|
| 컴퓨터 비전 | SIFT·HOG 같은 수동 특징 + 분류기 | 특징 추출기를 사람이 설계 |
| 음성 인식 | 음향 모델 + 발음 사전 + 언어 모델 | 단계마다 다른 모델을 따로 학습 |
| 자연어 처리 | n-gram·파싱 파이프라인 | 언어학 지식을 규칙으로 인코딩 |
| 강화학습 | 작업별 정책 표현 | 상태 표현을 사람이 고름 |
핵심은 성능이 낮았다는 게 아닙니다. 분야를 옮기면 배운 게 거의 안 통했다 는 것입니다. 비전 연구자와 음성 연구자는 같은 학회에 가지 않았고, 같은 코드를 읽지 않았습니다.
2012년 AlexNet 이후 특징 추출이 학습으로 넘어갔고, 그다음 트랜스포머가 모델링 툴킷 자체를 하나로 합쳤습니다.
지금 우리가 "AI 엔지니어"라는 하나의 직군을 말할 수 있는 이유가 여기 있습니다. 2012년이었다면 그건 최소 네 개의 직군이었습니다.
3. 어텐션은 아이디어가 아니라 병목에서 나왔다
강의에서 제일 재미있는 대목은 어텐션의 탄생 비화입니다. 카파시가 드미트리 바흐다나우(Dzmitry Bahdanau)에게 직접 받은 이메일을 읽어줍니다.
문제는 이랬습니다. 당시 신경망 기계번역은 인코더가 문장 전체를 고정 길이 벡터 하나로 압축 하고, 디코더가 그걸 보고 번역했습니다.
"나는 어제 도서관에서 빌린 책을 오늘 다 읽었다"
→ [ 하나의 고정 길이 벡터 ] ← 여기가 병목
→ "I finished the book ... today"문장이 길어지면 성능이 급격히 무너졌습니다. 벡터 하나에 다 안 들어가니까요.
바흐다나우의 직관은 기술적이지 않았습니다. 사람이 번역할 때 원문을 계속 흘끔거린다 는 것. 그래서 디코더가 매 단어를 낼 때마다 원문의 어느 위치를 볼지 직접 고르게 만들었습니다.
세부 사항 두 개가 이 얘기를 좋아하게 만듭니다.
- 처음 이름은 어텐션이 아니라 RNNSearch 였습니다. 검색에 가까운 이름이었던 것
- "attention"이라는 이름은 요슈아 벤지오가 제안 했습니다. 이름이 붙자 개념이 퍼졌습니다
그리고 2017년 Attention Is All You Need가 나옵니다. 강의의 지적은 이 논문이 무언가를 더한 논문이 아니라 뺀 논문 이라는 것입니다. RNN을 들어내고 어텐션만 남겼습니다.
병목을 메우려고 만든 보조 장치가, 결국 본체를 밀어냈습니다.
더 놀라운 건 그다음입니다. 그 아키텍처가 5년 넘게 거의 안 바뀌었습니다. 의미 있는 변경이라고 할 만한 건 레이어 노멀라이제이션 위치를 블록 앞으로 옮긴 정도입니다.
4. 어텐션은 그래프 위의 메시지 전달이다
강의의 가장 값어치 있는 부분은 여기입니다. 어텐션을 수식이 아니라 통신 구조 로 설명합니다.
토큰들을 방향 그래프의 노드 로 봅니다. 각 노드는 자기 벡터를 갖고 있고, 매 레이어마다 이웃과 한 번 통신합니다. 그 통신이 어텐션입니다.
| 내놓는 것 | 의미 | 사람 말로 |
|---|---|---|
| Query | 이 노드가 찾는 것 | "나는 지금 무엇이 궁금한가" |
| Key | 이 노드가 가진 것 | "나는 무엇에 대한 정보인가" |
| Value | 이 노드가 전달할 것 | "골라준다면 이걸 주겠다" |
# 노드마다 세 개를 내놓는다
q = x @ Wq # 나는 무엇을 찾고 있는가
k = x @ Wk # 나는 무엇을 갖고 있는가
v = x @ Wv # 내가 전달할 것은 무엇인가
# 내 query와 남의 key의 내적 = 그 노드에 얼마나 주목할지
w = softmax(q @ k.T / sqrt(d))
out = w @ v # 가중 평균으로 정보를 받아온다여기서 결정적인 문장이 나옵니다.
가중치가 데이터에 따라 달라집니다. 어텐션은 고정된 배선이 아니라 매 입력마다 새로 그려지는 라우팅 입니다.
컨볼루션은 배선이 고정입니다 — 항상 옆 픽셀을 봅니다. 어텐션은 무엇을 볼지를 입력이 정합니다. 이 한 가지 차이가 뒤에 나올 확장성 전부의 원인입니다.
그리고 이 관점이 좋은 이유가 하나 더 있습니다. 아키텍처 변종이 전부 "간선을 어떻게 놓느냐"로 환원됩니다.
| 변종 | 간선 배치 |
|---|---|
| 인코더 | 모든 노드가 모든 노드를 본다 |
| 디코더 | 과거만 본다 (인과적 마스킹) |
| 크로스 어텐션 | 다른 집합의 노드를 본다 |
| ViT | 이미지 패치를 노드로 놓는다 |
5. nanoGPT — 아키텍처는 생각보다 작다
강의는 중반부터 nanoGPT를 띄워 놓고 한 줄씩 읽습니다. GPT 아키텍처 전체가 300줄 남짓입니다.
| 조각 | 하는 일 |
|---|---|
| 토큰 임베딩 | 토큰 id → 벡터 |
| 위치 임베딩 | 어텐션은 순서를 모른다. 순서를 따로 넣어준다 |
| 블록 × N | 인과적 셀프 어텐션 + MLP, 각각 잔차 연결 |
| 레이어 노름 | 블록 앞 에 붙는다(pre-LN) |
| 최종 선형층 | 벡터 → 어휘 전체에 대한 로짓 |
블록 하나의 모양은 이렇게 요약됩니다.
x = x + attention(layernorm(x)) ← 노드끼리 정보를 주고받는다 (통신)
x = x + mlp(layernorm(x)) ← 받아온 정보를 각자 소화한다 (계산)카파시가 강조하는 건 잔차 연결(residual) 입니다. x + ... 모양 덕분에 입력에서 출력까지 덧셈만으로 이어지는 길이 뚫려 있습니다. 역전파에서 기울기가 이 길을 그대로 타고 내려가기 때문에, 층을 아주 깊게 쌓아도 학습이 됩니다.
여기서 놀라야 할 것은 복잡함이 아니라 작음입니다. 우리가 "거대 언어 모델"이라 부르는 것의 거대함은 아키텍처가 아니라 파라미터 수와 데이터에 있습니다. 설계도 자체는 한 파일에 들어갑니다.
6. 인과적 마스킹 — 한 줄이 만드는 훈련 효율
디코더가 미래를 보면 안 됩니다. 다음 토큰을 맞히는 게 과제인데 답을 보고 있으면 학습이 안 되니까요.
구현은 허무할 만큼 짧습니다.
# 상삼각(미래) 위치를 -inf로 채우면 softmax 후 가중치가 0이 된다
att = att.masked_fill(tril == 0, float('-inf'))
att = softmax(att, dim=-1)강의가 짚는 포인트는 "미래를 가린다"가 아니라 그 부수 효과입니다.
| RNN | 트랜스포머 + 인과 마스킹 | |
|---|---|---|
| 시퀀스 처리 | 앞에서 뒤로 순차 | 전 위치 동시에 |
| 한 시퀀스에서 얻는 학습 신호 | 순차적으로 누적 | 길이 T면 T개를 한 번에 |
| GPU 활용 | 순차 의존 때문에 놀린다 | 큰 행렬 곱 하나로 채운다 |
길이 1024짜리 문장 하나를 넣으면, 1번째 토큰까지 보고 2번째를 맞히는 문제부터 1023번째까지 보고 1024번째를 맞히는 문제까지 1024개의 문제를 동시에 푸는 셈입니다. 마스킹 한 줄이 이걸 가능하게 합니다.
학습 효율이 이렇게 높지 않았다면, 오늘의 스케일은 애초에 불가능했을 겁니다.
7. 같은 블록이 도메인을 건너다닌다
강의 후반은 확장 사례입니다. 그리고 목록이 곧 논증입니다.
| 모델 | 도메인 | 무엇을 토큰으로 놓았나 |
|---|---|---|
| ViT | 이미지 | 16×16 패치 |
| Whisper | 음성 | 스펙트로그램 조각 |
| Decision Transformer | 강화학습 | (보상, 상태, 행동) 시퀀스 |
| AlphaFold | 단백질 | 아미노산 잔기 |
블록은 그대로입니다. 바뀐 건 무엇을 노드로 볼 것인가 하나뿐입니다.
새 분야에 트랜스포머를 붙일 때 설계해야 하는 건 아키텍처가 아니라 토큰화 입니다.
2012년 표와 나란히 놓으면 대비가 선명합니다. 분야마다 다른 도구였던 것이, 분야마다 다른 토큰 정의만 있으면 되는 것으로 바뀌었습니다.
8. GPT-3의 인컨텍스트 러닝 — 가중치를 안 고치고 배운다
강의는 GPT-3의 few-shot 능력을 다루면서 방향을 한 번 틉니다.
기존의 "배운다"는 가중치를 고치는 일이었습니다. 그런데 GPT-3는 프롬프트에 예시 몇 개를 넣으면, 가중치를 하나도 안 고치고 그 작업을 해냅니다.
sea otter → loutre de mer
cheese → fromage
plush girafe → ??? ← 학습이 아니라 순전파 안에서 일어난다카파시가 붙이는 해석이 이 강의에서 제일 멀리 가는 지점입니다.
| 바깥 루프 | 안쪽 루프 | |
|---|---|---|
| 무엇 | 사전학습 (경사하강) | 컨텍스트를 읽는 순전파 |
| 무엇이 바뀌나 | 가중치 | 활성값만 |
| 언제 | 학습 시점 | 추론 시점, 매번 |
바깥 루프가 안쪽 루프를 학습시킨 것입니다. 경사하강이 "패턴을 보고 맞춰가는 절차"를 가중치 안에 심었고, 그 절차가 순전파 안에서 돕니다. 카파시는 이걸 메타 러닝이라고 부릅니다.
이 관점을 받아들이면 실무 하나가 재해석됩니다. 컨텍스트 윈도우는 저장 공간이 아니라 프로그램이 적히는 곳입니다. 이 블로그가 컨텍스트 엔지니어링이나 스펙 쓰는 법에서 계속 말해온 것 — 프롬프트를 코드처럼 다루라는 조언 — 의 근거가 여기 있습니다. 은유가 아니라, 진짜로 거기서 계산이 일어납니다.
9. 트랜스포머가 이길 수밖에 없었던 세 가지
강의의 결론입니다. 트랜스포머가 운이 좋았던 게 아니라, 세 조건을 동시에 만족한 드문 후보였다는 것.
| 조건 | 뜻 | 트랜스포머가 갖춘 방식 |
|---|---|---|
| 표현력이 있다 | 순전파가 충분히 많은 것을 표현할 수 있다 | 데이터 의존 라우팅 + 층마다 전역 통신 |
| 최적화가 된다 | 역전파로 실제로 학습이 된다 | 잔차 연결 · 레이어 노름 · 부드러운 softmax |
| 효율적이다 | 하드웨어를 채운다 | 순차 의존이 없어 큰 행렬 곱으로 환원된다 |
세 번째가 자주 과소평가됩니다. RNN은 앞 단계 결과가 나와야 다음을 계산하니 GPU를 놀립니다. 트랜스포머는 그 의존이 없어서 하드웨어를 꽉 채웁니다.
아무리 표현력이 좋아도 학습이 안 되면 죽고, 학습이 돼도 GPU를 못 채우면 스케일에서 집니다. 셋 다 맞춘 게 드물었습니다.
그래서 강의가 트랜스포머를 범용 미분 가능 컴퓨터라고 부릅니다.
| 비유 | 의미 |
|---|---|
| 범용 | 도메인에 묶이지 않는다 (7절) |
| 미분 가능 | 데이터로 프로그래밍된다 — 사람이 짜지 않는다 |
| 컴퓨터 | 순전파가 곧 실행이다 (8절) |
10. Q&A에 남은 숙제 — 메모장
강의 말미의 Q&A에서 카파시는 앞으로 필요한 것으로 외부 메모리를 듭니다. 모델이 생각을 적어둘 메모장이 없다는 것.
2023년엔 아쉬움이었습니다. 3년 뒤에 보면, 우리가 지금 매일 쓰는 게 대체로 그 메모장입니다.
| 2023년의 아쉬움 | 2026년의 대응물 |
|---|---|
| 생각을 적어둘 곳이 없다 | 파일에 쓰는 계획·스펙·SPEC.md |
| 필요한 지식을 그때 불러올 수 없다 | 스킬 · 점진적 공개 |
| 컨텍스트가 한 덩어리다 | 서브에이전트 · 컨텍스트 분리 |
| 절차가 매번 즉흥이다 | 하네스 · 워크플로우 |
이 표가 이 글을 쓴 진짜 이유입니다. 하네스와 스킬은 아키텍처 바깥의 유행이 아니라, 아키텍처가 비워둔 칸을 메우는 물건입니다. 모델이 못 하는 걸 대신 하는 게 아니라, 모델이 안 갖고 태어난 것을 붙여주는 쪽에 가깝습니다.
11. 마무리 — 3년 전 강의가 지금 읽히는 방식
| 강의의 주장 | 2026년에 확인된 것 | |
|---|---|---|
| 1 | 도구가 하나로 합쳐졌다 | 토큰화만 정의하면 도메인이 바뀐다 |
| 2 | 어텐션은 병목에서 나왔다 | 보조 장치가 본체를 밀어냈다 |
| 3 | 어텐션은 데이터 의존 라우팅이다 | 아키텍처 변종 = 간선 배치 |
| 4 | 아키텍처는 300줄이다 | 거대함은 설계도가 아니라 스케일에 있다 |
| 5 | 순전파가 곧 실행이다 | 컨텍스트 = 저장소가 아니라 프로그램 |
| 6 | 표현력·최적화·효율을 동시에 | 후속 아키텍처들의 채점 기준이 됐다 |
| 7 | 메모장이 필요하다 | 그게 지금의 스킬·하네스다 |
이 블로그가 최근에 쓴 글들과 겹쳐 보면 자리가 분명해집니다.
- 컨텍스트 엔지니어링 — 순전파에 무엇을 적어 넣을 것인가
- 에이전트가 따르는 스펙 쓰는 법 — 그 프로그램을 무슨 모양으로 적을 것인가
- 스킬 거버넌스 — 적어둔 것을 여러 사람이 공유할 때
- 이번 글 — 그걸 읽는 물건이 애초에 어떻게 생겼는가
에이전트를 다루는 일은 갈수록 모델 바깥의 일이 됩니다. 프롬프트, 스킬, 하네스, 검증. 그래서 오히려 안쪽을 한 번쯤 정확히 아는 게 값어치가 있습니다. 컨텍스트에 규칙을 더 넣을지 말지 같은 판단이, 안쪽 모양을 알면 감이 아니라 근거가 됩니다.
300줄짜리 파일 하나를 읽는 데 한 시간이면 충분합니다.
참고 문서
- Andrej Karpathy, Stanford CS25 — Introduction to Transformers (한영 자막본) · 원본
- Stanford CS25: Transformers United
- Vaswani et al., Attention Is All You Need
- Bahdanau, Cho, Bengio, Neural Machine Translation by Jointly Learning to Align and Translate
- Karpathy, nanoGPT
- 이전 글 — 에이전트가 따르는 스펙 쓰는 법 · 스킬 거버넌스 · 컨텍스트 엔지니어링