역전파 알고리즘(Backpropagation)과 손실 최소화 원리
1. 서론
딥러닝에서 신경망 모델을 학습시키기 위해서는 손실(loss)을 최소화해야 합니다. 이를 위해 가장 널리 사용되는 방법이 바로 역전파 알고리즘(Backpropagation)입니다. 역전파 알고리즘은 신경망의 가중치와 편향을 조정하여 예측값과 실제값 사이의 오차를 줄이는 핵심적인 최적화 기법입니다.
이번 포스팅에서는 역전파 알고리즘의 원리와 수식을 이해하고, 이를 Python 코드로 구현해보겠습니다.
2. 신경망의 학습 과정
신경망 학습 과정은 다음과 같이 진행됩니다.
- 순전파(Forward Propagation): 입력 데이터를 네트워크에 통과시켜 예측값을 얻습니다.
- 손실 계산(Loss Calculation): 예측값과 실제값의 차이를 손실 함수로 계산합니다.
- 역전파(Backpropagation): 오차를 각 가중치에 대해 미분하여 경사(Gradient)를 구합니다.
- 가중치 업데이트(Weight Update): 경사하강법(Gradient Descent)을 사용하여 가중치를 조정합니다.
이 과정이 여러 번 반복되면서 신경망의 성능이 점점 개선됩니다.
3. 역전파 알고리즘(Backpropagation)의 원리
역전파 알고리즘은 미분을 활용하여 손실을 최소화하는 방향으로 가중치를 조정하는 기법입니다. 이를 이해하기 위해 간단한 2층 신경망을 예로 들어보겠습니다.
3.1. 순전파 단계
신경망에서 한 개의 뉴런을 고려해보겠습니다.
$$
\hat{y} = f(WX + b)
$$
여기서,
- $X$ : 입력 데이터
- $W$ : 가중치(Weight)
- $b$ : 편향(Bias)
- $f$ : 활성화 함수(Activation Function)
- $\hat{y}$ : 예측값(Predicted Output)
3.2. 손실 함수 계산
손실(Loss)은 예측값과 실제값 사이의 차이를 측정하는 함수입니다. 가장 일반적인 손실 함수로 평균 제곱 오차(Mean Squared Error, MSE) 를 사용합니다.
$$
L = \frac{1}{2} (y - \hat{y})^2
$$
3.3. 역전파 단계: 미분을 이용한 가중치 조정
오차를 최소화하기 위해 손실 함수를 가중치 $W$ 에 대해 미분합니다.
$$
\frac{\partial L}{\partial W} = \frac{\partial L}{\partial \hat{y}} \times \frac{\partial \hat{y}}{\partial W}
$$
각 항목을 풀어보면:
$$
\frac{\partial L}{\partial \hat{y}} = - (y - \hat{y})
$$
$$
\frac{\partial \hat{y}}{\partial W} = X f'(WX + b)
$$
따라서, 가중치의 변화량은 다음과 같이 표현할 수 있습니다.
$$
\Delta W = -\eta \frac{\partial L}{\partial W}
$$
여기서 $ \eta $ 는 학습률(Learning Rate)입니다.
4. 역전파 알고리즘의 Python 구현
이제 간단한 신경망 모델을 직접 구현하고, 역전파 알고리즘을 통해 학습시키는 예제를 살펴보겠습니다.
import numpy as np
# 활성화 함수 및 미분
def sigmoid(x):
return 1 / (1 + np.exp(-x))
def sigmoid_derivative(x):
return x * (1 - x)
# 데이터 설정
X = np.array([[0,0], [0,1], [1,0], [1,1]])
y = np.array([[0], [1], [1], [0]])
# 가중치 초기화
np.random.seed(42)
W1 = np.random.uniform(-1, 1, (2, 2)) # 입력층 → 은닉층
W2 = np.random.uniform(-1, 1, (2, 1)) # 은닉층 → 출력층
b1 = np.zeros((1, 2))
b2 = np.zeros((1, 1))
# 학습 하이퍼파라미터
learning_rate = 0.1
epochs = 10000
# 학습 과정
for epoch in range(epochs):
# 순전파
hidden_input = np.dot(X, W1) + b1
hidden_output = sigmoid(hidden_input)
final_input = np.dot(hidden_output, W2) + b2
final_output = sigmoid(final_input)
# 손실 계산
error = y - final_output
# 역전파
d_output = error * sigmoid_derivative(final_output)
d_hidden = np.dot(d_output, W2.T) * sigmoid_derivative(hidden_output)
# 가중치 업데이트
W2 += np.dot(hidden_output.T, d_output) * learning_rate
b2 += np.sum(d_output, axis=0, keepdims=True) * learning_rate
W1 += np.dot(X.T, d_hidden) * learning_rate
b1 += np.sum(d_hidden, axis=0, keepdims=True) * learning_rate
# 1000번마다 손실 출력
if epoch % 1000 == 0:
loss = np.mean(error**2)
print(f"Epoch {epoch}, Loss: {loss:.5f}")
# 최종 출력 확인
print("Final Predictions:")
print(final_output)
위 코드는 XOR 문제를 해결하는 간단한 2층 신경망을 구현한 것입니다. 역전파를 이용하여 가중치를 조정하면서 손실을 최소화하는 과정이 포함되어 있습니다.
5. 결론
이번 포스팅에서는 역전파 알고리즘의 원리를 설명하고, Python을 이용하여 신경망을 직접 학습시켜 보았습니다. 역전파는 신경망 학습에서 가장 중요한 개념이며, 이를 이해하는 것이 딥러닝 모델을 최적화하는 데 필수적입니다.
'Python > Deep Learning' 카테고리의 다른 글
| CNN(Convolutional Neural Network)의 개념 및 동작 원리 (0) | 2025.12.23 |
|---|---|
| 다층 퍼셉트론(MLP) 모델 구현 (0) | 2025.12.20 |
| 단순 퍼셉트론 구현 및 개념 정리 (0) | 2025.12.18 |
| PyTorch Lightning을 이용한 모델 트레이닝 효율화 (0) | 2025.12.17 |
| TensorFlow 및 Keras의 콜백 함수 활용법 (0) | 2025.12.16 |