Develop/ML·DL

최적화 함수를 알아보자.

YOOZI. 2025. 2. 7. 11:32
728x90
모델의 학습 성능을 결정짓는 핵심 요소

 

 

 

오늘은 딥러닝 최적 모델학습- 최적화 함수에 대해 알아보자.

 

 

오늘의 배움
  • 최적화 함수의 개념과 필요성
  • 주요 최적화 함수의 종류와 특징
  • 각 최적화 함수의 장단점과 실제 적용

 

1. 최적화 함수

  • 정의: 딥러닝 모델의 손실을 최소화하기 위해 가중치를 조정하는 방법
  • 핵심 개념 한 줄 설명: 마치 등산을 할 때 정상으로 가는 최적의 경로를 찾는 것처럼, 모델이 가장 좋은 성능을 내는 가중치 값을 찾아가는 방법이다.
  • 특징:
    • 모델의 학습 속도, 일반화 성능, 수렴 안정성에 직접적인 영향을 미친다
    • 다양한 방식으로 가중치를 업데이트한다
    • 각각의 장단점이 뚜렷하다
    • 대표적인 최적화 함수로 확률적 경사 하강법(SGD), 모멘텀, AdaGrad, RMSprop, Adam 
  • 핵심 공식: 기본 가중치 업데이트 공식: w ← w - η(학습률) × ∂L/∂w(기울기)
📚 실제 예시로 이해하기
  • [일상적인 예시] 등산로를 찾는 상황으로 비유:
    • SGD: 한 발자국씩 앞을 보고 이동
    • Momentum: 이전에 움직인 방향을 고려하며 이동
    • AdaGrad: 덜 다닌 길은 큰 보폭으로, 자주 다닌 길은 작은 보폭으로 이동
    • RMSprop: 최근에 다닌 길의 상태를 보고 보폭 조절
    • Adam: 이전 이동 방향과 최근 지형 상태를 모두 고려

 


 

2. 확률적 경사 하강법(SGD)

 

  • 정의: 무작위로 선택한 데이터로 가중치 업데이트
  • 작동 원리: 기울기 방향으로 일정 크기만큼 이동
  • 특징: 단순하지만 안정적
  • 예시: w_new = w - learning_rate * gradient
  •  

 

import numpy as np

def sgd_update(w, grad, lr=0.01):
    return w - lr * grad

# 가중치와 기울기
w = np.array([0.5, -0.3])
grad = np.array([0.2, -0.4])

# SGD 업데이트 적용
w_new = sgd_update(w, grad)
print("Updated weights:", w_new)

 


 

3. 모멘텀

 

  • 정의: 이전 업데이트 방향을 고려한 가중치 업데이트
  • 작동 원리: 물리적 관성 개념 적용
  • 특징: 지역 최솟값 회피 가능
  • 예시: v = momentum * v - learning_rate * gradient

 

 

def momentum_update(w, v, grad, lr=0.01, momentum=0.9):
    v = momentum * v - lr * grad
    w += v
    return w, v

# 초기값 설정
w = np.array([0.5, -0.3])
v = np.array([0.0, 0.0])
grad = np.array([0.2, -0.4])

# 모멘텀 업데이트 적용
w_new, v_new = momentum_update(w, v, grad)
print("Updated weights:", w_new)

 


 

4. AdaGrad

  • 학습률을 개별 파라미터마다 다르게 적용하는 기법
  • 자주 업데이트 되는 파라미터의 학습률은 작아지고, 드물게 업데이트되는 파라미터의 학습률은 커지도록 조정한다.
  • AdaGrad는 초반 학습 속도가 빠르지만, 기울기의 제곱합이 계속 누적되면서 학습률이 급격히 감소하여 학습이 멈출 수도 있다.
def adagrad_update(w, grad, h, lr=0.01, epsilon=1e-8):
    h += grad ** 2
    w -= (lr / (np.sqrt(h) + epsilon)) * grad
    return w, h

# 초기값 설정
w = np.array([0.5, -0.3])
h = np.array([0.0, 0.0])
grad = np.array([0.2, -0.4])

# AdaGrad 업데이트 적용
w_new, h_new = adagrad_update(w, grad, h)
print("Updated weights:", w_new)

 


5. RMSprop

  • AdaGrad의 단점을 개선한 방법으로 최근 기울기의 크기를 지수적으로 가중평균하여 스케일링한다. (이전 기울기의 이동 평균을 사용하여 학습률을 조정한다.)
