Lec7) Training Neural Networks II

0

Re?LU를 쓰자
적절한 가중치 초기화가 중요 Xavier/MSRA Initialize를 쓰자
전처리 - Zero-Mean, unit variance

Batch Normalization 사용

Babysitting Learning
epoch에 따른 로스 변화량, 로스값 반포, Accuracy 등 체크하기

Hyperparameter Search
Grid Search < Random Search
너무 많은 경우의 수를 쓰지 말자

Coarse Search(넓은범위 적은 epoch) -> Fine Search(좁은범위 많은 epoch)

Learning rate <- 제일 중요한 하이퍼파라미터
작으면 학습이 오래걸리고 크면 발산 가능성이 커짐

Optimization

가중치에 대한 손실함수를 정의해두면, 손실함수는 가중치가 좋은지 나쁜지 알려줌
손실함수는 가중치에 대한 산처럼 나타낼 수 있음 (2차원을 가정)
가장 낮은 loss를 가지는 값을 찾아야함
Stochastic Gradient Descent를 사용해
데이터의 Loss를 계산 후 Gradient의 반대방향을 향해 가중치를 update함

SGD의 문제 :

1)Loss가 특정 가중치 하나에 거의 의존해서 변화한다면 다른 가중치의 변화는 영향이 적다
~~ Hessian matrix의 최대/최소 singular values비율이 안좋다 ~~
이경우 gradient 방향이 고르지 못해서 지그재그 형태가 나옴
2차원에서도 이럴 수 있다면 엄청나게 많은 가중치 파라미터의
차원이 존재하기 때문에 더 많은 문제가 발생함을 예측 할 수 있다.

2)Local minima, Saddle point
손실함수가 단순한 모습이 아니라 굴곡이 있다면 (ex 5차함수 모형)
진짜 최소값을 찾기전에 기울기가 0이되는 (가짜)최소값을 찾을 수도 있다.
3차원의 Saddle points도 마찬가지로 기울기가 0이되는 (가짜)최소값이 있다면
기울기가 아주 작고 여러개의 가중치에 대해 그러하므로 더큰 문제가 될 수 있다.
파라미터가 엄청나게 많다면 이러한 상황은 더 빈번하게 일어날 수 있다.

3) 손실함수를 계산할때는 엄청 많은 training set의 Loss를 다 계산할 수 없기 때문에
mini batch의 손실함수(추정치)를 사용한다. 이는 정확한 gradient가 아니기 때문에 noise가 발생한다.
(GD)를 사용한다 해도 결국 비슷한 문제에 봉착한다.

SGD + Momentum

gradient에 velocity와 같은 변수를 추가해 운동량을 추가함 (변수 rho = velocity의 영향력)
Local minima나 Saddle point의 기울기 0에서 멈추는 문제 해결 가능
loss에 영향력이 적은 가중치에 대한 효과를 최소화 할 수 있음.

적절한 rho값을 정해준다면 기울기보다 velocity가 크고
방향도 조금씩 차이나므로 벡터합으로 실제 이동을 정할 수 있다.
속도에는 가까운 gradient가 제일큰 영향을 미치고 멀어질수록 영향력이 지수적으로 감소
momentum은 최소값을 지나칠 수 있지만 경로를 수정해서 결국 최소값에 도달할 수 있다.

Nesterov momentum
현재/이전의 velocity간에 에러보정 term이 추가된 형태

AdaGrad

velocity term을 더하는 대신
미분값의 제곱을 계속 더해주는 grad squared를 사용한다.

Learning_rate 에 미분값 / grad sqrared 사용 (분모에 있음 유의)

차원이 클 때 -> 제곱 합의 값이 크다.
차원이 작을 떄 -> 제곱 합의 값이 작다.

작은 값으로 나눌때 -> Learning_rate가 점점 증가
큰 값으로 나눌때 -> Learning_rate가 점점 감소

매번 진행할때마다 미분값의 제곱을 계속 더해주므로
Step을 진행할수록 값이 점점 작아짐(분모가 커지므로)

손실함수가 볼록하다면 점점 작아지는건 좋을 수 있지만
saddle point에 걸리는 경우 멈추거나 하는 문제가 생김

RMSProp

미분값의 제곱을 계속 더할때 decay_rate(0.9~0.99)정도를 곱해줘
grad square가 급격하게 증가함을 방지해 속도가 너무 느려지는 것을 방지함
차원마다의 상황에 맞춰 방향을 수정할 수 있음
AdaGrad와 같은 궤적을 가지지만 느려지는것이 방지되므로 좋다.

