2025 학부 인턴/CV

옵티마이저 : Optimizer

dbwls-log 2025. 12. 15. 13:04

Optimizier란? 

머신러닝 및 딥러닝 모델의 학습 과정에서 손실 함수의 값을 최소화하여 모델이 최적의 파라미터를 찾도록 하는 알고리즘이다. 

즉, 모델이 더 좋은 성능을 내도록 가중치를 조절해주는 역할을 하는 것이다. 

 

옵티마이저의 종류에는 경사하강법(BGD, SGD, MBGD), Momentum, AdaGrad, RMSprop, Adam, Adamw 등이 있다. 

 

 

경사하강법 : Gradient Descent 

경사하강법이란 손실함수의 기울기를 계산한 후, 가중치를 기울기 방향으로 조금씩 조정하면서 손실의 최적점을 찾아가는 방식이다. 

 

BGD : Batch Gradient Descent 

전체 데이터셋을 사용하여 한번에 업데이트하므로, 안정적이지만 게산량이 많다는 문제점이 있다. 

 

SGD: Stochastic Gradient Descent 

하나의 샘플(데이터 포인트) 씩 업데이트 한다. 

하나의 데이터는 무작위로 선택되며 기울기를 계산하고 파라미터를 업데이트하고 난 후 다른 데이터에서 다시 무작위로 선택하는 방식으로 동작한다. 따라서 지역 최저점 문제를 해결할 수 있다. 

계산량은 적지만 기울기 방향이 급격하게 변하는 지역에서는 업데이트가 계속 왔다갔다 하며 효과적으로 내려가지 못하고 진동할 가능성이 있다. 

 

MBGD : Mini-Batch Gradient Descent 

여러개의 샘플을 배치단위로 묶어 업데이트하는 방식으로 동작한다. 

SGD와 BGD의 장점을 적절히 활용한 방식이다. 

 

 

SGD + Momentum 

모멘텀을 사용하여 SGD를 이용할 수 있다. 

모멘텀이란 이전 업데이트 방향을 기억하고 그 방향으로 계속 움직이도록 하는 것이다. 이전에 이동한 방향과 속도를 활용하여 진동을 줄이며, 수렴 속도를 높힐 수 있다. 

 

지금의 기울기와 이전의 기울기 2가지를 모두 고려하여 방향을 결정한다. 

즉, 가중치 변경 이력이 현재 가중치에 영향을 미친다는 것이다. 이전 기울기를 고려하기 때문에 지역 최저점에서 빠져나갈 수 있다. 

 

예시 

학습률 p = 0.1, 모멘텀 γ = 0.9, 초기 속도 v0 = 0이라고 한다면 아래 식처럼 나타낼 수 있다. 

속도 vt = 모멘텀 x 이전 속도 + 학습률 x 기울기 

설정 값 = 현재 상태 - 이동할 양 (vt) 

 

해당 표를 보면 기울기가 2로 일정할 때, 실제로 이동하는 보폭 vt 가 어떻게 점점 커지는지 볼 수 있다. 

여기서 파라미터 업데이트란 모델이 정답을 더 잘맞히기 위하여 자신의 설정값을조금씩 수정하는 과정을 의미한다. 

 

1단계에서 보면 초기 속도는 0으로 관성이 없다. 따라서 초기 속도 0과 모멘텀 0.9를 곱해준 0에 학습률과 기울기를 곱해준 0.2를 더하여 속도를 0.2로 만들어준다. 

 

2단계에서 보면 초기 속도가 0.2가 되고 모멘텀이 0.9 이므로 이전 속도의 0.9인 0.18을 관성으로 가지고 오고, 학습률과 기울기를 곱한 0.2와 더하여 0.38로 만들어준다. 

 

3단계에서 보면 초기 속도가 0.38이고 모멘텀이 0.9이므로 이를 곱해준 값과, 학습률과 기울기를 곱한 0.2를 더해 0.542로 만들어준다. 

 

