pageman/sutskever-30-implementations는 딥러닝 역사에서 가장 중요하다고 꼽히는 논문 30편을, 각각 하나의 Jupyter 노트북에 순수 NumPy로 구현한 교육용 저장소다. 저자(Paul "The Pageman" Pajo)가 README에 못 박은 목표는 분명하다 — "프레임워크가 숨겨 주는 것을 직접 보게 한다(Deepen understanding)". 그래서 PyTorch·TensorFlow·JAX를 일부러 쓰지 않고, 행렬 곱과 미분을 손으로 짠다.
이 "30편"에는 유명한 사연이 있다. 일리야 수츠케버(OpenAI 공동창업자·전 수석과학자)가 게임 개발자 존 카맥에게 논문 목록을 건네며 "이걸 정말로 다 익히면 오늘날 중요한 것의 90%를 알게 된다"고 말했다는 일화다. 그 목록에는 문자 단위 RNN, LSTM, AlexNet, ResNet, "Attention Is All You Need"(트랜스포머)부터 콜모고로프 복잡도·AIXI 같은 이론까지 들어 있다. 이 저장소는 그 리스트를 30개 전부(30/30) 구현 완료했다.
torch.nn.Linear처럼 이미 만들어진 부품을 가져다 쓰는 대신, 가중치 행렬을 직접 만들고 순전파·역전파 수식을 NumPy 배열 연산으로 직접 코딩하는 방식이다. 느리고 손이 많이 가지만, "프레임워크가 대체 뭘 대신 해 주고 있었는가"가 눈에 보인다. 이 저장소의 정체성이 바로 이것 — no magic(마법 금지).git clone 후 노트북을 열면 준비 과정 없이 바로 학습·시각화가 실행된다. 교육 자료로서 진입 장벽을 확 낮추는 설계다.PyTorch로 신경망을 짜는 건 밀키트 요리와 같다 — loss.backward() 한 줄이면 소스가 알아서 완성된다. 편하지만, 그 안에서 무슨 일이 일어나는지는 모른 채 지나간다. 이 저장소는 밀키트를 치우고 생재료를 내민다. 역전파를 직접 미분해서 짜고, 그래디언트가 폭발하지 않게 손수 잘라 준다.
느리고 번거롭다. 하지만 이 과정을 한 번 겪고 나면, 나중에 다시 밀키트(PyTorch)를 쓸 때 "이 한 줄이 실제로 무슨 계산을 하는지"가 훤히 보인다. 그게 수츠케버가 말한 "90%"의 정체다.
딥러닝 학습 자료는 넘쳐 나는데 이 저장소가 왜 트렌딩에 올랐을까. 이유는 세 가지가 겹쳤기 때문이다 — ① '수츠케버 30편'이라는 밈(meme)급 리스트 자체의 화제성, ② 프레임워크를 아예 걷어낸 순수 NumPy라는 희소성, ③ 말만 하고 절반쯤 하다 마는 다른 저장소들과 달리 30편을 전부 구현(100%) 완주했다는 점이다.
| 포인트 | 내용 |
|---|---|
| 정체 | 수츠케버 필독 논문 30편을 각각 NumPy로 구현한 Jupyter 노트북 30개. 문자 RNN·트랜스포머·ResNet부터 콜모고로프 복잡도 같은 이론까지. |
| 차별점 ① | 프레임워크 제로. PyTorch·TF·JAX 없이 순전파/역전파를 손으로 짜, "프레임워크가 감춘 것"을 드러낸다. |
| 차별점 ② | 즉시 실행. 각 노트북이 합성 데이터를 스스로 생성 → 데이터 다운로드 없이 클론 즉시 학습·시각화가 돈다. |
| 차별점 ③ | 18번(Relational RNN)이 플래그십. 노트북 안에 tape 기반 reverse-mode 자동미분 엔진을 직접 구현(~1,100줄) + 수치 그래디언트 검증까지. |
| 대상 독자 | "PyTorch는 쓰는데 내부는 모르겠다"는 학습자. 밑바닥 원리를 읽고 실행하며 익히려는 사람. |
이 리스트는 그 자체로 딥러닝계의 전설이다. "이것만 알면 90%"라는 한 문장이 수많은 학습자에게 "그럼 나도 이 30편만 정복하면?"이라는 동기를 심었다. 문제는 논문을 읽는 것과 구현하는 것은 하늘과 땅 차이라는 점. 이 저장소는 "읽기"를 "돌려 보기"로 바꿔 그 간극을 메운다. 리스트를 CV(AlexNet·ResNet), 시퀀스(RNN·LSTM·트랜스포머), 이론(MDL·콜모고로프·AIXI), 최신 LLM 실무(RAG·멀티토큰 예측)까지 아우르는 하나의 학습 경로로 엮은 게 강점이다.
요즘 튜토리얼의 정석은 PyTorch다. nn.MultiheadAttention 한 줄이면 어텐션이 끝난다. 그런데 이 저장소는 그 한 줄을 수십 줄로 풀어 헤친다 — scaled_dot_product_attention부터 positional_encoding, LayerNorm까지 전부 NumPy로. "편함"을 포기하는 대신 "이해"를 얻는 이 트레이드오프가, 카파시(Karpathy)의 min-char-rnn·micrograd 같은 명작 교육 자료의 계보를 잇는다.
대부분의 "논문 구현" 저장소는 실전 모델(CNN·트랜스포머)에서 멈춘다. 이 저장소는 아론슨의 복잡도 동역학, 콜모고로프 복잡도, MDL 원리, AIXI(초지능) 같은 순수 이론 논문까지 Rule 30 셀룰러 오토마타·엔트로피 시뮬레이션 같은 형태로 코드화했다. 딥러닝을 "왜 되는가"의 이론적 뿌리까지 함께 훑게 해 준다는 점이 독특하다.
냉정히 보자. "30/30 완성"은 파일이 다 있다는 뜻이지 모두 같은 깊이라는 뜻이 아니다. 대다수 노트북은 실제 대규모 학습이 아니라 순전파 데모 + 합성 데이터 + 시각화 수준이고, 완전한 학습·역전파·수치 검증까지 갖춘 건 사실상 18번(Relational RNN) 하나다. 또한 LICENSE 파일이 없어 README에 "교육용(Educational use)"이라고만 적혀 있다 — 코드를 재사용·재배포하려면 주의가 필요하다. 그리고 저자가 파는 유료 Colab 코드 링크가 상단에 걸려 있다는 점도 알아 두자. 정리하면, "정답 코드 모음"이 아니라 "직접 파고들 발판"으로 보는 게 정확하다.
이 저장소의 스택은 놀랍도록 단출하다. 화려한 의존성 트리가 아니라 "NumPy 하나로 얼마나 멀리 갈 수 있는가"를 보여 주는 게 목적이기 때문이다. 설치 안내도 README에 단 한 줄 — pip install numpy matplotlib scipy — 이 전부다.
| 영역 | 기술 · 쓰임 |
|---|---|
| 행렬 연산 | NumPy — 가중치 초기화, 순전파 np.dot, 역전파 그래디언트, np.tanh·np.exp 등 모든 수치 계산의 뼈대 |
| 시각화 | matplotlib — 학습 곡선, 어텐션 히트맵, 셀룰러 오토마타 패턴 등 노트북마다 그림으로 직관 제공 |
| 수치 유틸(일부) | scipy — 예: 18번 노트북이 scipy.special.softmax·log_softmax를 안정적 계산에 사용 |
| 실행 환경 | Jupyter Notebook — 코드·수식·그림·설명을 한 셀씩 상호작용하며 학습 |
requirements.txt·pyproject.toml·setup.py·package.json이 전부 없다. 의존성 관리 파일 자체가 없는 것이다. PyTorch·TensorFlow·JAX 어느 것도 등장하지 않는다. 이것은 실수가 아니라 선언이다 — README의 "Why NumPy-only?" 절이 그 철학을 밝힌다: (1) 프레임워크가 추상화한 것을 직접 보게 하고, (2) 모든 연산을 명시적으로 짜며, (3) 알고리즘 자체에 집중한다.
NumPy는 "자동 미분이 빠진 PyTorch"라고 생각하면 쉽다. 행렬 곱·브로드캐스팅 같은 빠른 배열 연산은 똑같이 제공하지만, 역전파를 자동으로 해 주지 않는다. 그래서 학습자는 loss.backward()가 대신 해 주던 미분 연쇄법칙을 손으로 짜야 한다. 바로 그 "손으로 짜는 경험"이 이 저장소가 파는 상품이다. NumPy는 딥러닝 원리를 가르치기에 딱 적당히 낮은 추상화 수준인 셈이다.
TrendShift 설명은 두 형제 저장소를 언급한다. pageman/sutskever-30-beyond-numpy는 이름 그대로 NumPy를 넘어선 다중 백엔드(폴리글롯) 판으로 추정되고, pageman/Sutskever-Agent는 에이전트용 버전이다. 흥미롭게도 이 저장소 안에는 18번(Relational RNN) 개발 과정에서 나온 ORCHESTRATOR_PLAN·DELIVERABLES·PHASE_3_TRAINING_SUMMARY 같은 에이전트 워크플로우 흔적 문서 14개가 남아 있어, 이 노트북들이 AI 에이전트 파이프라인으로 제작됐을 가능성을 정황상 시사한다(확증은 아님).
이 저장소에는 서버도, 빌드 파이프라인도, 복잡한 모듈 의존성도 없다. "아키텍처"는 곧 노트북 한 편이 어떻게 짜여 있는가와, 그중 가장 깊은 18번의 자동미분 엔진이 어떻게 도는가로 요약된다. 이 둘을 뜯어보자.
거의 모든 노트북이 똑같은 골격을 따른다. 데이터를 스스로 만들고 → 모델 클래스를 정의하고 → 순전파·역전파를 손으로 짜고 → 학습 루프를 돌린 뒤 → 그림으로 확인한다. 외부 파일에 의존하지 않으니 셀을 위에서 아래로 실행하기만 하면 된다.
2번 노트북(카파시의 min-char-rnn 재현)의 실제 코드를 보면 이 골격이 그대로 드러난다. 특히 backward()는 시간을 거슬러 오르는 역전파(BPTT)를 딕셔너리 캐시와 reversed()로 손수 구현한다.
class VanillaRNN:
def __init__(self, vocab_size, hidden_size):
self.Wxh = np.random.randn(hidden_size, vocab_size) * 0.01
self.Whh = np.random.randn(hidden_size, hidden_size) * 0.01
self.Why = np.random.randn(vocab_size, hidden_size) * 0.01
def forward(self, inputs, hprev):
xs, hs, ys, ps = {}, {}, {}, {}
hs[-1] = np.copy(hprev)
for t, char_idx in enumerate(inputs):
xs[t] = np.zeros((self.vocab_size, 1)); xs[t][char_idx] = 1
hs[t] = np.tanh(np.dot(self.Wxh, xs[t]) + np.dot(self.Whh, hs[t-1]) + self.bh)
ys[t] = np.dot(self.Why, hs[t]) + self.by
ps[t] = np.exp(ys[t]) / np.sum(np.exp(ys[t])) # softmax
return xs, hs, ys, ps
def backward(self, xs, hs, ps, targets): # BPTT
dhnext = np.zeros_like(hs[0])
for t in reversed(range(len(targets))): # 시간을 거슬러
dy = np.copy(ps[t]); dy[targets[t]] -= 1 # softmax+CE 미분
dh = np.dot(self.Why.T, dy) + dhnext
dhraw = (1 - hs[t] ** 2) * dh # tanh 미분
dhnext = np.dot(self.Whh.T, dhraw)
for dparam in [dWxh, dWhh, dWhy, dbh, dby]:
np.clip(dparam, -5, 5, out=dparam) # 폭발 방지
여기서 dhraw = (1 - hs[t]**2) * dh 한 줄이 바로 프레임워크가 감추던 tanh의 미분이다. PyTorch라면 자동으로 처리됐을 이 계산을 눈으로 보는 것 — 그게 이 저장소의 핵심 경험이다.
13번(Attention Is All You Need)은 어텐션을 한 줄 API가 아니라 수식 그대로 풀어 쓴다. 스케일드 닷-프로덕트 어텐션, 멀티헤드, 포지셔널 인코딩, LayerNorm까지 전부 NumPy 자급자족이다.
def scaled_dot_product_attention(Q, K, V, mask=None):
d_k = Q.shape[-1]
scores = np.dot(Q, K.T) / np.sqrt(d_k) # QKᵀ/√d_k
if mask is not None:
scores = scores + (mask * -1e9) # 마스킹
attention_weights = softmax(scores, axis=-1)
return np.dot(attention_weights, V), attention_weights
class MultiHeadAttention:
def forward(self, Q, K, V, mask=None):
for i in range(self.num_heads): # 헤드마다 명시적 루프
head_out, _ = scaled_dot_product_attention(Q[i], K[i], V[i], mask)
combined = self.combine_heads(np.stack(head_outputs, axis=0))
return np.dot(combined, self.W_o.T)
18번(Relational RNN) 노트북은 차원이 다르다. 여기엔 tape(테이프) 기반 reverse-mode 자동미분 엔진이 통째로 들어 있다 — 사실상 PyTorch autograd의 축소판을 손으로 재현한 것이다. 값과 그래디언트를 담는 Tensor, 연산을 기록하는 ComputationGraph, 그리고 각 연산이 자신의 역전파를 클로저로 등록하는 구조다.
class Tensor: # 계산 그래프의 노드 (값 + grad)
def __init__(self, data, requires_grad=True):
self.data = np.array(data, dtype=np.float64)
self.grad = np.zeros_like(self.data) if requires_grad else None
class ComputationGraph: # 연산을 기록하는 테이프
def backward(self, loss_tensor):
loss_tensor.grad = np.ones_like(loss_tensor.data)
for backward_fn, inputs, output in reversed(self.tape): # 거꾸로 재생
backward_fn(inputs, output)
def matmul_forward(A, B): # 순전파 + backward 클로저 등록
C = Tensor(A.data @ B.data)
def backward(inputs, output):
A, B = inputs; dC = output.grad
if A.requires_grad: A.grad += dC @ B.data.T # ∂/∂A
if B.requires_grad: B.grad += A.data.T @ dC # ∂/∂B
graph.record(backward, (A, B), C); return C
이 엔진 위에 sigmoid/tanh/relu/softmax(+ 각 backward), cross_entropy, 어텐션·LSTM 셀·Relational Memory를 얹고, SGD·Adam 옵티마이저와 유한차분 gradient_check()로 손으로 짠 미분이 맞는지 수치적으로 검증까지 한다. 딥러닝 프레임워크의 심장을 통째로 관찰할 수 있는, 흔치 않은 교재다.
구조는 의외로 단순하다. 모든 파일이 루트에 평면(flat)으로 놓여 있고, 하위 디렉토리가 없다. 노트북 파일명이 01_~30_으로 번호가 매겨져 그 자체가 목차 역할을 한다. 예외적으로 18번만 전용 .py 모듈·테스트·저장 모델·개발 문서를 대량으로 거느린다.
구성을 숫자로 보면 — 노트북(.ipynb) 30개, 보조 .py 17개, 문서 .md 18개, 그림 .png 17개, 저장 모델 .npz 3개. 논문은 README에서 5개 그룹(기초 1–5 / 아키텍처 6–15 / 고급 16–22 / 이론·메타 23–30)으로 묶여 학습 순서를 안내한다.
18번 주변에 몰려 있는 ORCHESTRATOR_PLAN·DELIVERABLES·PHASE 문서들은, 이 노트북 하나가 여러 단계로 나뉜 개발 프로젝트였음을 보여 준다. 나머지 29개가 "혼자 완결된 교육 노트"라면, 18번은 실제 학습·테스트·저장 모델·회귀 검증까지 갖춘 소프트웨어 프로젝트에 가깝다. 저장소를 처음 열면 18번을 정점으로, 나머지는 그 발판이라고 이해하면 길을 잃지 않는다.
먼저 전체 지도를 보자. 30편은 무작위 나열이 아니라 딥러닝의 진화 서사를 따른다. RNN이 LSTM으로, 평범한 깊은 망이 ResNet으로, 순차 처리 RNN이 병렬 어텐션(트랜스포머)으로 진화하는 흐름이 논문 순서에 녹아 있다.
| 그룹 | 대표 논문 · 배우는 핵심 |
|---|---|
| 기초 1–5 | 복잡도 동역학 · 문자 RNN(카파시) · LSTM 이해 · RNN 정규화 · MDL 프루닝 — 시퀀스 모델과 BPTT의 기본기 |
| 아키텍처 6–15 | Pointer Net · AlexNet · GPipe · ResNet · Dilated Conv · GNN · 트랜스포머 · Bahdanau 어텐션 — CV·어텐션의 핵심 구조 |
| 고급 16–22 | Relation Net · VAE · Relational RNN(자작 autodiff) · Neural Turing Machine · CTC 음성 · Scaling Laws |
| 이론·메타 23–30 | MDL 원리 · AIXI(초지능) · 콜모고로프 복잡도 · CS231n · 멀티토큰 예측 · DPR · RAG · Lost in the Middle |
프레임워크를 쓰면 평생 안 마주칠 계산을 여기서 직접 짠다 — softmax + cross-entropy의 그래디언트가 왜 (예측 - 정답)이라는 우아한 형태로 떨어지는지, tanh의 미분이 왜 (1 - h²)인지, 시간을 거슬러 그래디언트를 전파하는 BPTT가 어떻게 딕셔너리 캐시로 구현되는지. 그리고 RNN의 고질병인 그래디언트 폭발을 np.clip으로 막는 실전 처방까지. 이 경험 한 번이 나중에 PyTorch 코드를 읽는 눈을 바꾼다.
18번의 자작 엔진은 "PyTorch의 .backward()가 대체 무슨 마법인가"에 대한 완벽한 답이다. 핵심 통찰은 두 가지다 — (1) 순전파 때 모든 연산을 테이프에 기록해 두고, (2) 역전파 때 테이프를 거꾸로 재생하며 각 연산이 미리 등록해 둔 backward 클로저를 호출하면, 연쇄법칙이 자동으로 완성된다. 이 원리를 이해하면 micrograd·tinygrad 같은 미니 프레임워크나 PyTorch autograd의 소스도 읽어낼 수 있다.
교육 자료를 만들 때 가장 큰 마찰은 "데이터 준비"다. 이 저장소는 각 노트북이 필요한 데이터를 코드로 생성해 이 마찰을 없앤다. 정렬 문제, 난수 시퀀스, 인공 이미지를 즉석에서 만들어 모델을 학습시킨다. 자신이 알고리즘을 가르치는 예제를 만들 때 그대로 훔쳐 쓸 만한 패턴이다 — "외부 의존 없이 실행되는 자기완결 예제".
대부분의 학습자가 건너뛰는 부분이다. 콜모고로프 복잡도(어떤 데이터를 만드는 가장 짧은 프로그램의 길이), MDL(최소 기술 길이 = 좋은 모델은 데이터를 짧게 압축한다), AIXI(이론적 최적 지능) 같은 개념을 코드·시뮬레이션으로 만진다. "신경망이 왜 일반화되는가"를 압축·오컴의 면도날이라는 이론적 렌즈로 바라보게 해 준다.
이 저장소의 가장 큰 교훈은 특정 알고리즘이 아니라 학습 태도다 — 편리한 추상화(PyTorch)에 곧장 올라타기 전에, 적어도 한 번은 밑바닥에서 짜 보라는 것. 그 한 번이 "블랙박스를 쓰는 사람"과 "블랙박스를 이해하는 사람"을 가른다. 30편을 다 못 하더라도, 2번(char-RNN)과 13번(트랜스포머)과 18번(autodiff) 세 편만 손으로 완주해도 딥러닝을 보는 눈이 달라진다.
| 목적 | 요구사항 |
|---|---|
| 언어 · 런타임 | Python 3.x + Jupyter Notebook(또는 JupyterLab·VS Code·Colab) |
| 패키지 | pip install numpy matplotlib scipy — 이 세 개가 전부. requirements.txt조차 없음 |
| GPU | 불필요. 순수 NumPy(CPU) 연산 + 작은 합성 데이터라 노트북/일반 PC로 충분 |
| 데이터 | 다운로드 불필요. 각 노트북이 합성 데이터를 스스로 생성 → 클론 즉시 실행 |
| 디스크 | 저장소 약 6.7MB(노트북·그림·저장 모델 포함). 매우 가볍다 |
| 사전 지식 | 선형대수(행렬 곱)·미분(연쇄법칙) 기초. 파이썬·NumPy 기본 문법 |
# 1) 클론
git clone https://github.com/pageman/sutskever-30-implementations.git
cd sutskever-30-implementations
# 2) 패키지 설치 (딱 세 개)
pip install numpy matplotlib scipy
# 3) 노트북 실행 — 추천 시작점은 02번(문자 RNN)
jupyter notebook 02_char_rnn_karpathy.ipynb
# 셀을 위에서 아래로 실행하면 학습·시각화가 바로 돈다
딥러닝 예제를 돌리려다 CUDA 버전·드라이버·데이터셋 경로에서 좌절해 본 사람이 많다. 이 저장소는 그 벽이 아예 없다. NumPy 하나만 깔리면 되고, GPU도 대용량 데이터도 필요 없다. "환경 설정 30분, 학습 5초"가 아니라 "환경 설정 1분, 바로 학습"인 셈. 원리 공부에 온전히 집중할 수 있다는 게 이 단순함의 진짜 값이다.
2번 노트북을 실행해 작은 텍스트(예: 좋아하는 노래 가사)를 학습시키고, sample()로 문장을 생성해 본다. 학습이 진행될수록 출력이 무의미한 문자열에서 그럴듯한 단어로 바뀌는 과정을 관찰하라. 온도(temperature) 값을 바꿔 가며 생성이 얼마나 대담해지는지도 실험. "RNN이 다음 글자를 확률로 예측한다"를 몸으로 이해하는 게 목표.
같은 노트북에서 hidden_size·학습률·시퀀스 길이를 바꿔 loss 곡선이 어떻게 달라지는지 본다. 그래디언트 클리핑의 np.clip(dparam, -5, 5)에서 경계값 5를 0.5나 50으로 바꾸면 학습이 어떻게 망가지거나 안정되는가? "왜 클리핑이 필요한가"를 직접 체감한다.
임의의 층 하나(예: Linear 또는 tanh)를 골라, 유한차분 그래디언트 검증을 직접 구현한다: 가중치를 아주 조금(1e-5) 흔들어 loss 변화를 재고, 그 수치 미분이 손으로 짠 해석적 미분과 일치하는지 비교. 18번의 gradient_check()가 참고 예시다. "내 backward가 진짜 맞나"를 스스로 증명하는 훈련.
13번을 참고만 하고, 백지에서 scaled_dot_product_attention을 다시 구현한다. softmax의 수치 안정성(최댓값을 빼는 트릭)을 스스로 챙기고, 인과 마스크(causal mask)를 넣어 "미래를 못 보는" 어텐션을 만들어 본다. 완성되면 원본과 출력이 같은지 대조. 트랜스포머의 심장을 손에 넣는 과제.
18번의 ComputationGraph에 새로운 연산(예: exp·mean·tanh 중 없는 것)을 순전파 + backward 클로저 한 쌍으로 추가한다. 그다음 유한차분으로 그래디언트를 검증하라. 여력이 되면 이 엔진으로 작은 2층 MLP를 학습시켜 본다. "미니 PyTorch를 내 손으로 확장한다" — 이 저장소가 줄 수 있는 가장 값진 경험이다.
| 주차 | 주제 · 학습 목표 |
|---|---|
| 1주차 시퀀스 · 손 미분 | RNN·LSTM과 BPTT의 기본기. 2번(char-RNN)으로 순전파/역전파를 손으로 미분하고, 3번(LSTM)으로 게이트가 장기 기억을 어떻게 지키는지 이해. softmax+CE 미분, tanh 미분, 그래디언트 클리핑을 완전히 소화하는 게 이번 주 목표. |
| 2주차 CV · 아키텍처 | 합성곱과 깊은 망의 구조. 7번(AlexNet)으로 CNN의 기본, 10·15번(ResNet)으로 잔차 연결(residual)이 왜 깊은 망을 학습 가능하게 만드는가, 11번(Dilated Conv)으로 수용 영역 확장. "평범한 깊은 망 → ResNet" 진화 서사를 코드로 확인. |
| 3주차 어텐션 · 자동미분 | 트랜스포머와 autograd의 내부. 14번(Bahdanau)에서 13번(Self-Attention)으로 이어지는 어텐션의 계보, 그리고 18번의 자작 autodiff 엔진 정독. tape·backward 클로저·gradient check까지. 이번 주가 이 저장소의 하이라이트다. |
| 4주차 이론 · 최신 LLM | 왜 되는가 + 요즘 실무. 22번(Scaling Laws), 23·25번(MDL·콜모고로프 복잡도)으로 일반화의 이론적 뿌리를 훑고, 27·29·30번(멀티토큰 예측·RAG·Lost in the Middle)으로 현대 LLM 실무 감각까지. 30편의 큰 그림을 완성. |
reversed()로 거슬러 오르며 각 타임스텝의 그래디언트를 누적한다. 2번 노트북의 핵심.[-5, 5] 등)로 잘라 내는 처방. np.clip 한 줄로 학습 안정성을 지킨다..backward()의 원리이며, 18번이 이를 직접 구현.(backward함수, 입력, 출력)으로 기록하는 목록. 역전파 때 이 테이프를 reversed()로 되감아 각 backward 클로저를 호출한다.(예측 - 정답)이라는 깔끔한 형태로 떨어진다 — 손으로 미분하며 확인하게 된다.tanh의 도함수가 1 - tanh²라는 사실. RNN 역전파에서 dhraw = (1 - hs[t]**2) * dh로 등장하며, 프레임워크가 자동으로 해 주던 계산의 실체다.softmax(QKᵀ/√d_k)·V로 "어디에 주목할지"를 계산한다. 13번이 이를 헤드별 루프로 명시적으로 구현.x + F(x)). 그래디언트가 잘 흘러 아주 깊은 망도 학습되게 만든다. 10·15번의 주제.저장소 · 제작자
· GitHub: github.com/pageman/sutskever-30-implementations (Python / 순수 NumPy · 노트북 30개 · 교육용)
· 최신 커밋: 225cba7 (2026-03-16, "Paper 13에 Annotated Transformer 참고 자료 추가")
· 자매 저장소(별개): pageman/sutskever-30-beyond-numpy(폴리글롯 판), pageman/Sutskever-Agent(에이전트 판)
추천 시작 노트북(클론 후)
· 02_char_rnn_karpathy.ipynb — 문자 RNN + BPTT (가장 좋은 출발점)
· 13_attention_is_all_you_need.ipynb — 트랜스포머를 NumPy로
· 18_relational_rnn.ipynb — ★ 자작 autodiff 엔진(이 저장소의 정점)
배경 지식 · 원전
· The Unreasonable Effectiveness of RNNs(카파시, 2번의 원전) · micrograd(자동미분 미니 구현)
· The Annotated Transformer(13번 참고) · CS231n(26번 토대)
· Understanding LSTM Networks(Olah, 3번의 원전)
① 라이선스 없음 — LICENSE 파일이 없고 README에 "교육용"이라고만 적혀 있다. 코드를 재사용·재배포하려면 저자에게 확인 필요. ② 완성도 편차가 크다 — "30/30 완성"은 파일이 다 있다는 뜻이며, 대부분은 순전파 데모·시각화 수준이고 완전한 학습·역전파·검증을 갖춘 건 사실상 18번뿐. ③ toy 구현이다 — 원 논문의 규모·성능을 재현하는 게 아니라 핵심 아이디어를 최소 코드로 보여 준다. 실전 성능을 기대하면 안 된다. ④ 유료 링크 — README 상단에 저자가 파는 Colab 코드(gumroad) 배너가 있다. ⑤ 버전 미고정 — requirements.txt가 없어 의존성 버전이 안 잡혀 있다. 최신 NumPy에서 일부 경고가 날 수 있다. ⑥ 자매 저장소는 별개 — beyond-numpy·Sutskever-Agent는 이 저장소 안에서 참조되지 않는 다른 프로젝트다.