Skip to content

9장. 뉴런의 산수 — 신경망

이 장의 질문: 단순한 부품을 쌓기만 하면 어떻게 임의의 복잡한 패턴을 배울 수 있는가? 신경망의 구조를 산수 수준까지 해체하고, "깊이"가 표현 학습이라는 마법을 낳는 원리를 이해한다.

전제: 2장(모델·손실·최적화), 3장(행렬 곱), 5장(시그모이드, 소프트맥스).

직선의 한계, XOR라는 벽

5장의 로지스틱 회귀는 결국 직선(평면)으로 공간을 가르는 기계였다. 그런데 직선으로 절대 가를 수 없는, 허무할 만큼 단순한 문제가 있다. 두 입력이 "서로 다르면 1, 같으면 0"인 XOR다. 네 점을 종이에 찍어 보라 — (0,0)0, (1,1)0은 대각선 양끝에, (0,1)1, (1,0)1은 반대 대각선 양끝에 있다. 0들과 1들을 가르는 직선은 존재하지 않는다. 어떤 w를 배워도 안 된다. 모델의 후보 집합 안에 답이 없기 때문이다.

돌파구는 관점의 전환이다. 직선으로 못 가르는 것은 이 좌표계에서의 이야기다. 입력을 먼저 다른 표현으로 바꾸면 어떨까? 예컨대 새 특징 두 개 — $h_1 = $ "둘 중 하나라도 1인가", $h_2 = $ "둘 다 1인가" — 를 만들면, 네 점은 새 좌표계 (h1,h2)에서 (0,0),(1,0),(1,0),(1,1)이 되고, XOR의 답은 h1h2 … 직선으로 갈라진다! 문제가 어려웠던 게 아니라 표현이 나빴던 것이다.

그렇다면 남은 질문은 하나 — 그 좋은 표현(h1,h2)을 누가 만드나? 사람이 손으로? 그것이 구시대의 "특징 공학"이다. 신경망의 대답은: 표현을 만드는 일 자체를 학습에 포함시키자.

층을 쌓는다는 것

신경망의 기본 층은 이미 아는 부품 둘의 결합이다.

h=f(Wx+b)

읽는 법: 입력 벡터 x에 행렬 W를 곱하고 b를 더한 뒤(선형 변환 — 5장까지 쓰던 "점수 계산"의 묶음판), 각 숫자에 비선형 함수 f를 통과시킨다. 이 한 덩어리가 (layer)이고, 출력 h의 각 숫자가 뉴런 하나의 활성값이다. 뉴런 하나만 떼어 보면 정확히 로지스틱 회귀 하나다 — 신경망이란 작은 로지스틱 회귀들을 병렬로 여러 개(층), 그리고 직렬로 여러 겹(깊이) 쌓은 것에 지나지 않는다.

층을 겹치면 앞 층의 출력이 뒷 층의 입력이 된다:

y^=W2f(W1x+b1)+b2

여기서 초심자 열에 아홉이 지나치는 결정적 질문 — f는 왜 필요한가? f를 빼고 선형 변환만 겹쳐 보라. W2(W1x)=(W2W1)x — 행렬 둘의 곱은 그냥 또 하나의 행렬이다. 비선형 f가 없으면 백 층을 쌓아도 한 층짜리 선형 모델과 정확히 같다. XOR 앞에서 여전히 무력하다. f활성 함수 — 는 층 쌓기가 표현력 증가로 이어지게 하는 유일한 장치, 신경망의 관절이다.

현대의 표준 활성 함수는 시시할 만큼 단순하다. ReLU: f(z)=max(0,z) — 음수는 0으로, 양수는 그대로. 왜 이런 꺾인 막대기가 통하는가? ReLU 신경망이 만드는 함수는 조각조각 이어붙인 직선(평면) 이다. 뉴런이 많을수록 조각이 많아지고, 조각이 충분히 많으면 어떤 곡선이든 원하는 정밀도로 흉내낼 수 있다 — 곡선을 짧은 직선들로 근사해 그리는 것과 같다. 실제로 "은닉층 하나에 뉴런이 충분히 많으면 임의의 연속 함수를 근사할 수 있다"는 보편 근사 정리가 증명되어 있다. 다만 이 정리는 "그런 파라미터가 존재한다"는 보장일 뿐 "찾을 수 있다"거나 "적은 뉴런으로 된다"는 보장이 아니다 — 그래서 다음 절의 질문이 남는다.

