꺼내먹는지식 준
딥러닝 Optimization (최적화) 및 최적화 용어 정리 본문
Deap Learning의 최적화
최적화에서 용어들을 명확하게 집고 넘어가야 연구자들끼리 대화에 불편함이 없다. 용어의 중요성을 늘 기억하자.
Gradient Descent
1st order descent

찾고자 하는 parameter에 대해서 loss function을 편미분해서 학습을 하겠다. 반복적으로 최적화 한다.
단, local minumum 으로 갈 수밖에 없다.
최적화의 중요 컨셉
Generalization (일반화 성능)

Training error 가 0이어도, 항상 최적 값에 도달했다는 보장은 없다.
어느정도 시간이 지나면, test error 에 대해서는 성능이 오히려 떨어진다.
Generalization performance 라는 건 주로, test error 와 train error의 차이를 말한다.
좋은 Generalization performance: 학습 데이터와 test error가 비슷하게 나온다. (
나쁜 Generalization performance: 반대의 경우
Under-fitting, Over-fitting
Over-fitting: 나쁜 Generalization performance: 반대의 경우

Under-fitting: 네트워크가 너무 간단하거나, train을 너무 조금해서 학습 데이터도 잘 못맞춤
Cross Validation

즉, train data 와 test data(validation)를 따로 준다.
학습 데이터로 학습 시킨 모델이 학습 되지 않은 데이터로 얼마나 잘 작동하는지 보는 것
학습 데이터와 validation data는 얼마만큼의 비율로 하는 것이 좋을까?
이런 문제를 해결하기 위한 것이 Cross-validation (K fold validation 이라고도 함)
학습 데이터를 k개로 나눠서, 학습에 사용한다.
ex. 5 fold validation: (k-1)개로 학습하고, 나머지 한개로 validate
데이터 10만개가 있다고 하면
a,b,c,d,e = 2만_1, 2만_2, 2만_3, 2만_4, 2만_5
lst = [a,b,c,d,e]
for i in range(5):
val = lst[i]
test_set[:i] + test_set[i:]
2만개씩 partition 한 후, 8만개로 학습하고 2만개로 validation
각 validation 에 해당하는 data set 변경해가며 학습과 validate 를 진행
어떤 경우에 사용하는가?
어떤 hyperparameter가 좋은지 모르니, cross validation을 통해 좋은 hyperparameter를 찾고 hyperparameter를 고정시킨 후 학습시킬 때 모든 데이터를 사용한다. (test 데이터는 어떠한 방식으로든 학습에 사용되서는 안된다. 즉, cross validation은 이경우에만 거의 사용)
Bias and Variance

Variance: 입력에 대해서 출력이 얼마나 일관적으로 나오는가
Low Variance : 비슷한 곳에 찍혔으므로 bias 만 수정해주면 최고의 지점에 도달할 수 있다.
High Variance : 비슷한 입력에 대해 출력이 많이 달라진다. 즉 over-fitting 되기 쉽다 .
Bias: 분산 관계없이 평균적으로 봤을 때, true taraget 에 얼마나 가까운가
Low Bias : 분산이 커도 평균적으로 봤을 때, true taraget 에 가깝다.
High Bias : 평균적으로 봤을 때, true taraget 에 가깝지 않다.
학습데이터에 노이즈가 껴있다고 가정할 때,
노이즈가 껴 있는 타겟 데이터를 미니마이즈 하는 것은 3가지 파트로 나뉜다.
1) bias
2) variance
3) noise

주로 bias 를 줄이면 variance 가 커지고, vice versa하다.
근본적으로 noise 가 껴져있을 때 두가지를 모두 줄이는 것은 이론상 어렵다.
Bootstrapping
학습데이터가 100개(fixed)가 있으면 그 중 몇개만(ex.80) 활용한(subsampling) 모델을 여러개 만든다. 하나의 입력에 대해 모델들이 예측하는 값들이 얼마나 consensus 한가 확인해서 모델의 uncertainty 를 예측하기 위하여 사용
Bagging vs Boosting

