TrendShift 딥다이브 · 2026-07-17 · Daily #19

pageman/sutskever-30-implementations 딥다이브
— 수츠케버가 고른 "딥러닝의 90%" 논문 30편을 순수 NumPy로 밑바닥부터

sutskever-30-implementations는 일리야 수츠케버(Ilya Sutskever)가 존 카맥에게 "이것만 제대로 익히면 딥러닝에서 중요한 것의 90%를 알게 된다"며 건넸다는 전설의 논문 30편을, PyTorch·TensorFlow 없이 오직 NumPy로 밑바닥부터 구현한 교육용 Jupyter 노트북 모음이다. 가장 먼저 각인할 발상 — 프레임워크가 자동으로 해 주던 순전파·역전파를 손으로 직접 짜 본다. 특히 18번(Relational RNN)은 NumPy로 만든 자작 자동미분(autodiff) 엔진까지 담고 있다. 이 문서는 소스를 직접 클론해 "이 저장소에서 무엇을 배울 수 있는가"를 파고든다. (저장소: pageman/sutskever-30-implementations · Python / 순수 NumPy · 노트북 30개(30/30 완성) · 라이선스 미지정(교육용) · 최신 커밋 2026-03-16 · TrendShift Daily #19)
목차
  1. 프로젝트 한 줄 요약
  2. 왜 지금 주목받는가
  3. 기술 스택 전체 지도
  4. 아키텍처 심화 분석
  5. 디렉토리 구조 해부
  6. 학습 포인트
  7. 시스템 · 실행 요구사항
  8. 직접 해볼 수 있는 실습 과제
  9. 관련 기술 심화 학습 로드맵
  10. 핵심 키워드 사전
  11. 참고 링크

1프로젝트 한 줄 요약

수츠케버의 "필독 논문 30편"을 프레임워크 없이 NumPy로 하나하나 재현한 교육 노트북

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) 구현 완료했다.

핵심 용어 · 이게 뭐냐
밑바닥부터 구현(from scratch) — 프레임워크 없이 손으로
from scratchtorch.nn.Linear처럼 이미 만들어진 부품을 가져다 쓰는 대신, 가중치 행렬을 직접 만들고 순전파·역전파 수식을 NumPy 배열 연산으로 직접 코딩하는 방식이다. 느리고 손이 많이 가지만, "프레임워크가 대체 뭘 대신 해 주고 있었는가"가 눈에 보인다. 이 저장소의 정체성이 바로 이것 — no magic(마법 금지).
핵심 용어 · 즉시 실행의 비결
합성 데이터(Synthetic Data) — 다운로드 없이 바로 돌아간다
보통 딥러닝 예제는 수 GB짜리 데이터셋(ImageNet 등)을 내려받아야 돈다. 이 저장소의 노트북들은 대신 각자 코드 안에서 필요한 데이터를 즉석에서 만들어 낸다(난수 시퀀스, 작은 정렬 문제, 인공 이미지 등). 그래서 git clone 후 노트북을 열면 준비 과정 없이 바로 학습·시각화가 실행된다. 교육 자료로서 진입 장벽을 확 낮추는 설계다.
한 문장 비유

"밀키트로 요리하던 사람이 재료를 직접 손질하고 육수부터 내며 요리의 원리를 배우는 요리 학교"

PyTorch로 신경망을 짜는 건 밀키트 요리와 같다 — loss.backward() 한 줄이면 소스가 알아서 완성된다. 편하지만, 그 안에서 무슨 일이 일어나는지는 모른 채 지나간다. 이 저장소는 밀키트를 치우고 생재료를 내민다. 역전파를 직접 미분해서 짜고, 그래디언트가 폭발하지 않게 손수 잘라 준다.

느리고 번거롭다. 하지만 이 과정을 한 번 겪고 나면, 나중에 다시 밀키트(PyTorch)를 쓸 때 "이 한 줄이 실제로 무슨 계산을 하는지"가 훤히 보인다. 그게 수츠케버가 말한 "90%"의 정체다.

