3-7. 경사 하강법의 변형: Momentum, AdamW
1. 경사 하강법의 한계와 개선의 필요성
이전 챕터들에서 우리는 딥러닝 모델을 학습시키는 기본적인 방법인 경사 하강법(Gradient Descent)에 대해 살펴보았습니다. 특히, 3-3 챕터에서는 확률적 경사 하강법(SGD)을 소개하며, 전체 데이터셋 대신 배치(batch) 단위로 데이터를 사용하여 학습 속도를 향상시키는 방법을 다루었습니다. 하지만, SGD를 포함한 기본적인 경사 하강법은 몇 가지 단점을 가지고 있습니다. 이러한 단점들은 모델 학습의 효율성을 떨어뜨리고, 최적의 해를 찾는 것을 방해할 수 있습니다.
1) SGD의 문제점
- 진동(Oscillation) 현상: 경사 하강법은 손실 함수의 경사를 따라 내려가는 방식으로 작동합니다. 그러나 손실 함수의 형태가 복잡하거나, 특히 굴곡이 심한 경우, 최솟값에 도달하기 전에 진동하는 경향이 있습니다. 이는 학습 속도를 느리게 하고, 학습 과정을 불안정하게 만듭니다.

- 지역 최솟값(Local Minima) 문제: 손실 함수가 복잡한 형태를 가질 때, 경사 하강법은 전역 최솟값(global minimum)이 아닌 지역 최솟값(local minimum)에 갇힐 수 있습니다. 이는 모델이 최적의 성능을 내지 못하게 하는 원인이 됩니다.

