은닉층이 있는 경우 신경망 학습 예시

Bean·2025년 3월 30일
0

인공지능

목록 보기
1/123

1 신경망 구조

은닉층(Hidden layer)이 1개 있는 경우의 간단한 신경망으로 경사 하강법 예시를 보여드리겠습니다.

입력층(Input Layer):

xx

은닉층(Hidden Layer):

  • 가중치: w1w_1
  • 활성화 함수: ReLU 사용 → h=max(0,w1x)h = \max(0, w_1 \cdot x)

출력층(Output Layer):

  • 가중치: w2w_2

  • 출력값:
    ypred=w2hy_{\text{pred}} = w_2 \cdot h

  • 손실 함수(Loss Function): Mean Squared Error (MSE) 사용


2 수식 정리

(1) 순전파 (Forward Pass)

은닉층 계산 (ReLU 활성화 함수 적용)

h=max(0,w1x)h = \max(0, w_1 \cdot x)

출력층 계산

ypred=w2hy_{\text{pred}} = w_2 \cdot h

손실 함수(MSE) 계산

L=1n(ypredytrue)2L = \frac{1}{n} \sum (y_{\text{pred}} - y_{\text{true}})^2


(2) 역전파 (Backpropagation, Chain Rule 적용)

손실 LL에 대해 각 가중치의 기울기를 구합니다.

① 출력층의 가중치 w2w_2에 대한 기울기

Lw2=Lypred×ypredw2\frac{\partial L}{\partial w_2} = \frac{\partial L}{\partial y_{\text{pred}}} \times \frac{\partial y_{\text{pred}}}{\partial w_2}

계산하면:
Lw2=2n(ypredytrue)×h\frac{\partial L}{\partial w_2} = \frac{2}{n} \sum (y_{\text{pred}} - y_{\text{true}}) \times h

② 은닉층의 가중치 w1w_1에 대한 기울기 (체인 룰 적용)

Lw1=Lypred×ypredh×hw1\frac{\partial L}{\partial w_1} = \frac{\partial L}{\partial y_{\text{pred}}} \times \frac{\partial y_{\text{pred}}}{\partial h} \times \frac{\partial h}{\partial w_1}

각 항을 계산하면:

Lypred=2n(ypredytrue)\frac{\partial L}{\partial y_{\text{pred}}} = \frac{2}{n} (y_{\text{pred}} - y_{\text{true}})

ypredh=w2\frac{\partial y_{\text{pred}}}{\partial h} = w_2

hw1=x\frac{\partial h}{\partial w_1} = x

(단, ReLU의 미분: h>0h > 0일 때만 1, h0h \leq 0이면 0)

Lw1=2n(ypredytrue)×w2×x×1h>0\frac{\partial L}{\partial w_1} = \frac{2}{n} \sum (y_{\text{pred}} - y_{\text{true}}) \times w_2 \times x \times 1_{h > 0}

여기서 1h>01_{h > 0}는 ReLU의 미분(활성 여부에 따라 0 또는 1)입니다.


(3) 경사 하강법(Gradient Descent)으로 가중치 업데이트

w1=w1ηLw1w_1 = w_1 - \eta \cdot \frac{\partial L}{\partial w_1}

w2=w2ηLw2w_2 = w_2 - \eta \cdot \frac{\partial L}{\partial w_2}


3 PyTorch 코드로 구현

이제 위 수식을 실제 PyTorch 코드로 실행해보겠습니다.

import torch

# 데이터 정의
x = torch.tensor([1.0, 2.0, 3.0, 4.0])  # 입력값
y_true = torch.tensor([2.0, 4.0, 6.0, 8.0])  # 실제값

# 학습할 가중치 (requires_grad=True 설정)
w1 = torch.tensor([0.5], requires_grad=True)  # 은닉층 가중치
w2 = torch.tensor([0.5], requires_grad=True)  # 출력층 가중치

# 순전파 (Forward Pass)
h = torch.relu(w1 * x)  # 은닉층 (ReLU 활성화)
y_pred = w2 * h  # 출력층
loss = ((y_pred - y_true) ** 2).mean()  # MSE 손실

# 역전파 (Backward Pass)
loss.backward()

# 경사 하강법을 이용한 가중치 업데이트
learning_rate = 0.1
with torch.no_grad():  # PyTorch의 자동 미분 추적 방지
    w1 -= learning_rate * w1.grad  # w1 업데이트
    w2 -= learning_rate * w2.grad  # w2 업데이트
    w1.grad.zero_()  # 그래디언트 초기화
    w2.grad.zero_()

# 업데이트된 가중치 출력
print(f"Updated w1: {w1.item()}, Updated w2: {w2.item()}")

4 결론

  • 체인 룰을 이용해 은닉층의 가중치까지 최적화 가능!
  • PyTorch의 loss.backward()가 자동으로 체인 룰을 적용해 역전파 수행!
  • 경사 하강법을 이용해 w1,w2w_1, w_2를 업데이트하며 최적화 진행!

즉, 은닉층이 추가되더라도 체인 룰을 통해 역전파를 수행하고 경사 하강법으로 가중치를 최적화할 수 있습니다.

profile
AI developer

0개의 댓글