2왜 지금 주목받는가

TrendShift Daily #19 — "전설의 논문 리스트 + 프레임워크 제로 + 30/30 완주"라는 세 박자

딥러닝 학습 자료는 넘쳐 나는데 이 저장소가 왜 트렌딩에 올랐을까. 이유는 세 가지가 겹쳤기 때문이다 — ① '수츠케버 30편'이라는 밈(meme)급 리스트 자체의 화제성, ② 프레임워크를 아예 걷어낸 순수 NumPy라는 희소성, ③ 말만 하고 절반쯤 하다 마는 다른 저장소들과 달리 30편을 전부 구현(100%) 완주했다는 점이다.

포인트내용
정체수츠케버 필독 논문 30편을 각각 NumPy로 구현한 Jupyter 노트북 30개. 문자 RNN·트랜스포머·ResNet부터 콜모고로프 복잡도 같은 이론까지.
차별점 ①프레임워크 제로. PyTorch·TF·JAX 없이 순전파/역전파를 손으로 짜, "프레임워크가 감춘 것"을 드러낸다.
차별점 ②즉시 실행. 각 노트북이 합성 데이터를 스스로 생성 → 데이터 다운로드 없이 클론 즉시 학습·시각화가 돈다.
차별점 ③18번(Relational RNN)이 플래그십. 노트북 안에 tape 기반 reverse-mode 자동미분 엔진을 직접 구현(~1,100줄) + 수치 그래디언트 검증까지.
대상 독자"PyTorch는 쓰는데 내부는 모르겠다"는 학습자. 밑바닥 원리를 읽고 실행하며 익히려는 사람.

주목 포인트 1 — '수츠케버 30편'이라는 서사의 힘

이 리스트는 그 자체로 딥러닝계의 전설이다. "이것만 알면 90%"라는 한 문장이 수많은 학습자에게 "그럼 나도 이 30편만 정복하면?"이라는 동기를 심었다. 문제는 논문을 읽는 것과 구현하는 것은 하늘과 땅 차이라는 점. 이 저장소는 "읽기"를 "돌려 보기"로 바꿔 그 간극을 메운다. 리스트를 CV(AlexNet·ResNet), 시퀀스(RNN·LSTM·트랜스포머), 이론(MDL·콜모고로프·AIXI), 최신 LLM 실무(RAG·멀티토큰 예측)까지 아우르는 하나의 학습 경로로 엮은 게 강점이다.

주목 포인트 2 — "프레임워크를 버린다"는 교육적 도발

요즘 튜토리얼의 정석은 PyTorch다. nn.MultiheadAttention 한 줄이면 어텐션이 끝난다. 그런데 이 저장소는 그 한 줄을 수십 줄로 풀어 헤친다scaled_dot_product_attention부터 positional_encoding, LayerNorm까지 전부 NumPy로. "편함"을 포기하는 대신 "이해"를 얻는 이 트레이드오프가, 카파시(Karpathy)의 min-char-rnn·micrograd 같은 명작 교육 자료의 계보를 잇는다.

주목 포인트 3 — 이론 논문까지 코드로 만졌다

대부분의 "논문 구현" 저장소는 실전 모델(CNN·트랜스포머)에서 멈춘다. 이 저장소는 아론슨의 복잡도 동역학, 콜모고로프 복잡도, MDL 원리, AIXI(초지능) 같은 순수 이론 논문까지 Rule 30 셀룰러 오토마타·엔트로피 시뮬레이션 같은 형태로 코드화했다. 딥러닝을 "왜 되는가"의 이론적 뿌리까지 함께 훑게 해 준다는 점이 독특하다.

균형 잡힌 시각
과대평가 금물 — "완성도"는 노트북마다 크게 다르고, 라이선스가 없다

