PyTorch

8. Optimizers

MoonLight314 2025. 3. 3. 20:52
728x90
반응형

안녕하세요, MoonLight입니다.

이번 장에서는 딥러닝 모델의 Train을 하는데 있어서 중요한 요소중의 하나인, Optimizer에 대해서 알아보도록 하겠습니다.

 

 

1. Optimization in Deep Learning

 

 

 

1.1. Optimization(최적화)

딥러닝 모델은 수많은 가중치(Weight)와 편향(Bias)이라는 학습 가능한 매개변수를 가지고 있습니다.

모델의 성능을 평가하는 기준이 되는 Loss Function(손실 함수)는 이 매개변수들의 함수이며, 이를 최소화하는 것이 딥러닝 모델 학습의 목표입니다.

이때, 모델이 손실을 최소화하도록 가중치를 조정하는 방법을 결정하는 것이 바로 최적화 알고리즘(Optimizer)이며, Optimizer는 모델의 Parameter(Weight & Bias)를 어떤 수학적 방법으로 조절하느냐에 따라서 다양한 종류가 있습니다.

 

1.2. Optimizer의 동작 방식

모델이 학습을 진행하면 매 Epoch마다 Loss값이 계산됩니다.

Train Loop에서는 계산된 Loss 값을 Backpropagation시켜서 각 Parameter(Weight & Bias)가 Loss값에 얼마나 영향을 주는지 편미분을 통해서 계산하게 됩니다.

이제 Optimizer는 각 Parameter가 Loss에 영향을 주는 정도(기울기)값을 보고 Optimizer의 알고리즘에 따라서 각 Parameter를 조절합니다.

이 과정을 반복하면서 Loss는 점점 줄어들고 모델의 성능은 향상되는 것이고, 이 과정이 바로 모델의 Train 과정입니다.

이때, Optimizer는 단순히 Parameter를 임의로 변경하는 것이 아니라, 경사 하강법(Gradient Descent)과 같은 수학적인 기법을 사용하여 가장 효과적인 방향으로 Parameter를 조절합니다.

 

 

1.3. Optimizer의 수학적 배경

Optimizer의 가장 기본이 되는 알고리즘인 경사 하강법(Gradient Descent)부터 이해해 보도록 하겠습니다.

위 수식은 경사 하강법의 기본적인 Weight Update 수식입니다.

이 수식은 Optimizer가 기울기(Gradient)를 이용하여 손실 함수(Loss Function)를 최소화하는 방향으로 가중치를 조정하는 기법을 나타냅니다.

모든 Optimizer가 이 방법을 사용하는 것이 아니라, 이 후에 나오는 다른 Optimizer들은 이 방식을 기본으로 다양한 향상된 알고리즘을 적용합니다.

즉, 이 수식이 모든 Optimizer의 기본적인 알고리즘이므로 이 수식의 의미를 잘 알아둘 필요가 있다는 의미입니다.

1.3.1. 경사 하강법과 편미분

경사 하강법에서는 손실 함수 L(w)의 기울기(미분)를 계산하여, 기울기의 반대 방향으로 가중치를 업데이트합니다. 이를 수식으로 표현하면 다음과 같습니다.

· w′ : 업데이트된 가중치

· w : 현재 가중치

· α : 학습률(Learning Rate) - 가중치를 조정하는 속도를 결정하는 하이퍼파라미터

· dL/dw : 손실 함수 L 을 가중치 w에 대해 미분한 값

이 수식의 핵심 개념은 기울기의 반대 방향으로 이동해야 손실이 줄어든다는 것입니다.

dL/dw > 0 : (기울기가 양수)라면 w 값을 줄임

dL/dw < 0 : (기울기가 음수)라면 w 값을 증가

즉, 기울기가 양수이면 Loss가 양의 방향으로 커지고 있는 상태이고, 기울기가 음수이면 Loss가 음의 방향으로 커지고 있는 상태라는 뜻입니다.

