A Step by Step Backpropagation Example

학습 목표 매핑

SKALA 3기 Module 3 — ML/Deep Learning (Learning Objective 3-3)

  • Objective: 신경망의 순전파(Forward Pass)와 역전파(Backpropagation)를 이해하고, 구체적인 수치 예시로 단계별 계산을 수행할 수 있다 (Bloom L2-L3)
  • Evaluation: 2-4-2 신경망에서 손실함수 계산 및 가중치 업데이트 공식을 유도·적용 가능

신경망 아키텍처 (예시)

네트워크 구조:

  • 입력층 (Input): 2개 노드
  • 은닉층 (Hidden): 2개 노드 + bias
  • 출력층 (Output): 2개 노드 + bias

초기 가중치:

  • 입력→은닉:
  • 은닉→출력:
  • 바이어스:

1단계: 순전파 (Forward Pass)

은닉층 계산

입력값:

은닉층 첫 번째 노드 ():

활성화 함수 (Sigmoid):

은닉층 두 번째 노드 () (유사하게 계산):

출력층 계산

출력층 첫 번째 노드 ():

출력층 두 번째 노드 () (유사하게 계산):

2단계: 손실 계산

목표값:

제곱 오차 (Sum of Squared Error):

3단계: 역전파 (Backpropagation)

출력층 그래디언트 계산

출력층 노드 의 오차:

Sigmoid 미분:

체인 룰 적용:

가중치 그래디언트 계산

에 대한 그래디언트 (출력층-은닉층 연결):

가중치 업데이트 (학습률 )

은닉층 그래디언트 계산

역전파 체인:

은닉층 가중치 업데이트 (유사하게 계산)

핵심 개념: 체인 룰 (Chain Rule)

신경망의 핵심은 편미분의 곱셈(체인 룰) 적용:

역전파 흐름:

출력층 오차 → 은닉층 오차 → 입력층 오차
각 단계에서 활성화 함수 미분 × 입력값 × 가중치

주요 통찰

개념설명중요성
Sigmoid 미분각 층의 그래디언트 크기 결정
학습률 ()가중치 업데이트 크기 조절 (보통 0.01-0.1)너무 크면 발산, 너무 작으면 느린 수렴
바이어스 미업데이트예시에서 바이어스는 고정 (실제로는 업데이트 필요)트레이닝 완전성을 위해 필수
그래디언트 확산깊은 층으로 갈수록 그래디언트 → 0 (소실)Vanishing Gradient 문제 근원

단계별 계산 예시 요약

단계계산 항목예시 값
1. Forward0.3775
0.5933
1.1059
0.7514
2. Error0.3021
3. Backward0.7414
0.1385
0.0822
4. Update (학습률=0.5)0.3589

학습 설계 포인트

Cognitive Level (Bloom)

  • L2 (Understand): Forward Pass 단계 이해
  • L3 (Apply): 체인 룰을 이용한 그래디언트 계산
  • L4 (Analyze): 학습률·활성화 함수 변경 시 영향 분석

권장 실습

  1. 손계산: 2-4-2 또는 2-2-2 네트워크로 처음부터 계산
  2. 코드 검증: PyTorch/TensorFlow로 동일 가중치로 실행 후 비교
  3. 미분: Sigmoid 미분 공식 유도
  4. 문제 해결: “학습률을 2배로 하면?” “활성화 함수를 ReLU로 바꾸면?”

코드 예시 (PyTorch로 검증)

import torch
import torch.nn as nn
 
# 초기 가중치 설정
model = nn.Sequential(
    nn.Linear(2, 2),  # 입력층 → 은닉층
    nn.Sigmoid(),
    nn.Linear(2, 2),  # 은닉층 → 출력층
    nn.Sigmoid()
)
 
# 가중치 초기화 (Matt Mazur 예시)
with torch.no_grad():
    model[0].weight = nn.Parameter(torch.tensor([
        [0.15, 0.20],
        [0.25, 0.30]
    ], dtype=torch.float32))
    model[0].bias = nn.Parameter(torch.tensor([0.35, 0.35], dtype=torch.float32))
    model[2].weight = nn.Parameter(torch.tensor([
        [0.40, 0.45],
        [0.50, 0.55]
    ], dtype=torch.float32))
    model[2].bias = nn.Parameter(torch.tensor([0.60, 0.60], dtype=torch.float32))
 
# Forward Pass
x = torch.tensor(, dtype=torch.float32)
y = torch.tensor(, dtype=torch.float32)
 
output = model(x)
print(f"예측값: {output}")  # [0.7514, 0.7669]
 
# 손실 계산
loss_fn = nn.MSELoss()
loss = loss_fn(output, y)
print(f"손실: {loss.item():.4f}")  # 0.3021
 
# Backward Pass
loss.backward()
 
# 그래디언트 확인
print(f"w5 그래디언트: {model[2].weight.grad[0, 0]}")  # ≈ 0.0822

참고: 신경망 학습의 완전한 루프

입력 데이터
    ↓
[순전파] 계산 그래프 구성
    ↓
손실 함수 계산
    ↓
[역전파] 그래디언트 계산 (체인 룰)
    ↓
[업데이트] 경사 하강법으로 가중치 수정
    ↓
다음 에포크로 반복

타 소스와의 연계

neural-network-forward-backprop-tds (이론·수식·PyTorch 구현) tensorflow-keras-quickstart (실제 MNIST 분류 예시)