냉정히 보자. "30/30 완성"은 파일이 다 있다는 뜻이지 모두 같은 깊이라는 뜻이 아니다. 대다수 노트북은 실제 대규모 학습이 아니라 순전파 데모 + 합성 데이터 + 시각화 수준이고, 완전한 학습·역전파·수치 검증까지 갖춘 건 사실상 18번(Relational RNN) 하나다. 또한 LICENSE 파일이 없어 README에 "교육용(Educational use)"이라고만 적혀 있다 — 코드를 재사용·재배포하려면 주의가 필요하다. 그리고 저자가 파는 유료 Colab 코드 링크가 상단에 걸려 있다는 점도 알아 두자. 정리하면, "정답 코드 모음"이 아니라 "직접 파고들 발판"으로 보는 게 정확하다.

3기술 스택 전체 지도

언어는 Python 하나, 무기는 NumPy 하나 — 시각화에 matplotlib, 수치 유틸에 scipy

이 저장소의 스택은 놀랍도록 단출하다. 화려한 의존성 트리가 아니라 "NumPy 하나로 얼마나 멀리 갈 수 있는가"를 보여 주는 게 목적이기 때문이다. 설치 안내도 README에 단 한 줄 — pip install numpy matplotlib scipy — 이 전부다.

① 계산 코어 — NumPy 단독

영역기술 · 쓰임
행렬 연산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인가

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 에이전트 파이프라인으로 제작됐을 가능성을 정황상 시사한다(확증은 아님).

4아키텍처 심화 분석

노트북 한 편의 해부학, 그리고 18번에 숨은 "손으로 만든 PyTorch autograd"

이 저장소에는 서버도, 빌드 파이프라인도, 복잡한 모듈 의존성도 없다. "아키텍처"는 곧 노트북 한 편이 어떻게 짜여 있는가와, 그중 가장 깊은 18번의 자동미분 엔진이 어떻게 도는가로 요약된다. 이 둘을 뜯어보자.

핵심 설계 1 — 자기완결형 노트북의 6단 해부

거의 모든 노트북이 똑같은 골격을 따른다. 데이터를 스스로 만들고 → 모델 클래스를 정의하고 → 순전파·역전파를 손으로 짜고 → 학습 루프를 돌린 뒤 → 그림으로 확인한다. 외부 파일에 의존하지 않으니 셀을 위에서 아래로 실행하기만 하면 된다.

┌──────────────────────────────────────────────────────────┐ │ 전형적 노트북 한 편의 해부 (예: 02_char_rnn) │ └──────────────────────────────────────────────────────────┘ [1] 합성 데이터 코드가 텍스트/시퀀스를 즉석 생성 (다운로드 X) │ ▼ [2] 모델 클래스 class VanillaRNN: 가중치 Wxh/Whh/Why 직접 초기화 │ ▼ [3] forward() np.dot · np.tanh 로 순전파, 타임스텝별 캐시 저장 │ ▼ [4] backward() BPTT — 연쇄법칙을 손으로 미분 + 그래디언트 클리핑 │ ▼ [5] train loop SGD로 가중치 갱신, loss 출력 │ ▼ [6] 시각화 / 샘플 matplotlib 그래프 + (RNN이면) 텍스트 생성 결과

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라면 자동으로 처리됐을 이 계산을 눈으로 보는 것 — 그게 이 저장소의 핵심 경험이다.

핵심 설계 2 — 트랜스포머도 헤드별 루프로 명시

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)

핵심 설계 3 — 18번에 숨은 자작 autodiff 엔진 (이 저장소의 정점)

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
자작 autodiff의 원리 — "기록했다가 거꾸로 재생" 순전파: 연산할 때마다 (backward함수, 입력, 출력)을 tape에 append matmul → add → relu → ... → loss └──────────── tape에 차곡차곡 쌓임 ────────────┘ 역전파: loss.grad = 1 에서 시작 → tape를 reversed()로 되감으며 각 연산의 backward 클로저 호출 → 입력들의 .grad 누적

이 엔진 위에 sigmoid/tanh/relu/softmax(+ 각 backward), cross_entropy, 어텐션·LSTM 셀·Relational Memory를 얹고, SGD·Adam 옵티마이저와 유한차분 gradient_check()로 손으로 짠 미분이 맞는지 수치적으로 검증까지 한다. 딥러닝 프레임워크의 심장을 통째로 관찰할 수 있는, 흔치 않은 교재다.

