Adore__

[BootCourse DL] 3. Optimization_Gradient Descent Methods 본문

AI Learner/DL

[BootCourse DL] 3. Optimization_Gradient Descent Methods

3_GreenHeart 2023. 4. 6. 14:07
728x90

Source : Boostcourse '딥러닝 기초 다지기'

 

 

Important Concepts in Optimization


▪️ Generalization

보통 training data를 학습시킬수록 training error는 줄어든다. 하지만 특정 시기부터는, test error는 증가한다.

즉, 새로운 데이터에 대한 성능이 떨어지는 것이다. 여기서 generalization은 이 test error와 training error 사이의 gap을 말한다.

주의할 점은, 무조건 generalization이 좋다고 해서 test 성능이 좋다는 것은 아니다. 만약 학습 데이터에 대한 성능 자체가 안좋다면 test error도 크다는 뜻이기때문이다.

 

▪️ Under-fitting vs. over-fitting

네트워크가 너무 간단하거나 학습이 부족해서 training data에도 성능이 안좋은 것을 underfitted,

너무 지나치게 training data에 학습이 되어, 새로운 test data에는 성능이 좋지 않은 것을 overfitted라고 한다.

https://analystprep.com/study-notes/cfa-level-2/quantitative-method/overfitting-methods-addressing/

 

▪️ Cross-validation

위 문제점을 해결하기 위한 방법 중 하나이다. 

학습데이터로 학습시킨 모델이, 새로운 데이터를 기준으로 얼마나 잘되는지 보기 위해 validation data를 만든다.

그러면 validation 데이터를 어느정도 나눌까? 이 비율을 설정해주어야 한다. 이를 나누는 방법으로 k-fold가 있다.

학습 데이터를 k개로 쪼갠 뒤에, 하나씩 돌아가면서 validation data가 되는 것이다.

즉, k-1개로 학습시키고, 나머지 1개로 validation을 해보는 것을 cross validation이라고 한다.

 

이 방법은 hiper parameter(내가 정하는 값, learning rate, loss function 등..) 를 찾을 때, cross validation으로 최적의 hiper parameter를 찾는다. 이때 test data는 어떤 식으로든 사용되면 안된다. 답지를 미리 알려주고 시험을 보는 것과 똑같다.

scikit-learn

▪️ Bias-variance tradeoff

low variance라는 것은 입력을 임의로 넣었을 때, 출력이 얼마나 일관적으로 나오냐는 것이다.

low bias라는 것은, 비슷한 입력에 대해서 평균적으로 true target에 접근하게 되는 것이다. 반면 bias가 높다는 것은 내가 원하는 값에 멀어진다는 뜻이다.

Source:  http://scott.fortmann-roe.com/docs/BiasVariance.html

 

학습 데이터에 noise가 껴있다고 했을 때, 이 target data를 minimize하는 것은 3가지로 나뉠 수 있다.

다시 말하면, 우리는 1가지 값을 최소화 한다고 하지만, 이 1개가 3개의 구성 요소로 이루어져 있어서 그 중 하나가 줄어들면 나머지 2개는 증가한다는 것이다. 수식으로 알아보면 다음과 같다.

https://www.cs.cornell.edu/courses/cs4780/2018fa/lectures/lecturenote12.html

만약 우리의 모델이 bias를 줄이면 variace가 높아질 가능성이 크고, variance를 줄이면 bias가 높아질 가능성이 있다.

따라서 bias와 variance 모두를 줄일 수 있는 모델을 만드는 것은 어렵다.

 

 

▪️ Bootstrapping

학습 데이터가 100개가 있으면, 70개씩 뽑아서 여러개의 모델을 만들 수 있다.

이때 하나의 입력에 대해서 각각의 모델이 같은 값을 예측할 수도, 다른 값을 예측할 수 있다. 이 예측들이 얼마나 일치하는지 볼 때 이 bootstrapping을 사용한다.

즉, 학습데이터가 고정되어 있을 때, 그 안에서 sub sampling으로 학습 데이터를 여러개를 만든다 -> 이를 이용하여 여러 모델을 만든다 -> 이들의 consensus를 확인한다.

 

 

▪️ Bagging vs. Boosting

1) bagging

: bootstrapping 기법으로 n개의 모델을 만든 후에, 이 예측값들의 평균을 사용한다.

2) boosting

: bagging처럼 독립적으로 여러 모델을 만드는 것이 아니라, 순차적으로 모델을 만든다.

예를 들어 학습 데이터가 100개가 있으면, 간단한 모델 하나를 만들고 학습 데이터에 대해 성능을 확인한다.

만약 70개의 학습 데이터에 대해서는 성능이 좋지만, 30개에 대해서는 성능이 좋지 않을 때, 다음에는 30개에 대해서만 잘 동작하는 모델을 만든다. 이렇게 weak learner들을 sequencial 하게 합쳐서 하나의 strong learner를 만드는 방법이다.

 

source: edureka!

 

 

 

 

Gradient Descent Methods


▪️ 3가지로 분류할 수 있다.

 

1) Stochastic

전체 데이터 중, 한번에 1개의 sample을 통해서만 gradient를 계산해서 update하고, 이를 반복한다.

2) Mini-batch (가장 많이 사용)

일반적으로 많이 사용되는 128 or 256개의 sample을 뽑아서 gradient를 계산하고 update한다.

3) Batch

한번에 전체 데이터를 다 써서 이 모델 gradient의 평균을 갖고 update를 한다

 

▪️ Batch-size Matters

batch 크기를 설정하는 것이 사소한 것인 것처럼 보일 수 있지만 매우 중요하다.

