또르르's 개발 Story

[12] 최적화 (Optimization) 종류와 용어들 본문

부스트캠프 AI 테크 U stage/이론

[12] 최적화 (Optimization) 종류와 용어들

또르르21 2021. 2. 2. 23:53

최적화(Optimization)는 딥러닝에서 손실함수의 값을 최소화하는 하이퍼 파라미터(Hyper Parameter)의 값을 찾는 과정을 말합니다. 딥러닝에서 최적화 과정은 꼭 필요하며, 적절한 하이퍼 파라미터(Hyper Parameter)를 사용하면 딥러닝 모델의 성능이 훨씬 좋아집니다.

 

여기서 parameter와 hyper parameter의 차이는 아래와 같습니다.

  • Parameter : 최적화(optimization)해서 찾고 싶은 값 (가중치, bias 등)
  • Hyper Parameter : 사용자가 정하는 값 (running rate, loss function 등)

가장 기본적인 함수 최적화 방법은 경사하강법(Gradient Descent)을 사용하는 것입니다.

Gradient Descent는 어떤 loss function (loss가 가장 줄어들었을 때가 optimal한 값)에서 찾고자 하는 parameter을 가지고 loss function을 편미분한 값을 말합니다.

Gradient Descent의 목표는 local minimum을 찾는 것입니다.

 

그렇다면 어떤 최적화 함수가 있는지 알기 전에 Optimization에서 사용되는 용어들을 정리해보겠습니다.

 

 

1️⃣ Optimization 용어

 

1) Generalization(일반화)

 

https://www.edwith.org/bcaitech1

 

일반적으로 학습을 시키게 되면 iteration이 지나가면서 training error을 줄이게 됩니다.

그렇지만 training error가 0이 되었다고 해서 원하는 최적 값에 도달했다고 하는 보장은 없습니다.

왜냐하면 training error는 줄어들지만 어느정도 시간이 지나가고 나면 Test Error (학습에 이용하지 사용하지 않은 데이터)에 대해 성능이 오히려 떨어지게 되기 때문이죠.

 

일반적으로 Generalizationtest error와 training error의 차이를 의미합니다.

"좋은 generalization을 가지고 있다"의 의미는 "테스트 데이터 성능이 학습데이터와 비슷하게 나올 것이다"를 보장해주는 의미입니다.

그렇지만 만약 네트워크 성능이 매우 좋지 않아서(최적화를 잘못 설정해거나 hyper parameter를 잘못 설정한 경우) 학습 데이터의 성능 자체가 안 좋을 때, generalization performance가 좋다고 하지만 test data의 성능이 좋다고 말할 수 없습니다. 왜냐하면 generalization은 학습 데이터와 테스트 데이터 사이에 얼마나 차이가 나는지만 나타낼 뿐이기 때문이죠.

 

 

2) Underfitting vs Overfitting

 

https://docs.aws.amazon.com/machine-learning/latest/dg/model-fit-underfitting-vs-overfitting.html

 

Overfitting은 학습데이터에 대해 잘 동작을 하지만 테스트데이터에 대해서 잘 동작하지 않는 현상을 뜻합니다.

맨 오른쪽 그림처럼 학습데이터는 다 맞추고 있지만 뭔가 네트워크가 이상한 모양을 그리는데 과적합이 일어났기 때문입니다.

(하지만 학습하고자 하는 데이터를 가정하고 있을 뿐이지, 실제로 딥러닝 타켓 모형이 overfitting 사진(많이 변동하는)과 같은 모형일 수도 있습니다.)

 

반대로 Underfitting은 네트워크가 너무 간단하거나 학습을 너무 조금시켜서 네트워크가 학습 데이터를 못 맞추는 현상입니다.

 

 

3) Cross-validation

 

https://blog.quantinsti.com/cross-validation-machine-learning-trading-models/

 

일반적으로 딥러닝은 학습을 시킬 때 training data validation data를 나눠서 학습데이터를 주고 학습을 시키는 방법을 사용합니다. 즉, training data로 학습시킨 모델학습에 사용되지 않은 validation data 기준으로 얼마나 잘 학습이 되었는지 검증하는 방법입니다.

 

그렇다면 training data와 validation data를 얼마만큼으로 나누는 것이 좋을까요?

이 문제를 해결하려고 하는 것이 Cross-validation입니다.

K-fold cross validation이라고도 하는데 학습데이터를 k개로 나눠서 k-1개로 학습을 시키고, k번째 데이터를 validation 시키는 방법입니다.

 

Cross-validation은 어떤 경우에 쓰게 될까요?