5디렉토리 구조 해부

하위 폴더 없는 완전 평면 구조 — 30개 노트북 + 18번 전용 위성 패키지

구조는 의외로 단순하다. 모든 파일이 루트에 평면(flat)으로 놓여 있고, 하위 디렉토리가 없다. 노트북 파일명이 01_~30_으로 번호가 매겨져 그 자체가 목차 역할을 한다. 예외적으로 18번만 전용 .py 모듈·테스트·저장 모델·개발 문서를 대량으로 거느린다.

sutskever-30-implementations/ # 전부 루트, 하위 폴더 없음 ├── README.md PROGRESS.md IMPLEMENTATION_TRACKS.md # 메인 문서 │ ├── 01_complexity_dynamics.ipynb # 논문 구현 30개 (번호=목차) ├── 02_char_rnn_karpathy.ipynb # 문자 RNN + BPTT ├── 07_alexnet_cnn.ipynb # AlexNet/CNN ├── 10_resnet_deep_residual.ipynb # ResNet ├── 13_attention_is_all_you_need.ipynb # 트랜스포머 ├── 18_relational_rnn.ipynb # ★ 플래그십: 자작 autodiff ├── 20_neural_turing_machine.ipynb ├── ... (30_lost_in_middle.ipynb 까지) │ ├── (18번 전용 위성 패키지 — 이 저장소의 "본진") │ ├── relational_memory.py relational_rnn_cell.py │ ├── attention_mechanism.py training_utils.py reasoning_tasks.py │ ├── lstm_baseline.py train_*.py *_demo.py # 런너/데모 │ ├── test_*.py (4개) # 회귀 테스트 │ ├── *.npz (저장 모델 3개) *.json (결과 2개) │ └── *.png (학습곡선·태스크 예시 17개) │ └── (18번 개발 산출 문서 14개) PAPER_18_ORCHESTRATOR_PLAN.md, P1_T3_DELIVERABLES.md, PHASE_3_TRAINING_SUMMARY.md, RELATIONAL_MEMORY_SUMMARY.md ...

구성을 숫자로 보면 — 노트북(.ipynb) 30개, 보조 .py 17개, 문서 .md 18개, 그림 .png 17개, 저장 모델 .npz 3개. 논문은 README에서 5개 그룹(기초 1–5 / 아키텍처 6–15 / 고급 16–22 / 이론·메타 23–30)으로 묶여 학습 순서를 안내한다.

비유 · 18번 폴더의 정체

18번 주변에 몰려 있는 ORCHESTRATOR_PLAN·DELIVERABLES·PHASE 문서들은, 이 노트북 하나가 여러 단계로 나뉜 개발 프로젝트였음을 보여 준다. 나머지 29개가 "혼자 완결된 교육 노트"라면, 18번은 실제 학습·테스트·저장 모델·회귀 검증까지 갖춘 소프트웨어 프로젝트에 가깝다. 저장소를 처음 열면 18번을 정점으로, 나머지는 그 발판이라고 이해하면 길을 잃지 않는다.

6학습 포인트

이 저장소에서만 얻는 네 가지 — 손 미분·자동미분 원리·진화 서사·이론적 뿌리

먼저 전체 지도를 보자. 30편은 무작위 나열이 아니라 딥러닝의 진화 서사를 따른다. RNN이 LSTM으로, 평범한 깊은 망이 ResNet으로, 순차 처리 RNN이 병렬 어텐션(트랜스포머)으로 진화하는 흐름이 논문 순서에 녹아 있다.

그룹대표 논문 · 배우는 핵심
기초 1–5복잡도 동역학 · 문자 RNN(카파시) · LSTM 이해 · RNN 정규화 · MDL 프루닝 — 시퀀스 모델과 BPTT의 기본기
아키텍처 6–15Pointer Net · AlexNet · GPipe · ResNet · Dilated Conv · GNN · 트랜스포머 · Bahdanau 어텐션 — CV·어텐션의 핵심 구조
고급 16–22Relation Net · VAE · Relational RNN(자작 autodiff) · Neural Turing Machine · CTC 음성 · Scaling Laws
이론·메타 23–30MDL 원리 · AIXI(초지능) · 콜모고로프 복잡도 · CS231n · 멀티토큰 예측 · DPR · RAG · Lost in the Middle

