← AI 놀이터 홈으로

🎬 순전파·역전파 시뮬레이터 (Backpropagation)

아주 작은 신경망이 학습 한 바퀴 도는 모습을 슬로모션으로 — 순전파(예측), 손실, 역전파(책임 나누기), 업데이트의 모든 숫자를 한 칸씩 직접 봅니다.

📖 따라하기 가이드 — 1 / 8 단계

Step 1. 학습은 왕복 운동이에요

아주 작은 신경망(입력 2 → 은닉 2 → 출력 1)이 학습 한 바퀴를 도는 모습을 슬로모션으로 봅니다. 신경망 학습 = 순전파(예측) → 손실 → 역전파(책임 나누기) → 업데이트의 왕복이에요. 캔버스의 동그라미가 뉴런, 선이 가중치(연결 강도)입니다. 아래 🔍 지금 계산 카드에 매 단계의 산수가 실제 숫자로 나와요.

🏢 층으로 보기 (쉬운 버전)

📥 입력층x₁=1.000, x₂=0.500
↓ ×가중치 +편향
🧮 은닉층 계산z₁=?, z₂=?
↓ 활성화 σ
⚡ 은닉층 출력a₁=?, a₂=?
↓ ×가중치 +편향
🧮 출력층 계산z_out=?
↓ 활성화 σ
📤 예측a_out=?
↓ 정답과 비교
🎯 손실정답 t=1 → L=?

위에서 아래로 내려가면 순전파(예측 만들기), 아래에서 위로 거슬러 오르는 빨간 ↑ δ는 역전파(책임 나누기)예요. 지금 계산 중인 층이 보라색으로 켜져요 — 아래 동그라미 그림과 똑같은 계산을 층 단위로 뭉쳐 본 것입니다.

동그라미는 뉴런(안의 숫자는 출력값 a), 선은 가중치예요. 노란색은 지금 계산에 쓰이는 부분(순전파: 왼→오), 빨간 점선은 역전파에서 책임 δ가 거꾸로(오→왼) 흐르는 길, 초록은 방금 업데이트된 가중치입니다.

바퀴(iteration)를 완주할 때마다 손실이 점으로 기록돼요. 오른쪽 아래로 떨어지는 빨간 선 = 학습이 되고 있다는 증거!

🔍 지금 계산 — 0단계: 준비

입력 x₁=1.000, x₂=0.500, 정답 t=1. 가중치 9개는 캔버스의 선 위에 적혀 있어요. 신경망 학습 = 순전파(예측) → 손실 → 역전파(책임 나누기) → 업데이트의 왕복! [다음 단계 ▶]를 눌러 첫 발을 떼 보세요.

🎛️ 단계 진행

은닉층 활성화 함수

출력층은 0~1 확률이 필요해서 항상 σ(시그모이드) 고정이에요. 바꾸면 0단계부터 다시 시작해요.

📊 지금 상태

현재 단계
0. 준비
예측 a_out
0.600
손실 L
0.080
완료한 바퀴
0
🖩 직접 맞힌 계산
0개

[다음 단계 ▶]로 한 칸씩 왕복을 완주하고, [🔁 한 바퀴 더]로 반복하면 손실 L이 점점 줄어들어요.

🧮 수식과 파이썬

δ_은닉 = δ_출력 × v × σ′(z)
연쇄 법칙(chain rule): 뒤의 책임이 연결 강도를 타고 앞으로 전해져요
w ← w − η·∂L/∂w
경사 하강법: 기울기의 반대 방향으로 학습률 η만큼 한 걸음
🐍 파이썬 코드로 보면? (펼치기)
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()   # 자동 미분이 연쇄 법칙을 대신 해줍니다