ADAM

Momentum , RMSProp두 방식의 조합

첫 움직임에는 Momentum과 비슷한 방식
두번째 움직임에서는 Gradient square를 사용하는 RMS방식을 사용

첫 움직임 = 속도를 이용 (velocity)
이후 Gradient square로 계속 나눠줌 (RMS)

문제점

초반 moment는 초기화된 0이고, 여기에도 0에 가까운 값만 더해지므로
상수항 10^-7이 엄청큰 값이므로 러닝 레이트가 엄청 작아지게 된다.
따라서 한 step에 가는 양이 적어서 학습 시동이 걸리는데 오래걸릴 수 있다.
(실제 기울기와 관계없이 초기값에 의해 일어나는 현상)

이를 위한 Bias correction term이 존재한다. (초반 시동걸리는 시간을 줄여줌)

*** beta1 = 0.9, beta2 = 0.999 해서 돌리면 어지간해서 잘돌아간다.

초반 velocity term(momentum의 특성을 가짐)
이후 Gradient square Term (RMSProp의 특성을 가짐)

그럼에도 Adam도 문제가 없는건 아님
타원형 손실함수 - poor conditioning 인 경우 대부분 알고리즘이 다루기 힘듬
(그라디언트가 발산하기 때문)

그래서 결론 : Learning rate를 잘 선정하는게 중요하다.
처음에는 높게 설정하다가 학습이 진행될수록 낮추는
Learning rates decay 전략(아담이 쓰던것)

Step decay : 100000 iter마다 러닝 레이트를 반으로 줄임
exponential decay : 지수함수로 계속 감소하게 함

Rasnet : 필요에 따라 러닝 레이트를 감소시켜서 계단식으로 Loss를 내려가게함

아담보다 SGD 모멘텀에 러닝레이트 decay를 많이씀
그러나 초기부터 고려할 사항은 아님 그냥 러닝레이트를 잘 고르는게 조음

일단 러닝레이트 decay없이 쓰다가 decay를 첨가하자

1차 미분값을 연결하면 원래의 함수를 근사 가능 (테일러 급수)
1차 미분값을 통한 근사로는 0이 되는 경우 더이상 다음 값을 알 수 없으므로
2차 미분값의 정보를 추가 이용해 minima에 잘 도달가능
-> 위로 볼록, 아래로 볼록

2차 미분값을 통한 정보를 다차원으로 확장하는 것을
Newton step이라고 하며
Hessian matrix (헤세 행렬)를 통해 손실함수의 2차 근사를 통해
minama로 이동 가능하다.

Learning rate가 없다는 점이 특이함

그러나 이것도 근사의 한계로 완벽하진 않기때문에
실제로는 learning rate가 필요하게 됨

but 딥러닝에서는 이용하기가 힘듬
파라미터가 1억개면 헤세 행렬은 1억 X1억 행렬이 되기 때문임

따라서 간소화된 quasi-Newtonmethods를 사용
헤세 행렬을 그대로 사용하기보다는 뉴턴's method에 가까운 근사를 이용

L-BFGS

사실상 DNN에서는 잘 쓰지않음,
단점 : stochastic case에서 잘 동작하지 않음, non-convex problems에도 비적합
Style transfer와 같이 파라미터가 적고 full batch update가 가능하면 써보는것도괜찮음,

지금까지본 Optimization의 역할 : Traning error 줄이고 손실함수 최소화
그러나 더 중요한 것은 test error 와 traning error의 격차 줄이는 법.

모델 앙상블

10개 모델을 독립적으로 학습해 값의 평균치를 구함
(2%정도 성능 향상을 보인다구 함)

중간중간 모델들을 저장(sanpshots)하고 여러 snapshot에서 나온 예측을 평균내서 사용

러닝레이트를 늘리거나 줄이면서 다양한 지역에 수렴할 수 있도록 함
(일반적으로 손실함수의 해가 여러 개 이므로... 가능한 듯)

하이퍼 파라미터를 다양하게 (모델 사이즈, 러닝 레이트, 정규화 기법) 앙상블 할 수 있다.

파라미터의 exponentially decaying average를 계산해서 활용 (아담이쓰는 방법)
이 파라미터를 바꾸는 방식으로 (Polyak averaging) smooth 앙상블 효과를 줄수 있다고함
-> 실제로는 잘 활용 안됨

단일 모델의 성능 증가 방법 (제일 원하는 것)