이렇게 구한 속도를 가지고 파라미터 업데이트 양을 정해주면 되는 것이다. 

단계가 흘러갈수록 점점 더 빠르게 가속된다는 것을 확인할 수 있다. 

 

이전 이동 방향을 기억해 관성(모멘텀)을 부여하여 최적점을 향한 움직임을 안정적이도 부드럽게 만든다. 

같은 방향으로 지속적으로 움직이면 가속되어 빠르게 학습하고, 방향이 급격히 바뀌는 경우엔 속도를 줄이며 진동을 방지한다. 

 

 

AdaGrad : Adaptive Gradient 

AdaGrad는 학습률을 파라미터마다 동적으로 조절하여 학습속도를 개선시키는 방법이다. 

자주 업데이트 된 가중치의 학습률은 작게(조금씩 업데이트), 거의 업데이트 되지 않는 가중치의 학습률은 크게(더 크게 업데이트)하는 방식으로 동작한다. 

대부분의 입력값이 0이고, 일부 위치에만 의미 있는 값이 존재하는 데이터인 희소 데이터에 효과적이다. 

 

모든 파라미터(가중치)에 대해 각 파라미터에 대한 기울기의 제곱값을 누적하여 기록한다. 

누적된 값을 이용하여, 모든 가중치에 대해 개별적인 학습률을 조정하고, 학습률은 과거의 기울기 크기에 반비례하도록 조정한다. 

 

하지만 이는 제곱합을 계속하여 누적하므로, 시간이 지날수록 분모가 계속하여 커지고 학습률이 매우 작아져 학습이 초기에 멈추는 현상인 조기 정체가 발생할 수 있다. 

 

예시

학습률 p=0.4, 초기 G0=0이라면 아래와 같다. 

 

제곱 누적 = 이전 제곱 누적 + 기울기의 제곱 

파라미터 업데이트= 이전 업데이트 - 학습률 x 기울기 

 

 

각 파라미터에 대해 과거 기울기의 제곱을 누적하여 학습률을 파라미터마다 개별적으로 조정한다. 

많이 업데이트된 파라미터의 학습률은 낮추고, 적게 업데이트된 파라미터의 학습률은 높게 유지하여 균형 잡힌 학습을 수행한다. 

다만 시간이 지날수록 학습률이 점점 작아져 나중에는 거의 움직이지 않아 학습 후반부의 수렴 속도가 저하되는 문제가 발생할 수 있다. 

 

 

RMSprop : Root Mean Square Propagation 

RMSprop은 AdaGrad의 단점을 보완하기 위하여 제안된 옵티마이저이다. 

AdaGrad는 과거의 모든 기울기의 제곱합을 무한적 누적시켜 학습률이 급격히 작아져 학습이 느려지는 문제가 있었다. 

RMSprop은 과거의 기울기를 모두 누적하지 않고, 최근의 기울기만 중점적으로 반영하는 방식으로 동작한다. 

 

기울기 제곱의 지수 이동 평균을 계산하여 계산된 이동 평균을 이용하여 파라미터를 업데이트한다. 

이는 최근 기울기에 더 큰 가중치를 두어 반영한다는 것을 의미한다. 

 

 

Adam : Adaptive Moment Estimation 

Adam은 Momentum 과 RMSprop을 결합한 옵티마이저이다. 

기울기의 1차 모멘트인 이동 평균과 2차 모멘트인 제곱 이동 평균을 계산한다. 

 

예시 

여기서 ⍬는 가중치를 의미한다. 즉, 우리가 찾아야하는 값이다. 

p는 학습률으로 한번 수정할 때 얼마나 크게 바꿀지 정하는 보폭 느낌이다. 

B1은 모멘텀 계수와 비슷한 개념으로 기울기를 기억할 때 최근 정보를 얼마나 중요하게 반영할지 정하는 비율이다. 

B2는 보폭 조절(속도)을 계산할 때 쓰는 비율이다. 기울기의 제곱을 얼마나 오래 기억할지 정하는 값이다. 

