Building makemore Part 2: MLP 후기 (진행 중)
이번 강의는 Andrej Karpathy 의 Neural Networks: Zero to Hero 코스의 세 번째 강의 Building makemore Part 2: MLP 다. 2강의 bigram(바로 앞 글자 하나만 보는 모델)을 넘어, 앞 글자 여러 개(기본 3개)를 문맥으로 보는 MLP(다층 퍼셉트론, 여러 층을 쌓은 신경망) 글자 단위 언어 모델을 Bengio et al. 2003 논문 구조로 만든다.
이번엔 방식을 조금 다르게 가져갔다. 강의를 처음부터 끝까지 쭉 따라가는 대신, 개념 하나가 흐릿해지면 거기서 멈춰 바닥까지 파고들었다. 특히 "신경망이 도대체 어떻게 '배우는가'" 를 한참 붙잡고 늘어졌다. 그래서 이 글은 강의 전체 요약이 아니라, 모델을 세우는 앞부분(Part 1)과 그 과정에서 튀어나온 "학습의 원리" 에 대한 중간 기록이다. 나머지 뒷부분은 다음 글에서 이어간다.
- 이전 강의 후기: building makemore 후기
강의를 들으면서 메모
- 2강 bigram 은 27×27 표 하나였다. 문맥을 앞 글자 3개로 늘리려면 표가 27배씩 폭발해(3개면 약 53만 칸) 데이터로 채울 수가 없다. 빈 칸의 진짜 문제는 "메모리 낭비" 가 아니라, 데이터가 0개라 확률이 0 이 되고 그 문맥에선 예측 자체가 불가능해진다는 것이었다. 그래서 표를 버리고 신경망으로 간다.
- Bengio 의 핵심은 글자를 "따로 노는 번호(a=1, e=5)" 가 아니라 "거리가 있는 좌표(벡터)" 로 다루는 것이다. 표는 각 칸이 서로 남남인 섬이라, 처음 보는 조합은 기댈 이웃이 없어 0 이 된다. 신경망은 연속 함수라 비슷한 입력이면 비슷한 출력이 나와서, 처음 보는 조합도 근처의 이미 본 조합에서 예측을 빌려온다. "표 vs 신경망" 의 진짜 차이는 이 '거리' 개념이 있느냐 없느냐였다.
- 학습이 끝난 신경망은 결국 "정해진 입력에 정해진 답을 내는 함수" 다. 검색 엔진이 아니다. 다만 표도 함수인데, 차이는 표가 결정적이기만 한 반면 신경망은 결정적이면서 매끄럽다(비슷한 입력이면 비슷한 출력)는 점이다.
- 글자를 임베딩(글자를 숫자 벡터로 바꾸는 것)할 때 그 벡터는 처음엔 완전 랜덤이다. 하지만 임베딩 표(C)도 학습 대상이라, 틀림을 줄이는 방향으로 다른 값들과 함께 밀린다. 랜덤은 출발점일 뿐이고 최종 좌표는 학습이 만든 결과다. 모음끼리 한 덩어리로 뭉치는 것도 우리가 시킨 게 아니라 저절로 생긴다.
- one-hot 벡터(해당 자리만 1, 나머지는 0)를 C 에 곱하는 건 사실 "곱셈" 이라기보다 C 의 한 행을 골라내는 것이다. 0 을 곱한 행은 전부 사라지고 1 을 곱한 행만 남기 때문이다. 그래서
C[i]와one_hot(i) @ C는 정확히 같은 결과다. - 임베딩 결과
(228k, 3, 10)을 은닉층(입력과 출력 사이의 중간 계산층)에 넣으려면(228k, 30)한 줄로 펴야 한다.view가 이걸 복사 없이 공짜로 해내는 이유가 흥미로웠다. 텐서는 메모리에 숫자를 1줄로 쭉 저장하고, 모양(shape)은 그 1줄을 어떻게 끊어 읽을지 알려주는 라벨일 뿐이라, 데이터를 옮기지 않고 라벨만 바꾸면 된다. - 이번 강의의 최대 수확은 "경사하강법이 왜 되는가" 였다. 따로 정리한다(아래).
제일 오래 붙잡은 것: 신경망은 어떻게 '배우는가'
"틀린 정도(loss)를 숫자로 재고, 그 숫자가 줄어드는 방향으로 모든 값을 아주 조금씩, 수십만 번 미는 것" 이 학습이다. 진짜 막힌 건 "어느 쪽이 줄어드는 방향인지 어떻게 아는가" 였다.
- 기울기(gradient)가 곧 방향이다. loss 를 세로축, 어떤 숫자
w를 가로축에 두면 곡선이 그려지고, 지금 위치의 경사가 기울기다. 기울기가 양수면 오르막이라w를 줄여야 하고, 음수면 내리막이라w를 키워야 한다. 어느 경우든 "기울기의 반대 방향" 으로 가면 loss 가 준다. 코드p.data += -lr * p.grad의 그 마이너스가 정확히 이 "반대로 뒤집기" 였다. - 시험 삼아 밀어보는 게 아니었다. 위로도 밀어보고 아래로도 밀어보고 비교하는 줄 알았는데 아니다. loss 가 곱셈, 덧셈, tanh(값을 -1~1 사이로 눌러주는 함수) 같은 알려진 연산의 조합이라, 미분으로 각 숫자의 경사를 곧바로 계산한다. 그래서 방향 판단이 한 번의 시행 안에 이미 다 들어있다. "계속 학습하면 loss 가 계속 준다" 는 관찰이 자연스러운 이유가 이거였다. 매 걸음이 애초에 내리막으로 계산된 걸음이라서다.
- 가장 작은 예로 확인했다.
loss = w²는 기울기가2w다.w=5에서 기울기 10(양수)이니w ← 5 - 0.1×10 = 4, loss 는 25 에서 16 으로 준다. 다시 기울기 8 →w=3.2, loss 16 에서 10.24 로.w가 계곡(0)으로 계속 내려가고,w=0이면 기울기도 0 이라 저절로 멈춘다. 마법이 아니라 경사 반대로 걸으니 당연히 내려가는 것이었다. - 조정은 전체를 동시에 한다.
backward()(모든 숫자의 기울기를 자동으로 계산해주는 함수)가 기울기를 한 번에 다 구해두면, 같은 걸음에 각 숫자가 저마다-lr × 자기 기울기만큼 다 같이 움직인다. 하나씩 순서대로가 아니다. - lr(learning rate, 학습률)은 보폭 그 자체가 아니라 보폭을 조절하는 배율이다. 실제 한 걸음 =
lr × 기울기. 기울기는 자리마다, 걸음마다 달라지고, lr 은 우리가 골라 고정해두는 하나의 배율이다. 너무 크면 계곡을 건너뛰어 튕기고, 너무 작으면 느리다.
강의 내용 간단 요약 (Part 1, 여기까지)
[00:00 ~ 01:48]intro: 2강 bigram 은 문맥을 늘리면 표가 지수로 폭발한다. 그 한계에서 출발해, 문맥을 늘려도 감당되는 신경망 방식으로 넘어간다.[01:48 ~ 09:03]Bengio et al. 2003 논문: 글자를 저차원 벡터로 임베딩하고, 그 벡터들을 신경망에 넣어 다음 글자를 예측한다. 비슷한 글자를 가까운 좌표에 두어, 처음 보는 문맥도 일반화할 수 있게 하는 것이 핵심이다.[09:03 ~ 12:19]데이터셋 만들기(block_size):block_size(문맥으로 볼 이전 글자 수, 기본 3)만큼 창을 한 칸씩 밀며 (앞 3글자 → 다음 글자) 쌍을 만든다. 이름 하나에서 나오는 예제 수는 글자 수 + 1(끝을 알리는 점 하나 때문)이다. 이름 3.2만 개면 약 22.8만 쌍이 된다.[12:19 ~ 18:35]임베딩 룩업 테이블(C):(27, 10)짜리 표로, 글자 하나마다 10차원 좌표를 배정한다. 처음엔 랜덤이고 학습으로 바뀐다.C[X]한 줄로 문맥의 모든 글자를 한꺼번에 벡터로 바꾼다.[18:35 ~ ]은닉층 + 텐서 내부(storage, view): 임베딩을(228k, 30)으로 편 뒤W1을 곱하고b1을 더한 다음tanh를 씌워 은닉층을 만든다. 이 과정에서view가 왜 데이터 복사 없이 모양만 바꾸는지(메모리 저장 순서 vs 모양 라벨)를 파봤다. 여기까지 봤고, 이후(출력층, 손실, 학습 루프, 미니배치, 학습률 찾기, train/dev/test 분리, 샘플링)는 다음 글로 이어간다.
생각한 것들과 교훈
- 흐릿할 때마다 멈춰 짚고 가는 게 결국 빠른 길이었다. "gradient 가 곧 방향" 이 아리송해서 한참 붙잡았는데, 그 하나가 뚫리자 경사하강법 전체가 함께 뚫렸다.
- 추상적인 게 안 잡히면 가장 작은 예로 손계산을 해본다.
loss = w²하나를 몇 걸음 직접 걸어보고 나서야 "매 걸음이 내리막" 이 실감났다. 2강의 broadcasting 을 2×2 표로 뚫었던 것과 같은 방법이다. - 어려운 주제일수록 모국어로 먼저 이해하는 게 빨랐다. 이번에도 개념은 한국어로 잡고 영어 연습은 따로 분리했다. 언어 장벽과 개념 장벽을 동시에 넘으려 하지 않으니 머리에 더 잘 들어왔다.
- 묻기 창피한 기본 질문이 진짜 구멍을 메웠다. "임베딩이 뭐였지?", "모양이 안 맞는다는 게 무슨 문제지?", "랜덤 숫자로 임베딩한다고?" 같은 질문에서 실제로 막혔고, 막힌 걸 알아챘기에 다시 짚을 수 있었다.
- 랜덤에서 시작한 숫자가 학습만으로 의미 있는 좌표가 된다는 게 여전히 신기하다. 우리가 규칙을 손으로 넣는 게 아니라, 틀림을 줄이다 보니 저절로 그렇게 된다. 이 "저절로" 가 이 강의를 붙잡게 만드는 지점이다.