Optimization 소개

“Language is the source of misunderstandings” - Antoine de Saint-Exupery (1900-1944)

용어에 대한 정리를 하고 넘어가야 이후에 오해가 생기지 않는다. 용어 통일이 가장 중요하기 때문에 용어에 대한 명확한 컨셉을 잡아볼 것임.

Introduction

Gradient Descent

  • First-order iterative optimization algorithm for finding a local minimum of a differentiable function.
  • 찾고자 하는 파라미터에 대해서 손실함수를 미분한 편미분값을 가지고 학습을 하겠다는 것임.
  • Local minimum: 손실함수를 미분했을 때 극소적으로 좋은 로컬 미니멈을 찾는 것을 목적으로 함.

Important Concepts in Optimization

  • Generalization (일반화)

    • 대부분의 경우 일반화 성능을 높이는 것이 목적이다.
    • 일반화 성능을 높이기만 하면 좋은 것인가?
      • 일반적으로 학습을 시키게 되면 Iteration이 지나면서 Training Error를 줄이게 되는데, Training Error가 0이 되었다고 해서 우리가 항상 원하는 최적값에 도달했다는 보장이 없다.
      • 일반적으로 Training error가 주어지지만, 어느정도 시간이 지나고 나면 Test Error가 커짐, 즉 학습에 사용하지 않은 데이터에 대해서는 성능이 오히려 떨어지게 된다.
      • 즉, 일반적으로 일반화는 테스트에러와 트레이닝 에러의 갭을 줄이는 것을 의미한다.
      • 만약 우리 네트워크가 안좋아서 학습데이터에 대한 성능이 안좋으면, 일반화의 퍼포먼스가 좋다고 해서 테스트 데이터의 성능이 좋다고 말할 수 없다.
      • 일반화의 성능은 테스트와 트레이닝 에러의 갭을 말하기 때문이다.
  • Under-fitting vs. over-fitting

    • 학습데이터에 대해서는 잘 동작을 하지만 테스트데이터에 대해서 잘 동작하지 않는 것을 OverFitting이라고 한다.

  • Cross validation

    • 일반적으로 데이터가 분리되어 있음 (Train, Test, Validate)
    • 보통은 학습 데이터로 학습시킨 모델이 학습에 사용되지 않은 밸리데이션 데이터를 기준으로 학습이 잘 되었는지 확인하는 과정이다.
    • 하지만, 트레인과 테스트를 반반으로 했을 때, 트레인을 80 테스트를 20으로 했을 때 등 Split 범위에 따라서 학습의 퍼포먼스가 달라질 수 있다. 이러한 것을 해결하고자 하는 것이 Cross Validation이다. (혹은 K-Fold Validation)
    • 네트워크를 학습할 때 수많은 파라미터가 존재한다. 또한 Hyper Parameter들에 대한 기준이 없다. 따라서 Cross-validation을 통해 최적의 Parameter Sets 을 찾고, 파라미터를 보정한 상태에서 모든 학습데이터를 학습에 사용해야 더 많은 데이터를 사용할 수 있다.
    • Test Data는 어떠한 방법으로든 학습에 사용되어서는 안된다. 즉, 학습에는 Train과 Validate 데이터만을 이용해야 한다.
  • Bias-variance tradeoff

    • 사격을 할 때 항상 같은 곳에만 찍히면 (원점이 아니더라도) 좋은 것이다. 전체 모델을 어느정도 평준화 시키면 최적값에 도달할 가능성이 많기 때문이다. 이것을 Low Variance라고 한다. (출력이 얼마나 일관적으로 나오는 지)

    • 이것에 반해 Variance가 크면 비슷한 입력이 들어와도 출력이 많이 달라지는 것을 의미한다.

    • Bias라는 것은 출력에 따른 평균적으로 True Target에 접근하는 정도를 의미하며, Bias가 크면 Mean에서 많이 벗어나는 것을 의미한다.

    • 학습 데이터에 Noise가 껴있다고 가정했을 때 내가 이 노이즈가 껴있는 타겟 데이터를 미니마이즈하는 것에 대하여 세 파트로 나뉘어진다. 내가 미니마이즈하는 것은 하나의 값(cost)이지만, 그 값은 세 파트로 나뉘어져 있어서 한 파트를 줄이면 다른 파트가 커질 수밖에 없는 Trade-off 관계이다.

      위 식에서 cost를 minimize한다는 것은 bias와 variance, noise를 minimize 한다는 것을 의미한다.

  • Bootstrapping

    • 신발끈을 말하는 것이며, 그 뜻은 신발끈을 들어올려 하늘을 날겠다라는 허황된 뜻임.
    • 딥러닝에서는 학습 데이터가 100개가 있다고 하면, 100개 중 80개를 사용하겠다 등 일부만 뽑아서 사용한다는 것을 의미한다.
    • 이렇게 했을 때 하나의 입력에 대해서 각 모델들의 출력이 달라질 수 있다. 이 때 각 모델들의 예측값들이 얼마나 일치를 이루는지 보고 전체 모델들의 특성을 알고자 하는 것이다.
    • 학습데이터가 고정되어 있을 때 subsampling을 통해 여러 학습데이터를 만들고 그것을 이용하여 여러 모델 혹은 metric을 만들겠다는 것임.
  • Baggin and boosting

    • Bagging(Bootstrapping aggregating)
    • 학습데이터를 여러 개를 만들어서 (Booststrapping) 여러 모델을 만들고 그 모델의 output들을 가지고 평균을 내겠다는 뜻임.
    • 학습데이터가 고정되어 있으면 이것을 모두 이용하여 하나의 결과를 내는 것이 좋을 것 같지만 사실은 그렇지 않다. N개의 모델을 만들고, N개의 모델의 출력값의 평균이나 Voting을 통해 나오는 결과를 사용하는 것이 보통 성능이 더 좋다.
    • Boosting: 학습데이터를 시퀀셜하게 바라봐서 간단한 모델을 만들고, 모델에 학습데이터를 다 넣어본다. 모델에서 80개는 잘 예측을 했지만 20개는 잘 안되었다. 이 때 모델을 하나를 더 만드는데 전에 안되었던 20개에 데이터를 잘 예측하는 모델을 만든다. 이렇게 모델들을 만들고 합친 이후에 하나의 struct learner를 만들고, 그 weight를 찾는 방식을 말한다.