def rmsprop_update(w, h, grad, lr=0.01, beta=0.9, epsilon=1e-8):
    h = beta * h + (1 - beta) * (grad ** 2)
    w -= (lr / (np.sqrt(h) + epsilon)) * grad
    return w, h

 


6. Adam

  • 모멘텀과 RMSProps를 결합한 방법
  • 1차 모멘텀(기울기의 이동평균)과 2차 모멘텀(기울기 제곱의 이동평균)을 활용해 안정적인 학습이 가능

def adam_update(w, m, v, grad, t, lr=0.01, beta1=0.9, beta2=0.999, epsilon=1e-8):
    m = beta1 * m + (1 - beta1) * grad
    v = beta2 * v + (1 - beta2) * (grad ** 2)
    m_hat = m / (1 - beta1 ** t)
    v_hat = v / (1 - beta2 ** t)
    w -= (lr / (np.sqrt(v_hat) + epsilon)) * m_hat
    return w, m, v

 

 


비교 분석표

최적화 함수 학습 속도 메모리 사용량 하이퍼파라미터 민감도 권장 사용 사례
SGD 느림 낮음 높음 간단한 모델
Momentum 중간 중간 중간 일반적인 상황
Adam 빠름 높음 낮음 복잡한 모델

 


 

📌딥러닝 최적화 함수 쉽게 이해하기!

 

1. SGD (확률적 경사 하강법)

  • 한줄 요약: " 무작위로 선택한 하나의 데이터를 사용하여 손실 함수의 기울기를 계산하고 가중치를 업데이트하는 방법 "
  • 실생활 예시: 등산할 때 눈 앞에 보이는 경사만 보고 한 발자국씩 이동하는 것과 같다. 때로는 빠른 길을 찾지 못할 수 있지만, 결국 정상에 도착할 수 있다.
w = w - learning_rate * gradient

 

2. Momentum (모멘텀)

  • 한줄 요약: " 이전 가중치 업데이트의 방향성을 고려하여 현재 업데이트에도 반영하는 방법 "
  • 실생활 예시: 자전거를 타고 언덕을 오를 때, 이전에 받은 추진력을 이용하면 더 쉽게 올라갈 수 있는 것과 같다.
velocity = momentum * velocity - learning_rate * gradient
w = w + velocity

 

3. AdaGrad

  • 한줄 요약: " 각 파라미터마다 학습률을 개별적으로 조정하여 파라미터의 중요도에 따라 다르게 업데이트하는 방법 "
  • 실생활 예시: 새로운 도시를 탐험할 때, 처음 가보는 곳은 자세히 살펴보고, 자주 가본 곳은 빠르게 지나가는 것과 같다.
h = h + gradient**2
w = w - learning_rate * gradient / (sqrt(h) + epsilon)

 

4. RMSprop

  • 한줄 요약: " 최근의 기울기 변화량을 지수평균하여 학습률을 적응적으로 조정하는 방법 "
  • 실생활 예시: 주식 투자 시 최근 며칠간의 가격 변동을 더 중요하게 고려하는 것과 같다.
h = beta * h + (1 - beta) * gradient**2
w = w - learning_rate * gradient / (sqrt(h) + epsilon)

 

5. Adam

  • 한줄 요약: "모멘텀의 방향성 활용과 RMSprop의 적응적 학습률 조정을 결합한 방법 "
  • 실생활 예시: 내비게이션이 과거의 주행 데이터와 현재의 도로 상황을 모두 고려하여 최적의 경로를 추천하는 것과 같다.
m = beta1 * m + (1 - beta1) * gradient
v = beta2 * v + (1 - beta2) * gradient**2
w = w - learning_rate * m / (sqrt(v) + epsilon)

 

 

최적화 함수 속도 메모리 사용 안정성 특징 추천 상황
SGD 느림 매우 적음 보통 단순하고 직관적 간단한 데이터셋
Momentum 중간 적음 좋음 관성을 이용한 빠른 수렴 지역 최솟값이 많은 경우
AdaGrad 중간 중간 좋음 파라미터별 학습률 조정 희소한 데이터
RMSprop 빠름 중간 매우 좋음 최근 변화에 민감 비정형 데이터
Adam 매우 빠름 많음 매우 좋음 적응적 학습률 + 모멘텀 대부분의 상황

 

728x90