기울기가 양수이든 음수이든 Loss값 자체의 절대값은 커지고 있는 상태라서 현재 기울기의 반대방향으로 기울기를 조절해서 기울기가 0의 방향으로 가도록 해야 합니다.

그러기 위해서 기울기의 영향을 주는 w값을 조절하여 기울기를 0의 방향으로 가도록 하는 것입니다.

2. Optimizer의 종류

Optimizer의 종류에는 크게

· 확률적 경사 하강법(Stochastic Gradient Descent, SGD) ,

· 모멘텀 기반 최적화(Momentum-Based Optimization) ,

· 적응형 최적화 알고리즘 (Adaptive Optimization Algorithms)

이렇게 3가지 정도의 카테고리가 있습니다. 각각에 대해서 알아보도록 하겠습니다.

 

 

 

2.1. 확률적 경사 하강법(Stochastic Gradient Descent, SGD)

경사 하강법(Gradient Descent)은 손실 함수의 기울기(Gradient)를 따라 가중치를 조정하며 최적의 값을 찾아가는 알고리즘인데요, 연산량이 많고 속도가 느리다는 단점이 있습니다.

이를 극복하기 위해서 나온 것이 확률적 경사 하강법(Stochastic Gradient Descent, SGD)입니다.

2.1.1. 핵심 Idea

일반적인 배치 경사 하강법이 다음과 같이 전체 데이터셋을 사용하여 한 번의 업데이트를 수행합니다.

반면, 확률적 경사 하강법은 배치 단위가 아닌 데이터 샘플 하나씩을 이용하여 기울기를 계산하고 가중치를 업데이트하는 방식입니다

즉, 매번 데이터 하나를 사용하여 기울기를 계산하고 즉시 업데이트하기 때문에, 더 빠르게 학습할 수 있는 장점이 있습니다.

2.1.2. 장단점

1) 장점

· 빠른 업데이트 및 저렴한 연산 비용

배치 전체를 사용하지 않고 하나의 데이터만 사용하므로 계산 비용이 절감되고, 특히, 데이터셋이 클수록 효과적입니다.

· Local Minimum 탈출 가능

배치 경사 하강법은 특정 지역 최소값에서 빠져나오기 어렵지만, SGD는 노이즈가 많아 다양한 경로를 탐색하며 탈출할 가능성이 큼.

· 온라인 학습(Online Learning)에 적합

새로운 데이터가 계속 들어오는 환경에서도 학습 가능하기 때문에, 실시간으로 학습을 진행하는 시스템에 활용 가능.

2) 단점

· 불안정한 최적화 경로

기울기 계산이 샘플 하나에 의존하므로 가중치가 매번 급격하게 변할 수 있다는 단점이 있어서 최적화가 수렴하는 과정이 BGD보다 불안정할 수 있습니다.

· 최적해 근처에서 진동 발생 가능

최적의 가중치를 찾기 전에 계속 진동하며 정착하지 못할 수도 있습니다.

이를 방지하기 위해 학습률을 점진적으로 감소시키는 기법(예: 학습률 스케줄링)이 필요합니다.

· 미분 가능하지 않은 손실 함수에는 적용하기 어려움

SGD는 손실 함수의 기울기를 기반으로 하기 때문에 미분 불가능한 경우 적용하기 어렵다.

 

 

2.2. 모멘텀 기반 최적화(Momentum-Based Optimization)

SGD(Stochastic Gradient Descent)는 연산량이 적고 빠르게 업데이트할 수 있다는 장점이 있지만, 최적화 경로가 불안정하고 수렴 속도가 느리며 진동이 발생할 수 있다는 단점도 존재합니다.

이러한 단점을 해결하기 위해 등장한 것이 모멘텀(Momentum) 개념을 적용한 최적화 알고리즘입니다.

모멘텀 기반 최적화는 물리학의 운동량 개념을 도입하여, 기울기를 단순히 따라가는 것이 아니라 이전의 업데이트 방향을 기억하고 가속도를 유지하는 방식으로 가중치를 조정하는 알고리즘입니다.