Practical Gradient Descent Methods

Stochastic gradient Descent

  • 하나의 샘플을 이용

Mini-batch Gradient Descent

  • Subset of data 를 사용

Batch Gradient Descent

  • whole data 를 사용

Batch-size Matters

  • 배치사이즈는 굉장히 중요하다.

  • 엄청나게 큰 배치를 사용하게 되면 Sharp Minimizers에 도달한다. 하지만 작은 배치를 사용하면 Flat Minimizers에 도달한다.

  • 배치사이즈를 작게 사용하는 것이 일반적으로 좋다. sharp보단 flat이 더 좋다는 것임.

  • 우리의 목적은 Train function에서 잘 동작하는 것이 아니라 Testing function에 잘 동작하는 것이다. 이 때 Flat Minimum은 Testing 값이 잘 나오지만, Sharp Minimum의 경우 한 번도 트레인에 사용되지 않은 데이터에서는 잘 동작하지 않는다.

Gradient Descent Methods

구현할 필요는 전혀 없음! 딥러닝 프레임워크에서는 한 줄 컷이다.

  • Stochastic Gradient Descent

    • 가장 큰 단점은 Lr, stepsize를 잡는 것이 가장 어렵다는 것이다. 너무 크면 학습이 안되고, 너무 작으면 학습을 오래 시켜도 학습이 안된다.
    • $W_{t + 1} \leftarrow W_t - \eta g_t$
    • $\eta$ : Learning rate or step size
    • $g_t$: Gradient
  • Momentum (관성)

    • SGD의 단점을 극복하기 위해 제시된 Optimization 테크닉이다.

    • 한 번 Gradient가 한 방향으로 흐른 이후 다음 Gradient 가 조금 다른 방향으로 흘렀어도, 이전 방향으로 흘렀던 정보를 활용해보자.

  • $a_{t+1}$ : Accumulation

  • $\beta$ : Momentum

  • 모멘텀과 현재 기울기를 합친 Accumulation으로 Update를 한다.

  • 장점은 한 번 흘러간 기울기를 포함하여 업데이트를 하기 때문에 어느정도 학습이 잘 이루어지게 된다.

  • Nesterov Accelerated Gradient

    • 이것도 역시 a라고 하는 Accumulate 가 업데이트를 하는 것인데, 기울기를 계산할 때 Lookahead gradient를 계산하게 된다.

    • 모멘텀은 이전 기울기 정보로 계산하는데, 이 친구는 a라고 하는 현재 정보가 있다면 그 방향으로 한 번 가보고 기울기를 계산한 다음에 그 기울기를 가지고 Accumulation을 계산한다.

    • 일반적으로 모멘텀을 관성으로 해석한다면, Local Minimum으로 Conversion 하지 못하는 현상이 생길 수 있는데 이에 반해 NAG는 Local Minimum을 지나서 기울기를 계산하는 것이 아니라 한 번 지나간 그 점에서 기울기를 계산하는 것이기 때문에 Local Minimum이 한 쪽 아래로 흘러갈 수 있다는 장점이 있다. 즉, 극값에 조금 더 빠르게 접근할 수 있다는 장점이 있다.

  • Adagrad

    • 신경망의 파라미터가 변했는지 안변했는지를 보게 되고 많이 변한 파라미터들은 적게 변화시키고 조금 변한 파라미터는 많이 변화시키기 위해 고안된 Adaptive Learning 이다.
    • 즉 파라미터들이 얼마나 변했는지를 기록한 정보가 필요하다.
    • $W_{t+1}=W_{t}-\frac{\eta}{\sqrt{G_{t}}+\epsilon} g_{t}$​​​
    • $G_t$: sum of gradient squares
    • 가장 큰 문제는 $G_t$ 라는 것이 계속해서 커지기 때문에 결국에는 무한대로 가게 되면 분모가 무한대니까 W의 업데이트가 안되게 된다. 즉 뒤로 갈 수록 학습이 점점 되지 않는 문제가 생긴다. 이것을 해결하기 위해 고안된 방법이 Adam 등이다.
  • Adadeltha

    • Adagrad가 가지는 $G_t$가 커지는 것을 막기 위해 고안된 방법 중 하나이다.

    • 타임스텝 t가 주어졌을 때 $G_t$ 를 윈도우 사이즈 만큼의 파라미터, 시간에 따른 기울기 변화를 보겠다는 것임.

    • 이것 역시 문제가 있음. 윈도우 사이즈를 100으로 잡았을 때 100회 정보에 대한 값을 가지고 있어야 한다. 즉 GPU가 터질 수도 있다. 이것을 $H_t$ 를통해 해결할 수 있다.

    • Adadelta의 가장 큰 특징은 Learning rate가 없다는 것인데, 그 뜻은 우리가 무언가를 시도해볼 것이 적다는 뜻이다. 따라서 잘 쓰이지 않는다.

  • RMSprop

    • 논문을 통해서 제안된 방법이 아니다.

    • 아이디어는 간단함.

    • Adagrad 처럼 Gradient Squares를 그냥 더하는 것이 아니라 분모에 넣고, $\eta$ 라는 stepsize가 들어간다.

  • Adam

    • 일반적으로 가장 무난하게 사용하는 것이 바로 Adam이다.

    • $m_t$ : momentum

    • $v_t$ : EMA of gradient squares

    • Gradient 크기에 따라서 Adaptive하게 Learning rate를 바꾸는 것과 이전 Gradient 정보에 해당하는 모멘텀을 잘 합친 방법이다.