배울 것 1 — 순전파·역전파를 손으로 미분하기

프레임워크를 쓰면 평생 안 마주칠 계산을 여기서 직접 짠다 — softmax + cross-entropy의 그래디언트가 왜 (예측 - 정답)이라는 우아한 형태로 떨어지는지, tanh의 미분이 왜 (1 - h²)인지, 시간을 거슬러 그래디언트를 전파하는 BPTT가 어떻게 딕셔너리 캐시로 구현되는지. 그리고 RNN의 고질병인 그래디언트 폭발np.clip으로 막는 실전 처방까지. 이 경험 한 번이 나중에 PyTorch 코드를 읽는 눈을 바꾼다.

배울 것 2 — reverse-mode 자동미분의 내부 원리

18번의 자작 엔진은 "PyTorch의 .backward()가 대체 무슨 마법인가"에 대한 완벽한 답이다. 핵심 통찰은 두 가지다 — (1) 순전파 때 모든 연산을 테이프에 기록해 두고, (2) 역전파 때 테이프를 거꾸로 재생하며 각 연산이 미리 등록해 둔 backward 클로저를 호출하면, 연쇄법칙이 자동으로 완성된다. 이 원리를 이해하면 micrograd·tinygrad 같은 미니 프레임워크나 PyTorch autograd의 소스도 읽어낼 수 있다.

배울 것 3 — "합성 데이터 자급자족" 설계 패턴

교육 자료를 만들 때 가장 큰 마찰은 "데이터 준비"다. 이 저장소는 각 노트북이 필요한 데이터를 코드로 생성해 이 마찰을 없앤다. 정렬 문제, 난수 시퀀스, 인공 이미지를 즉석에서 만들어 모델을 학습시킨다. 자신이 알고리즘을 가르치는 예제를 만들 때 그대로 훔쳐 쓸 만한 패턴이다 — "외부 의존 없이 실행되는 자기완결 예제".

배울 것 4 — 딥러닝의 이론적 뿌리까지

대부분의 학습자가 건너뛰는 부분이다. 콜모고로프 복잡도(어떤 데이터를 만드는 가장 짧은 프로그램의 길이), MDL(최소 기술 길이 = 좋은 모델은 데이터를 짧게 압축한다), AIXI(이론적 최적 지능) 같은 개념을 코드·시뮬레이션으로 만진다. "신경망이 왜 일반화되는가"를 압축·오컴의 면도날이라는 이론적 렌즈로 바라보게 해 준다.

그대로 가져갈 발상 · 초보자용 정리
"한 번은 프레임워크 없이 짜 봐야 한다"

이 저장소의 가장 큰 교훈은 특정 알고리즘이 아니라 학습 태도다 — 편리한 추상화(PyTorch)에 곧장 올라타기 전에, 적어도 한 번은 밑바닥에서 짜 보라는 것. 그 한 번이 "블랙박스를 쓰는 사람"과 "블랙박스를 이해하는 사람"을 가른다. 30편을 다 못 하더라도, 2번(char-RNN)과 13번(트랜스포머)과 18번(autodiff) 세 편만 손으로 완주해도 딥러닝을 보는 눈이 달라진다.

7시스템 · 실행 요구사항

Python + NumPy/matplotlib/scipy + Jupyter — GPU 불필요, 데이터 다운로드 불필요
목적요구사항
언어 · 런타임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분, 바로 학습"인 셈. 원리 공부에 온전히 집중할 수 있다는 게 이 단순함의 진짜 값이다.

8직접 해볼 수 있는 실습 과제

난이도별 5개 — char-RNN 굴리기부터 autodiff 엔진에 새 연산 추가까지
난이도 ★☆☆ · 초급