2.2.1. 핵심 Idea

SGD의 단점을 극복하기 위해서 모멘텀 기반 최적화는 이전 기울기의 영향을 일정 부분 유지하면서 새로운 기울기를 반영하는 방식을 사용합니다.

이로 인해서 수렴 속도가 빨라지고, 진동이 줄어서 안정적인 학습이 가능하며, Local Minimum에 갇히는 경우가 적어지게 되는 장점이 생깁니다.

이를 수학적으로 표현한다면, 아래는 같은 일반적인 SGD 방식의 경우입니다.

이는 단순히 현재 기울기에 따라 가중치를 조정하는 방식이므로, 기울기가 크게 변할 때마다 방향이 계속 바뀌어 진동이 발생할 수 있습니다.

반면, 모멘텀 개념을 적용한 수식은 아래와 같습니다.

여기서

· 𝑣𝑡 : 현재 속도(velocity), 즉 가중치 업데이트에 영향을 주는 값

· β : 모멘텀 계수 (일반적으로 0.9로 설정)

· α : 학습률

· ∂𝐿 / ∂w : 손실 함수의 기울기

이 공식의 의미:

𝛽𝑣𝑡−1 : 이 부분은 이전 업데이트 방향을 일정 부분 유지하는 효과를 가지도록 하며, 새로운 기울기를 반영하면서도 이전 기울기의 방향성을 고려하여 보다 부드럽게 이동하도록 해줍니다. β 값이 클수록 과거의 기울기를 더 많이 반영하여 진동을 줄이는 효과가 있습니다.

2.2.2. 종류

(1) 표준 모멘텀 (Momentum)

가장 기본적인 형태로, 위에서 설명한 방식으로 이전 기울기를 기억하면서 현재 기울기를 반영하여 업데이트하는 방식입니다.

(2) 네스테로프 가속 경사 (Nesterov Accelerated Gradient, NAG)

네스테로프 모멘텀은 기존 모멘텀 방식보다 더 빠르게 최소값에 도달할 수 있도록 개선된 방법입니다.

표준 모멘텀은 현재 위치에서 기울기를 계산하여 이동하는 반면에 네스테로프 모멘텀은 현재 위치에서 한 걸음 더 나아간 위치를 먼저 예측한 후, 거기서 기울기를 계산하는 아이디어를 추가하였습니다.

더 정확한 기울기 정보를 활용하여 불필요한 이동을 줄이고 빠르게 수렴 가능하며, 진동을 더 줄일 수 있는 장점이 있습니다.

2.2.3. 장단점

1) 장점

· SGD보다 수렴이 빠르고, 진동이 적어 학습이 더 안정적입니다.

· 평탄한 지역에서도 이동 속도를 유지하여 빠르게 진행 가능

· Local Minimum에 빠지는 경향이 적습니다.

(2) 단점

· 적절한 모멘텀 계수(β) 설정이 필요합니다.

· 복잡한 경사면에서는 오버슈팅(overshooting, 목표를 지나쳐버리는 현상)이 발생할 수 있습니다.

· SGD보다 메모리를 조금 더 많이 사용합니다.

 

 

2.3. 적응형 최적화 알고리즘 (Adaptive Optimization Algorithms)

경사 하강법(SGD)과 모멘텀 기반 최적화는 학습률(𝛼)이 고정된 값을 사용하는 반면, 적응형 최적화 알고리즘(Adaptive Optimization Algorithms)은 가중치(Weight)마다 학습률을 다르게 적용하여,학습이 빠른 영역에서는 작은 학습률을 적용하고, 학습이 느린 영역에서는 큰 학습률을 적용하는 방식으로 동작합니다.

 

2.3.1. 핵심 Idea

Weight마다 다른 학습률을 적용하여 기울기가 급격히 변하는 영역에서는 학습률을 줄이고, 평탄한 영역에서는 학습률을 증가시켜 빠르게 학습을 최적화시킵니다.