Regularization

학습에 잘 되는 것을 방해하기 위해 규제하는 것임. 학습을 방해함으로써 얻기 위한 목적을 잘 생각해야 한다. 즉, 학습데이터가 잘 되기 위해 사용하는 것이 아니라 방해함으로써 테스트데이터에도 잘 동작하도록 만드는 것이다.

  • Early stopping

    • 학습을 일찍 멈추는 것. 하지만 학습을 멈출 때 테스트 데이터를 사용하면 Cheating이기 때문에 Validation Data를 사용한다.
    • Loss 가 어느 순간부터 커질 수 있는 데 그 시점에 빠르게 학습을 멈추자는 것임.
  • Parameter norm penalty

    • 신경망 파라미터가 너무 커지지 않게 하는 것임. 각 파라미터들을 제곱한 다음에 더하면 어떤 숫자가 나올텐데, 그 숫자를 같이 줄이는 것이다.
    • 이왕이면 네트워크 웨이트의 숫자가 작을 수록 좋다. ‘크기’에 관점에서.
    • 물리적이거나 해석적인 관점에서의 의미는 뉴럴넷이 만드는 함수의 공간속에서 함수를 최대한 부드러운 함수로 보자는 것이다. 부드러운 함수일수록 일반화 성능이 높다는 것일 것이다라는 가정이 전제됨.
  • Data augmentation

    • 딥러닝에서 가장 중요한 것 중 하나가 데이터이다.

    • 데이터가 적으면 딥러닝보다 전통적인 ML(XG Boost, Random Forest 등)이 훨씬 성능이 높다.

    • 하지만 데이터가 커질수록 머신러닝 방법론들보다 딥러닝 방법론이 훨씬 성능이 좋다.

    • 하지만 데이터는 한정적이기 때문에 Augmentation을 통해 어떠한 방법으로든 데이터를 늘리는 것이다.

  • Noise robustness

    • 왜 잘되는지는 아직 의문이 있다.
    • Data Augmentation이랑 비슷할 수도 있지만, 데이터에 노이즈를 집어넣는 방식이다. 굳이 차이를 두자면 입력에만 노이즈를 두는 것이 아니라 weight에도 noise를 주는 것이다.
  • Label smoothing

    • 데이터 두 개를 뽑아서 Train 단계의 데이터 두 개를 섞어주는 것이다.
    • 일반적으로 분류 문제에서 Descision Boundary를 찾는 것이 목적인데, Descision Boundary 를 조금 더 부드럽게 만들어주는 효과가 있다.
    • 라벨을 섞고 이미지(학습데이터)도 섞는 방법임.
    • 왜 잘되는지가 설명되기 보다는 그냥 하면 잘 된다.
  • Dropout

    • 신경망의 weight를 0으로 바꾸는 것이다.
    • 각각의 뉴런들이 더욱 Robust한 Feature를 얻을 수 있다고 해석을 한다.
  • Batch normalization

    • 논란이 많은 논문이다.
    • 적용하려는 레이어에 Statistics를 정규화 시키는 것이다.
    • 천개의 파라미터가 있는 히든레이어라면, 천개의 파라미터의 각각의 값들에 대한 statistics에 대해 평균을 빼주고 표준편차를 나눠주는 방식이다.
    • 활용하면 성능이 많이 올라간다.
Author

Yohan Lee

Posted on

2021-08-10

Updated on

2021-08-22

Licensed under

댓글