- 학습률(Learning Rate) 설정의 어려움: 적절한 학습률을 설정하는 것은 경사 하강법의 성능에 매우 중요한 영향을 미칩니다. 학습률이 너무 작으면 학습 속도가 느려지고, 너무 크면 발산(divergence)하여 학습이 제대로 진행되지 않습니다. 학습률을 적절하게 조정하는 것은 까다로운 일이며, 실험적인 방법을 통해 찾아야 합니다.
이러한 문제점들을 해결하기 위해, Momentum, AdamW 등과 같은 경사 하강법의 다양한 변형(variant)들이 개발되었습니다. 이러한 알고리즘들은 SGD의 단점을 보완하고, 더 빠르고 안정적인 학습을 가능하게 합니다.
2. 모멘텀(Momentum)
모멘텀은 경사 하강법의 진동 문제를 해결하고, 학습 속도를 향상시키기 위해 고안된 기법입니다. 모멘텀은 물리적인 관성(inertia)의 개념을 차용하여, 이전의 기울기(gradient) 정보를 활용하여 현재 기울기를 갱신합니다.
1) 모멘텀의 원리
모멘텀 알고리즘은 각 파라미터에 대한 "속도(velocity)" 벡터를 유지합니다. 이 속도는 이전 기울기의 가중 평균으로 계산됩니다. 즉, 이전의 기울기가 현재 기울기에 영향을 미치도록 하여, 마치 공이 언덕을 내려갈 때 관성을 얻는 것과 유사한 효과를 냅니다.
-
속도(Velocity) 업데이트: $$ v_t = \rho v_{t-1} + \eta \nabla_\theta J(\theta_t) $$ 여기서,
- $v_t$: 시간 $t$에서의 속도
- $\rho$: 모멘텀 계수 (일반적으로 0.9)
- $\eta$: 학습률
- $\nabla_\theta J(\theta_t)$: 시간 $t$에서의 기울기
- 파라미터 업데이트: $$ \theta_{t+1} = \theta_t - v_t $$
2) 모멘텀의 효과
- 진동 감소: 모멘텀은 이전 기울기의 방향으로 움직이는 경향이 있어, 진동을 줄이고 수렴 속도를 높입니다.
- 관성 효과: 손실 함수의 평평한 부분에서는 속도를 유지하여 더 빠르게 움직이도록 돕고, 가파른 경사에서는 속도를 줄여 발산을 방지합니다.
- 지역 최솟값 탈출: 지역 최솟값에 갇힐 위험을 줄여주고, 전역 최솟값으로 이동할 가능성을 높입니다.
3) 모멘텀의 구현 (예시: 파이썬)
import numpy as np
# 가짜 손실 함수 (예시)
def loss_function(x):
return x**2
# 기울기 계산 함수 (예시)
def gradient(x):
return 2 * x
# 모멘텀 알고리즘
def momentum_optimization(learning_rate=0.1, momentum=0.9, num_iterations=100):
x = 5 # 초기 파라미터 값
velocity = 0 # 초기 속도
history = [x]
for i in range(num_iterations):
grad = gradient(x)
velocity = momentum * velocity + learning_rate * grad # 속도 업데이트
x = x - velocity # 파라미터 업데이트
history.append(x)
return history
# 실행 및 결과 시각화 (matplotlib 필요)
import matplotlib.pyplot as plt
history = momentum_optimization()
x_values = np.linspace(-5, 5, 100)
y_values = [loss_function(x) for x in x_values]
plt.figure(figsize=(10, 6))
plt.plot(x_values, y_values, label='Loss Function')
plt.scatter(history, [loss_function(x) for x in history], color='red', label='Optimization Path')
plt.xlabel('Parameter')
plt.ylabel('Loss')
plt.title('Momentum Optimization')
plt.legend()
plt.grid(True)
plt.show()
4) Nesterov Momentum
Nesterov Momentum은 모멘텀의 개선된 버전입니다. 모멘텀은 현재 위치에서 기울기를 계산하는 반면, Nesterov Momentum은 모멘텀 방향으로 미리 일정 거리만큼 이동한 위치에서 기울기를 계산합니다. 즉, "미리 앞을 보고" 기울기를 계산하는 것입니다.
-
Nesterov Momentum의 원리:
- 미리 이동: 현재 속도($v_{t-1}$)를 사용하여 임시 위치를 계산합니다. $$ \tilde{\theta} = \theta_t + \rho v_{t-1} $$
- 기울기 계산: 임시 위치에서 기울기를 계산합니다. $$ \nabla_\theta J(\tilde{\theta}) $$
- 속도 업데이트: 계산된 기울기를 사용하여 속도를 업데이트합니다. $$ v_t = \rho v_{t-1} + \eta \nabla_\theta J(\tilde{\theta}) $$
- 파라미터 업데이트: 속도를 사용하여 파라미터를 업데이트합니다. $$ \theta_{t+1} = \theta_t - v_t $$
- Nesterov Momentum의 효과: Nesterov Momentum은 모멘텀보다 더 빠르게 수렴하고, 특히 손실 함수의 곡률이 높은 곳에서 더 효과적으로 작동합니다. Nesterov Momentum은 공이 언덕을 내려갈 때, 미리 브레이크를 걸어 멈추는 것과 유사한 효과를 냅니다.
3. AdamW (Weight Decay 포함 Adam)
Adam(Adaptive Moment Estimation)은 모멘텀과 RMSprop을 결합한 알고리즘으로, 각 파라미터에 대해 적응적인 학습률을 제공합니다. Adam은 널리 사용되는 최적화 알고리즘 중 하나이며, 다양한 딥러닝 문제에서 좋은 성능을 보입니다. AdamW는 Adam에 가중치 감쇠(weight decay)를 통합하여 성능을 더욱 개선한 버전입니다.
1) Adam의 원리
Adam은 다음과 같은 두 가지 모멘트를 사용합니다.
-
1차 모멘트 (Momentum): 기울기의 지수 가중 평균을 계산합니다. 이는 SGD + 모멘텀과 유사한 효과를 냅니다. $$ m_t = \beta_1 m_{t-1} + (1 - \beta_1)g_t $$
- $m_t$: 시간 $t$에서의 1차 모멘트 (기울기의 지수 가중 평균)
- $\beta_1$: 1차 모멘트의 감쇠율 (일반적으로 0.9)
- $g_t$: 시간 $t$에서의 기울기
- 2차 모멘트 (RMSprop): 기울기의 제곱의 지수 가중 평균을 계산합니다. 이는 각 파라미터의 학습률을 조절하는 데 사용됩니다. $$ v_t = \beta_2 v_{t-1} + (1 - \beta_2)g_t^2 $$
- $v_t$: 시간 $t$에서의 2차 모멘트 (기울기 제곱의 지수 가중 평균)
- $\beta_2$: 2차 모멘트의 감쇠율 (일반적으로 0.999)
- $g_t^2$: 시간 $t$에서의 기울기의 제곱
Adam은 이러한 모멘트들을 사용하여 파라미터를 업데이트합니다.
- 편향 보정 (Bias Correction): 초기화 시 1차 및 2차 모멘트가 0으로 초기화되므로, 초반 단계에서는 편향(bias)이 발생합니다. 이를 보정하기 위해 다음과 같은 수식을 사용합니다. $$ \hat{m_t} = \frac{m_t}{1 - \beta_1^t} $$ $$ \hat{v_t} = \frac{v_t}{1 - \beta_2^t} $$
-
파라미터 업데이트: 보정된 모멘트를 사용하여 파라미터를 업데이트합니다. $$ \theta_{t+1} = \theta_t - \eta \frac{\hat{m_t}}{\sqrt{\hat{v_t}} + \epsilon} $$
- $\eta$: 학습률
- $\epsilon$: 0으로 나누는 것을 방지하기 위한 작은 값 (예: $10^{-8}$)
2) Adam의 장점
- 적응적 학습률: 각 파라미터에 대해 서로 다른 학습률을 적용하여, 학습 속도를 효율적으로 조절합니다.
- 모멘텀 효과: 진동을 줄이고, 수렴 속도를 높입니다.
- 자동 학습률 튜닝: 학습률 튜닝에 대한 부담을 줄여줍니다.
- 다양한 문제에 적용 가능: 다양한 딥러닝 문제에서 좋은 성능을 보입니다.
3) AdamW의 등장 배경
Adam은 널리 사용되지만, 몇 가지 단점이 존재합니다. 그중 하나는 가중치 감쇠(weight decay)를 올바르게 적용하기 어렵다는 점입니다. Adam에서 가중치 감쇠를 적용하는 일반적인 방법은 파라미터 업데이트 과정에 직접적으로 L2 정규화 항을 추가하는 것입니다.
$$ \theta_{t+1} = \theta_t - \eta \frac{\hat{m_t}}{\sqrt{\hat{v_t}} + \epsilon} - \eta \lambda \theta_t $$
여기서 $\lambda$는 가중치 감쇠의 강도를 나타냅니다.
하지만, 이 방법은 가중치 감쇠와 학습률이 상호작용하여 원치 않는 결과를 초래할 수 있습니다. 특히, 학습률이 적응적으로 변하는 Adam의 특성상, 가중치 감쇠가 제대로 적용되지 않을 수 있습니다.
4) AdamW의 핵심: 가중치 감쇠 분리
AdamW는 이러한 문제를 해결하기 위해, 가중치 감쇠를 파라미터 업데이트 과정에서 분리합니다. 즉, 가중치 감쇠를 기울기 계산이나 모멘트 계산에 포함시키지 않고, 파라미터 업데이트 단계에서 직접 적용합니다.
AdamW의 파라미터 업데이트 수식: $$ \theta_{t+1} = \theta_t - \eta \frac{\hat{m_t}}{\sqrt{\hat{v_t}} + \epsilon} - \eta \lambda \theta_t $$
여기서 주목할 점은, AdamW는 가중치 감쇠를 적용하기 전에 파라미터를 업데이트한다는 것입니다. 이렇게 함으로써, 가중치 감쇠와 학습률 간의 상호작용을 최소화하고, 가중치 감쇠가 의도한 대로 작동하도록 보장합니다.
5) AdamW의 효과
- 더 나은 일반화 성능: AdamW는 가중치 감쇠를 올바르게 적용하여, 과적합을 방지하고 더 나은 일반화 성능을 제공합니다.
- 더 안정적인 학습: 가중치 감쇠와 학습률 간의 상호작용 문제를 해결하여, 학습 과정을 더욱 안정적으로 만듭니다.
- 간편한 구현: AdamW는 Adam과 거의 동일한 방식으로 구현되므로, 쉽게 사용할 수 있습니다.
4. Momentum, AdamW 비교
| 특징 | Momentum | AdamW |
|---|---|---|
| 기본 원리 | 이전 기울기의 정보를 활용한 관성 | Momentum + RMSprop + 가중치 감쇠 분리 |
| 학습률 | 단일 학습률 (수동 튜닝 필요) | 적응적 학습률 (자동 튜닝) |
| 주요 장점 | 진동 감소, 수렴 속도 향상 | 적응적 학습률, 더 나은 일반화, 안정적인 학습 |
| 가중치 감쇠 | 적용 어려움 | 가중치 감쇠 분리 적용 |
| 복잡성 | 상대적으로 간단 | Adam보다 약간 복잡 |
| 사용 시점 | 단순한 문제, SGD의 대안 | 대부분의 문제, 특히 과적합 우려 시 |
| 하이퍼파라미터 | 학습률, 모멘텀 계수 ($\rho$) | 학습률, $\beta_1$, $\beta_2$, 가중치 감쇠 ($\lambda$) |
5. 실전 적용 및 선택 가이드
1) 상황별 선택 가이드
- 기본적인 문제: SGD를 먼저 시도하고, 학습 속도가 느리거나 진동 문제가 발생하면 Momentum을 사용합니다.
- 대부분의 문제: AdamW를 사용하는 것이 좋습니다. AdamW는 Adam보다 일반화 성능이 뛰어나고, 더 안정적인 학습을 제공합니다.
- 특수한 경우: 문제의 특성에 따라 다른 알고리즘을 사용하거나, 알고리즘을 조합하여 사용할 수도 있습니다.
2) 하이퍼파라미터 튜닝
- 학습률: 가장 중요한 하이퍼파라미터입니다. 일반적으로 0.001, 0.0001 등 작은 값으로 시작하여, 검증 세트의 성능을 확인하며 튜닝합니다.
- 모멘텀 계수: Momentum에서는 0.9를 사용하는 것이 일반적입니다.
- $\beta_1$과 $\beta_2$: Adam 계열 알고리즘에서는 $\beta_1=0.9$, $\beta_2=0.999$를 사용하는 것이 일반적입니다.
- 가중치 감쇠 ($\lambda$): AdamW에서는 0.01, 0.001 등 작은 값으로 시작하여 튜닝합니다.
3) 팁
- 경험 공유: 다른 사람들의 튜닝 경험을 참고하는 것이 도움이 됩니다.
- 실험: 다양한 하이퍼파라미터 조합을 시도해보고, 검증 세트의 성능을 비교합니다.
- 학습 곡선 분석: 학습 곡선(손실, 정확도)을 분석하여, 과적합, 과소적합 등의 문제를 파악하고, 하이퍼파라미터를 조정합니다.
- 자동 튜닝 도구: 하이퍼파라미터 자동 튜닝 도구를 사용하여, 효율적으로 최적의 하이퍼파라미터를 찾을 수 있습니다.
6. 결론
Momentum, AdamW는 경사 하강법의 단점을 극복하고 딥러닝 모델의 학습 효율을 높이기 위한 중요한 알고리즘입니다. 각 알고리즘의 원리를 이해하고, 문제의 특성에 맞는 알고리즘을 선택하는 것이 중요합니다. 또한, 하이퍼파라미터 튜닝을 통해 모델의 성능을 극대화할 수 있습니다. 딥러닝 분야는 끊임없이 발전하고 있으며, 새로운 최적화 알고리즘들이 계속해서 등장하고 있습니다. 이러한 알고리즘들을 꾸준히 학습하고, 실제 문제에 적용해보는 것이 중요합니다.
비슷한 글 추천
2-2. 미분과 경사하강법: 딥러닝 최적화의 핵심
미분의 개념과 경사하강법을 설명하고, 딥러닝 모델 학습 과정에서 최적화를 위해 어떻게 사용되는지 설명합니다.
9-4. 하이퍼파라미터 튜닝 (Hyperparameter Tuning): Grid Search, Random Search
Grid Search, Random Search 등 하이퍼파라미터 튜닝 방법을 소개하고, 최적의 하이퍼파라미터 조합을 찾는 전략을 제시합니다.
9-5. Learning Rate Scheduling: 학습률 조절 전략
다양한 Learning Rate Scheduling 전략(Step Decay, Exponential Decay 등)을 설명하고, 학습 성능 향상에 기여하는 바를 분석합니다.
9-1. 딥러닝 모델 최적화: Regularization, Dropout
딥러닝 모델의 과적합을 방지하기 위한 Regularization, Dropout 기법의 원리와 효과를 설명합니다.
Comments (0)
No comments yet. Be the first to comment!
Please to write a comment.