ε은 앱실론으로 0으로 나누는 것을 막기 위한 안전장치이다. 

m0과 v0은 시작할 때 초기값이다. 시작할 때는 이전 기록이 없어서 둘 다 0으로 설정해둔 것이다. 

 

 

초기에는 기울기에 민감하게 반응하지만, 시간이 지나며 과거 정보를 더 많이 반영하고 폭이 지나치게 크거나 작아지는 것을 막아준다. 

 

 

Adamw : Adam + Weight Decay 

AdamW는 Adam과 명시적 Weight Decay를 사용하는 것이다. 

Adam의 최적화 과정에 별도로 명시적인 가중치 감소를 추가하여 더 강력한 정규화 효과를 주는 것이다. 

 

기존의 Adam에서는 손실함수에 정규화 항을 더하고 그걸 기울기와 함께 합쳐서 업데이트에 넣는 방식이였기 때문에, 정규화항이 1차 모멘텀과 2차 모멘텀에 포함되어 정규화 항의 효과가 기울기 보정 과정에의해 왜곡된다는 문제가 있었다. 

AdamW는 이를 해결하기 위하여 가중치 감소 항을 기울기 처리에서 완전히 분리하였다. 

 

일반적으로는 Adam보다 더 나은 일반화 성능을 보이며, 최신 딥러닝 연구에서는 AdamW를 기본 옵티마이저로 활용하고 있다. 

 

예시 

 

기울기가 줄어들수록 Adam 방향 감소량은 줄어들지만, decay는 꾸준히 작동한다. 

AdmaW는 파라미터가 점점 작아지고, 훈련 후반부에서 더 규제된 학습 경로를 형성하여 과적합방지 효과가 기대된다. 

 

 

Weight Decay와 L2 Regularization 

과적합을 방지하고 일반화 성능을 높이기 위해 사용하는 대표적인 정규화 기법이다. 

 

L2 Regularization 

L2 정규화 (Ridge 정규화라고 하기도 함)와 본질적으로 동일하다. 

손실함수에 정규화항을 추가하는 방식으로 동작하여 기울기 자체를 증가시켜 파라미터를 더 많이 깎는 방식이다. 

||θ||² = Σ(i=1 ~ n) θi² 으로 파라미터의 제곱합이고, λ는 정규화 강도로 양수이면서 작은 값을 사용한다. 

θ 값이 클수록 손실함수가 커지므로, 학습 시 가중치가 작아지도록 유도한다. 

 

 

Weight Dacay 

손실함수에 추가하지 않고, 업데이트 시점에 파라미터를 일정 비율만큼 직접 감소시키는 방식이다. 

업데이트 공식에 -pλθ 항을 직접 추가한다. 

 

파라미터를 직접 깎는 방식은 기울기에 영향을 주지 않고 파라미터 자체만 줄이는 효과가 있다. 

정규화 효과가 기울기 연산과 독립적으로 작용한다. 

 

 

※ L2 Regularization vs Weight Decay 

 

 

 

Learning Rate Scheduling 

학습률 스케줄링이란 사용자가 학습률 변화를 사전에 정의하는 방식이다. 

고정 학습률 대신 스케줄링을 사용하면 초반에는 큰 학습률로 빠르게 최적화하고, 후반에는 작은 학습률로 미세 조정이 가능하다. 

즉, 과적합은 방지하고 최종적으로는 더 나은 성능을 뽑을 수 있는 것이다. 

 

학습률 스케줄링에는 다양한 방식이 있다. 

 

Step Decay : 단계적 감소 

일정한 epoch 마다 학습률을 감소시키는 방식이다. 

 

Exponetial Decay : 지수적 감소 

학습률을 지수함수처럼 감소시키는 방식이다. 

예) 매 epoch 마다 학습률을 95%로 줄이기 

 

Cosine Annealing : 코사인 감소 

코사인 함수처럼 점점 줄이다가 다시 크게 조정하는 방식이다. 

