Optimization

Heath_Jeong·2021년 3월 7일
0

Ustage Week3 - DL Basic

목록 보기
5/10

Introduction

  • 최적화와 관련된 여러 용어들에 대해 명확히 알아야 함, 그러지 않으면 다른 사람들과 얘기할 때 어려움을 겪을 것
  • Gradient Descent : 미분 가능한 함수에서 로컬 미니멈을 찾기 위해 일차 미분 최적화 알고리즘을 사용하는 방법

Important Concepts in Optimization

Generalization

  • 많은 경우에 모델의 일반적인 성능을 높이는게 목적 → 일반적이란?
  • 학습을 시킬 때 마다 Training error 는 내려감, 하지만 Test error 는 오히려 올라갈 때가 있음
  • Generalization gap : Test error 와 Train error 의 차이 => Test 성능을 Training 때 만큼 보장해주는게 목적
  • 그러나 근본적으로는 Training 성능이 좋아야 함
  • Underfitting : 학습이 덜 돼서 트레이닝 예측도 잘 못하는 경우
  • Overfitting : 학습이 너무 많이 돼서 학습데이터에 대해서는 잘 맞추지만 모델의 모양이 이상해져서 실제 예측을 잘 못하게 됨 (그러나 이렇게 구불구불한 모양을 원할 때도 있을 수 있다.)

Cross-validation

  • 얼마나 모델이 독립적인 테스트 데이터셋에 일반화 잘하는지 평가하기 위한 모델 유효성 검증 테크닉
  • Cross-validation : 예를 들어 학습 데이터가 10만개면 (테스트 데이터와 별도) 2만개씩 5 folds 로 나누고, 첫 번째 학습에서는 1~4 folds 를 학습에 쓰고 fold 5 를 validation 하고, 두 번째 학습에서는 1, 2, 3, 5 folds 를 학습에 쓰고 fold 4 를 validation 하는 식으로 진행
    → 학습 데이터를 k 개로 나누고 k-1 개 학습, 1 개 validation
  • 파라미터 : 내가 찾고 싶은 값, 웨이트 등
  • 하이퍼 파라미터 : 미리 정해두는 값, lr, loss-function 등
    → 어떻게 세팅하는게 최적인지 모르니까 크로스 밸리데이션을 통해 최적의 하이퍼 파라미터셋을 찾음
    → 이 하이퍼 파라미터를 적용하고 이제는 모든 데이터로 학습 진행
  • (중요) 테스트 데이터는 학습에서 절대 사용하면 안됨, 크로스 밸리데이션, 밸리데이션 등 어떤 경우에도 사용하면 치팅이라 안됨

Bias and Variance

  • 총을 쏠 때 원점이 아니라도 탄착군이 형성되면 좋음 (variance 가 작은 모델임) → bias 만 옮기면 좋아지니까
    ⇒ Low Variance (분산이 적음, 뭉쳐있음)
  • Variance 가 큰 모델은 비슷한 입력이 들어와도 출력이 달라짐 → overfitting 될 확률이 높음
  • Bias 가 높으면 mean 을 잘 못찾고 있는것

Bias and Variance Tradeoff

  • 노이즈가 낀 학습데이터를 사용하여 로스를 최소화하는 과정은 사실 세 가지 값이 연관되어 있음
    bias2bias^2, variance, and noise

  • 노이즈가 낀 데이터를 사용할 때는 bias 를 줄이면 variance 가 커지고, variance 를 줄이면 bias 가 커짐

Bootstrapping

  • 신발끈을 위로들어 하늘을 날겠다!
  • 랜덤 샘플링을 사용하여 성능을 높이고자 하는 방법
  • 100 개의 학습데이터가 있으면 다 사용하지 않고 랜덤하게 80 개만 사용해서 모델을 만듦. 여러번 수행하여 만들어진 모델들은 같은 하나의 입력에 대해서도 같은 값을 예측할 수도 있지만 다른 값을 낼 수도 있음
    → 얼마나 모델들이 일치를 이루는지 체크
    → 전체적인 모델의 uncertain 을 확인
  • 학습 데이터가 고정돼있을 때, 랜덤 샘플링하여 여러 모델을 만들어 측정하겠다!

Bagging vs. Boosting

  • Bagging (Boostrapping aggregating)
    • 정해진 학습데이터를 모두 사용하여 1 개의 모델을 만드는게 아니라 학습데이터를 부트스트래핑해서 여러 모델 만듦
      → 모델들의 아웃풋을 평균냄
    • 다른 말로 앙상블
    • 하나의 모델보다 성능이 좋음
  • Boosting
    • 분류하기 어려운 학습 데이터가 있을 때 사용하기 용이함
    • 일부 (잘 학습 안되는) 데이터로 모델 따로 만듦 (weak learners), 이렇게 weak learners 를 합쳐서 A strong model 을 만들어냄
    • 합칠 때 sequential 하게 함 → 이전 weak learner 의 실수로부터 다음 weak learner 는 배워나감
      ⇒ strong model 완성

Gradient Descent Methods

  • Stochastic Gradient Descent
    • 싱글 샘플 (전체에서 추출) 로부터 gradient 계산하고 경사하강법 수행
  • Mini-batch Gradient Descent
    • 한 데이터의 여러 서브셋 (전체를 여러개로 나눔) 으로부터 gradient 계산하고 경사하강법 수행
      ⇒ 대부분 딥러닝에서 미니배치 사용
  • Batch Gradient Descent
    • 한 번에 전체 데이터 다써서 gradient 계산하고 경사하강법 수행