SGD보다 안정적으로 수렴하며, 모멘텀과 결합하면 더욱 강력한 성능을 발휘합니다.

이런 특징으로 인해서 수렴 속도를 높이고 안정성이 높습니다.

일반적으로 수렴 속도가 빠르며, 최적의 학습률을 찾는 과정이 필요 없다는 장점이 있습니다.

뿐만 아니라, 희소 데이터(Sparse Data)에서도 효과적으로 동작하여 가장 많이 사용됩니다.

 

2.3.2. 종류

1) Adagrad (Adaptive Gradient)

Adagrad 방식은 Weight를 업데이트할 때, 이전까지의 기울기의 제곱합을 반영하여 학습률을 조정하는 방법입니다.

여기서 ∇(나블라, Nabla) 기호는 기울기(Gradient)를 의미하며, ∇L(wt)는 손실 함수 𝐿(𝑤𝑡)에 대한 가중치 𝑤𝑡의 기울기(Gradient) 를 나타냅니다.

∇가 단변수 함수에 적용되면 미분을 의미하지만, 위와 같이 다변수 L(w)에 적용이 되면 편미분을 나타내며, 각 변수에 대한 변화율을 표현합니다.

· Gt : 현재까지의 기울기 제곱합 (각 가중치마다 다르게 저장됨)

· Gt−1 : 이전까지의 기울기 제곱합

· ∇𝐿(𝑤𝑡) : 현재 가중치 𝑤𝑡 에 대한 손실 함수의 기울기

· ∇𝐿(𝑤𝑡)2 : 기울기의 제곱 값 (각 매개변수에 대해 계산됨)

· α : 기본 학습률

· ϵ : 수식의 안정성을 위한 작은 값

Adagrad의 특징은 기울기가 큰 가중치는 학습률을 작게 , 작은 기울기를 가진 가중치는 학습률을 크게 조정하여 학습률이 자동 조절되는 장점이 있습니다.

즉, 이전까지의 기울기 정보를 누적하여 학습률을 조절하는 역할을 합니다

하지만, 𝐺𝑡가 커지면서 학습률이 너무 작아지는 문제(Vanishing Learning Rate)가 발생할 수 있다는 단점이 있습니다.

2) RMSprop (Root Mean Square Propagation)

Adagrad의 단점(학습률이 점점 작아지는 문제, Vanishing Learning Rate)을 해결하기 위해, 기울기의 누적을 지수 이동 평균(EMA, Exponential Moving Average)으로 계산하여 업데이트하는 방식입니다.

 

· β : 지수 이동 평균(보통 0.9로 설정)

나머지 변수들은 Adagrad와 동일

RMSprop의 특징은 Adagrad의 단점(학습률이 점점 작아지는 문제, Vanishing Learning Rate)을 개선하였으며, 평탄한 지역에서도 학습이 지속적으로 잘 이루어집니다.

3) Adam (Adaptive Moment Estimation)

Adam은 모멘텀(이전 기울기의 이동 평균)과 RMSprop(기울기의 제곱 이동 평균)을 결합한 방식의 알고리즘입니다.

즉, 1차 모멘트(평균)와 2차 모멘트(분산)를 모두 활용하여 더욱 효과적으로 학습할 수 있도록 만들어졌습니다.

 

· mt : 1차 모멘트 (기울기의 이동 평균, 모멘텀 효과)

· 𝑣𝑡 : 2차 모멘트 (기울기의 제곱 이동 평균, RMSprop 효과)

· 𝛽1,𝛽2 : 각각 1차, 2차 모멘트의 이동 평균 계수 (일반적으로 0.9, 0.999로 설정)

Adam 의 주요 특징은 앞서 설명했듯이 모멘텀과 적응형 학습률을 동시에 적용하여 강력한 성능을 발휘하며 실제로 거의 대부분의 문제에서 잘 동작합니다.

