[08.10] Day7 - '🏃Optimization'
Optimization(최적화)
[수업 내용]
강사 : 최성준 조교수님
우선 여러가지 용어들에 대해서 명확한 이해를 한다.
Gradient Descent
: 선형 함수에 대한 Gradient를 구해서 가중치 및 Bias를 빼주는 과정이 Gradient Descent이다. 내가 찾고자 하는 파라미터로 Loss Function을 미분한 편미분 값을 이용해서 빼주는 과정이다.
→ Local Minimum으로 갈 수 밖에 없다.(국소적)
Generalization(일반화)
: 많은 경우 일반화 성능을 높이는 것이 목적.
일반화는 ? Iteration이 늘어나면 Train Error가 줄어들지만 Test Error(우리가 예측할 Test)에 대해서는 성능이 떨어지게 된다. 그래서 두개의 차이가 적을 수록 좋다.
Generalization이 성능이 좋다 → 학습데이터에 대해 훈련한것과 테스트데이터에 대해 예측한 것이 차이가 거의 없다.
- 학습을 너무 못시켜서 네트워크가 아직 훈련이 덜 된 것 → Underfitting
- 너무 학습을 시킨 나머지 학습 데이터에 대해서는 예측이 높지만 테스트는 엉망 → Overfitting
Cross-Validation
: Train Data와 Validation Data는 얼마의 비율로 나눠야 할까? → 이런 것을 해결하기 위한 것이 Cross-Validation이라고 한다.(k-fold validation이 있다.) 파티션들 k 개로 나눠 k-1개로 학습을 시키고 1개로 검증을 한다.
Cross Validation을 통해서 최적의 하이퍼 파라미터를 구하고 이 셋을 통해서 모든 데이터 셋을 통해 학습을 진행해야 많은 데이터를 통해 학습 시킬 수 있다.
Bias and Variance
과녁에 같은 지점에 찍힌다? → Low Variance
과녁에 흩날리게 찍힌다? → High Variance(Overfitting 가능성이 높다.)
Variance : 내가 입력을 넣었을때, 출력이 얼마나 일관적인지.
Bias : 평균적으로 봤을때, 비슷한 입력에 대해 전체적으로 True 타겟에 근처에 있다는 것.
Bias and Variance Tradeoff
내 학습데이터에 노이즈가 껴있을 때, 노이즈가 껴있는 Target data를 minimize하는 것은 3 파트로 나뉘어질 수 있다.
위의 수식을 보면 Cost는 일정하기 때문에, Bias를 줄이면 Variance가 커지고, Variance를 줄이면 Bias가 커지는 것을 알 수 있다. 그래서 근본적으로 학습 데이터에 노이즈가 껴있을떄, 둘다 줄이는 것은 거의 힘들다는게 이론적으로 설명된다.
Bootstrapping
: 학습데이터 전체를 사용하는 것이 아니라, 일부만 뽑아서 모델을 만들고 , 만들고 .. 여러개 모델을 만들어 하나의 예측에 대해서 얼마나 일치하는 가에 대해서 전체를 예측한다는 이론이다.
Bagging vs Boosting
Bagging(Bootstrapping aggregating) - 모델을 여러개를 만들고 (이때, Boostrapping을 통해 Random Sampling 진행), 그 Output에 대해서 평균값을 구한다.
Boosting - 시퀀셜하게 데이터를 바라봐서 하나의 모델을 만들고 예측을 진행. 이때, 다음 모델은 예측이 잘 안된 부분에 Focus를 맞춰서 모델을 만든다.
Gradient Descent Methods
- Stochastic Gradient Descent(SGD)
- : 하나의 샘플에 대해 Gradient를 구해서 Update를 구한다.
- Mini-Batch Gradient Descent
- : Subset을 구해서 Gradient를 구하고 Update를 구한다.
- Batch Gradient Descent
- : 전체에서 Gradient를 구하고 Update를 구한다.
Batch-Size Matters
: 큰 배치를 사용하게 되면 Sharp Minimizer를 도달한다. 반대로 작은 배치를 사용하면 Flat Minimizer로 수렴한다.
그래프를 보면 Flat Minimum 같은 경우 Generalization이 높다고 할 수 있다.
Methods
→ 기본적인 Gradient-Descent(Stochastic)
→ Momentum
: 한번 Gradient가 흐르는 방향이 다음 Gradient도 비슷한 방향으로 가지 않을까
→ NAG(Nesterov Accelerated Gradient)
: Gradient를 계산할때 Lookahead Gradient를 계산한다. 현재 A라는 정보가 있다면 그 곳에 가보고 간곳에서 구한 Gradient를 가지고 Accumulation을 구한다.
→ Adagrad
: 뉴럴 네트워크에 파라미터의 변화를 보고 따진다.(변화들을 저장해야하고 이것이 G이다.)
이때, G가 무한대로 커질 가능성이 있다. 이러면 학습이 되지 않고 점점 멈춰지게 되는 현상이 생긴다.
→ AdaDelta
: G가 계속 커지는 현상을 막겠다. t가 주어졌을때, 어느정도 window size만큼 변화를 보겠다.
→ RMSprop
: Geoff Hinton이 강의에서 갑자기 생각한 내용을 통해서 나온 이론.
→ Adam
: past Gradient 와 Squared Gradient 모두 가져간다. Momentum과 Adaptive Learning Rate 접근을 잘 섞은 것.
Regularization
: Generalization이 잘 되고 싶다. 여러 도구들을 살펴보자!
- Early Stopping
- : 학습을 멈춘다. Validation Data를 통해서 일정 차이가 넘어가면 멈추도록 진행한다.
- Parameter Norm Penalty(weight decay)
- : Neural Network 파라미터들이 너무 안 커지게 한다. Neural Network가 만들어내는 함수 공간 속에서 최대한 부드러운 함수로 본다.
- Data Augmentation
- : 데이터가 많으면 보통 성능이 높다. 그래서 내가 주어진 데이터에서 지지고 볶아서 늘리고 싶다. 데이터를 약간 변환을 주는 과정(Label이 변하지 않는 가정하게 변화를 준다.)
- Noise Robustness
: Input이나 Weight에 Random Noise를 추가하면 성능이 높아진다는 실험적 결과 - Label Smoothing
- : Cut Mix!
- Dropout
- : 각각의 Forward Path 마다 랜덤으로 뉴런을 Zero로 만든다. → Robustness Feature를 만들 수 있다. 그래서 성능이 좋지 않을까
- Batch Nomalization
- : 내가 적용하고자 하는 Layer에 Statistic을 정규화를 진행하는 것이다. Empirical mean 과 variance를 독립적으로 각각의 차원에 대해 계산하고 Nomarlize 진행. → Layer를 깊게 쌓으면 보통 성능이 높아진다고 한다.
[피어세션 정리]
ADAMP, SGDP 에 대해서 한번 뜯어보면서 이야기 해보았다.
→ ADAMP, SGDP 같은 경우 서로의 성질은 그대로 유지한다. 다만 Momentum을 부여할 때 excessive 되지 않도록 정사영을 통해서 진행 된다고 했다. (이는 가중치 Norm의 성장을 모멘텀이 유도한다는 문제 때문에 진행된다.)
일반적으로 적용되는 다양한 Optimizer 보다 빠르게, 그리고 더 정확하게 학습하는 것을 실험적으로 증명하였다. 함수를 보니 특정 값(람다)보다 작은 값에서 정사영 모멘텀(?)을 곱해서 적용한다. 아마 극소점으로 가까워질때 쯤 모멘텀을 제어하는 모양인가 보다.
AdamP: Slowing Down the Slowdown for Momentum Optimizers on Scale-invariant Weights
[수업 회고]
- Regularize 에 대해서 좀 더 알아보았다. 특히 Batch Size 같은 것들도 중요한 파라미터로, 몇개의 sample 집합을 묶느냐에 따라 연산량과 성능이 달라진다는 것을 알았다.
- 다양한 Optimize 함수들에 대해서 간략하지만 중요한 부분들 위주로 짚어주셨다. Adam 이 가장 보편적으로 성능이 좋다고 알려주셨다.