Backpropagation 이해하기: Python 예제 — Part 3
Source: Dev.to
Recap (Part 2)
이전 글에서는 제곱 잔차 합 (SSR) 을 편향 (b_3) 에 대해 플롯하여 손실이 최소가 되는 지점을 시각화했습니다. 분홍색 곡선이 그 관계를 보여 주었으며, 그 곡선의 최저점이 최적 편향 값에 해당합니다.
Gradient Descent 를 이용한 최적 편향 찾기
많은 편향 값을 일일이 평가하는 대신, Gradient Descent 를 적용할 수 있습니다. 이를 위해서는 SSR을 (b_3) 에 대해 미분해야 합니다.
체인 룰을 이용한 미분
[ \frac{\partial \text{SSR}}{\partial b_3} = \sum_{i=1}^{n} \frac{\partial \text{SSR}}{\partial \hat{y}_i} \cdot \frac{\partial \hat{y}_i}{\partial b_3} ]
각 훈련 샘플에 대한 기여도는 다음과 같습니다:
[ -2 \times (y_i - \hat{y}_i) \times 1 ]
여기서 (y_i) 는 실제 목표값이고 (\hat{y}_i) 는 예측값이며 (편향에 대한 예측값의 미분은 1) 입니다.
첫 번째 반복 ( (b_3 = 0) )
입력 벡터 ([0, 1, 0]) 에 대해 모델은 다음과 같이 예측합니다:
| Sample | (y_i) | (\hat{y}_i) |
|---|---|---|
| 1 | 0 | -2.6 |
| 2 | 1 | -1.6 |
| 3 | 0 | -2.61 |
그라디언트는:
[ \begin{aligned} &-2 \times (0 - (-2.6)) \times 1 \ &;+; -2 \times (1 - (-1.6)) \times 1 \ &;+; -2 \times (0 - (-2.61)) \times 1 \ &= -15.7 \end{aligned} ]
학습률 (\alpha = 0.1) 을 사용하면:
[ \text{step size} = \text{gradient} \times \alpha = -15.7 \times 0.1 = -1.57 ]
[ b_3^{\text{new}} = b_3^{\text{old}} - \text{step size} = 0 - (-1.57) = 1.57 ]
새로운 예측을 나타내는 초록색 곡선이 이제 개선된 모습을 보입니다.
두 번째 반복 ( (b_3 = 1.57) )
예측값은 다음과 같이 바뀝니다:
| Sample | (y_i) | (\hat{y}_i) |
|---|---|---|
| 1 | 0 | -1.03 |
| 2 | 1 | -0.03 |
| 3 | 0 | -1.04 |
그라디언트:
[ \begin{aligned} &-2 \times (0 - (-1.03)) \times 1 \ &;+; -2 \times (1 - (-0.03)) \times 1 \ &;+; -2 \times (0 - (-1.04)) \times 1 \ &= -6.26 \end{aligned} ]
스텝 사이즈:
[ \text{step size} = -6.26 \times 0.1 = -0.626 ]
편향 업데이트:
[ b_3^{\text{new}} = 1.57 - (-0.626) = 2.19 ]
수렴
업데이트 과정을 반복하면 그라디언트 크기가 점점 작아집니다. (b_3 \approx 2.61) 일 때 그라디언트가 0에 가까워지며, 이는 손실이 최소에 도달했음을 의미합니다. 따라서 (b_3 = 2.61) 이 이 간단한 예제의 최적 편향입니다.
정리
Gradient Descent 는 전수조사 없이도 SSR 곡선의 최소점을 효율적으로 찾는 방법을 제공합니다. 그라디언트와 반대 방향으로 편향을 반복적으로 조정함으로써 우리는 빠르게 최적값에 수렴할 수 있습니다.
개념을 강화하기 위해 Python 노트북에서 직접 계산을 실험해 보세요.