Batch-size Matters

  • 미니배치에서 배치사이즈를 어떻게 정하는가
  • 큰 배치사이즈를 사용하면 sharp minimizer 에 도달하고, 작은 배치사이즈를 사용하면 flat minimizer 에 도달 → flat minimizer 가 좋음 → 작은 배치 사이즈가 좋음

  • flat minimizer 는 general 이 잘 됨, 플랫해야 범위가 넓어서 테스팅과 트레이닝의 갭이 작으니까

Gradient Descent Methods (자동미분 계산 방법들)

(Stochastic) Gradient Descent

  • Wt+1  Wt  ηgtW_\mathit{t+1}\ ←\ W_t\ -\ \eta g_t
  • 문제점 : 러닝레이트 η\eta 를 잘 잡는게 어려움

Momentum

  • 더 빨리 학습시켜주기 위한 방법, 관성
  • 한 번 한 방향으로 진행됐으면 다음에도 그 방향으로 진행될 가능성이 높음

  • accumulation 을 사용하여 그 방향으로 계속 흘러가게 해줌, 방향을 어느정도 유지시켜줌

Nesterov Accelerated Gradient, NAG

  • Momentum 과 비슷하지만 Lookahead gradient 를 사용, a 라는 현재 정보가 있으면 그 방향으로 한 번 가보고 그 간곳에서 gradient 를 계산하여 축적함

  • 모멘텀은 로컬 미니멈에 수렴못하고 왔다갔다 하는 경우가 있는데 이를 고친 방법, 한 번 지나간 그 점에서 grad 를 계산하므로 수렴 가능

Adagrad

  • Ada : Adaptive
  • 뉴럴 네트워크의 파라미터가 지금까지 많이 변한 파라미터는 적게 변화시키고, 적게 변한 파라미터는 많이 변화시킴
  • 지금까지 얼마나 파라미터들이 변했는지를 G 에 저장. 역수에 넣기 때문에 위의 설명대로 진행됨
  • 문제 : 시간이 지날수록 G 가 결국 계속 커지기 때문에 업데이트가 너무 적어짐

Adadelta

  • Adagrad 에서 G 가 계속 커지는 현상 막음
  • EMA : 지수 이동 평균 (Exponential Moving Average)
    • 오래된 자료에 대한 가중치가 기하 급수적으로 감소
  • 러닝레이트가 없음 → 바꿀 수 있는 요소가 별로 없음 → 잘 사용 안 함

RMSprop

  • 논문을 통해 제안된건 아니고 제프 힌튼이 강의 중에 제안한 방법, 따라 해보니 잘됐음
  • Adadelta 에 lr (step size) 를 넣음

ADAM

  • 일반적으로 사용됨
  • Adaptive Moment Estimation, 과거 grad 와 제곱 grad 를 함께 지님
  • 모멘텀adaptive learning rate 를 합친 방법

(optimizer 들을 직접 구현할 필요는 없고 제공하는거 한 줄 쓰면 됨)

Regularization

  • 학습을 방해해서 학습데이터에서만 잘 동작하는게 아니라 테스트 데이터에서도 잘 동작하게 해주는 방법들

Early stopping

  • 너무 많은 트레이닝을 하면 오버피팅돼서 test 와 성능 차이가 심해지므로 적절한 지점에서 학습을 멈춤
  • test error 는 사용할 수 없으므로 (치팅) validation error 를 통해 멈추는 지점을 찾음

Parameter Norm Penalty

  • 뉴럴네트워크 파라미터가 너무 커지지 않게 함, 파라미터들을 다 더하고 제곱해서 작게 만들어줌 → 뉴럴 네트워크가 만들어내는 함수의 공간 속에서 함수를 부드럽게 만들어주자 (일반화가 잘될것)

Data Augmentation

  • 딥러닝에서 데이터가 가장 중요함, 데이터가 많으면 학습 잘 됨
  • 데이터가 적을 때는 랜덤포레스트 같은 방법들이 딥러닝보다 잘 됐음, 데이터가 많아지면 딥러닝이 더 잘 됨 → 딥러닝은 많은 데이터에 대해 표현할 수 있음
  • 한 레이블에 대해 노이즈가 있는 데이터들이 있다면 이 데이터들을 알맞게 조정해주는 작업 (찌그러진 사진을 펴주는 등)

Noise Robustness

  • 입력과 웨이트에 노이즈를 중간중간 넣어주면 테스트에서 좋은 결과 얻을 수 있음
  • 왜 잘되는지는 잘 모름

Label Smoothing

  • Data Augmentation 과 비슷함
  • 실제 성능 많이 올라감
  • 학습 데이터 두 개를 뽑아서 섞어줌 (mixup), 이미지에서 descision boundary 를 부드럽게 만들어 줌
  • cutmix : 자르고 두 이미지 합침
  • cutout : 일부를 잘라버림

Dropout

  • forward 과정에서 일부 웨이트를 0 으로 바꿔서 진행
  • 성능 많이 올라감

Batch Normalization

  • 논란이 많은 논문, internal covariate shift 가 논란
  • BN 을 적용하고자 하는 레이어에 Statistics 를 정규화 시키는 방법
    → 각각의 레이어가 1000개의 파라미터가 있다면, 이 파라미터들의 값을 줄여버림 (평균빼고 분산으로 나눔)
    → internal covariate (feature랑 같은말) shift 를 줄임
  • 간단한 분류문제에서 성능 좋음

  • 여러 종류의 비슷한 방법들이 있음


참조

  • BoostCamp AI Tech
profile
데이터로 문제를 해결하는 엔지니어를 꿈꿉니다.

0개의 댓글