Bagging
학습데이터가 고정되어 있을 때, 다 사용하지말고 여러개를 섭셈플링, 여러개의 output 을 보겠다.
한개의 모델을 쓰는 것보다, subsampling해서 여러개의 모델에서 나오는 값들의 평균 혹은 voting의 출력값을 쓰는게 주로 좋은 결과가 나온다.
Boosting
학습 데이터가 100개가 있으면 모델 하나를 간단하게 만들고, 학습데이터에 대해 돌려본다. 그 후 잘 동작하지 않은 데이터에 대해 간단한 모델을 다시 만든다. 이러한 weak learner 을 여러번의 과정으로 만든 후, sequential하게 합쳐 strong leaner 을 한개 만든다.
Practical Gradient Descent Methods
1) Stochastic Gradient Descent
하나의 샘플을 통해서만 gradient 를 구해서 업데이트
너무 오래걸린다.
2) Mini-batch Gradient Descent
일반적으로 우리가 쓰는 방법, data의 subset의 gradient를 구해서 업데이트
3) Batch Gradient Descent
모든 데이터로 gradient를 구한 후 모든 gradient의 평균을 내서 업데이트
네트워크 GPU 가 터질 수 있다.
Large batch size 를 활용하면, sharp minimizer에 도달한다.
Small batch size 를 사용하면, flat minimizer에 도달한다.
Flat Minimum (generalization performance 가 높다.)
Sharp Minimum(train Data 기준으로 잘 동작하나 test data에 약하다. )
즉 flat minimizer에 도달하는게 좋다.

Gradient Descent Method

기본적으로 learning rate * gradient 를 빼면서 weight를 update.
다만, 적절한 learning rate 값을 찾는 것이 너무 어렵다.
learning rate가 크면 학습이 잘 안되고 크면, 작으면 학습이 오래걸려도 진전이 없다.
더 좋은 성능, 더 빨리 학습을 시킬 수 있는 여러 Techique
1) Momentum (관성)
이번 batch의 gradient 방향이 이전 batch와 다를경우, 이전 batch의 정보를 최대한 사용해보자.

지수이동평균(Exponential Moving Average)은 과거의 모든 기간을 계산대상으로 하며 최근의 데이타에 더 높은 가중치를 두는 일종의 가중이동평균법이다.
2) Nesterov Accelerated Gradient

NAG는 a (accumulated gradient) 를 gradient descent 하는데, 이 때, lookahead gradient를 계산한다.
a라는 현재정보 만큼 한번 가보고, 간 곳에서 gradient 를 계산한 것을 accumulate 한다.

local minimun을 좀 더 빠르게 빠져나갈 수 있다.
Adagrad

뉴럴 넷의 파라미터가 얼만큼 지금까지 변해왔는지 파악을 한 후, 많이 변한 파라미터는 더 적게 변화시키고, 조금 변한 파라미터는 많이 변화시킨다. Large G 가 지금까지 gradient가 얼마만큼 변해왔는지를 제곱해서 더한 것이다. 입실론은 0으로 나누지 않도록 안정화 하는 변수.
G는 계속 커지기에, 무한대로 가까워지게 되면 분모가 무한대라 W가 업데이트가 안된다. 즉 뒤로 갈 수록 업데이트가 안된다.
이러한 문제를 해결한 것이 Adam
Adadelta

Adagrad가 가지는 G가 최대한 계속 커지는 문제를(monotonically decreasing) 막는 방법
현재 timestep t가 주어졌을 때 어느정도 window size만큼의 gradient 제곱의 변화를 본다.
문제는 최소양의 t의 값을 가지고 있어야 하는데 파라미터가 큰 경우 가지고 가기 힘들다.
이에 따라, exponential moving average로 어느정도 time window 만큼의 값을(합) 최대한 가지고 있는다.
이 방법이 바로 Adadelta이다. 다만 learning rate이 없어서 잘 사용되지는 않는다.
RMSprop

논문 제안은 아니
고, 강의에서 제안 된 것.
Adagrad처럼 Gradient squares를 그냥더하지 않고 exponential moving average를 더하는데 대신에 step사이즈를 집어 넣었다.
Adam

Adaptive Moment Estimation
가장 무난하게 잘 되는 것. Gradient squares를 exponential moving average로 가져가는 동시에, momentum을 같이 활용한다.
Gradient square의 크기에 따라서 adaptive 하게 learning rate를 바꾸는 것과 이전 gradient정보에 해당하는 moment정보를 두개 잘 합친 것이 Adam이다.
Hyperparameter로는 momentum을 얼마나 유지시킬지와 gradient squares에 대한 EMA정보, eta learning rate, epsilon parameter 이 4 파라미터를 잘 조절하는 것도 중요하다.
$\frac{1-\beta^{t}_{1}}{\sqrt{1-\beta^{t}_{2}}}$ 는 전체 방법론이 unbiased estimator가 되기 위해 수학적으로 증명한 것
실제로는 epsilon을 잘 바꿔주는 것이 practical에서 중요하다.
Regularization
Generalization이 잘 되도록 하고 싶은 것.
학습을 방해함으로써, 학습 데이터에만 잘 동작하는 것이 아니라 테스트 데이터에도 잘 동작하도록 만드는 것.
Early Stopping