과제 1 — char-RNN으로 텍스트를 생성해 보기

2번 노트북을 실행해 작은 텍스트(예: 좋아하는 노래 가사)를 학습시키고, sample()로 문장을 생성해 본다. 학습이 진행될수록 출력이 무의미한 문자열에서 그럴듯한 단어로 바뀌는 과정을 관찰하라. 온도(temperature) 값을 바꿔 가며 생성이 얼마나 대담해지는지도 실험. "RNN이 다음 글자를 확률로 예측한다"를 몸으로 이해하는 게 목표.

난이도 ★☆☆ · 초급

과제 2 — 하이퍼파라미터를 흔들어 보기

같은 노트북에서 hidden_size·학습률·시퀀스 길이를 바꿔 loss 곡선이 어떻게 달라지는지 본다. 그래디언트 클리핑의 np.clip(dparam, -5, 5)에서 경계값 5를 0.5나 50으로 바꾸면 학습이 어떻게 망가지거나 안정되는가? "왜 클리핑이 필요한가"를 직접 체감한다.

난이도 ★★☆ · 중급

과제 3 — 손으로 짠 미분이 맞는지 수치로 검증

임의의 층 하나(예: Linear 또는 tanh)를 골라, 유한차분 그래디언트 검증을 직접 구현한다: 가중치를 아주 조금(1e-5) 흔들어 loss 변화를 재고, 그 수치 미분이 손으로 짠 해석적 미분과 일치하는지 비교. 18번의 gradient_check()가 참고 예시다. "내 backward가 진짜 맞나"를 스스로 증명하는 훈련.

난이도 ★★☆ · 중급

과제 4 — 어텐션 하나를 처음부터 다시 짜 보기

13번을 참고만 하고, 백지에서 scaled_dot_product_attention을 다시 구현한다. softmax의 수치 안정성(최댓값을 빼는 트릭)을 스스로 챙기고, 인과 마스크(causal mask)를 넣어 "미래를 못 보는" 어텐션을 만들어 본다. 완성되면 원본과 출력이 같은지 대조. 트랜스포머의 심장을 손에 넣는 과제.

난이도 ★★★ · 고급

과제 5 — 자작 autodiff 엔진에 새 연산 추가

18번의 ComputationGraph에 새로운 연산(예: exp·mean·tanh 중 없는 것)을 순전파 + backward 클로저 한 쌍으로 추가한다. 그다음 유한차분으로 그래디언트를 검증하라. 여력이 되면 이 엔진으로 작은 2층 MLP를 학습시켜 본다. "미니 PyTorch를 내 손으로 확장한다" — 이 저장소가 줄 수 있는 가장 값진 경험이다.

9관련 기술 심화 학습 로드맵

4주 코스 — 시퀀스 기초 → CV·구조 → 어텐션·자동미분 → 이론·최신 LLM
주차주제 · 학습 목표
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편의 큰 그림을 완성.

10핵심 키워드 사전

