내가 본 강의는 A course by Andrej Karpathy on building neural networks, from scratch, in code. 코스의 첫번째 강의 The spelled-out intro to neural networks and backpropagation: building micrograd였다.

배경: 왜 이 강의를 봤나?


  • 여러가지가 있는데 생각나는대로 적어보자면 ...
    • 트렌드를 쫓아가는 것도 중요하지만 잘 변하지 않는 기초 지식을 배우고 싶었다(내가 좋아하는 책 Same as Ever 21장에 관련 내용이 있다. 이 글에는 해당 21장 내용은 아직 없다 😅).
    • 내가 사용하고 있는 기술의 근본 동작 원리를 알고 싶기 때문이었다.
  • 카파시가 바이브 코딩이라는 용어를 만들기 전, https://www.youtube.com/watch?v=kCc8FmEb1nY 이 영상을 우연히 알게 됐다. 언젠가 봐야지, 봐야지 하다가 몇 년이 훌쩍 지나버렸다.
  • 그래서 현재 운영하고 있는 AI 스터디를 계기로 이 코스를 진득하게 들어보고 싶어 이번 주에 첫번째 강의를 들었다.

강의에서 다루고 있는 내용 요약


  • [00:00:00 ~ 00:08:25] micrograd 가 뭔가: 카파시가 라이브러리 없이 직접 만든 100줄 안팎의 작은 자동 미분(autograd) 엔진이다. 신경망이 "어떻게 스스로 배우는지"를 밑바닥부터 만들어가며 보여준다.
  • [00:08:25 ~ 00:19:30] 미분을 다시 정의한다: 어려워보이는 공식이 아니라 "입력을 아주 살짝 밀면 출력이 어느 쪽으로 얼마나 움직이나(민감도)"로 본다. 실제로 0.001 만큼 밀어보고 변화량을 재는 수치 미분에서 출발한다.
  • [00:19:30 ~ 00:32:11] Value 객체 = 계산 과정 녹화기: 숫자 하나를 감싸되, 자기가 "어떤 연산으로 태어났는지"까지 같이 기억한다. 덕분에 식 전체가 그래프로 기록되고, 나중에 거꾸로 거슬러 올라갈 수 있다.
  • [00:32:11 ~ 00:53:02] forward / backward pass: 정방향으로 답을 내고(forward), 결과에서 거꾸로 훑으며 각 입력이 최종 결과에 준 영향(gradient)을 구한다(backward). 이 backward 과정이 곧 backpropagation(역전파)이다.
  • [00:32:11 ~ 00:53:02] chain rule(연쇄 법칙)이 심장: '연쇄 법칙'은 함수가 여러 겹 겹쳐 있을 때(합성 함수) 미분하는 규칙이다. 여러 단계를 거치면 각 단계의 민감도가 곱해진다. 거꾸로 흐를 때 "+" 노드는 gradient 를 그대로 분배하고, "×" 노드는 상대편 입력값을 곱해 전달한다. (코드 구현은 01:09:20~01:22:48)
  • [00:53:02 ~ 01:09:20] 뉴런에서 신경망(MLP)으로: 뉴런 하나는 (가중치 × 입력 + bias)에 tanh 로 살짝 비튼 것이다. 이 뉴런을 레고처럼 층층이 쌓으면 다층 퍼셉트론(MLP, Multi-Layer Perceptron)이 된다. (MLP 라이브러리 만들기는 01:44:24~)
  • [01:39:40 ~ 01:44:24] PyTorch 와 비교: micrograd 는 숫자 하나(scalar) 단위로 다룰 뿐, 실제 라이브러리와 수학은 똑같다는 걸 PyTorch 로 확인한다.
  • [02:01:26 ~ 02:14:19] 훈련 루프가 전부다: 여기서 '훈련 루프'란 같은 과정을 수천·수만 번 반복하는 사이클이다. 한 바퀴는 이렇게 돈다: forward(예측을 내고) → loss(정답에서 얼마나 틀렸는지 숫자 하나로 재고) → backward(각 손잡이를 어느 쪽으로 돌려야 덜 틀리는지 계산하고) → gradient descent(그 방향으로 손잡이를 아주 조금 돌리기). 한 바퀴로는 거의 안 변하지만, 수만 번 돌리면 손잡이들이 조금씩 정답 맞히는 자리로 자리잡는다. 이 과정이 신경망 학습의 전부이고, GPT 같은 거대 모델도 규모만 다를 뿐 같은 뼈대다.

생각한 것들 및 교훈


  • 처음에 말도 안되게 어렵게 느껴져서 당황스러웠다.
    • 꾸역꾸역 보고 듣고 AI에게 무차별 질문 난사하다보니 조금씩 감을 잡게 됐다.
    • 나중에 또 물어보면 전혀 새로운 느낌이 나겠지.
  • '왜?' 라고 질문 던지는 건 중요하다.
    • 그렇지 않으면 현재 하고 있는 일의 원동력이 없어지고 즐거움도 사라진다.
    • AI 덕분에 대부분의 질문에 대답 받을 수 있었다.
      • 예시 질문: "신경망이랑 미분이 왜 관련 있는 거지?", "미분이 대체 뭐지?", "선형 함수를 왜 쌓고, 비선형은 왜 더 강하지?", "gradient descent 는 왜 하필 '하강'이지? 기울기를 올리면 안 되나?", "결국 backward() 는 뭘 하는 함수지?"
      • 그것이 정확한지 아닌지는 본인만의 검증 방법이 필요하다.
      • 답변이 어려울 때도 괜찮다. 그럴 땐 내가 이해할 때까지 쉽게 설명해달라고 하자.
        • "내가 7살이라면 어떻게 설명할까"를 AI 에게 부탁하니(파인만식) 훨씬 쉽게 들어왔다.
  • AI 의 답이라도 무조건 믿지 말고 검증하자.
    • 실제로 AI 가 tanh 를 "탄치"라고 발음한다고 잘못 알려줬는데, 카파시는 "텐에이치(ten-H)"라고 발음한다. 강의를 직접 들었기에 알 수 있었던 부분.
    • 발음, 인용, 숫자처럼 사실로 확인 가능한 건 원본(강의, 공식 문서)으로 한 번 더 대조하는 습관이 필요하다.
  • 배운 걸 노트 한 장으로 정리해두면 남는다.
    • 강의를 들으며 막혔던 "왜?" 들을 비유와 함께 정리하니, 다음에 다시 꺼내 볼 복습 자료가 됐다.
  • 직접 포팅해보니 확실히 내 것이 된다.
    • 강의는 Python 이지만, 익숙한 TypeScript 로 다시 포팅했다. 주석은 한국어로 달고, 변수명도 줄임말 없이 풀어 썼다. 눈으로만 보던 코드를 손으로 옮기니 이해가 단단해졌다.
    • 포팅한 코드: sounmind/micrograd (korean 브랜치)