[CS300 #269] 신경망 기초 — 퍼셉트론과 역전파
컴퓨터공학 300 주제 시리즈의 269번째 글이다. 전체 지도는 여기.
한 줄 요약
신경망은 “가중합 → 비선형 함수”를 층층이 쌓은 함수이고, 역전파는 연쇄 법칙으로 출력의 오차를 거꾸로 흘려 모든 가중치의 기울기를 한 번에 계산하는 알고리즘이다.
왜 필요한가
선형 모델은 직선(초평면) 경계밖에 못 그린다. 이미지·음성·문장처럼 특징을 사람이 일일이 설계하기 어려운 데이터에서는 특징 자체를 데이터에서 배우는 모델이 필요하다. 신경망이 그 일을 한다. 앞쪽 층이 단순한 패턴을, 뒤쪽 층이 그 조합을 배운다.
그리고 오늘날 쓰이는 모든 딥러닝 모델, 합성곱 신경망부터 트랜스포머까지, 학습 방법은 같다. 손실을 정의하고, 역전파로 기울기를 구하고, 경사 하강법으로 가중치를 고친다. 이 글의 내용이 이후 모든 글의 바닥이다.
핵심 개념
퍼셉트론
로젠블랫(1958)의 퍼셉트론은 뉴런 하나다.
x1 ─w1─┐
x2 ─w2─┼─▶ Σ wi·xi + b ─▶ 계단 함수 ─▶ 0 또는 1
x3 ─w3─┘
학습 규칙은 단순하다. 틀리면 w ← w + (y − ŷ)·x. 데이터가 선형 분리 가능하면 유한 번 안에 수렴한다는 것이 증명되어 있다(퍼셉트론 수렴 정리).
문제는 선형 분리 불가능한 데이터다. 대표가 XOR 이다. (0,0)→0, (0,1)→1, (1,0)→1, (1,1)→0 은 평면에 직선 하나로 가를 수 없다. 민스키와 페퍼트가 1969년 책에서 이런 한계를 체계적으로 정리했다.
다층 퍼셉트론(MLP)
해법은 층을 쌓는 것이다.
입력층 은닉층 출력층
x1 ──┐ ┌─ h1 = φ(...) ─┐
├─W1─┤─ h2 = φ(...) ──┼─W2─▶ ŷ
x2 ──┘ └─ h3 = φ(...) ─┘
은닉층이 입력을 새로운 공간으로 옮기고, 그 공간에서는 선형 분리가 가능해진다. 단, φ 가 비선형이어야 한다. 선형 함수를 아무리 겹쳐도 선형 함수 하나이기 때문이다(W2·W1·x = W·x).
| 활성화 함수 | 식 | 미분 | 쓰임 |
|---|---|---|---|
| 시그모이드 | 1/(1+e^−z) | σ(1−σ), 최대 0.25 | 이진 출력층 |
| tanh | (e^z − e^−z)/(e^z + e^−z) | 1 − tanh², 최대 1 | 은닉층(고전) |
| ReLU | max(0, z) | 0 또는 1 | 은닉층(현대 기본) |
은닉층이 하나라도 뉴런이 충분히 많으면 연속 함수를 원하는 정밀도로 근사할 수 있다는 보편 근사 정리가 있다. 다만 “가능하다”는 것이지 “학습으로 그 가중치를 찾을 수 있다”는 보장은 아니다. 실제로는 깊게 쌓는 편이 같은 파라미터로 더 효율적이다.
역전파
가중치가 수백만 개일 때, 각각을 조금 바꿔 보며 기울기를 재면 너무 느리다. 역전파는 연쇄 법칙을 이용해 순전파 한 번 + 역전파 한 번으로 모든 기울기를 구한다.
2층 신경망, 이진 교차 엔트로피 손실 L 에 대해
순전파: z1 = X·W1 + b1 h = tanh(z1)
z2 = h·W2 + b2 p = σ(z2) L = BCE(p, y)
역전파: dL/dz2 = p − y (시그모이드 + BCE 의 깔끔한 결과)
dL/dW2 = hᵀ · dL/dz2
dL/dh = dL/dz2 · W2ᵀ
dL/dz1 = dL/dh ⊙ (1 − h²) (tanh 의 미분, ⊙ 는 원소별 곱)
dL/dW1 = Xᵀ · dL/dz1
출력에서 입력 쪽으로, “위층에서 내려온 기울기 × 이 층의 국소 미분”을 반복한다. 순전파에서 계산한 중간값(h, p)을 저장해 두었다가 재사용하므로, 계산량은 순전파와 같은 차수다. 이 방식이 1986년 럼멀하트·힌턴·윌리엄스의 논문으로 널리 퍼졌다.
현대 프레임워크(PyTorch, JAX)는 이 과정을 자동 미분으로 처리한다. 연산 그래프를 기록해 두고 역순으로 국소 미분을 곱한다. 원리는 위 다섯 줄과 같다.
초기화와 학습률
가중치를 모두 0 으로 두면 같은 층의 뉴런이 모두 같은 기울기를 받아 영원히 같은 값을 유지한다(대칭 문제). 그래서 작은 무작위 값으로 초기화한다. 손실 곡면이 볼록하지 않으므로, 초기값과 학습률에 따라 나쁜 지점에 머물 수 있다. 실제로 아래 예제도 처음에 은닉 뉴런 4개, 다른 난수 씨앗으로 돌렸을 때 출력이 0.5 에 갇혀 XOR 을 풀지 못했다. 은닉 뉴런을 8개로 늘리자 풀렸다. 뉴런이 많으면 좋은 해로 가는 길이 많아진다.
직접 해 보기
XOR 에 대해 단층 퍼셉트론과 은닉층 하나짜리 신경망을 비교한다. 역전파는 위 수식을 그대로 넘파이로 옮겼다.
import numpy as np
X = np.array([[0,0],[0,1],[1,0],[1,1]], float)
y = np.array([[0],[1],[1],[0]], float) # XOR
# 1) 단층 퍼셉트론은 XOR 을 못 푼다
w, b = np.zeros(2), 0.0
for epoch in range(100):
for xi, yi in zip(X, y[:, 0]):
pred = float(w @ xi + b > 0)
w += (yi - pred) * xi; b += (yi - pred)
print("퍼셉트론 예측:", [int(w @ xi + b > 0) for xi in X])
# 2) 은닉층 하나 + 역전파
rng = np.random.default_rng(1)
W1, b1 = rng.normal(0, 1, (2, 8)), np.zeros(8)
W2, b2 = rng.normal(0, 1, (8, 1)), np.zeros(1)
sig = lambda z: 1 / (1 + np.exp(-z))
for step in range(5000):
h = np.tanh(X @ W1 + b1) # 순전파
out = sig(h @ W2 + b2)
d_out = (out - y) / len(X) # BCE + 시그모이드의 기울기
dW2 = h.T @ d_out; db2 = d_out.sum(0)
d_h = d_out @ W2.T * (1 - h**2) # 연쇄 법칙, tanh' = 1 - tanh^2
dW1 = X.T @ d_h; db1 = d_h.sum(0)
for p, g in ((W1,dW1),(b1,db1),(W2,dW2),(b2,db2)):
p -= 1.0 * g
print("2층 신경망 출력:", out[:, 0].round(3))
실행 결과:
퍼셉트론 예측: [1, 1, 0, 0]
2층 신경망 출력: [0. 1. 1. 0.]
퍼셉트론은 100 에폭을 돌아도 XOR 을 맞히지 못한다(정답은 0, 1, 1, 0). 수렴하지 못하고 가중치가 계속 진동한다. 은닉층을 둔 신경망은 네 점을 모두 맞혔다.
코드의 d_h = d_out @ W2.T * (1 - h**2) 한 줄이 연쇄 법칙의 핵심이다. 출력층의 오차를 W2 로 거꾸로 보내고, tanh 의 국소 미분을 곱한다.
현업에서는
- 직접 역전파를 짜는 일은 거의 없다. 그러나 기울기가 NaN 이 되거나, 손실이 안 줄거나, 특정 층의 기울기가 0 이 되는 문제를 디버깅하려면 이 흐름을 머릿속에 그릴 수 있어야 한다.
- 기울기 확인(gradient check): 새 연산을 직접 구현했다면 수치 미분 (f(w+ε) − f(w−ε)) / 2ε 과 역전파 결과를 비교해 검증한다.
- 메모리: 역전파는 순전파의 중간값을 저장해야 하므로, 학습은 추론보다 메모리를 훨씬 많이 쓴다. 큰 모델 학습에서 활성값 재계산(gradient checkpointing)으로 메모리와 계산을 맞바꾸는 이유다. 작은 홈랩 서버에서 추론은 되는데 학습은 메모리 부족으로 안 되는 일이 흔한 것도 이 때문이다.
확인 문제
- 활성화 함수 없이 선형 층만 10개 쌓은 신경망은 무엇과 같은가?
- 퍼셉트론이 XOR 을 풀지 못하는 이유는?
- 모든 가중치를 0 으로 초기화하면 어떤 문제가 생기는가?
- 시그모이드 출력 + 이진 교차 엔트로피에서 출력층의 기울기 dL/dz 는?
- 역전파가 각 가중치를 하나씩 흔들어 보는 수치 미분보다 빠른 이유는?
풀이
- 선형 층 하나. 행렬 곱의 합성은 행렬 곱이다.
- XOR 의 네 점은 직선 하나로 나눌 수 없는데, 퍼셉트론의 결정 경계는 직선(초평면)이다.
- 같은 층의 뉴런들이 같은 기울기를 받아 계속 같은 값으로 갱신된다. 뉴런을 여러 개 둔 의미가 사라진다.
- p − y.
- 연쇄 법칙으로 중간 결과를 공유해, 순전파 한 번과 역전파 한 번에 모든 기울기를 구한다. 수치 미분은 가중치 수만큼 순전파를 반복해야 한다.
더 읽을거리 (References)
- D. Rumelhart, G. Hinton, R. Williams, “Learning representations by back-propagating errors”, Nature 323, 1986. 링크
- I. Goodfellow, Y. Bengio, A. Courville, Deep Learning, MIT Press, 6장. 온라인판
- Stanford CS231n 강의 노트, Backpropagation, Intuitions
- F. Rosenblatt, “The perceptron: A probabilistic model for information storage and organization in the brain”, Psychological Review 65(6), 1958. (서지 정보)