이와 관련된 논문을 참고하면, 큰 batch를 사용할 경우, sharp minimizer에 도달하게 된다. 반면 작은 batch를 사용할 경우 flat minimizer에 도달한다. 논문에서는 sharp보다는 flat에 도달하는 게 좋다고 말한다.

그래프를 참고하면, flat minimizer 에 도달할 경우에는 training function에서 조금 멀어져도 testing function과 크게 차이나지 않아, generalization이 높다.

반면 sharp minimizer 경우에는 test와 train 성능의 gap이 크기때문에 generalization 성능이 좋지 않다.

따라서 작은 batch size를 사용하는 것이 더 일반화 성능에 있어서는 더 낫다.

 

 

▪️ Gradient Descent Methods

loss function을 정의하고 나면 컴퓨터가 자동으로 미분을 계산해주지만, 어떤 optimizer를 사용할지는 골라야한다. 따라서 각각의 특징을 파악하는 것이 도움이 된다.

 

1) Stochastic Gradient descent

NN의 weight를 W라고 할 때, gradient (g)를 계산하고 learning rate만큼 곱해서 W에서 빼주면 update가 된다.

🔻 문제점 : learning rate (step size)를 잡는 것이 어렵다. 이를 적절히 잡아주는 것이 중요하다

2) Momentum

더 빠른 학습을 위해 제안된 방법 중 하나이다. momentum의 뜻은 '관성', 한 방향으로 이동하면 계속 그 방향에 머무르려는 성질이다.

이러한 성질을 적용하면 다음과 같다. 이전 batch에서 오른쪽 방향으로 gradient가 흘렀다고 할 때, 이번 batch에서 gradient가 다른 방향으로 흘러도, 이전 batch의 정보를 활용하여 계속 오른쪽으로 이어가자는 것이다.

 

아래 식을 보면, hiper parameter (beta)로 momentum을 잡는다.

g라는 gradient가 현재(t) 들어오면 다음번 (t+1)때 이 정보를 버리고, momentum과 gradient를 합친 accumulation gradient로 업데이트 한다.

🔻 장점 : gradient의 변동이 커도, 한번 흘러간 방향을 유지해주기때문에 어느정도 좋은 성능을 보일 수 있다.

https://miro.medium.com/v2/resize:fit:1000/1*X9SaxFM6_sBOAMY9TaGsKw.png

 

3) NAG (Nesterov Accelerated Gradient)

momentum과 비슷하지만, gradient를 계산할 때 Lookahead gradient 방법을 사용한다.

momentum은 현재 주어져있는 parameter에서 gradient를 계산하고 이를 이용해서 momentum을 accumulation하지만,

NAG는 현재 정보가 아닌 한번 이동한 위치의 정보를 활용한다. a라는 정보가 있으면 그 방향으로 한번 가보고, 그 곳에서 계산한 gradient를 이용하여 accumulation하는 것이다.

https://miro.medium.com/v2/resize:fit:1400/1*6MEi74EMyPERHlAX-x2Slw.png

🔻장점: 일반 momentum 방법에 비해 local minimum에 더 빨리 converge할 수 있다.

 

 

4) Adagrad

NN의 parameter가 지금까지 얼만큼 변해왔는지를 참고한다.

많이 변해온 parameter에 대해서는 적게 변화시키고, 적게 변한 parameter에 대해서는 많이 변화시킨다.

지금까지 각 parameter가 얼만큼 변해왔는지 저장하기 위해 G를 사용한다.

G는 각 parameter의 gradient 제곱의 합으로 계속해서 증가하겠지만, 역수를 취했기때문에 반비례하여 변화하게 된다.

🔻문제 :  G는 값이 계속 커지기때문에 분모가 무한대가 되면 학습이 점점 멈추는 현상이 나타난다.

 

5) Adadelta

Gt가 계속해서 커지는 현상을 막기 위해 제시되었다.

현재 t가 주어졌을 때, 적정 window size만큼의 parameter (시간)에 대한 gradient 제곱의 변화를 본다.

 

문제점 : window size만큼의 g 정보를 갖고 있어야 한다. 문제는, gradient는 parameter 하나의 정보만 들고 있기때문에, gpt3 같은 1000억개의 parameter를 가진 모델을 쓰게 되면, Gt 자체도 1000억개의 parameter인 것이다. GPU가 터져버릴 것이다..

 

이를 막기 위해 Exponential moving average (EMA)를 이용해서 Gt를 update하는 방법이 Adadelta이다. (추가로, parameter H가 들어간다.)

 

🔻 한계점: learning rate와 유사한 용도로 사용되는 것이 Ht이지만, 실질적으로 learning rate가 없기때문에, 우리가 조작할 수 있는 부분이 많이 없다. 따라서 많이 활용되지는 않는다.

 

 

 

6) RMSprop

Geoff Hinton이 DL강의할 때 제안했던 방법이다. 단순히 Adadelta에서 stepsize를 추가한 방법이다.

 

7) Adam (가장 많이 사용)

adaptive 방법 (이전에 변화해온 경향을 반영하는 것)과, momentum (이전 gradient가 진행된 방향을 이어나가는 것)을 합친 방법이다.

중요한 parameter : momentum / EMA of gradient squares / 입실론 / stepsize

'AI Learner > DL' 카테고리의 다른 글

[BoostCourse DL] 4. CNN  (0) 2023.04.06
[BoostCourse DL] 3.2 Optimization_Regularization  (0) 2023.04.06
[BoostCourse DL] 2. Neural Network, MLP  (0) 2023.04.03
[BoostCourse DL] 1. Start  (0) 2023.04.03
[Keras] VGG16 implementation  (0) 2023.04.03
Comments