-
[ML] Optimizer란 무엇인가ML&DL 이야기/ML 2023. 8. 24. 23:40
https://tutorials.pytorch.kr/beginner/basics/optimization_tutorial.html
앞선 글에서 처럼 각 반복 단계에서 모델은 출력을 추측하고, 추측과 정답 사이의 오류(손실(loss))를 계산하고, 매개변수에 대한 오류의 도함수(derivative)를 수집한 뒤, 경사하강법을 사용하여 이 파라미터들을 최적화(optimize)합니다(https://www.youtube.com/watch?v=tIeHLnjs5U8)
24.1.23 LG Aimers 이화여자대학교 강제원 교수님의 강의 내용 추가
하이퍼파라미터(Hyperparameter)
하이퍼파라미터는 모델의 최적화 과정에서 우리가 직접 제어할 수 있는, 조절 가능한 매개변수이다. 이를 조절하는 것을 하이퍼파라미터 튜닝이라고 하는데, 이는 동일한 모델이어도 모델 성능이 차이가 나는 이유이기도 하다.
하이퍼파라미터 튜닝을 최적화하는 표준 도구로 RayTune이 존재한다(https://tutorials.pytorch.kr/beginner/hyperparameter_tuning_tutorial.html)
하이퍼 파라미터의 종류는 다양하지만 대표적으로 아래의 3개가 있다.
- 에폭(epoch) 수 - 데이터셋을 반복하는 횟수
- 배치 크기(batch size) - 매개변수가 갱신되기 전 신경망을 통해 전파된 데이터 샘플의 수
- 학습률(learning rate) - 각 배치/에폭에서 모델의 매개변수를 조절하는 비율. 값이 작을수록 학습 속도가 느려지고, 값이 크면 학습 중 예측할 수 없는 동작이 발생할 수 있다
Optimizer(최적화 도구)
최적화는 각 학습단계에서 모델의 loss function에 따른 오차를 줄이기 위해 parameter를 조절하는 과정이다. 이때 해당 최적화를 진행함에 있어서 확률적 경사하강법(SGD; Stochastic Gradient Descent)에 가장 대표적이나 Pytorch에는 다양한 optimzer들을 제공한다.이는 다른 종류의 모델과 데이터에서 SGD보다 더 잘 작동하는 경우가 있다.
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)
Pytroch의 Optimizer를 간단히 살펴보면 다음과 같다.
Gradient Descent(GD)
가장 기본적인 optimizer 알고리즘으로 경사를 따라가면서 Gradient를 편미분을 통해 계산하여 해당 매개변수를 최적화하는 방법(https://secundo.tistory.com/49)
Stocastic Gradient Descent(SGD)
위에서 Gradient Descent의 경우 data size가 큰 경우 모든 data에 대한 오차를 계산한 후해 weight를 수정해야해서 학습속도가 느리다는 단점이 있었다(모든 m에 관해서 계산)
그래서 일부 data만을 이용한 mini batch로 학습을 진행하는 것을 SGD라고 한다(SGD는 1 sample을 mini batch sgd 1이상의 dataset을 이용한다는 점에서 다르지만 현재는 거의 유사한 용어로 묶어서 용어를 사용한다)
기존 Gradient descent알고리즘의 경우, local minimum에 빠질 위험이 존재했다. 이를 해결하기 위해 momentum이 나오게 되었다.
Momentum: 관성
Momentum은 현재 data만이 아닌 이전의 학습 결과를 추가로 반영하여 학습을 더 빠르게 만들고, small&noisy gradient에서 보다 안정적으로 optimal 값을 찾게 만들었다.
수식을 보면, exponentially moiving average를 이용하는 것을 알 수 있다. 즉, 현재의 momentum은 과거의 momentum에 $\rho$만큼 곱한 값에 과거의 gradient term의 누적합을 더한다. 이때 gradient term의 누적합은 과거 데이터일수록 0에 가깝게 반영된다($\rho$가 1보다 작음, 즉, 곱할 수록 0에 가까워짐)
이를 이용하면 gradient가 설령 0인 saddlepoint더라도 momentum을 반영한 step으로 학습하게 된다.
AdaGrad: 각 방향으로 learning rate를 적응적으로 조절
모든 weight에 관해 동일한 learning rate를 적용하는 것이 아닌, 많이 업데이트되는 변수는 적게, 적게 업데이트 된 변수는 더 크게 학습(learning의 비중을 높여줌)하는 것이 바로 Adagrad이다.
r을 보면 gradient의 제곱 term이 더해져서 업데이트 되는 것을 알 수 있다. 즉, gradient값이 클 수록 r은 커지게 된다.
r이 커지면 r은 분수의 term이 있음으로 전체 업데이트 되는 parmeter의 $\Delta\theta$ 값은 작아짐을 알 수 있다.
즉, g가 크다는 것은 이미 그 방향으로 학습이 많이 진행됨을 의미하기에, delta값은 작아짐으로 수렴 속도를 늦추고, g가 작다면 반대로 수렴 속도를 키운다.
하지만 gradient 값이 계속 곱해짐으로 학습이 진행됨에 따라 learning rate가 굉장히 작아진다는 단점이 있다. 이를 수정한 것이 RMSProp이다.
RMSProp: Adagrad의 learning rate 문제 해결
AdaGrad의 문제는 시간이 지나면 지날 수록 학습률이 계속 감소한다는 점이다(G가 계속 커지기에)
이를 해결하기 위해 Rmsprop은 gradient의 곱을 단순히 더하지 않고, 가중치를 통해 조절한다.
위의 식을 보면 가중치($\rho$)를 이용해 현재의 r과 gradient의 가중치 합으로 update한다는 것을 알 수 있다.
Adam: RMSProp + Momentum
Adam은 RMSProp과 Momentum의 장점을 모아 만든 Optimizer이다.
가장 많이 언급되는 optimizer로 기존의 두 방법은 공통적으로 초기 설정된 s값, r 값이 0으로 된다면 Weight가 초반에 0으로 biased된다는 문제점을 가졌다. 즉, 학습 초기에 값이 튀거나 불안정한 모습을 보였는데 이런 부분을 해결하기 위해 3번째 과정인 bias correct과정을 거친다. 이를 통해 통계적으로 더 안정된 값을 가진다.
Adam은 기존 momentum이 local minimum를 넘어 다른 곳으로 갈 수 있기에 조심스럽게 업데이트 속도를 줄이는 것 + 다양한 파라미터드마다 다른 크기의 업데이트를 진행한다는 아이디어를 합한 것이다.
위의 수도 코드에서 m=Momentum에서의 m, v=RMSProp에서의 G, g=W(가중치)의 gradient라고 보면 된다.
식을 보면 기존의 RMSProp에서 g와 G가 변경되었는데 그 식이 다음과 같다.
$$ \hat{m_t} = \frac{m_t}{1-\beta_1^t} $$
$$ \hat{v_t} = \frac{v_t}{1-\beta_2^t} $$
기존 Momentum에서는 m0가 0으로 초기화되면 m1=0.1g1( ∵β1 = 0.9) 으로써 0으로 biased된다.
그러나 Adam에서는 m/(1-β)로 m을 update하기 때문에 m1=g1이 되어 0으로 biased됨을 해결하였다.
이를 통해 loss가 최솟값으로 빠르게 수렴하고, vanishing learning rate 문제, high variance 문제를 해결하였다
beta1 및 beta2: 이동 평균 계산에 사용되는 모멘텀 하이퍼파라미터로, 일반적으로 0.9와 0.999
epsilon: 숫자 안정성을 위한 작은 값으로, 일반적으로 1e-8로 설정됩니다.'ML&DL 이야기 > ML' 카테고리의 다른 글
[ML] Convolution 합성곱의 정의와 FFT 고속푸리에 변환에 관하여 (1) 2023.10.08 [ML] Regression과 Logit(승수)와 Sigmoid함수 그리고 Softmax함수 (0) 2023.10.02 [ML] Entropy와 Likelihood관점에서의 Loss function (0) 2023.10.02 Likelihood(우도, 가능도)와 MLE(Maximum Likelihood Estimaton) (0) 2023.07.26 [ML] L1함수와 L2함수 입장에서의 Loss Funtion (0) 2023.07.25