1 신경망 구조
은닉층(Hidden layer)이 1개 있는 경우의 간단한 신경망으로 경사 하강법 예시를 보여드리겠습니다.
x
은닉층(Hidden Layer):
- 가중치: w1
- 활성화 함수: ReLU 사용 → h=max(0,w1⋅x)
출력층(Output Layer):
2 수식 정리
(1) 순전파 (Forward Pass)
은닉층 계산 (ReLU 활성화 함수 적용)
h=max(0,w1⋅x)
출력층 계산
ypred=w2⋅h
손실 함수(MSE) 계산
L=n1∑(ypred−ytrue)2
(2) 역전파 (Backpropagation, Chain Rule 적용)
손실 L에 대해 각 가중치의 기울기를 구합니다.
① 출력층의 가중치 w2에 대한 기울기
∂w2∂L=∂ypred∂L×∂w2∂ypred
계산하면:
∂w2∂L=n2∑(ypred−ytrue)×h
② 은닉층의 가중치 w1에 대한 기울기 (체인 룰 적용)
∂w1∂L=∂ypred∂L×∂h∂ypred×∂w1∂h
각 항을 계산하면:
∂ypred∂L=n2(ypred−ytrue)
∂h∂ypred=w2
∂w1∂h=x
(단, ReLU의 미분: h>0일 때만 1, h≤0이면 0)
∂w1∂L=n2∑(ypred−ytrue)×w2×x×1h>0
여기서 1h>0는 ReLU의 미분(활성 여부에 따라 0 또는 1)입니다.
(3) 경사 하강법(Gradient Descent)으로 가중치 업데이트
w1=w1−η⋅∂w1∂L
w2=w2−η⋅∂w2∂L
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])
w1 = torch.tensor([0.5], requires_grad=True)
w2 = torch.tensor([0.5], requires_grad=True)
h = torch.relu(w1 * x)
y_pred = w2 * h
loss = ((y_pred - y_true) ** 2).mean()
loss.backward()
learning_rate = 0.1
with torch.no_grad():
w1 -= learning_rate * w1.grad
w2 -= learning_rate * w2.grad
w1.grad.zero_()
w2.grad.zero_()
print(f"Updated w1: {w1.item()}, Updated w2: {w2.item()}")
4 결론
- 체인 룰을 이용해 은닉층의 가중치까지 최적화 가능!
- PyTorch의 loss.backward()가 자동으로 체인 룰을 적용해 역전파 수행!
- 경사 하강법을 이용해 w1,w2를 업데이트하며 최적화 진행!
즉, 은닉층이 추가되더라도 체인 룰을 통해 역전파를 수행하고 경사 하강법으로 가중치를 최적화할 수 있습니다.