1P by GN⁺ 1일전 | ★ favorite | 댓글 1개
  • MicroGPT는 200줄짜리 순수 Python 코드로 작성된 GPT 모델의 최소 구현체로, 대형 언어모델의 핵심 구조를 시각적으로 이해할 수 있게 구성됨
  • 32,000개의 인간 이름 데이터셋을 학습해 새로운 이름을 생성하며, 토크나이징·예측·손실 계산·역전파 과정을 단계별로 시각화함
  • Softmax, Cross-Entropy Loss, Backpropagation, Embedding, Attention 등 GPT의 주요 구성 요소를 코드와 함께 설명함
  • 학습 과정에서는 Adam 옵티마이저를 사용해 손실을 점차 줄이고, 이후 온도 조절(Temperature Sampling) 을 통해 다양한 이름을 생성함
  • ChatGPT와 같은 대형 모델의 핵심 알고리듬을 단순화한 형태로, LLM의 내부 작동 원리를 이해할수 있는 교육용 자료

MicroGPT 개요

  • Andrej Karpathy가 작성한 200줄짜리 Python 스크립트를 기반으로, GPT 모델의 학습과 추론 과정을 시각적으로 해설
    • 외부 라이브러리 없이 순수 Python만으로 구현
    • ChatGPT와 같은 대형 언어모델의 기본 알고리듬을 그대로 포함
  • 글은 초보자 친화적인 시각적 접근을 통해 모델의 각 단계를 단계별로 보여줌

데이터셋과 학습 목표

  • 32,000개의 인간 이름(예: emma, olivia, ava 등)을 학습 데이터로 사용
    • 각 이름은 하나의 문서로 간주되며, 모델은 이름의 문자 패턴을 학습
    • 학습 후 “kamon”, “karai”, “anna”, “anton” 등의 새로운 이름을 생성
  • 모델은 문자 간의 통계적 관계, 이름의 길이, 시작과 끝의 음운 패턴 등을 학습

텍스트를 숫자로 변환하는 과정

  • 신경망은 숫자만 처리하므로, 각 문자를 정수 ID로 변환
    • a–z는 0–25, BOS(Beginning of Sequence)는 26으로 지정
    • BOS 토큰은 이름의 시작과 끝을 표시
  • 실제 GPT-4의 tiktoken은 문자 대신 문자 조각 단위로 토큰화하지만, 원리는 동일

다음 토큰 예측

  • 모델은 주어진 문맥에서 다음 문자를 예측
    • 예: [BOS] → “e”, [BOS, e] → “m”, [BOS, e, m] → “m”, [BOS, e, m, m] → “a”
  • 각 단계는 입력(문맥)과 목표(다음 문자) 쌍을 생성하며, 이 방식은 ChatGPT와 동일

Softmax와 확률 계산

  • 모델 출력은 27개의 로짓(logit) 으로 구성되며, Softmax를 통해 확률로 변환
    • 각 로짓을 지수화 후 합으로 나누어 확률 분포 생성
    • 최대값을 빼는 연산은 오버플로 방지를 위한 안정화 처리
  • Softmax 결과는 각 토큰이 다음에 등장할 확률을 나타냄

손실 계산: Cross-Entropy

  • 예측의 정확도를 −log(p) 로 계산
    • 정답 확률이 높을수록 손실이 낮고, 0에 가까울수록 손실이 커짐
    • p=1일 때 손실 0, p→0일 때 손실 무한대
  • 학습은 이 손실을 최소화하는 방향으로 진행

역전파(Backpropagation)

  • 손실을 기준으로 각 파라미터가 손실에 미치는 영향을 계산
    • 모든 연산(add, multiply, exp, log 등)을 노드로 구성한 계산 그래프를 통해 미분 수행
    • 각 노드는 입력과 지역 미분값을 저장하고, 역방향으로 그래디언트를 전파
  • 예시: L = a⋅b + a (a=2, b=3) → a의 그래디언트는 4.0 (두 경로의 합)
  • PyTorch의 loss.backward()와 동일한 원리

