아주 작은 신경망이 학습 한 바퀴 도는 모습을 슬로모션으로 — 순전파(예측), 손실, 역전파(책임 나누기), 업데이트의 모든 숫자를 한 칸씩 직접 봅니다.
위에서 아래로 내려가면 순전파(예측 만들기), 아래에서 위로 거슬러 오르는 빨간 ↑ δ는 역전파(책임 나누기)예요. 지금 계산 중인 층이 보라색으로 켜져요 — 아래 동그라미 그림과 똑같은 계산을 층 단위로 뭉쳐 본 것입니다.
동그라미는 뉴런(안의 숫자는 출력값 a), 선은 가중치예요. 노란색은 지금 계산에 쓰이는 부분(순전파: 왼→오), 빨간 점선은 역전파에서 책임 δ가 거꾸로(오→왼) 흐르는 길, 초록은 방금 업데이트된 가중치입니다.
바퀴(iteration)를 완주할 때마다 손실이 점으로 기록돼요. 오른쪽 아래로 떨어지는 빨간 선 = 학습이 되고 있다는 증거!
입력 x₁=1.000, x₂=0.500, 정답 t=1. 가중치 9개는 캔버스의 선 위에 적혀 있어요. 신경망 학습 = 순전파(예측) → 손실 → 역전파(책임 나누기) → 업데이트의 왕복! [다음 단계 ▶]를 눌러 첫 발을 떼 보세요.
출력층은 0~1 확률이 필요해서 항상 σ(시그모이드) 고정이에요. 바꾸면 0단계부터 다시 시작해요.
[다음 단계 ▶]로 한 칸씩 왕복을 완주하고, [🔁 한 바퀴 더]로 반복하면 손실 L이 점점 줄어들어요.
import numpy as np
def sigmoid(z): return 1 / (1 + np.exp(-z))
# --- 수동 역전파: 이 페이지의 계산을 numpy로 그대로 ---
x = np.array([1.0, 0.5]); t = 1.0 # 입력과 정답
W1 = np.array([[0.3, 0.6], [-0.4, 0.2]]) # 은닉층 가중치
b1 = np.array([0.1, -0.2])
v, c, lr = np.array([0.7, -0.3]), 0.05, 1.0 # 출력층 가중치, 학습률
for epoch in range(10):
z1 = W1 @ x + b1; a1 = sigmoid(z1) # 순전파: 은닉층
z_out = v @ a1 + c; a_out = sigmoid(z_out) # 순전파: 출력층
L = 0.5 * (a_out - t) ** 2 # 손실 (MSE)
d_out = (a_out - t) * a_out * (1 - a_out) # 역전파: 출력의 책임 δ
d_h = d_out * v * a1 * (1 - a1) # 연쇄 법칙: 은닉의 책임
v = v - lr * d_out * a1; c = c - lr * d_out # 업데이트
W1 = W1 - lr * np.outer(d_h, x); b1 = b1 - lr * d_h
# --- PyTorch라면? 위의 δ 계산 전부가 단 한 줄 ---
# loss.backward() # 자동 미분이 연쇄 법칙을 대신 해줍니다