주로 SGD+Momentum과 함께 사용하며, Adam 계열 사용시에는 학습률 스케줄링이 덜 필요하지만, SGD 사용시에는 필수적이다. 

 

ReduceLRONPlateau : 손실 정체 시 감소 

학습이 정체되면 학습률을 자동으로 줄이는 방식이다. 

예) 검증 손실이 줄어들지 않으면 학습률 감소 

 

OneCycleLR : 1주기 학습률 조정 

초반에는 LR을 증가시키고, 이후에는 줄여서 빠르게 학습하면서 최적화 시키는 방식이다. 

ResNet, EfficientNet 등에서 자주 사용되는 방식이다. 

 

 

CV에서 Optimizer 선택 기준 

CV에서는 문제의 복잡도, 데이터 크기, 모델 아키텍처의 특성, 학습 단계에 따라 옵티마이저 선택 기준이 달라진다. 

 

학습 단계 

초기 학습 

Adam이나 RMSprop과 같이 빠른 수렴을 보이는 옵티마이저를 사용하는 것이 좋다. 

 

후반 학습 및 일반화 

SGD+Momentum 및 적절한 학습률 스케줄링을 활용하는 것이 좋다. 

 

하이퍼파라미터 튜닝 

실험을 통해 데이터와 모델에 맞는 최적의 설정을 찾아내는 것이 핵심이다. 

 

 

데이터셋 크기 

작은 데이터셋 

ex) MNIST, CIFAR-10 등 

일반적으로 SGD+Momentum이 좋은 성능을 보인다. 

Adam이나 RMSprop을 사용하면 빠르게 수렴하기는 하지만, 과적합 위험이 커질 수 있다. 

 

큰 데이터셋 

ex) Imagenet, COCO 

Adam, RMSprop이 빠르게 학습할 수 있지만 최근 연구에서는 SGD+Momentum + Cosine Annealing 이 더 나은 성능을 내는 경우가 많다. 

 

 

모델 구조

단순한 모델 : 얕은 네트워크 

기본적으로 SGD+Momentum을 사용한다. 

Adam이나 RMSprop도 사용할 수 있지만 성능차이는 그렇게 크기 않다.

 

복잡한 모델 : 깊은 네트워크 

ex) ResNet, EfficientNet, ViT 

AdamW or SGD+ Momentum + Learning Rate Sheduling이 효과적이다. 

Adam은 빠르게 수렴하지만  일반화 성능이 낮을 수 있어 AdamW를 사용한다. 

 

트랜스포머 기반 모델 

ex) ViT , Swin Transformer 

AdamW가 표준적인 옵티마이저로 사용된다. 

특히 비전 트랜스포머의 경우 SGD 보다는 Adam 계열이 훨씬 좋은 성능을 낸다. 

 

 

학습 속도 

빠른 수렴이 중요할 때 

초반 학습 속도가 빠른 Adam, RMSprop을 사용한다. 

하지만 일반화 성능이 낮아질 수 있다. 

 

일반화 성능이 중요할 때 

느리지만 최종 성능이 더 좋을 가능성이 큰 SGD + Momentum을 사용한다. 

Cosine Annealing같은 학습률 스케줄링 기법과 함께 사용하면 더 효과적이다. 

 

 

 

하드웨어 성능 : GPU 메모리 

Adam 계열 

계산량이 많아 GPU 사용량이 크고, 작은 GPU 에서는 배치 사이즈를 줄여야할 수 있다. 

 

SGD + Momentum

상대적으로 메모리 사용량이 적고 효율적이다. 

대형 모델을 학습할 때 선호된다. 

 

'2025 학부 인턴 > CV' 카테고리의 다른 글

CNN의 구조  (0) 2025.12.15
CNN 등장 배경  (0) 2025.12.15
손실 함수 : Loss Function  (0) 2025.12.14
활성화 함수 : Activation Function  (0) 2025.12.14
딥러닝 기초 with 파이토치  (0) 2025.11.21