임베딩(Embedding)

  • 각 토큰 ID는 16차원 벡터로 변환되어 의미를 학습
    • 토큰 임베딩과 위치 임베딩을 더해 입력으로 사용
    • 위치에 따라 같은 문자의 역할이 달라짐
  • 학습 후 유사한 문자(예: 모음)는 유사한 벡터를 갖게 됨

어텐션(Attention)

  • 각 토큰은 Query, Key, Value 벡터를 생성
    • Query와 Key의 내적을 통해 관련성을 계산하고, Softmax로 가중치를 산출
    • 가중합된 Value가 출력으로 사용
  • Causal Mask를 적용해 미래 토큰을 참조하지 않음
  • 4개의 어텐션 헤드가 병렬로 작동하며, 서로 다른 패턴을 학습

전체 GPT 구조

  • 입력 토큰은 다음 단계를 거침
    1. 임베딩 + 위치 임베딩
    2. RMSNorm 정규화
    3. 멀티헤드 어텐션
    4. 잔차 연결(Residual)
    5. MLP(64차원 확장 → ReLU → 16차원 축소)
    6. 다시 잔차 연결 후 출력 로짓 계산
  • Residual 연결은 그래디언트 소실을 방지
  • RMSNorm은 활성값의 크기를 일정하게 유지해 학습 안정화

학습 루프

  • 1,000회 반복 학습
    • 이름 선택 → 토크나이즈 → 순전파 → 손실 계산 → 역전파 → 파라미터 업데이트
  • Adam 옵티마이저 사용
    • 모멘텀과 적응 학습률을 통해 안정적 수렴
  • 초기 손실 약 3.3에서 2.37로 감소
    • 생성된 이름이 무작위에서 점차 자연스러운 형태로 발전

추론(Inference)과 샘플링

  • 학습 후에는 BOS로 시작해 다음 토큰을 반복적으로 예측
    • BOS가 다시 나올 때까지 생성 반복
  • Temperature로 샘플링 다양성 조절
    • 낮을수록 결정적(평균적), 높을수록 창의적이지만 불안정
    • 이름 생성의 적정 온도는 약 0.5
  • 예시 출력: “karai”

효율성과 확장성

  • MicroGPT는 GPT의 핵심 알고리듬을 단순화한 완전 구현체
    • ChatGPT와의 차이는 규모뿐임
    • 32,000개 이름 대신 수조 개 토큰, 4,192개 파라미터 대신 수천억 개 파라미터
    • CPU 기반 스칼라 연산 대신 GPU 텐서 연산 사용
  • 기본 루프는 동일: 토크나이즈 → 임베딩 → 어텐션 → 예측 → 손실 → 역전파 → 업데이트

결론

  • MicroGPT는 GPT의 내부 작동 원리를 직관적으로 학습할 수 있는 교육용 모델
  • 대규모 LLM의 복잡한 구조를 단순화해, 언어모델의 핵심 메커니즘을 직접 체험할 수 있게 함