그렇기 때문에 왠만한 경우에는 Adam을 사용하면 큰 문제없이 모델을 훈련시킬 수 있습니다.

2.3.3. 적응형 최적화 알고리즘의 장단점

 

1) 장점

· 학습률을 자동으로 조정하여 학습 안정성을 매우 빠르게 증가시킵니다.

· 희소 데이터(Sparse Data)와 비정상적인 기울기가 존재하는 문제에서도 효과적입니다.

2) 단점

· 모델에 따라 오버피팅(Overfitting)이 발생할 가능성이 있습니다.

· 배치 크기에 영향을 많이 받으며, 일반화 성능이 저하될 수 있습니다.

· Adam은 최적해 주변에서 수렴이 불안정할 수도 있습니다.


아래는 PyTorch에서 지원하는 모든 Optimizer의 리스트입니다.

Optimizer
특징
함수 사용 예시
SGD
확률적 경사 하강법
torch.optim.SGD() optimizer = optim.SGD(model.parameters(), lr=0.01)
Momentum
표준 모멘텀
torch.optim.SGD() optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
Momentum
네스테로프 가속 경사
torch.optim.SGD() optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9, nesterov=True)
Adagrad
적응형 학습률 (학습률 자동 조정)
torch.optim.Adagrad() optimizer = optim.Adagrad(model.parameters(), lr=0.01)
RMSprop
Adagrad 개선 (지수 이동 평균 적용)
torch.optim.RMSprop() optimizer = optim.RMSprop(model.parameters(), lr=0.01, alpha=0.99)
Adam
Adam (모멘텀 + RMSprop 결합)
torch.optim.Adam() optimizer = optim.Adam(model.parameters(), lr=0.001, betas=(0.9, 0.999))
AdamW
Adam + Weight Decay 적용
torch.optim.AdamW() optimizer = torch.optim.AdamW(model.parameters(), lr=0.001, weight_decay=0.01)
NAdam
Adam + 네스테로프 모멘텀 적용
torch.optim.NAdam() optimizer = torch.optim.NAdam(model.parameters(), lr=0.001)
Adamax
Adam의 변형, L∞ 노름 사용
torch.optim.Adamax() optimizer = torch.optim.Adamax(model.parameters(), lr=0.002)
Adadelta
Adagrad 개선, 학습률 자동 조정
torch.optim.Adadelta() optimizer = torch.optim.Adadelta(model.parameters(), lr=1.0)
LBFGS
2차 미분 기반 최적화 (Hessian 사용)
torch.optim.LBFGS() optimizer = torch.optim.LBFGS(model.parameters(), lr=0.1)
 
 
 


 

더욱 다양한 PyTorch 강의를 보시려면 아래 강의 목록을 읽어보시면 도움이 됩니다.

 

1. PyTorch 소개

https://moonlight314.tistory.com/entry/1-PyTorch-%EC%86%8C%EA%B0%9C

 

1. PyTorch 소개

안녕하세요, MoonLight입니다.​Deep Learning Framework의 양대산맥이라고 하면 Tensorflow와 PyTorch일 것입니다.​예전에는 다양한 Framework이 많이 있었지만, 이제는 거의 이 2개가 대부분을 차지한다고 할

moonlight314.tistory.com


2. PyTorch의 주요 Module 소개

https://moonlight314.tistory.com/entry/2-PyTorch%EC%9D%98-%EC%A3%BC%EC%9A%94-Module-%EC%86%8C%EA%B0%9C

 

2. PyTorch의 주요 Module 소개

안녕하세요, MoonLight입니다.​이번 Post에서는 PyTorch를 구성하는 다양한 Module에 대해서 소개해 드리고자 합니다.​​Model을 설계하고 Train 시키는데 매우 다양한 기능이 필요한 것은 어찌보면 당

moonlight314.tistory.com


3. Tensor

https://moonlight314.tistory.com/entry/3-Tensor

 

3. Tensor