이 문서에서 반드시 챙길 용어 14개
용어 01
밑바닥부터 구현(from scratch)
프레임워크의 완성된 부품 대신, 가중치·순전파·역전파를 NumPy로 직접 코딩하는 방식. 느리지만 원리가 다 보인다. 이 저장소의 정체성.
용어 02
NumPy 전용(NumPy-only)
PyTorch·TF·JAX 없이 오직 NumPy로만 딥러닝을 구현하는 제약. "자동 미분이 빠진 도구"로 짜기에, 미분을 손으로 챙겨야 한다.
용어 03
BPTT(시간에 따른 역전파)
RNN의 역전파. 시퀀스를 시간 순으로 펼친 뒤 reversed()로 거슬러 오르며 각 타임스텝의 그래디언트를 누적한다. 2번 노트북의 핵심.
용어 04
그래디언트 클리핑(Gradient Clipping)
RNN에서 그래디언트가 폭발하는 걸 막으려 값을 일정 범위([-5, 5] 등)로 잘라 내는 처방. np.clip 한 줄로 학습 안정성을 지킨다.
용어 05
자동미분 · reverse-mode(Autodiff)
순전파를 기록해 뒀다가 거꾸로 재생하며 연쇄법칙으로 그래디언트를 자동 계산하는 기법. PyTorch .backward()의 원리이며, 18번이 이를 직접 구현.
용어 06
계산 그래프 · 테이프(Computation Graph / Tape)
연산 순서를 (backward함수, 입력, 출력)으로 기록하는 목록. 역전파 때 이 테이프를 reversed()로 되감아 각 backward 클로저를 호출한다.
용어 07
softmax + 교차엔트로피(Cross-Entropy)
분류 출력을 확률로 바꾸는 softmax와 그 손실 함수. 둘을 합치면 그래디언트가 (예측 - 정답)이라는 깔끔한 형태로 떨어진다 — 손으로 미분하며 확인하게 된다.
용어 08
tanh 미분
tanh의 도함수가 1 - tanh²라는 사실. RNN 역전파에서 dhraw = (1 - hs[t]**2) * dh로 등장하며, 프레임워크가 자동으로 해 주던 계산의 실체다.
용어 09
스케일드 닷-프로덕트 어텐션
트랜스포머의 심장. softmax(QKᵀ/√d_k)·V로 "어디에 주목할지"를 계산한다. 13번이 이를 헤드별 루프로 명시적으로 구현.
용어 10
잔차 연결(Residual / ResNet)
입력을 출력에 그대로 더하는 지름길(x + F(x)). 그래디언트가 잘 흘러 아주 깊은 망도 학습되게 만든다. 10·15번의 주제.
용어 11
합성 데이터(Synthetic Data)
외부 다운로드 없이 코드가 즉석 생성하는 학습 데이터. 이 저장소가 "클론 즉시 실행"이 되는 비결이자, 재사용할 만한 교육 예제 설계 패턴.
용어 12
MDL · 콜모고로프 복잡도
MDL(최소 기술 길이) = "좋은 모델은 데이터를 짧게 압축한다". 콜모고로프 복잡도 = "데이터를 만드는 가장 짧은 프로그램의 길이". 일반화를 압축으로 보는 이론적 렌즈(23·25번).
용어 13
스케일링 법칙(Scaling Laws)
모델·데이터·연산을 키울수록 성능이 예측 가능한 곡선으로 좋아진다는 경험 법칙. 오늘날 대형 모델 투자의 이론적 근거(22번).
용어 14
그래디언트 검증(Gradient Check)
가중치를 아주 조금 흔들어 얻은 수치 미분과 손으로 짠 해석적 미분이 일치하는지 대조하는 검증법. "내 역전파가 맞나"를 스스로 증명한다.

11참고 링크

원본을 직접 열어 확인하는 습관 — 특히 코드·수치는 클론한 소스 기준

저장소 · 제작자
· 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번의 원전)

확인된 함정 모음 · 재확인 필수
읽기 전에 알아 둘 6가지

라이선스 없음 — LICENSE 파일이 없고 README에 "교육용"이라고만 적혀 있다. 코드를 재사용·재배포하려면 저자에게 확인 필요. ② 완성도 편차가 크다 — "30/30 완성"은 파일이 다 있다는 뜻이며, 대부분은 순전파 데모·시각화 수준이고 완전한 학습·역전파·검증을 갖춘 건 사실상 18번뿐. ③ toy 구현이다 — 원 논문의 규모·성능을 재현하는 게 아니라 핵심 아이디어를 최소 코드로 보여 준다. 실전 성능을 기대하면 안 된다. ④ 유료 링크 — README 상단에 저자가 파는 Colab 코드(gumroad) 배너가 있다. ⑤ 버전 미고정 — requirements.txt가 없어 의존성 버전이 안 잡혀 있다. 최신 NumPy에서 일부 경고가 날 수 있다. ⑥ 자매 저장소는 별개beyond-numpy·Sutskever-Agent는 이 저장소 안에서 참조되지 않는 다른 프로젝트다.