Hacker News 의견들
  • 학습이 끝날 때 모델이 "kamon", "karai", "anna", "anton" 같은 이름을 생성한다고 했는데, 실제로는 이 이름들이 데이터셋에도 포함되어 있음
    다른 이름을 쓰는 게 좋을 듯함 — 데이터셋 링크

    • 맞음, 전체 글이 AI가 쓴 것처럼 느껴졌음
    • 고마움, 수정하겠음
  • 초보자용이라고 하지만, 이런 수학적 설명을 이해할 수 있는 초보자가 얼마나 있을지 모르겠음
    예를 들어 cross-entropy loss 공식을 설명하는 부분은 너무 복잡하게 느껴졌음

    • 나도 전문가는 아니지만 어느 정도 지식이 있어서 초보자 입장에서는 어려울 수 있는 표현을 쓰게 되는 것 같음
      다시 생각해보겠음
  • 내가 이해가 안 되는 부분은 이런 단순한 모델이 어떻게 임의의 코드 문제를 디버깅할 수 있게 되는가임
    통계적 추론이 어떻게 ‘추론 능력’으로 바뀌는지 궁금함
    Claude 코드를 매일 쓰다 보니 이제는 정말 그렇게 되는 것 같음

    • 이 질문이 ML 연구의 가장 큰 미스터리라고 생각함
      핵심은 “항상 올바른 다음 단어를 예측할 수 있다면, 결국 모든 질문에 올바르게 답할 수 있다”는 것임
      그래서 최근에는 RLHF나 RLVR 같은 강화학습 기반 접근으로 ‘정답’을 찾는 방향으로 발전 중임
    • 단순히 단어 수준의 통계 추론이 아니라, 복잡한 의미 구조를 계층적으로 추론하는 과정이 반복적으로 이루어지는 것임
    • DNN은 일반적인 의미의 통계적 추론이 아님
      수학적으로는 미적분 기반의 최적화 문제에 더 가까움
      단순히 텍스트 통계를 학습하는 게 아니라, 다음 토큰을 예측하기 위한 복잡한 해법을 찾는 것임
    • “통계적 추론”이라는 표현이 너무 단순화된 설명임
      신경망에는 통계적 요소도 있지만, 인간 두뇌처럼 그 이상이 있음
  • 글 전체를 읽었는데, 유용한 부분도 있었지만 ‘나머지 부엉이를 그려라’ 식으로 느껴졌음
    개념 간의 연결부가 빠진 듯했지만, 인터랙티브한 구성은 좋았음

    • 처음엔 괜찮았는데 곧 “MLP는 2층 피드포워드 네트워크로, 64차원으로 투사하고 ReLU를 적용한 뒤 16차원으로 다시 투사한다” 같은 설명이 나와서 갑자기 난이도가 확 올라감
      좀 더 깊이 있게 다뤘으면 좋겠음
  • 요즘 일부러 맞춤법이나 문법 오류를 넣어서 LLM이 쓴 글이 아님을 보여주는 게 유행인가 궁금함
    Karpathy의 블로그와 이 글에서도 그런 오타가 꽤 보였음

    • 이런 역신호(counter signaling) 방식은 앞으로 더 흔해질 것 같음
    • 이제야 그걸 눈치챈 것 같음
    • 솔직히 말하자면 Karpathy가 그렇게 대단한 인물은 아님
      Elon의 Full Self Driving 프로젝트를 오랫동안 지탱했을 뿐이고, OpenAI에서도 오래 있지 않았음
      요즘은 거의 code golf나 신조어 만들기에만 집중하는 듯함
  • 원문은 Karpathy의 블로그에 있음 — microGPT 글 링크

  • 어떤 사람들은 너무 기초적이라고, 또 어떤 사람들은 너무 깊다고 했지만
    나처럼 모델 작동 원리를 잘 모르는 입장에서는 좋은 개요서였음
    완전히 이해는 못했지만 학습을 시작하기에 좋은 출발점 같음

  • 지금까지 본 가장 도움이 된 튜토리얼 중 하나였음
    코딩을 안 하던 나도 AI 덕분에 코드를 쓰게 되었음
    설명이 단순하고 명확해서 AI에게 무엇을 입력해야 할지 생각할 때 큰 도움이 됨

  • T-Mobile이 이 블로그 페이지를 차단하는 것 같음
    차단 경고 페이지 링크

  • 글을 읽고 이름이 출력되는 건 이해했는데, 왜 굳이 이름 생성을 예시로 쓴 건지 궁금했음

    • 이름은 단지 모델을 시연하기 위한 임의의 문제일 뿐임
      다른 어떤 데이터로도 가능함