training에 사용하지 않은 validation data로 지금까지 학습된 모델의 loss 를 보고 loss 가 어느시점부터 커지기 시작하면 빨리 멈추는 것 (추가적인 validation data가 필요)
Parameter norm penalty

neural net 파라미터가 너무 커지지 않게 하는 것
네트워크 파라미터들을 다 제곱해서 더하면 특정 값이 나오는데, 이 값을 같이 줄이는 것
이왕이면 네트워크 학습할 떄 네트워크 weight 의 숫자들이 작으면 작을 수록 좋다.
neural net의 함수 공간에서 최대한 부드러운 함수로 보자. 부드러울 수록 generalization 이 잘 될 것이라는 가정
Data augmentation

뉴럴넷, 머신러닝, 딥러닝 에서 가장 중요한 것 중 하나는 데이터이다. 데이터가 무한히 많으면 웬만하면 다 학습이 잘 된다. 데이터가 적으면 그냥 앙상블 기법이 더 잘되기도 했다. 그러나 데이터 셋이 어느정도 커지면 머신러닝이 표현력이 떨어지고, 뉴럴넷은 표현 능력이 된다. 그러나, 데이터가 한정적일 때 data augmentation을 통해 주어진 데이터 셋을 늘리는 것이다. (어떤 방식으로든) 이미지 라벨이 바뀌지 않는 한도 내에서 변화 (6데이터를 뒤짚어서 9를 만드는건 label이 바뀌어서 안된다.)
Noise robustness

왜 잘되는지는 아직 잘 모른다. random noise 를 input 혹은 더나아가서 weight에 넣어주면 더 좋은 결과가 나온다.
Label Smoothing

Data Augmentation과 비슷한데, 굳이 차이점을 찾으면 학습단계에서 데이터 두개를 뽑아서 두개를 섞어주는 것.
분류문제를 풀면 class 를 잘 구분하는 decision boundary 를 찾는 것이다. 이 boundary를 부드럽게 만드는 것이다.

다음과 같은 여러 기법이 있다.
왜 잘되는지를 설명하기 보다는 이러한 방법을 통해 성능이 상승한다.
분류 문제에서 데이터가 한정적일 때 mixup cutmix를 사용하면 많은 성능 상승이 있다. (간단)
Dropout
뉴럴넷의 weight를 0으로 바꾼다. inference할 때는 얻을 수 있는 것은 각각의 뉴런들이 robust한 feature을 잡을 수 있다. 쓰면 주로 성능이 올라간다.
https://algopoolja.tistory.com/50
Dropout 이란 무엇인가
Dropout은 신경망의 뉴런을 부분적으로 생략하여 모델의 과적합(overfitting)을 해결해주기 위한 방법중 하나이다. 과적합이란 training dataset으로 학습한 모델의 정확도가 x 축을 layer 수라고 할때 layer
algopoolja.tistory.com
Batch Normalization

논란이 많다. 내가 적용하고자 하는 layer의 통계치를 정규화 시키는 것이다. 1000개의 parameter가 있는 layer라면, 각각의 값의 통계값을 mean error , unit varaince 가 되도록 만드는 것이다. 평균을 빼주고 표준편차를 나눠줌을 통해서. internal covariance(feature) shift 를 줄여서 네트워크가 학습이 잘 된다고 했으나 여러 연구들이 이를 동의하지 않았다. 하지만 레이어가 깊을 수록 BN은 잘 작동한다.
비슷하게 Layer norm, data 한장별로 통계치를 정규화 시키는 instance norm도 있다. 간단한 분류문제를 풀 때 주로 활용한다.
https://eehoeskrap.tistory.com/430
[Deep Learning] Batch Normalization (배치 정규화)
사람은 역시 기본에 충실해야 하므로 ... 딥러닝의 기본중 기본인 배치 정규화(Batch Normalization)에 대해서 정리하고자 한다. 배치 정규화 (Batch Normalization) 란? 배치 정규화는 2015년 arXiv에 발표된 후
eehoeskrap.tistory.com
'AI > 딥러닝 기초' 카테고리의 다른 글
| 딥러닝 앙상블 (Ensemble) (0) | 2022.02.23 |
|---|---|
| 신경망 개념 완벽 이해 (0) | 2022.02.12 |
| Multi layer Perceptron 간단 구현 (0) | 2022.02.07 |
| Neural Net, Multi-layer Perceptron (0) | 2022.02.07 |
| 딥러닝 역사, 기본 및 용어 (0) | 2022.02.07 |