neural network를 학습하는 데 있어서 많은 hyper parameter가 존재하게 됩니다.

 

  • Parameter : 최적화(optimization)해서 찾고싶은 값 (가중치, bias 등)
  • Hyper Parameter : 사용자가 정하는 값 (running rate, loss function 등)

하지만 hyper parameter를 정할 때 어떤 것을 사용해야 하는지 모르는 경우가 많습니다.

이럴 때 cross-validation을 사용해서 최적의 hyper parameter set을 찾고 hyper parameter을 고정한 상태에서 데이터를 학습 시키는 방법을 사용합니다.

 

 

4) Bias와 Variance

https://work.caltech.edu/telecourse

 

Variance는 사용자가 어떤 입력을 넣었을 때 출력이 얼마나 일관적으로 나오는지를 나타냅니다.

Low variance는 대부분 일관적으로 나오게 되는데 (간단한 모델),

High variance는 비슷한 입력이 들어와도 출력이 많이 달라지는 것을 의미합니다.(overfitting 될 가능성)

 

Bias는 평균적으로 봤을 때 출력이 많이 분산이 되더라도 true target에 접근하게 되면 "bias가 낮다"라고 하고, 

"bias가 높다"는 target과 멀리 떨어져 있는 것을 뜻합니다.

 

 

5) Bias and Variance Tradeoff

 

 

학습데이터의 노이즈가 껴있다고 가정했을 때, 학습데이터를 minimize 하는 방법은 3가지 파트로 나눌 수 있습니다.

즉, minimize하는 것은 cost 1가지 값이지만 이 값은 3가지로 이루어져 있습니다.

따라서 이 3가지 값 중 1개가 줄어들면 다른 1개는 무조건 커지는 관계를 갖습니다.(tradeoff)

 

위의 식에서 t가 target, ˆf이 neural network의 출력 값, t에는 true target에 노이즈가 껴있다고 가정합니다.

cost를 minimize한다는 것은 bias를 minimize 하는 것과 variance를 minimize, noise를 minimize 하는 것을 뜻합니다.

하지만 variance를 줄이면 bias가 높아지고, bias를 줄이면 variance가 높아지는 관계를 가지고 있습니다.

따라서 noise가 껴있는 학습데이터가 있을 경우, bias와 variance는 tradeoff 관계를 가지기 때문에 둘 모두를 줄이는 것은 힘듭니다.

 

 

6) Bootstrapping

 

 

Bootstrapping은 신발끈을 의미합니다.

학습데이터가 100개가 있으면 그중 80개씩 랜덤으로 뽑아 모델을 만들 수 있습니다.

이 방법을 사용하면 여러개의 모델을 만드는 것이 가능합니다.

이때 여러개의 모델에 하나의 입력을 넣었을 때, 모델들은 각기 다른 값을 예측할 것입니다.

이 모델들이 예측하는 값들의 일치 정도를 보고 전체적인 모델의 uncertaint(불확실성)를 예측하는 방법입니다.

 

https://www.datacamp.com/community/tutorials/adaboost-classifier-python

 

  • Bagging (Bootstrapping aggregating

학습데이터를 통해 하나의 모델만 만드는 것이 아닌 여러 개의 데이터로 만들어 여러 개의 모델을 산출합니다.

여러 모델의 output이 나오면 output들의 평균을 측정합니다.

 

  • Boosting

학습데이터가 100개가 있으면 이 학습데이터를 Sequential 하게 바라봐서 간단한 모델(weak learner)을 만듭니다.

이때, 간단한 모델(weak learner)이 학습데이터의 80개를 예측하고 20개는 예측 못한다면, 예측 못한 20개 데이터만 가지고 잘 동작하는 모델을 만듭니다.

이렇게 여러개의 간단한 모델(weak learner)을 만든 후, 하나로 합쳐 강한 모델 (strong learner)을 만드는 방법입니다.

 

 

 

2️⃣ Practical Gradient Descent Methods (Optimization 종류)

 

가장 기본적인 Optimization는 Gradient descent를 사용하는 것입니다.

Gradient descent를 굳이 분류하자면 3가지로 분류가 가능합니다.

 

  • SGD (Stochastic gradient descent)

    한 번에 한 개(single) gradient descent만 구해서 update 하는 방법

  • Mini batch gradient descent

    batch 사이즈만큼 한번에 gradient descent를 구해서 update 하는 방법

  • Batch gradient descent

    한 번에 모든 데이터를 다 gradient descent 구해서 update하는 방법

 

그렇다면 Batch-size를 얼만큼 해야 될까요?

 

On Large-batch Training for Deep Learning: Generalization Gap and Sharp Minima, 2017

이 논문에는 아래와 같은 문장이 있습니다.

"We...present numerical evidence that supports the view that large batch methods tend to converge to sharp minimizers of the training and testing functions. In contrast, small-batch methods consistently converge to flat minimizers ... this is due to the inherent noise in the gradient estimation."

 

즉, batch size를 large로 활용하게 되면 sharp minimizer에 도달하고, batch size가 small로 활용하게되면 flat minimizer로 도달한다.

 

 

결론부터 말하면 Small batch size (flat minimizer)의 성능이 더 좋다고 말합니다.

위의 그림에서 Training을 했을 때 나오는 function 그래프(Training Function)와 실제 Testing을 했을 때 나오는 function 그래프(Testing Function)를 표현했습니다. 위 그림의 목표는 batch-size에 대한 testing function의 minimum을 찾는 것입니다.

이때, Flat minimum의 특징은 training function에서 멀어져도 testing function에서도 작은 값이 나옵니다.(별로 차이가 없음)

하지만 Sharp minimum에서는 training function에서 조금만 멀어져도 testing function에서 높은 값이 나옵니다.

 

따라서 batch size가 줄어들면 flat minimum에 가까워지는데, 이 말은 testing function에서 minimum 찾기가 수월해진다는 뜻입니다.

 

 

1) Gradient Descent

 

 

