Optimizer란?
Optimizer는 머신러닝 혹은 딥러닝 모델이 주어진 목표 함수를 최소화(혹은 최대화)하도록 모델 파라미터(가중치, 편향 등)를 업데이트하는 절차나 알고리즘을 말합니다. 예를 들어 모델의 손실 함수(Loss Function)를 최소화하는 방향으로 파라미터를 변경하는 것입니다.
Optimizer는 학습의 핵심입니다. 모델의 학습 과정은 결국 Optima(최적 해)를 찾아가는 과정입니다. 따라서 어떤 Optimizer를 쓰느냐에 따라 학습 속도, 수렴 안정성, 최종 성능 등이 크게 달라질 수 있습니다. 또한 매우 다양한 종류의 Optimizer가 존재합니다. Gradient Descent(경사 하강법)을 기본으로, 여러 변형 알고리즘(Momentum, Adam, RMSProp 등)이 존재합니다. 이들은 데이터 규모, 모델의 복잡도, 하드웨어 환경 등에 따라 선택적으로 사용됩니다.
Gradient Descent(GD)
경사 하강법은 가장 기본적이지만 가장 많이 사용되는 최적화 알고리즘입니다. 손실 함수의 1차 도함수에 의존하는 first-order 최적화 알고리즘으로, 함수가 최소값에 도달할 수 있도록 어떤 방향으로 가중치를 업데이트해야 하는지 계산합니다. 역전파(back propagation)를 통해 loss가 한 계층에서 다른 계층으로 전달되고, 다시 이 loss에 따라 모델 파라미터가 수정되어 손실을 최소화할 수 있습니다.
기본 개념:
- 목적 함수(Object Function) f(w): 딥러닝에서 주로 사용하는 손실 함수(loss)가 이에 해당합니다. 예컨대, 회귀 문제에서의 평균제곱오차(MSE), 분류 문제에서의 교차 엔트로피 손실 등이 해당합니다.
- 기울기(Gradient) ∇f(w): 파라미터 w를 변화시켰을 때, 손실 함수가 얼마나 민감하게 변하는지를 나타내는 미분 값입니다.
작동 원리:
- Gradient Descent는 "기울기(gradient)의 반대 방향" 으로 파라미터를 조금씩 업데이트해가며, 목표 함수를 점차 최소화합니다. 기울기의 "반대 방향"으로 이동하는 이유는, 기울기가 양수면 그 방향으로 손실 함수가 "증가"하기 때문에, 손실을 줄이려면 반대 방향으로 이동해야 하기 때문입니다.
장점:
- 단순하고 직관적: 수식이 간단하고, 파이썬 등에서 벡터 연산으로 쉽게 구현할 수 있습니다.
- 이론적으로 안정된 방법: 매개변수가 미분 가능하다는 전제 하에서, 전통적으로 가장 널리 연구되고 확립된 최적화 방법입니다.
- 소규모 데이터셋에서 효율적: 전체 데이터셋에 대한 손실 값을 매번 정확하게 계산하므로, 작은 데이터일수록 빠르고 안정적으로 수렴합니다.
단점:
- 대규모 데이터에서 연산량 폭증: 매 스탭마다 전체 데이터셋의 기울기를 구해야 하므로, 데이터가 클수록 시간과 메모리 소비가 커집니다. 이 문제 때문에 Stochastic Gradient Descent(SGD)나 Mini-batch Gradient Descent 같은 방식이 더 널리 쓰입니다.
- 학습률 설정의 어려움: 학습률이 너무 크면 발산, 너무 작으면 수렴 속도가 지나치게 느려집니다. 이 때문에 학습률 스케쥴링(시간에 따라 점진적으로 학습률을 줄이는 기법)이나 적응형 학습률(Adaptive Learning Rate)을 사용하는 방법이 나왔습니다.
- 로컬 미니마, 안장점(saddle point) 문제: 손실 함수의 지형이 복잡한 딥러닝 모델에서는, 로컬 최소점이나 안장점에 갇힐 수 있습니다.
Stochastic Gradient Descent(SGD, Mini-batch Gradient Descent)
대규모 데이터셋을 다룰 때, GD와 같이 매번 전체 데이터에 대해 기울기를 구하는 것은 연산량이 매우 큰 작업입니다. 그렇기 때문에 이런 상황에서 모델의 학습을 가속화하기 위해, "확률적(Stochastic)" 개념을 도입합니다:
- 전체 데이터셋 중 "일부(또는 하나의 샘플)"만 사용해 기울기를 추정합니다.
- 추정된 기울기는 본래 기울기와 오차(노이즈)가 있지만, 업데이트는 훨씬 빠르게 가능합니다.
Stochastic Gradient Descent는 이름 그대로 확률적 경사 하강법입니다. 간단히 말해, 파라미터 업데이트 시 배치(batch) 크기를 전체가 아닌 일부로 축소(최소 1개 샘플부터 수십~수백 개 샘플까지)하여 기울기를 계산한 뒤, GD 식과 유사하게 파라미터를 갱신합니다.
작동 원리:
- 확률 표본 추출: 전체 데이터 D에서 임의로 한 개(또는 소수의) 샘플을 뽑습니다 (이를 "Mini-batch" 또는 "Stochastic batch"라 부릅니다).
- 손실 함수 기울기 계산: 그 샘플(또는 소수의 샘플)에 대해서만 손실 함수를 계산하고, 기울기 ∇fi(w)를 구합니다. 그리고 이를 전체 손실의 근사치로 사용합니다.
- 파라미터 업데이트: 근사 기울기를 활용해 파라미터를 업데이트 합니다. 즉, SGD는 전체 기울기의 근사치를 사용하므로, 한 번의 업데이트마다 들어가는 계산량이 GD에 비해 훨씬 줄어듭니다.
장점:
- 계산 효율성(연산량 감소): 대규모 데이터셋에서 매 업데이트마다 전체 데이터셋을 보지 않고도 기울기를 추정할 수 있으므로, 훈련 속도가 빨라집니다. 특히 온라인 학습 시, 새로운 샘플이 들어올 때마다 즉시 업데이트할 수도 있습니다.
- 빠른 초기 수렴: 작은 배치로 인한 근사 기울기는 잡음이 섞여 있지만, 방향성은 대체로 맞기 때문에 빠르게 최적점 방향으로 이동할 수 있습니다. 초반 학습에서는 GD보다 더 빠르게 손실이 감소하는 경우도 많습니다.
- 규제(Regularization) 효과: 무작위성(샘플 추출로 인한 노이즈)이 업데이트에 자연스럽게 들어가서 오버피팅을 억제하는 효과가 있습니다.
단점:
- 노이즈로 인한 진동(Variance): 한 개(또는 소수)의 샘플만으로 기울기를 추정하므로, 실제 기울기와의 차이(추정 오차)가 큽니다.
- 느린 최종 수렴: GD는 배치 전체의 '정확한' 기울기를 기반으로 업데이트하므로, 후반부에 미세 조정이 잘 되는 경향이 있습니다. 반면 SGD는 계속해서 noisy gradient를 사용하므로, 최적점 근처에서도 쉽게 흔들릴 수 있습니다. *Scaling Law에 따르면 LLM은 수렴할 필요가 없기 때문에 LLM에는 적절한 Optimizer일 수도 있습니다.
- 학습률 설정이 여전히 까다로움: 노이즈가 큰 만큼, 적절한 학습률 스케줄링(점차 학습률을 낮추는 기법)이 필요합니다. 제대로 세팅하지 않으면 발산하거나, 반대로 수렴 속도가 지나치게 느려질 수 있습니다.
- 미니배치 크기 결정: 실제로는 단일 샘플이 아닌, Mini-batch SGD가 보편적입니다. 크기를 얼마로 해야 최적의 속도, 성능을 낼지도 문제입니다. 너무 작으면 추정 오차가 너무 크고, 너무 크면 GD에 가까워져 장점이 줄어듭니다.
Momentum & NAG(Nesterov Accelerated Gradient)
기존의 SGD는 일부 샘플(또는 미니 배치)을 이용해 기울기를 계산함으로써 연산 효율성을 높이지만, 기울기가 noisy하다는 단점이 있습니다. 즉, 최적점 근방에서 계속 진동하거나, 지그재그로 이동해 수렴 속도가 느려지는 것입니다.
따라서 단순히 기울기의 현재 정보만 보는 대신, 이전 업데이트 정보까지 고려해 "관성(Momentum)"을 부여하면 지그재그를 완화하고 더 빠른 수렴을 기대할 수 있습니다. 이를 기초로 탄생한 기법이 Momentum이며, 이후 이를 개선한 NAG(Nesterov Accelerated Gradient)가 소개되었습니다.
Momentum
Momentum Optimizer는 물리학의 관성 개념을 최적화에 적용한 방법입니다. 기울기 업데이트 시, 단순 경사하강법처럼 "현재 기울기"만 반영하는 것이 아니라, 이전 스템의 업데이트 방향도 일부 이어받아 관성(m)을 갖고 이동합니다.
작동 원리:
- Velocity(모멘텀) 업데이트
- 파라미터 업데이트: 결과적으로, v가 일정 방향으로 누적되면(가령 골짜기 바닥으로 향하는 방향), 해당 방향으로 더 빠르게 이동하고, 잘못된 방향에서는 기울기가 상쇄되어 속도가 줄어드는 효과를 갖습니다.
장점:
- 지그재그 완화: 수직(가파른) 방향의 진동이 완화되어, 수렴 속도가 빨라집니다. 특히 경사가 달라지는 경사면에서 안정적 이동이 가능합니다.
- 현대 딥러닝에서 널리 사용: 구현이 간단하고, SGD를 조금만 수정하면 쓸 수 있어 많은 프레임워크에서 기본 옵션으로 제공합니다.
- 적은 연산: SGD에 비해 모멘텀 벡터(v)만 추가로 관리하면 되므로, 연산 부담이 크게 늘지 않습니다.
단점:
- 오버슈팅(overshoot) 가능: 관성으로 인해 골짜기를 지나칠 수 있습니다(학습률이 크면). β와 α를 잘 조절해야 불안정한 진동을 막을 수 있습니다.
- Hyperparameter(모멘텀 계수) 튜닝 필요: β는 0. ~ 0.99등 비교적 범위가 정해져 있지만, 학습률과 함께 최적 값 찾기가 필요합니다.
Nesterov Accelerated Gradient(NAG)
Nesterov Accelerated Gradient(NAG)는 Momentum방법에 '미리 예측된 위치(lookahead)'에서 기울기를 계산하는 아이디어를 추가하여 오버슈팅을 방지하는 기법입니다. Yurii Nestorov가 제안한 "가속 경사법(Accelerated Gradient Methods)" 개념을 딥러닝 최적화로 가져온 사례입니다.
작동 원리:
- NAG는 기본적으로 Momentum의 속도 업데이트를 유지하되, 기울기를 계산하기 전에 한 번 미리 이동해보는(lookahead) 단계를 추가합니다.
- 예측 위치 계산
- 예측 위치에서의 기울기 계산
- Velocity(모멘텀) 업데이트
- 파라미터 업데이트: 이렇게 하면, 관성으로 인한 overshoot 문제가 다소 완화됩니다. 왜냐하면 실제 기울기를 "미리 이동한 지점"에서 평가하므로, 불필요하게 많이 이동하지 않게 되는 효과가 있기 때문입니다.
장점:
- 오버슈팅(overshoot) 개선: 예측 위치(lookahead)에서 기울기를 구해, 지나치게 멀리 이동하는 것을 방지합니다.
- 더 빠른 수렴: Momentum의 장점을 그대로 이어받으면서, 더욱 안정적으로 최적화가 진행됩니다.
- 추가 연산 적음: Momentum대비, "미리 이동"에 따른 기울기 평가만 추가로 계산하기 때문에 큰 오버헤드 없이 적용 가능합니다.
단점:
- 구현 복잡도 약간 상승: Momentum대비, 파라미터를 한 번 예측 위치로 옮겨 기울기를 계산하는 단계가 필요해 코드가 다소 복잡해질 수 있습니다.
- Hyperparameter 설정은 여전히 필요: , α등의 적절한 값 설정이 중요하며, 모델, 데이터에 따라 튜닝 과정이 필요합니다
Adaptive Gradient
적응형 학습률(Adaptive Learning Rate) 기법은, 파라미터마다 다른 학습률을 자동으로 조정해서 업데이트하는 최적화 알고리즘들을 통칭합니다.
전통적인 GD나 SGD는 모든 파라미터에 동일한 학습률을 적용합니다. 그러나 모델이 복잡해지고 파라미터 수가 많아질수록, 어떤 파라미터는 자주 업데이트되고(기울기가 자주 큰 값), 어떤 파라미터는 상대적으로 드물게 업데이트되는 상황이 발생합니다.
이 때, 자주 업데이트되는 파라미터(기울기가 큰 파라미터)는 학습률을 작게, 드물게 업데이트되는 파라미터(기울기가 상대적으로 작은 파라미터)는 학습률을 크게 적용하면, 더 빠르고 효율적인 학습이 가능합니다. *기울기가 큰데 학습률도 크면 오버슈팅의 가능성이 커지기때문입니다.
대표적인 알고리즘으로는 다음이 있습니다:
- AdaGrad(2011)
- RMSProp(2012, 제프리 힌튼 강의에서 제안)
- AdaDelta(2012)
- Adam(2014~2015, Momentum + RMSProp)
각 알고리즘은 서로 다른 방식으로 과거 기울기 정보를 누적해가며, 파라미터별 학습률을 조정하는 아이디어를 구현합니다.
AdaGrad
작동 원리:
- 과거 기울기 제곱 합 누적
- 학습률 조정: 자주 발생하는 기울기(즉, 업데이트가 많이 일어난 파라미터)는 Gt 값이 커지면서 학습률이 점차 작아지고, 드물게 발생하는 기울기는 학습률이 상대적으로 크게 유지됩니다.
RMSProp
AdaGrad가 학습을 진행할수록 Gt가 계속 누적되어, 학습률이 지나치게 0에 가까워지는 문제가 발생한다는 단점을 보완합니다. 이를 위해 지수 가중 이동 평균(Exponential Moving Average) 방식을 사용합니다.
작동 원리:
- 지수 이동 평균(EMA)로 기울기 제곱 누적
- 파라미터 업데이트: '지나치게 학습률이 0으로 수렴하는 문제'를 해결하기 위해, 오래된 기울기 정보는 점진적으로 줄이고 최근 기울기를 더 반영하는 방식
AdaDelta
AdaGrad와 유사한 아이디어지만, 학습률이 0으로 빠르게 수렴해버리는 문제를 한 단계 더 개선한 기법입니다. α 없이, 상대적 크기에 맞춰 파라미터마다 업데이트 보폭을 조절하기 때문에, 일정한 스케일로 업데이트를 계속 유지합니다.
작동 원리:
- 지수 이동 평균 활용
- 업데이트 양(Delta w) 계산
- 파라미터 업데이트: 현재 기울기의 제곱 평균 뿐만 아니라, 이전 업데이트 양의 제곱 평균까지 고려해, 서로 '상대적 비율'에 따라 파라미터 업데이트를 조정하는 방식
장점:
- 적응형 학습률: 파라미터마다 다른 학습률을 적용해, 자주 등장하는(기울기가 큰) 파라미터는 학습률이 작아지고, 드물게 등장하는 파라미터는 학습률이 커집니다. Sparse Feature가 많은 문제(자연어 처리, 추천 시스템 등)에 특히 효과적입니다. *feature가 있는 부분은 기울기가 feature가 없는 부분에 비해 크기 때문에 feature별로 학습률을 다르게 할 필요가 있습니다.
- 학습률 튜닝 부담 감소: 초기 학습률 α에 대한 민감성이 줄어들어, 어떤 측면에서는 직관적으로 다루기 쉽습니다. RMSProp, AdaDelta, Adam 등의 경우 학습 후반부에도 학습률이 0으로 쉽게 가라앉지 않습니다.
- 빠른 수렴: 초기 학습 단계에서 빠른 학습률 조절로 인해, 모델 파라미터가 효과적으로 업데이트되어 수렴 속도가 향상되는 경우가 많습니다.
단점:
- 추가 메모리/연산 부담: 파라미터별 기울기 제곱이나 업데이트 양(Delta w)의 평균 값을 저장,갱신해야 하므로, 일반 SGD 대비 메모리 사용량이 증가합니다. 하지만 딥러닝 프레임워크에서 대부분 자동화되어 크게 문제가 되지 않을 때도 있습니다.
- 하이퍼파라미터 존재: RMSProp, AdaDelta, Adam 등에서 계수(또는 β등)를 설정해야 하며, 모델,데이터에 따라 최적값이 다를 수 있습니다.
- 수렴 분석이 상대적으로 복잡: 적응형 학습률, 이동 평균 등 여러 요소가 결합되어, 이론적 수렴 분석이 기본 GD보다 까다롭고 아직 연구가 진행중인 부분도 있습니다.
Adam
Adam은 모멘텀(Momentum) 기법과 RMSProp의 적응형 학습률 아이디어를 결합한 최적화 알고리즘입니다. 2015년, Diederik P. Kingma와 Jimmy Ba가 논문 “Adam: A Method for Stochastic Optimization”에서 처음 제안하였으며, 이후 다양한 딥러닝 문제에서 사실상의 기본(standard) Optimizer로 자리 잡았습니다.
단순 SGD, Momentum, RMSProp 등 최적화 기법들이 각자의 장단점을 갖고 있습니다. Momentum은 1차 모멘트(기울기 평균)를 추적하며 관성을 부여, RMSProp은 2차 모멘트(기울기 제곱 평균)를 추적해 파라미터별 학습률을 조정합니다.
Adam은 이 둘(1차, 2차 모멘트 추적)을 동시에 도입해, 빠른 수렴 속도와 적응형 학습률의 장점을 모두 취합니다.
작동 원리:
- 1차 모멘트 추적(기울기 평균) 업데이트
- 2차 모멘트 추적(기울기 제곱 평균) 업데이트
- 바이어스 보정(Bias-Correction): 초기 단계에서 mt와 vt가 0으로 초기화되어 있으므로, 작은 t에서 편향이 생길 수 있습니다. 따라서 이를 보정하기 위해 아래와 같은 식을 사용합니다.
- 파라미터 업데이트
장점:
- 빠른 수렴 속도: Momentum처럼 관성을 가지면서도, RMSProp처럼 2차 모멘트 기반 적응형 학습률을 적용하므로써 초기 학습 단계에서 매우 빠르게 손실이 낮아지는 경향이 있습니다.
- 적응형 학습률: 2차 모멘트 vt를 기반으로 파라미터마다 학습률을 달리 적용하므로써 Sparse Feature 등 다양한 경우에 유리합니다.
- Hyperparameter 튜닝 부담 완화: , β2=0.999, ϵ=10^−8 등 권장 기본값이 잘 작동하는 경우가 많습니다. 결과적으로, 학습률만 대략적으로 맞춰줘도 준수한 성능이 나오는 경우가 흔합니다.
- 바이어스 보정: 초기 단계에서 모멘트 추정값이 0으로 인한 편향이 발생하지 않도록 보정해주므로, 보다 안정적으로 업데이트 됩니다.
단점:
- 과도한 적응 학습률로 인한 미세 조정 어려움: 특성에 따라 최적점 근방에서 기울기 진폭이 계속 들쭉날쭉할 경우, 정확한 미세 조정이 어렵다는 지적이 있습니다. 최근에는 Adam 대신 SGD + Mementum 으로 마지막 단계를 미세 조정하거나, AdamW(L2 정규화 적용) 같은 변형을 사용하기도 합니다.
- 메모리 사용량 증가: Momentum(1차 모멘트)와 2차 모멘트를 모두 저장해야 하므로, 일반 SGD 대비 2배 이상의 메모리를 사용합니다. 대규모 모델에서 고려 요소가 될 수 있습니다.
정리