1) drop out

모델이 traning data에 fit하는 것을 막아줌 = 한번도 못본 data에서의 성능을 향상
Regularization term을 활용한다.

  • dropout 임의의 일부 뉴런의 activation을 0으로 만들어버림 (매우 단순, 구현 쉬움)
    다음 레이어의 일부는 0이 곱해진 부분을 가지게 됨
    -> 특징들 간의 상호작용을 억제하는 효과가 있다. (소수의 feature에 의해 컴퓨터가 결정을 내리는 것을 막아줌)
    단일 모델로 앙상블 효과를 볼 수 있다고도 할 수 있음 (임의의 네트워크만 사용하므로 경우의 수만큼 가능은 함)

기본의 함수 y= f_w(x)가 y=f_w(x,z) z = random mask로 변화됨

일관성이 떨어지는 문제의 해결 방식 = Average out을 사용
적분을 사용하면 편하지만, 실제로 다루기가 힘듬 (원본 함수를 정확히 모르고 알아도 계산을 복잡함)
때문에 경우의 수를 통해서 적분식을 근사할 수 있음

ex) a = w_1x + w_2y 인 경우
둘다 0이 아닐때, x만 0일때, y만 0일때, 둘다 0일때의 평균 4가지 경우의수의 평균
이 경우 기대값이 반토막이 되므로, dropout 확률 (위 예시에서는 50%니까 2)를 곱해주면 ㅇㅋ

-> 그냥 계산하고 확률을 곱한거랑 같음 -> 그냥 그렇게 하자 ㅋㅋ (profit)

0인 경우 BackP가 없기때문에 업데이트되는 파라미터가 줄어들고 학습시간이 늘어날 수 있지만
모델이 수렴 후에는 더 좋은 일반화 능력을 가짐

일종의 Test 적합을 방해하는 역할을 수행 = Regularization

2) Batch Normalization

정규화를 통한 mini batch가 아닌 전체를 통해 평균화시켜
Test의 stochasticity(noise)가 사라지도록 해줌 -> 표본과 모집단의 평균 차이 등등
BN과 Dropout은 일반적으로 같이쓰지 않지만,
그럼에도불구하고 Dropout은 자유롭게 조절할수 있는 파라미터p 가 존재

3) Data Augmentation

레이블은 그대로 둔채 train을 무작위로 변환시켜봄

좌우반전, 다양한 사이즈로 자르기(crop);
ex) 이미지한장을 (4코너 + 중앙)*좌우반전 10개 사용

색의 채도, 명암등을 조절하기(자주 사용하지는 않음)

이미지 label을 그대로 두고 변환시킬수 있는 다양한 방법 사용

일종의 regularization 효과를 줌
stochasticity를 줄여주는 효과 (좋은지는 잘 모르겠다)

4) Drop connect

Dropout과 같지만 activation(x,y)가 아니라 가중치(w_1, w_2)를 0으로 만들어주기
작동방식은 거의 같음

5) fractional max pooling

2X2고정된 지역에서 pooling하는것이 아니라 랜덤으로 뽑아서
stochasticity를 averging out시킴

6) Stochastic Depth

training시 레이어의 일부가 아예 비활성화해버릴 수 있음.
dropout과 비슷한 방법의 regularizaiton

대개는 BN를 그냥 사용하지만 overfit이 발생하는 경우 dropout을 쓰기도함

Transfer Learning
overfit의 이유중 가장 큰 것 : 충분한 학습 데이터가 없다

일단 큰 데이터를 학습시킨 모델을 가져온뒤
FC Layer의 최종 class score와 feature의 연결을 초기화
이전의 모든 레이어의 가중치는 그대로 둠

마지막 레이어만 가지고 데이터를 학습시킴

작은 데이터로 좋은 학습효과를 줄 수 있음

데이터가 조금 더 많다면, 뒷부분 네트워크 일부에 학습을 시키거나 조정을 할 수도 있다.

기존 데이터와 많이 다른데이터의 경우라면?
다른 가중치도 손을 봐야할 수도 있음

이제는 일반적으로 전이학습을 주로 사용함.
대부분 ImageNet pretrainde-model이나 word-vector를 사용하고
task에 맞도록 fine tune 한다.
(인간으로 치면 모방학습에 해당?)

task에 맞는 protraining-model을 찾아보자
대부분 딥러닝 소프트웨어 패키지는 model들을 제공하구 있슴

딥러닝 소프트웨어 패키지 -> 8장에서 다룸

0개의 댓글