일반적으로 W는 가중치 행렬을 의미합니다.

대부분 딥러닝 프레임워크는 그레디언트를 자동으로 계산해줍니다.

그레이언트는 gt, 러닝레이트는 η입니다.

러닝레이트를 적절히 잡는 것이 가장 큰 어려움입니다.

 

 

2) Momentum

 

 

전에 있던 방향(direction)을 현재 수식에 영향을 미치게 만드는 것입니다.

momentum에 가지고 있는 값이 accumulation에 적용합니다.

한번 결정된 방향(direction)을 어느 정도 유지시켜줍니다.

 

 

3) NAG (Nesterov Accelerated Gradient)

 

Gradient를 계산할 때 Lookahead를 계산합니다.

현재 위치에서 앞서 나가서 그레디언트 계산을 하고 그 값을 수식에 적용합니다.

 

Momentum은 local minimum 부근에서 계속 왔다 갔다 하지만,

NAG는 local minimum에 더욱 빠르게 수렴하는 것이 가능합니다. (lookahead 계산을 통해) 

 

https://golden.com/wiki/Nesterov_momentum

 

4) Adagrad

 

 

Adagrad는 뉴럴 네트워크의 parameter가 지금까지 얼마나 변해왔는지, 안 변해왔는지를 볼 수 있습니다.

많이 변하는 parameter에 대해서는 적게 변화시키고, 적게 변한 parameter는 많이 변화시키는 방법입니다.

즉, 여태까지 많이 가보지 않았던 방향보다는 많이 갔던 방향에 대해 그 영향력을 점점 줄여나가는 방식입니다.

따라서 각 parameter가 얼마큼 변했는지에 대한 값을 저장해놓아야 합니다.

 

Gt는 그레디언트가 얼마만큼 변했는지를 제곱해서 더한 값입니다.

Gt가 커진다는 것은 해당 파라미터가 많이 변했다는 뜻이기 때문에, 함수에서 역수로 집어넣어 많이 변한 파라미터는 적게 변화시킵니다.

문제는 Gt가 계속 커지기 때문에 무한대에 수렴하고, 학습이 점점 멈추는 현상이 발생합니다. (역수이기 때문에)

 

5) Adadelta

 

 

Adagrid에서 Gt가 무한정 커지는 것을 막기 위해 Adadelta에서는 현재 타임스텝 t가 주어졌을 때 윈도우 사이즈만큼 gradient 제곱(g2t)의 변화를 보겠다는 것이 목표입니다.

 

문제는 윈도우사이즈 만큼의 G값을 가지고 있어야 하기 때문에 parameter가 많아지면 G도 그만큼 많이 들고 있어야 합니다.

따라서 이것을 막기 위해서는 γ만큼의 G와 1γ 만큼의 그레디언트(gt)를 더해줘서 평균값을 구합니다.

 

가장 큰 특징 중에 하나는 no learning rate입니다.

대신 가중치 벡터의 변화율의 제곱 (Wt)2 을 사용해 learning rate를 자동 조정합니다.

Ht값을 통해서 weight update가 adatively 하게 되기 때문에 learning late가 없습니다.

 

하지만 바꿀 수 있는 Hypter parameter가 없기 때문에 많이 사용되지 않습니다.

 

6) RMSprop

 

 

Adadelta와 비슷한데 가중치 변화율 Ht 대신 Stepsize η가 들어갑니다.

 

