Optimization
Generalization
: 일반화 성능, 학습 데이터와 테스트 데이터에서의 성능차이
Under-fitting
vsover-fitting
: 학습데이터에서는 잘 동작하지만 테스트 데이터에서 성능이 떨어지는 경우(over), 학습 데이터 에서 조차 충분히 학습이 안된 경우(under)Crossvalidatoin
: 학습 데이터를 나눠서 일부를 학습에 사용하지 않고 교차로 모델 성능 검증에 활용(최적의 하이퍼파라미터 조합을 위해 주로 사용)Bias-variance tradeoff
: 분산(일관성)과 편향(치우침)의 trade-off 관계
Bootstrapping
: 학습 데이터가 고정되어 있을때 서브샘플링을 통해 학습데이터를 여러개 만들어 내는 기법Bagging
- 여러개의 모델을 bootstrapping으로 학습 시킴
- 일반적으로 10만개의 데이터를 한 모델로 학습시키는 것 보다 2만개씩 5개의 모델로 학습시켜 그 결과밧을 평균내는 것이 성능이 더 좋다.
Boosting
- 학습 데이터가 10만개가 있으면 8만개의 데이터는 잘 예측하고 2만개의 데이터를 잘예측못한다 -> 다음 모델은 2만개의 데이터에 집중 -> ...-> 이렇게 모델을 만들어서 모델을 합침.
Gradient Descent Methods (경사하강법)
Stochastic gradient descent
- 배치 사이즈가 1
- 10만개의 데이터가 있으면 한번에 한개의 결과 값을 구해서 업데이트하고 반복...
- 엄청 많이 반복
Mini-batch gradient descent
- 10만개 데이터중 240개를 뜯어낸다음 그 240개에 대한 gradien를 구해서 업데이트 .. 반복 ..
Batch gradient descent
- 10만개의 gradient 를 한번에 구하고 모델에 업데이트하고 ... 반복 -> GPU 터짐...
Batch-size Matters
일반적으로 Batch-size를 작게하면 성능이 좋아지는데, 그 이유는 Batch-sie를 크게하면 sharp minimizer에 도달하고, Batch-size를 작게하면 flat minimizer에 도달 한다는 것을 발견함.
- Sharp보다는 flat minimizer가 좋다.
- training function에서 멀어져도 testing에서 성능이 크게 변하지 않기 때문.
Gradient Descent Methods
Gradient Descent
문제점 : 적절한 lerning rate를 잡기가 어렵다.
Momentum
: 한번 흘러간 gradient 방향을 유지시켜 준다. 그래서 gradient가 많이 왔다갔다해도 어느정도 학습이 잘된다.Nesterov accelerated gradient
: momentum과 비슷한 컨셉 -> gradient를 계산할 때 lookahead gradient를 계산Momentum
: 현재 주어진 파라미터에서 gradient를 계산해서,그 gradient로 accumulationNesterov acclerated gradient
: a라고 불리우는 현재의 정보가 있으면 **그 방향으로 한번 가보고, 그 지점에서 gradient를 계산한 값을 가지고 accumulation
Adagrad
: 이때까지 파라미터가 많이 변한 파라미터는 적게 변화 시키고, 적게 변화된 파라미터는 많이 변화시킴
→ $G_t$: 얼마나 변했는지
를 나타냄, 변화량 제곱함. 이를 역수를 취해줌으로써 많이 변한 경우 적게 weight update(적게 변한 경우는 많이)
=> 문제점 : $G_t$가 무한대로 가면 분모가 무한대 = 0 , W 가 업데이트 되지 않음. 즉 후반으로 갈수록 학습이 진행되지 않음.
Adadelta
: Adagrad는 처음부터 지금까지 모든 파라미터의 변화를 보지만, Adadelta는 적절한 window size 만큼 파라미터의 변화를 본다.
=> EMA : exponential moving average 활용문제점 : learning rate가 없다. 그래서 할 수 있는게 많이 없어서 잘 안씀
RMSprop
: Adaelta에 stepsize 추가.Adam
: 일반적으로 가장 무난하게 사용한다. RMSprop에서 Momentum을 같이 사용한 것이다.
식을 보면 $m_t$와 $v_t$만으로 이루어져 있을 것 같았던 식에 난데 없는 베타들이 붙고, m과 t에도 hat(expectation)이 붙었다.
이것은 $m_t$와 $v_t$가 0으로 초기화되어있어 초반에 이들을 unbiased하게 만들어주기 위한 보정을 해주는 작엄이라고 한다.
Regularization
학습이 잘 된 모델에 대하여 generalization을 잘 하는 것도 학습에서 중요한 요소이다.
학습 과정에서 여러 규제(regularization)을 통해 generalization을 할 수도 있는데 그 방법들에 알아보자.
- Early Stopping
- 맨 처음 그림과 비슷한데, 여기서 KFold의 validation error가 test error 대신 들어 갔다.
- KFold등의 방법으로 validation을 수행하면서 loss가 어느 순간 커지기 시작하면 중단하는 방법을 쓸 수 있다.
- 그래서 이 방법을 쓰려면 당연히 validation data를 따로 둬야 한다.
- Parameter Norm Penalty
- parameter 중 하나가 너무 커지지 않게 해주는 것이다. 즉 함수를 부드럽게 만들어 주는 것이다.
- 부드러운 함수일수록 generalization performance가 높을 것이라는 가정에서 비롯된 방법이다.
- Data Augmentation
- 데이터셋을 늘리는 기법이다. 데이터셋이 적으면 당연히 딥러닝의 성능은 여타 머신러닝 기법에 비해 떨어지게 된다.
- 데이터가 실제로 많으면 좋겠지만, 그렇지 못하면 데이터에 조금의 변화를 주어 데이터를 늘릴 수 있다.
- 에를 들어 이미지를 회전시키거나, 뒤집는다거나 하는 방법이 있는데 당연히 MNIST 같이 label preserving이 안되는 경우는 하면 안된다.
- Noise Robustness
- 위와 같이 이미지 벡터에 노이즈를 주면 학습이 더 잘 될 수 있다.
- 그 이유에 대해 명확하게 증명되지는 않았다.
- Label Smoothing
- 학습 데이터 2개를 섞어주는 방법으로, Mixup과 같이 아예 반반 섞는 방법도 있고, CutMix나 Cutout처럼 잘라서 무식하게 붙이거나 아예 잘라서 없애버리는 방법도 있다.
- Dropout
- 학습시 뉴런의 일부를 0으로 만들고(즉, 네트워크에 존재하지 않는 것으로 가정)학습한다.
- Batch Normalization
- parameter에 대하여 정규화(noramalization)을 하는 기법이다.
- 논문에서는 레이어 통과시마다 분산, 즉 분포가 변하는 현상을 줄이는 데에 좋다고 나와 있지만, 아직 이에 대한 논란은 많다.
- 단순히 각 parameter에서 입력값을 정규화해버리고 넣는다는게 아니고 ,학습을 할 때 각 신경망안에서 정규화하는 과정이 포함된 채로 학습 한다.
- 즉, 각 레이어마다 정규화하는 레이어를 두어 분포가 변형 되는 것을 막는 것이 주요 목적이다.
지금까지 여러 optimization, generalization을 위한 기법/알고리즘들을 알아보았는데 중요한 것은 어떠한 상황이 주어졌을 때 이들중 적절한 걸 골라 잘 활용하는 능력이다.
Reference
'딥러닝 > 딥러닝 기초' 카테고리의 다른 글
신경망과 역전파 (0) | 2021.03.11 |
---|---|
Convolution (0) | 2021.03.10 |