9장. 뉴런의 산수 — 신경망
이 장의 질문: 단순한 부품을 쌓기만 하면 어떻게 임의의 복잡한 패턴을 배울 수 있는가? 신경망의 구조를 산수 수준까지 해체하고, "깊이"가 표현 학습이라는 마법을 낳는 원리를 이해한다.
전제: 2장(모델·손실·최적화), 3장(행렬 곱), 5장(시그모이드, 소프트맥스).
직선의 한계, XOR라는 벽
5장의 로지스틱 회귀는 결국 직선(평면)으로 공간을 가르는 기계였다. 그런데 직선으로 절대 가를 수 없는, 허무할 만큼 단순한 문제가 있다. 두 입력이 "서로 다르면 1, 같으면 0"인 XOR다. 네 점을 종이에 찍어 보라 —
돌파구는 관점의 전환이다. 직선으로 못 가르는 것은 이 좌표계에서의 이야기다. 입력을 먼저 다른 표현으로 바꾸면 어떨까? 예컨대 새 특징 두 개 — $h_1 = $ "둘 중 하나라도 1인가", $h_2 = $ "둘 다 1인가" — 를 만들면, 네 점은 새 좌표계
그렇다면 남은 질문은 하나 — 그 좋은 표현(
층을 쌓는다는 것
신경망의 기본 층은 이미 아는 부품 둘의 결합이다.
읽는 법: 입력 벡터
층을 겹치면 앞 층의 출력이 뒷 층의 입력이 된다:
여기서 초심자 열에 아홉이 지나치는 결정적 질문 —
현대의 표준 활성 함수는 시시할 만큼 단순하다. ReLU:
XOR로 확인해 보자. 뉴런 두 개짜리 은닉층이면 족하다.
왜 넓게가 아니라 깊게인가
보편 근사 정리대로면 한 층을 옆으로 무한정 넓히면 될 텐데, 왜 굳이 깊게 쌓는가? 두 가지 답이 있다.
효율의 답. 세상의 패턴은 위계적이다 — 이미지에서 모서리들이 모여 눈·코가 되고, 눈·코가 모여 얼굴이 된다. 깊은 망은 이 위계를 그대로 담는다: 앞 층이 단순한 조각을 배우면, 뒷 층은 그 조각들을 재사용해 조합한다. 얕고 넓은 망은 재사용이 불가능해 같은 표현력에 지수적으로 많은 뉴런이 필요할 수 있다. 레고 부품을 만들어 두고 조립하는 것과, 모든 완성품을 통짜로 조각하는 것의 차이다.
표현 학습의 답 — 이 책에서 가장 중요한 문단 중 하나다. 깊은 망을 학습시키면, 마지막 층은 결국 (5장에서 배운) 로지스틱 회귀다. 그 앞의 모든 층이 하는 일은 무엇인가? 마지막의 단순한 분류기가 직선으로 가를 수 있도록, 데이터를 점점 좋은 표현으로 변환하는 것이다. 픽셀 뭉치였던 고양이 사진이 층을 지날수록 "모서리 → 털 질감·귀 모양 → 고양이다움"이라는 점점 추상적인 좌표로 다시 그려진다. 사람이 특징을 설계하던 일을 망이 스스로 하는 것 — 이것이 표현 학습(representation learning)이며, "딥"러닝이 이전의 모든 것과 구별되는 진짜 이유다. 이 관점은 이후 모든 장의 열쇠가 된다: CNN은 이미지에 맞는 표현 학습(13장), 임베딩은 단어의 표현 학습(16장), 파인튜닝은 배운 표현의 재활용(14장)이다.
손으로 조립해 보기
전체 그림을 코드로 못박자. 손글씨 숫자(28×28 픽셀 = 784차원 벡터)를 10개 클래스로 분류하는 2층 신경망이다.
import torch, torch.nn as nn
model = nn.Sequential(
nn.Linear(784, 256), # 1층: 784차원 픽셀 → 256차원 표현 (W₁: 784×256)
nn.ReLU(), # 관절
nn.Linear(256, 10), # 2층: 표현 → 10개 클래스 점수 (W₂: 256×10)
) # 점수는 소프트맥스+교차 엔트로피로 (5장의 출구, 손실에 내장됨)
x = torch.randn(64, 784) # 배치 64장
logits = model(x) # (64, 10) — 클래스별 점수
loss = nn.CrossEntropyLoss()(logits, torch.randint(0, 10, (64,)))
print(sum(p.numel() for p in model.parameters())) # 파라미터 수: 203,530몇 가지를 음미하라. 첫째, 모델 전체가 "행렬 곱 → ReLU → 행렬 곱"이라는, 3장에서 예고한 행렬 곱의 연쇄다. 둘째, 파라미터가 벌써 20만 개다 — 2장의 2개에서 여기까지 왔지만, 학습 방법은 완전히 동일하다: 손실의 기울기를 구해 반대로 걷는다. 셋째, 출구는 5장의 소프트맥스+교차 엔트로피 그대로다. 새 부품은 사실상 ReLU 하나뿐이다.
남은 구멍은 단 하나다. 파라미터 20만 개 각각에 대한 기울기를 어떻게 계산하나? 2장에서는 손으로 미분했지만 이제는 불가능하다. 3장의 연쇄법칙이 "겹친 함수의 민감도는 단계별 민감도의 곱"이라 했으니 원리는 있다 — 그 원리를 20만 개 파라미터에 대해 한 번의 역방향 계산으로 해치우는 알고리즘이 필요하다. 그것이 다음 장의 역전파이고, 딥러닝을 가능하게 만든 엔진이다.
코드랩 01이 바로 이 모델을 프레임워크 없이 NumPy만으로 조립한다 — 다음 장을 읽고 도전하면 완벽한 타이밍이다.
핵심 요약
- 선형 모델은 XOR조차 못 가른다 — 후보 집합에 답이 없다. 해법은 더 좋은 표현으로의 변환이고, 그 변환 자체를 학습하는 것이 신경망이다.
- 층 = 선형 변환 + 비선형 활성 함수(ReLU). 비선형이 없으면 백 층도 한 층이다. ReLU 망은 조각 직선으로 임의 함수를 근사한다(보편 근사).
- 깊이의 의미: 부품의 재사용(효율)과, 층을 지날수록 추상화되는 표현 학습 — 마지막 층의 단순한 분류기가 일할 수 있게 데이터를 다시 그려 주는 것.
- 신경망 = 행렬 곱의 연쇄 + 소프트맥스 출구. 학습 뼈대는 2장 그대로이며, 남은 퍼즐은 기울기의 대량 계산뿐이다.
스스로 점검
- XOR의 네 점을 직접 찍어 직선으로 가를 수 없음을 확인하고, 본문의
변환 후 좌표에서 가르는 직선을 하나 적어 보라. 가 항등함수( )인 3층 신경망이 사실상 몇 층짜리 모델과 같은지, 행렬 곱으로 보여 보라. - "마지막 층은 로지스틱 회귀, 나머지 층은 표현 변환"이라는 문장을 고양이 사진 분류를 예로 풀어 설명해 보라.
- 784→256→10 모델의 파라미터 수 203,530을 직접 계산해 검산해 보라. (힌트: 각 Linear는 가중치 행렬 + 편향 벡터)
다음 장에서
20만 개 파라미터의 기울기를, 순전파 한 번과 비슷한 비용의 역방향 계산 한 번으로 전부 얻어내는 알고리즘 — 역전파를 완전히 해부한다. loss.backward()라는 주문 뒤의 실체를 아는 사람과 모르는 사람은, 학습이 무너졌을 때 완전히 다른 대응을 하게 된다.