XOR로 확인해 보자. 뉴런 두 개짜리 은닉층이면 족하다. h1=ReLU(x1+x2), h2=ReLU(x1+x21)로 두면 네 입력에 대해 (h1,h2)(0,0),(1,0),(1,0),(2,1)이 되고, y^=h12h2는 정확히 0,1,1,0 — XOR 완성이다. 위에서 사람이 상상했던 "좋은 표현"을, 가중치 몇 개가 그대로 구현했다. 그리고 실전에서는 이 가중치를 사람이 아니라 경사하강이 데이터로부터 찾아낸다.

왜 넓게가 아니라 깊게인가

보편 근사 정리대로면 한 층을 옆으로 무한정 넓히면 될 텐데, 왜 굳이 깊게 쌓는가? 두 가지 답이 있다.

효율의 답. 세상의 패턴은 위계적이다 — 이미지에서 모서리들이 모여 눈·코가 되고, 눈·코가 모여 얼굴이 된다. 깊은 망은 이 위계를 그대로 담는다: 앞 층이 단순한 조각을 배우면, 뒷 층은 그 조각들을 재사용해 조합한다. 얕고 넓은 망은 재사용이 불가능해 같은 표현력에 지수적으로 많은 뉴런이 필요할 수 있다. 레고 부품을 만들어 두고 조립하는 것과, 모든 완성품을 통짜로 조각하는 것의 차이다.

표현 학습의 답 — 이 책에서 가장 중요한 문단 중 하나다. 깊은 망을 학습시키면, 마지막 층은 결국 (5장에서 배운) 로지스틱 회귀다. 그 앞의 모든 층이 하는 일은 무엇인가? 마지막의 단순한 분류기가 직선으로 가를 수 있도록, 데이터를 점점 좋은 표현으로 변환하는 것이다. 픽셀 뭉치였던 고양이 사진이 층을 지날수록 "모서리 → 털 질감·귀 모양 → 고양이다움"이라는 점점 추상적인 좌표로 다시 그려진다. 사람이 특징을 설계하던 일을 망이 스스로 하는 것 — 이것이 표현 학습(representation learning)이며, "딥"러닝이 이전의 모든 것과 구별되는 진짜 이유다. 이 관점은 이후 모든 장의 열쇠가 된다: CNN은 이미지에 맞는 표현 학습(13장), 임베딩은 단어의 표현 학습(16장), 파인튜닝은 배운 표현의 재활용(14장)이다.

손으로 조립해 보기

전체 그림을 코드로 못박자. 손글씨 숫자(28×28 픽셀 = 784차원 벡터)를 10개 클래스로 분류하는 2층 신경망이다.

python
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장 그대로이며, 남은 퍼즐은 기울기의 대량 계산뿐이다.

스스로 점검

  1. XOR의 네 점을 직접 찍어 직선으로 가를 수 없음을 확인하고, 본문의 h1,h2 변환 후 좌표에서 가르는 직선을 하나 적어 보라.
  2. f가 항등함수(f(z)=z)인 3층 신경망이 사실상 몇 층짜리 모델과 같은지, 행렬 곱으로 보여 보라.
  3. "마지막 층은 로지스틱 회귀, 나머지 층은 표현 변환"이라는 문장을 고양이 사진 분류를 예로 풀어 설명해 보라.
  4. 784→256→10 모델의 파라미터 수 203,530을 직접 계산해 검산해 보라. (힌트: 각 Linear는 가중치 행렬 + 편향 벡터)

다음 장에서

20만 개 파라미터의 기울기를, 순전파 한 번과 비슷한 비용의 역방향 계산 한 번으로 전부 얻어내는 알고리즘 — 역전파를 완전히 해부한다. loss.backward()라는 주문 뒤의 실체를 아는 사람과 모르는 사람은, 학습이 무너졌을 때 완전히 다른 대응을 하게 된다.

10장. 오차의 강을 거슬러 — 역전파 →