안녕하세요, MoonLight입니다.​이번 Post에서는 Deep Learning에서 Data를 표현하기 위한 자료구조인 Tensor에 대해서 알아보도록 하겠습니다.​​1. Tensor​1.1 Tensor의 개념Tensor는 겉으로 보기에 숫자로

moonlight314.tistory.com


4. Basic Train Loop

https://moonlight314.tistory.com/entry/4-Basic-Train-Loop

 

4. Basic Train Loop

안녕하세요, MoonLight입니다.​이번 글에서는 PyTorch를 이용한 기본적인 Train Loop를 분석하고, 각 구성 요소가 하는 역할을 상세히 설명합니다. ​이를 통해 신경망 모델을 학습하는 과정에서 필요

moonlight314.tistory.com


5. Dataset & DataLoader

https://moonlight314.tistory.com/entry/5-Dataset-DataLoader

 

5. Dataset & DataLoader

안녕하세요, MoonLigt입니다.​이번 Post에서는 Train Data를 효율적으로 가공하고 Model에 공급(?)해 주는 역할을 하는 Dataset & DataLoader Module에 대해서 알아보도록 하겠습니다.​​​​1. Dataset & DataLoader

moonlight314.tistory.com


6. 신경망 구성 - Container Class

https://moonlight314.tistory.com/entry/6-%EC%8B%A0%EA%B2%BD%EB%A7%9D-%EA%B5%AC%EC%84%B1-Container-Class

 

6. 신경망 구성 - Container Class

안녕하세요, MoonLight입니다.​이번 장에서는 신경망을 구성하는 기본 개념과, PyTorch에서 제공하는 다양한 Container Class를 활용하여 신경망을 구축하는 방법에 대해 알아보겠습니다.​​​1. Model

moonlight314.tistory.com


7. Loss Function( 손실 함수 )

https://moonlight314.tistory.com/entry/7-Loss-Function-%EC%86%90%EC%8B%A4-%ED%95%A8%EC%88%98

 

7. Loss Function( 손실 함수 )

안녕하세요, MoonLight입니다.​이번 Post에서는 모델이 학습을 잘하고 있는지 정량적으로 표현할 수 있게 해주는 손실함수(Loss Function)에 대해서 알아보도록 하겠습니다.​​1. Loss Function​1.1. Loss F

moonlight314.tistory.com


8. Optimizers

https://moonlight314.tistory.com/entry/8-Optimizers

 

8. Optimizers

안녕하세요, MoonLight입니다.​이번 장에서는 딥러닝 모델의 Train을 하는데 있어서 중요한 요소중의 하나인, Optimizer에 대해서 알아보도록 하겠습니다.​​​​1. Optimization in Deep Learning1.1. Optimizati

moonlight314.tistory.com


9. Learning Rate Schedulers

https://moonlight314.tistory.com/entry/9-Learning-Rate-Schedulers

 

9. Learning Rate Schedulers

안녕하세요, MoonLight입니다.​이번 Post에서는 Learning Rate를 효율적으로 변경하여 학습이 잘 이루어지도록 도와주는 Learning Rate Scheduler에 대해서 알아보도록 하겠습니다.​​​​​​1. Learning Rate1

moonlight314.tistory.com


10. Early Stopping

https://moonlight314.tistory.com/entry/10-Early-Stopping

 

10. Early Stopping

안녕하세요, MoonLight입니다.​이번 Post에서는 모델의 학습을 적절한 시점에 마무리 할 수 있도록 해주는 Early Stopping이라는 개념과 구현에 대해서 알아보도록 하겠습니다.​​​1. Early Stopping1.1. E

moonlight314.tistory.com

 

 

 

 

728x90
반응형

'PyTorch' 카테고리의 다른 글

10. Early Stopping  (0) 2025.03.03
9. Learning Rate Schedulers  (0) 2025.03.03
7. Loss Function( 손실 함수 )  (0) 2025.03.03
6. 신경망 구성 - Container Class  (0) 2025.03.03
5. Dataset & DataLoader  (0) 2025.03.03