최적화 기법
머신러닝과 딥러닝에서 모델의 성능을 극대화하고, 목적 함수의 값을 최소화(또는 최대화)하는 기법
경사 하강법(Gradient Descent)
목적 함수의 기울기(Gradient)를 활용해 함수의 최소값을 찾는 반복적인 최적화 알고리즘
동작 원리
- 목적 함수의 기울기를 계산
- 기울기의 반대 방향으로 학습률(learning rate)에 비례해 이동
- 1, 2 과정을 반복하며 최소값에 수렴 ⇒ 학습률(step size)을 통해 각 반복에서 얼마나 이동할지 결정
*learning rate : 설정된 상수값
경사 하강법에서 사용되는 하이퍼파라미터
각 반복(iteration)마다 가중치를 얼마나 변경할지 결졍하는 상수
보통 eta로 표시, 모든 파라미터 업데이트에서 동일하게 적용
→일정한 크기의 이동을 의미
*step size : 기울기에 의해 달라지는 실제 이동 거리
특정 경로 또는 지점에서 실제로 이동하는 거리 자체를 의미
eta와 기울기 크기의 곱으로 계산
→ learning rate가 동일하더라도 기울기의 크기에 따라 step size는 달라질 수 있음
변형
배치 경사 하강법 : 전체 데이터셋을 사용하여 기울기를 계산
확률적 경사 하강법(SGD) : 데이터 샘플 하나씩 사용
미니배치 경사 하강법 : 데이터셋을 소규모 미니배치로 나누어 사용
장점
간단한 구현
대규모 데이터셋 처리 가능(SGD 및 미니배치)
단점
지역 최소값(local minima) 또는 안장점(saddle point)에 빠질 수 있음
학습률 설정이 까다롭고, 부적절할 경우 발산 또는 느린 수렴 발생
✔️딥러닝에서 신경망 학습 시 역전파(backpropagation)와 함께 사용되어 신경망의 가중치 최적화
✔️강화학습에서 정책 경사법(policy gradient)에서 활용
라그랑주 승수법(Lagrange Multipliers)
제약 조건이 있는 최적화 문제를 해결하는 방법
아이디어
- 제약 조건을 만족하는 영역에서 목적 함수 f(x)를 최적화
- 목적 함수와 제약 조건을 결합한 라그랑주 함수 L(x, λ) = f(x) - λg(x)를 정의
- 라그랑주 함수의 정류점(critical point)를 찾아 최적해 구함
장점
제약 조건이 있는 문제를 무제약 최적화 문제로 변환
복잡한 수식도 효과적으로 다룰 수 있음
단점
제약 조건의 형태와 문제의 복잡성에 따라 계산이 어려워질 수 있음
✔️SVM(서포트 벡터 머신)의 쌍대 문제(dual problem) 해결
✔️물리학 및 경제학에서 제약 조건이 있는 최적화 문제에 사용
예 : 진자 운동에서 길이 제약 조건을 포함한 최적화, 기업의 이윤 극대화 문제에서 생산량 제약, 예산 제약 등을 포함
→라그랑주 승수법은 이러한 문제를 정리된 형태로 변환, 제약 조건을 직접적으로 다루기 때문에 학문적으로 표준적인 접근 방식이 됨
Adam 최적화 알고리즘(Adaptive Moment Estimation)
딥러닝에서 널리 사용되는 고급 최적화 기법
원리
- 모멘텀(momentum)과 RMSprop의 아이디어를 결합한 알고리즘
- 적응형 학습률을 사용해 각 파라미터의 업데이트 크기를 조정
- 1차 모멘트(평균)와 2차 모멘트(분산)의 지수 이동 평균(exponential moving average)을 계산
장점
하이퍼파라미터 튜닝이 비교적 쉬움
대부분의 문제에서 빠른 수렴과 좋은 성능
단점
계산 비용이 SGD보다 약간 높음
특정 경우(예: 과적합 상황)에서는 성능이 저하될 수 있음
✔️딥러닝 신경망 학습에서 표준적으로 사용
기타 주요 최적화 기법
확률적 최적화
랜덤 탐색을 포함한 기법, 복잡한 함수에서 글로벌 최소값(global minimum)을 찾는 데 사용
예 : 시뮬레이티드 어닐링(Simulated Annealing), 유전 알고리즘(Genetic Algorithm)
제약 없는 최적화
BFGS(Quasi-Newton)와 같은 방법론은 목적 함수의 2차 미분 정보를 근사해 최적화
SciPy를 사용하여 간단한 최적화 문제를 해결하는 방법
import numpy as np
from scipy.optimize import minimize
# 최소화할 함수 정의
def f(x):
return (x[0] - 1)**2 + (x[1] - 2.5)**2
# 초기값
x0 = [0, 0]
# 최적화 수행
res = minimize(f, x0, method='BFGS')
print("최적해:", res.x)
"""
최적해: [0.99999996 2.50000001]
"""
이 예제에서는 BFGS 알고리즘을 사용하고 있지만, 실제 머신러닝 애플리케이션에서는 문제의 특성에 따라 다양한 최적화 알고리즘을 선택할 수 있음
*BFGS : 준뉴턴 방식의 알고리즘으로 빠른 수렴을 제공
- 신경망 학습 : 확률적 경사 하강법(SGD) 및 Adam 최적화 알고리즘
- 서포트 벡터 머신(SVM): 라그랑주 승수법을 이용한 최적화 (선형 및 비선형 분류 문제 해결, 쌍대 문제를 통한 최적화)
- 강화학습 : 정책 경사법(Policy Gradient)을 이용, 에이전트의 행동 정책 최적화 누적 보상 최대화
- 하이퍼파라미터 최적화 : Bayesian Optimization이나 Grid Search/Random Search 기법 활용 모델 성능 극대화(최적 하이퍼파라미터 조합 탐색)