7) Adam

 

 

AdamMomentum과 Adaptive을 같이 사용하는 방법입니다.

Gradients squares를 average로 가지고감과 동시에 momentum을 같이 활용합니다.

gradients squares의 크기에 따라서 adaptive 하게 learing rate을 바꾸고, 이전 gradient 정보에 해당하는 momentum 두정보를 잘 합친 것이 Adam이라고 말할 수 있습니다.

이때, 엡실론(ϵ) 파라미터가 중요합니다.

 

 

 

3️⃣ Regularization

 

Regularization 의미는 generalization(일반화)을 잘 되게 하고 싶다는 뜻입니다.

즉, Overfitting이 되지 않도록 학습에 규제를 거는 것을 뜻합니다.

학습을 방해한다는 뜻은 학습 데이터에만 잘 동작하는 것이 아니라 이 방법론이 테스트 데이터에도 잘 적응하도록

에 대한 해결책

 

1) Early Stopping

 

 

Early Stopping은 말 그대로 학습을 중간에 멈추는 것을 뜻합니다.

Validation data를 사용해서 지금까지 학습된 모델의 성능을 평가해보고 (loss을 보고), 그 loss가 어느 시점부터 커지기 시작하면 멈추는 방법입니다.

 

 

2) Parameter Norm Penalty

 

 

Parameter Norm Penalty는 backpropagation을 할 때 가중치 W가 너무 커지지 않게 페널티를 주는 것입니다.

가중치 벡터 W가 너무 커지면, 학습 알고리즘은 학습 오류 loss를 최소화하는 것보다 W를 최소화하는데 우선순위를 두기 때문에 뉴럴 네트워크 파라미터가 너무 커지지 않게 만들어줍니다.

 

가중치 파라미터(값)들을 모두 제곱한 다음에 더하면 Scalar 값이 나오게 되고, 그 숫자를 같이 줄이는 방법입니다.

이왕이면 네트워크를 학습할 때 네트워크 weight 숫자들이 작으면 작을수록 좋습니다.

 

Parameter Norm Penalty 의미는 function state에서 숫자들을 줄임으로써 부드러운 함수로 만드는 것입니다.

부드러운 함수로 만드는 이유는 부드러운 함수일수록 generlization performance가 높을 것이다라는 가정이 있기 때문입니다.

 

 

3) Data Augmentation

 

 

Data가 무한히 많으면 웬만한 뉴럴 네트워크 모델들은 학습이 잘됩니다.

하지만 data가 한정적이라는 문제점이 존재합니다.

 

 

Data augmentation은 현재 가지고 있는 한정적 데이터 변형을 통해서 데이터 수를 늘리는 것을 말합니다.

주의할 점은 변화를 했을 때 데이터 라벨이 변하지 않는 한도 내에서 변화를 하는 것이 중요합니다.

 

 

4) Noise Robustness

 

 

Noise Robustness는 입력 데이터에 노이즈를 집어넣는 것을 말합니다.

입력에만 noise를 집어넣는 것이 아니라 weight에도 noise를 넣는 방법을 사용합니다.

실험적인 결과에 의해 도출된 방법이며 왜 그런지는 아직 잘...

 

 

5) Label smoothing

 

Label smoothing은 training Data 두 개를 뽑아서 일부분을 섞거나 자르는 방법입니다.

위 사직과 같이 개와 고양이의 이미지 일부분을 섞고 라벨로 확률을 표시합니다.

 

  • Cutout : 주어진 이미지의 일정 부분을 빼버리는 것
  • Cutmix : 섞어줄 때 이미지의 특정 영역을 붙이는 것

 

효과는 일반적으로 분류 문제를 풀 때 decision boundary를 찾고 싶을 때, 이 decision boundary를 부드럽게 만들어주는 효과를 가집니다.

 

 

6) Dropout

 

Dropout은 뉴럴 네트워크가 추론할 때 노드의 가중치를 0으로 바꾸는 것을 말합니다.

P=0.5일 때, 뉴럴 네트워크가 추론을 할 때 뉴럴 네트워크의 50%를 0으로 바꿔줍니다.

효과는 각각의 뉴런들이 robust 한 feature를 정할 수 있다는 점입니다.

 

 

7) Batch Normalization

 

Batch Normalization은 적용하고자 하는 layer의 statistc을 정규화시키는 것입니다.

만약 neural network에 천 개의 hidden layer가 있으면 각각의 값들에 대한 statistics를 means error와 unit varience로 만드는 것을 뜻합니다.

쉽게 말하면 원래의 값이 100 정도라고 하면 0.~ 방식으로 만들어버리는 것을 말합니다.

Comments