역전파 알고리즘 (Backpropagation)
1. 개요
역전파 알고리즘(Backpropagation)은 인공신경망(Artificial Neural Network)의 가중치를 업데이트하기 위해 손실 함수의 기울기를 효율적으로 계산하는 방법이다. 출력층에서 발생한 오차를 입력층 방향으로 역방향으로 전파하며 각 층의 가중치(Weight)와 편향(Bias)을 최적화하는 미분 계산 알고리즘이다.
이 알고리즘의 핵심은 오차의 역전파에 있으며, 이는 예측값과 실제 정답 사이의 차이를 나타내는 손실 함수(Loss Function)의 값을 최소화하기 위해 [경사 하강법]을 사용하는 과정이다. 쉽게 말해, 결과에서 발생한 '틀린 정도(오차)'를 뒤로 전달하며 "어떤 가중치가 얼마나 잘못되었는지"를 찾아내어 수정하는 직관적인 구조를 가진다.
2. 동작 원리
2.1 순전파와 손실 함수
학습의 시작은 순전파(Forward Propagation) 단계이다. 입력 데이터가 각 층의 가중치와 편향(Bias)을 거쳐 활성화 함수(Activation Function)를 통과하며 최종 출력값 $\hat{y}$를 산출한다. 이후 손실 함수를 통해 실제 정답 $y$와의 오차 $E$를 계산한다.
2.2 연쇄 법칙 (Chain Rule)
역전파의 수학적 근간은 미분학의 연쇄 법칙이다. 합성함수의 미분법인 연쇄 법칙을 이용하면, 출력층의 오차로부터 입력층 방향으로 각 가중치가 오차에 미치는 영향력을 단계적으로 계산할 수 있다.
[수학적 증명 과정]
신경망의 한 경로를 단순화하여 $x \rightarrow h \rightarrow \hat{y}$의 구조라고 가정하자.
- $z_1 = w_1 x + b_1$ (선형 결합)
- $h = \sigma(z_1)$ (은닉층 출력, $\sigma$는 활성화 함수)
- $z_2 = w_2 h + b_2$ (선형 결합)
- $\hat{y} = \sigma(z_2)$ (최종 출력)
- $E = L(\hat{y}, y)$ (손실 함수)
우리가 구하고자 하는 것은 가중치 $w_1$이 손실 $E$에 미치는 영향, 즉 $\frac{\partial E}{\partial w_1}$이다. 연쇄 법칙에 의해 다음과 같이 분해된다.
$$\frac{\partial E}{\partial w_1} = \frac{\partial E}{\partial \hat{y}} \cdot \frac{\partial \hat{y}}{\partial z_2} \cdot \frac{\partial z_2}{\partial h} \cdot \frac{\partial h}{\partial z_1} \cdot \frac{\partial z_1}{\partial w_1}$$
$$\frac{\partial E}{\partial w_1} = \frac{\partial E}{\partial \hat{y}} \cdot \sigma'(z_2) \cdot w_2 \cdot \sigma'(z_1) \cdot x$$
여기서 $\sigma'(z)$와 같은 활성화 함수의 미분값이 곱해지는 과정이 핵심이며, 이 값이 작아지거나 커짐에 따라 학습의 효율성이 결정된다.
2.3 손실 함수별 미분 예시
손실 함수의 형태에 따라 역전파의 시작점인 $\frac{\partial E}{\partial \hat{y}}$의 값이 달라진다.
| 손실 함수 |
수식 |
미분값 ($\frac{\partial E}{\partial \hat{y}}$) |
특징 |
회귀 분석에 주로 사용 |
| MSE (평균제곱오차) |
$\frac{1}{2}(\hat{y} - y)^2$ |
$\hat{y} - y$ |
회귀 분석에 주로 사용 |
|
| Binary Cross-Entropy |
$-(y\log\hat{y} + (1-y)\log(1-\hat{y}))$ |
$\frac{\hat{y}-y}{\hat{y}(1-\hat{y})}$ |
이진 분류에 사용 |
|
3. 알고리즘 단계
역전파 학습 과정은 다음과 같은 반복적인 사이클로 이루어진다.
| 단계 |
구분 |
수행 내용 |
주요 계산 요소 |
| Step 1 |
순전파 |
입력 데이터를 층별로 전달하여 예측값 산출 |
$z = Wx + b, a = \sigma(z)$ |
| Step 2 |
오차 계산 |
예측값과 실제값의 차이를 손실 함수로 계산 |
$E = L(\hat{y}, y)$ |
| Step 3 |
역전파 |
출력층 $\rightarrow$ 입력층 순으로 기울기 계산 |
$\frac{\partial E}{\partial W}, \frac{\partial E}{\partial b}$ (연쇄 법칙 적용) |
| Step 4 |
가중치 업데이트 |
계산된 기울기를 이용해 매개변수 수정 |
$W_{new} = W_{old} - \eta \frac{\partial E}{\partial W}$ $b_{new} = b_{old} - \eta \frac{\partial E}{\partial b}$ |
$\eta$는 학습률(Learning Rate)을 의미하며, 한 번의 업데이트 단계에서 얼마나 크게 이동할지를 결정한다.
4. 주요 최적화 및 변형
기본적인 경사 하강법(SGD)은 학습 속도가 느리거나 지역 최솟값(Local Minimum)에 빠질 위험이 있다. 이를 해결하기 위해 다양한 옵티마이저(Optimizer)가 도입되었다.
- Momentum: 과거의 기울기 변화량을 일정 부분 유지하여 관성을 주는 방식이다. 진동을 줄이고 빠르게 수렴하게 한다.
- RMSProp: 기울기의 크기에 따라 학습률을 조절한다. 최근 기울기가 컸던 매개변수는 학습률을 낮추고, 작았던 매개변수는 높여 효율적으로 학습한다.
- Adam (Adaptive Moment Estimation): Momentum의 관성과 RMSProp의 적응적 학습률 조절 방식을 결합한 알고리즘으로, 현재 가장 널리 사용된다.
5. 한계점 및 해결 방안
층이 깊어질수록(Deep Network) 연쇄 법칙에 의해 미분값이 계속 곱해지는데, 이때 문제가 발생한다.
- 기울기 소실 (Vanishing Gradient): 활성화 함수(예: Sigmoid)의 미분값이 1보다 작을 경우, 입력층으로 갈수록 기울기가 0에 수렴하여 가중치가 더 이상 업데이트되지 않고 학습이 중단되는 현상이다.
- 기울기 폭주 (Exploding Gradient): 가중치 값이 클 경우 기울기가 기하급수적으로 커져 가중치가 발산하고 모델이 불안정해지는 현상이다.
5.2 해결 방안
- 활성화 함수 변경: Sigmoid 대신 [ReLU] 함수를 사용한다. ReLU는 $x > 0$인 영역에서 미분값이 항상 1로 유지되므로, 층이 깊어져도 기울기가 사라지지 않고 그대로 전달되어 소실 문제를 효과적으로 해결한다.
- 기울기 클리핑 (Gradient Clipping): 기울기 폭주를 막기 위해, 기울기 값이 특정 임계값을 넘지 않도록 강제로 제한(Clip)하는 기법이다.
- [배치 정규화]: 각 층의 입력 분포를 일정하게 정규화하여 학습 속도를 높이고 기울기 문제를 완화한다.
- 가중치 초기화 (Weight Initialization): Xavier 또는 He 초기화 기법을 사용하여 초기 가중치 분포를 최적화함으로써 초기 학습의 안정성을 확보한다.
6. 구현 예제 및 자동 미분
6.1 자동 미분 (AutoGrad)의 원리
현대 딥러닝 프레임워크(PyTorch, TensorFlow)는 사용자가 직접 미분식을 작성하지 않아도 되는 자동 미분(Automatic Differentiation) 기능을 제공한다.
이는 계산 그래프(Computational Graph)를 기반으로 작동한다. 순전파 과정에서 모든 연산을 그래프 형태로 기록하고, 역방향으로 그래프를 추적하며 미리 정의된 기본 연산의 미분값을 곱해나가는 방식이다.
6.2 PyTorch 구현 예제
import torch
# 1. 데이터 및 가중치 정의
x = torch.tensor([1.0, 2.0], requires_grad=True) # 입력
w = torch.tensor([0.5, -0.5], requires_grad=True) # 가중치
y_true = torch.tensor([1.0]) # 실제 정답
# 2. 순전파 (Forward Propagation)
# torch.sum(x * w)는 입력과 가중치의 선형 결합(내적)을 모사한 연산임
y_pred = torch.sum(x * w)
# 3. 손실 함수 계산 (MSE)
loss = 0.5 * (y_pred - y_true)**2
# 4. 역전파 (Backpropagation)
# loss.backward() 호출 시 계산 그래프를 따라 기울기가 자동 계산됨
loss.backward()
# 5. 결과 확인 (기울기 출력)
print(f"x의 기울기: {x.grad}") # dLoss/dx
print(f"w의 기울기: {w.grad}") # dLoss/dw
# 6. 가중치 업데이트 (간단한 SGD 예시)
learning_rate = 0.1
with torch.no_grad():
# torch.no_grad() 블록은 가중치 업데이트 연산 자체가
# 다시 계산 그래프에 기록되어 미분 대상이 되는 것을 방지하기 위해 사용함
w -= learning_rate * w.grad
분류: 기술 / 인공지능 / 역전파 알고리즘
# 역전파 알고리즘 (Backpropagation)
## 1. 개요
**역전파 알고리즘(Backpropagation)**은 인공신경망(Artificial Neural Network)의 가중치를 업데이트하기 위해 손실 함수의 기울기를 효율적으로 계산하는 방법이다. 출력층에서 발생한 오차를 입력층 방향으로 역방향으로 전파하며 각 층의 가중치(Weight)와 편향(Bias)을 최적화하는 미분 계산 알고리즘이다.
이 알고리즘의 핵심은 **오차의 역전파**에 있으며, 이는 예측값과 실제 정답 사이의 차이를 나타내는 손실 함수(Loss Function)의 값을 최소화하기 위해 [[경사 하강법]](Gradient Descent)을 사용하는 과정이다. 쉽게 말해, 결과에서 발생한 '틀린 정도(오차)'를 뒤로 전달하며 "어떤 가중치가 얼마나 잘못되었는지"를 찾아내어 수정하는 직관적인 구조를 가진다.
---
## 2. 동작 원리
### 2.1 순전파와 손실 함수
학습의 시작은 **순전파(Forward Propagation)** 단계이다. 입력 데이터가 각 층의 가중치와 편향(Bias)을 거쳐 활성화 함수(Activation Function)를 통과하며 최종 출력값 $\hat{y}$를 산출한다. 이후 **손실 함수**를 통해 실제 정답 $y$와의 오차 $E$를 계산한다.
### 2.2 연쇄 법칙 (Chain Rule)
역전파의 수학적 근간은 미분학의 **연쇄 법칙**이다. 합성함수의 미분법인 연쇄 법칙을 이용하면, 출력층의 오차로부터 입력층 방향으로 각 가중치가 오차에 미치는 영향력을 단계적으로 계산할 수 있다.
**[수학적 증명 과정]**
신경망의 한 경로를 단순화하여 $x \rightarrow h \rightarrow \hat{y}$의 구조라고 가정하자.
- $z_1 = w_1 x + b_1$ (선형 결합)
- $h = \sigma(z_1)$ (은닉층 출력, $\sigma$는 활성화 함수)
- $z_2 = w_2 h + b_2$ (선형 결합)
- $\hat{y} = \sigma(z_2)$ (최종 출력)
- $E = L(\hat{y}, y)$ (손실 함수)
우리가 구하고자 하는 것은 가중치 $w_1$이 손실 $E$에 미치는 영향, 즉 $\frac{\partial E}{\partial w_1}$이다. 연쇄 법칙에 의해 다음과 같이 분해된다.
$$\frac{\partial E}{\partial w_1} = \frac{\partial E}{\partial \hat{y}} \cdot \frac{\partial \hat{y}}{\partial z_2} \cdot \frac{\partial z_2}{\partial h} \cdot \frac{\partial h}{\partial z_1} \cdot \frac{\partial z_1}{\partial w_1}$$
$$\frac{\partial E}{\partial w_1} = \frac{\partial E}{\partial \hat{y}} \cdot \sigma'(z_2) \cdot w_2 \cdot \sigma'(z_1) \cdot x$$
여기서 $\sigma'(z)$와 같은 **활성화 함수의 미분값**이 곱해지는 과정이 핵심이며, 이 값이 작아지거나 커짐에 따라 학습의 효율성이 결정된다.
### 2.3 손실 함수별 미분 예시
손실 함수의 형태에 따라 역전파의 시작점인 $\frac{\partial E}{\partial \hat{y}}$의 값이 달라진다.
| 손실 함수 | 수식 | 미분값 ($\frac{\partial E}{\partial \hat{y}}$) | 특징 | 회귀 분석에 주로 사용 |
| :--- | :--- | :--- | :--- | :--- |
| **MSE** (평균제곱오차) | $\frac{1}{2}(\hat{y} - y)^2$ | $\hat{y} - y$ | 회귀 분석에 주로 사용 |
| **Binary Cross-Entropy** | $-(y\log\hat{y} + (1-y)\log(1-\hat{y}))$ | $\frac{\hat{y}-y}{\hat{y}(1-\hat{y})}$ | 이진 분류에 사용 |
---
## 3. 알고리즘 단계
역전파 학습 과정은 다음과 같은 반복적인 사이클로 이루어진다.
| 단계 | 구분 | 수행 내용 | 주요 계산 요소 |
| :--- | :--- | :--- | :--- |
| **Step 1** | 순전파 | 입력 데이터를 층별로 전달하여 예측값 산출 | $z = Wx + b, a = \sigma(z)$ |
| **Step 2** | 오차 계산 | 예측값과 실제값의 차이를 손실 함수로 계산 | $E = L(\hat{y}, y)$ |
| **Step 3** | 역전파 | 출력층 $\rightarrow$ 입력층 순으로 기울기 계산 | $\frac{\partial E}{\partial W}, \frac{\partial E}{\partial b}$ (연쇄 법칙 적용) |
| **Step 4** | 가중치 업데이트 | 계산된 기울기를 이용해 매개변수 수정 | $W_{new} = W_{old} - \eta \frac{\partial E}{\partial W}$ <br> $b_{new} = b_{old} - \eta \frac{\partial E}{\partial b}$ |
*$\eta$는 학습률(Learning Rate)을 의미하며, 한 번의 업데이트 단계에서 얼마나 크게 이동할지를 결정한다.*
---
## 4. 주요 최적화 및 변형
기본적인 경사 하강법(SGD)은 학습 속도가 느리거나 지역 최솟값(Local Minimum)에 빠질 위험이 있다. 이를 해결하기 위해 다양한 **옵티마이저(Optimizer)**가 도입되었다.
- **Momentum**: 과거의 기울기 변화량을 일정 부분 유지하여 관성을 주는 방식이다. 진동을 줄이고 빠르게 수렴하게 한다.
- **RMSProp**: 기울기의 크기에 따라 학습률을 조절한다. 최근 기울기가 컸던 매개변수는 학습률을 낮추고, 작았던 매개변수는 높여 효율적으로 학습한다.
- **Adam (Adaptive Moment Estimation)**: Momentum의 관성과 RMSProp의 적응적 학습률 조절 방식을 결합한 알고리즘으로, 현재 가장 널리 사용된다.
---
## 5. 한계점 및 해결 방안
### 5.1 기울기 소실 및 폭주
층이 깊어질수록(Deep Network) 연쇄 법칙에 의해 미분값이 계속 곱해지는데, 이때 문제가 발생한다.
- **기울기 소실 (Vanishing Gradient)**: 활성화 함수(예: Sigmoid)의 미분값이 1보다 작을 경우, 입력층으로 갈수록 기울기가 0에 수렴하여 가중치가 더 이상 업데이트되지 않고 학습이 중단되는 현상이다.
- **기울기 폭주 (Exploding Gradient)**: 가중치 값이 클 경우 기울기가 기하급수적으로 커져 가중치가 발산하고 모델이 불안정해지는 현상이다.
### 5.2 해결 방안
- **활성화 함수 변경**: Sigmoid 대신 [[ReLU]](Rectified Linear Unit, $x = \max(0, x)$) 함수를 사용한다. ReLU는 $x > 0$인 영역에서 미분값이 항상 1로 유지되므로, 층이 깊어져도 기울기가 사라지지 않고 그대로 전달되어 소실 문제를 효과적으로 해결한다.
- **기울기 클리핑 (Gradient Clipping)**: 기울기 폭주를 막기 위해, 기울기 값이 특정 임계값을 넘지 않도록 강제로 제한(Clip)하는 기법이다.
- **[[배치 정규화]](Batch Normalization)**: 각 층의 입력 분포를 일정하게 정규화하여 학습 속도를 높이고 기울기 문제를 완화한다.
- **가중치 초기화 (Weight Initialization)**: Xavier 또는 He 초기화 기법을 사용하여 초기 가중치 분포를 최적화함으로써 초기 학습의 안정성을 확보한다.
---
## 6. 구현 예제 및 자동 미분
### 6.1 자동 미분 (AutoGrad)의 원리
현대 딥러닝 프레임워크(PyTorch, TensorFlow)는 사용자가 직접 미분식을 작성하지 않아도 되는 **자동 미분(Automatic Differentiation)** 기능을 제공한다.
이는 **계산 그래프(Computational Graph)**를 기반으로 작동한다. 순전파 과정에서 모든 연산을 그래프 형태로 기록하고, 역방향으로 그래프를 추적하며 미리 정의된 기본 연산의 미분값을 곱해나가는 방식이다.
### 6.2 PyTorch 구현 예제
```python
import torch
# 1. 데이터 및 가중치 정의
x = torch.tensor([1.0, 2.0], requires_grad=True) # 입력
w = torch.tensor([0.5, -0.5], requires_grad=True) # 가중치
y_true = torch.tensor([1.0]) # 실제 정답
# 2. 순전파 (Forward Propagation)
# torch.sum(x * w)는 입력과 가중치의 선형 결합(내적)을 모사한 연산임
y_pred = torch.sum(x * w)
# 3. 손실 함수 계산 (MSE)
loss = 0.5 * (y_pred - y_true)**2
# 4. 역전파 (Backpropagation)
# loss.backward() 호출 시 계산 그래프를 따라 기울기가 자동 계산됨
loss.backward()
# 5. 결과 확인 (기울기 출력)
print(f"x의 기울기: {x.grad}") # dLoss/dx
print(f"w의 기울기: {w.grad}") # dLoss/dw
# 6. 가중치 업데이트 (간단한 SGD 예시)
learning_rate = 0.1
with torch.no_grad():
# torch.no_grad() 블록은 가중치 업데이트 연산 자체가
# 다시 계산 그래프에 기록되어 미분 대상이 되는 것을 방지하기 위해 사용함
w -= learning_rate * w.grad
```
분류: 기술 / 인공지능 / 역전파 알고리즘