Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

study

CS231 7장 training neural networks 2 본문

CS231n

CS231 7장 training neural networks 2

채승완 2020. 12. 5. 18:17

Neural Network의 Weight를 조정하는 과정에서 보통 Gradient Descent(경사하강법)라는 방법을 사용합니다

이는 네트워크에서 내놓는 결과값과 실제 값 사이의 차이를 정의하는 Loss Function(손실함수)의 값을 최소화하기 위해 기울기를 이용하는 것입니다

여기서 Loss Function을 계산할 때 전체 Train-Set을 사용하는 것을 Batch Gradient Descent라고 합니다

그러나 이렇게 계산하면 한번 step을 내딛을 때, 전체 데이터에 대해 Loss Function을 계산해야 하므로 너무 많은 계산량이 필요합니다 이를 방지하기 위해 보통은 Stochastic Gradient Descent(SGD)라는 방법을 사용한다

 

이 방법에서는 Loss Function을 계산할 때, 전체 데이터(Batch) 대신 일부 데이터의 모음(Mini-Batch)를 사용하여 Loss Function을 계산한다. Batch Gardient보다 다소 부정확할 수는 있지만 계산 속도가 훨씬 바르고 같은 시간에 더 많은 step을 갈 수 있으며, 여러 번 반복할 경우 Batch 처리한 결과로 수렴하게 됩니다.

 

현재 빨간지점에 위치해있다면 수직으로는 경사가 급하고 수평으로는 완만하기 때문에 SGD의 따르면

최소화지점(얼굴 이모티콘)에 이르기 위해 수평은 빠르게 지나가고 수직에 대해서는 늦게 지나가서 지그재그의 형태를 가진다. 그렇기 때문에 최소화 지점에 도착하는 과정이 느리다는 단점이 존재

SGD의 단점인 느린 속도를 보완하기 위한 update 방법 중 하나는 Momentum이다

아래 수식을 보면 SGD에서 v(속도)가 추가된 것을 알 수 있다

mu는 마찰계수로 속도를 느려지게 만들어주는 역할을 하며 일반적으로 특정 값으로 주게 된다

그렇기 때문에 경사가 급한곳에서는 빠르게 완만한곳에서는 느리게 이동하여 최소화지점에 빠르게 도착한다

 

Momentum의 발전된 것이 바로 NAG(Nesterov Acclearated Gradient)이다

Momentum은 2단계로 나눌 수 있다 mu * v를 momentum step이라 하며 learning_rate * dx를 gradient step이라 한다

NAG에서는 momentum step은 같지만 gradient step의 시작점이 momentum step에서 진행되는 것을 확인할 수 있다

 

AdaGrad update는 cache 개념을 도입하였다

cache를 통해 파라미터마다 다른 learning_rate를 사용하는 방법이다

수직의 경우 gradient가 크기 때문에 cache값이 증가하여 속도를 느리게

수평의 경우 gradient가 작기 때문에 cache값이 작아져 속도를 빠르게 하여 균형을 맞추는 것입니다

참고로 1e-7는 0으로 나누는 것을 방지하기 위해 있는 것입니다

 

AdaGrad에서 cache의 값이 계속증가하는 문제가 있습니다

그래서 RMSProp update에서는 decay_rate(hyperparameter)를 통해 cache의 값이 서서히 증가하게 된다

 

Adam은 momentum과 RMSProp을 합친 경사하강법 방법입니다

그리고 bias correction 부분이 초기에 t값이 작을때 m과 v를 조정해주는 역할을 합니다

일반적으로 Adam을 가장 많이 사용한다

그리고 loss function을 구할 때 gradient 정보만 사용하는 것을 first order method라 부른다

 

H(Hessian)을 통해 곡면을 계산하여  최적점을 빠르게 찾아갈 수 있다

이런 방법을 Second order method라 부른다

하지만 연산량이 많아 Layer가 깊을수록 사용할 수 없다

 

정리를 하자면 일반적인 경우 Adam을 사용한다

그리고 mini-batch가 아닌 Batch로 학습하는 경우 L-BFGS(Limited memory BFGS)를 고려해볼만 하다

 

 

모델의 성능을 높이는 방법 중 하나가 앙상블을 사용하는 것이다

여러 개의 모델을 만들어 결과값의 평균을 사용하는 방식이다

하지만 단일 모델에서도 앙상블 같은 효과를 낼 수 있는 방법이 있다

1. epoch(학습)을 돌릴 때마다 기록이 되는데 그 기록들을 앙상블 하는 것이다

2. parameter vector간의 앙상블도 성능향상을 가져다 준다

=> 기존의 가지고 있는 x_test에 0.995 곱하고 x에도 0.005 씩 곱해주는 것이다

 

정규화(Refularization)의 방법 중 Dropout 있다

Dropout이란 일반적으로 Layer들은 모두 연결되어 있는데 일부 노드들을 random하게 0의 값을 주어 비활성화 시킨다

 

 

dropout을 하는 첫번째 이유는

두번째 노드에서 꼬리를 보고 고양이라고 예측했지만 첫번째 노드의 귀부분도 조금의 영향을 받아 고양이라고 예측하게 된다

만약 어떤 노드의 가중치가 크다면 다른 노드에 영향을 미치기 때문에 dropout을 통해 방지할 수 있다

 

두번째 이유는 노드들이 랜덤하게 사용되기 때문에 앙상블의 효과가 있다

 

dropout을 사용하는 경우 주의할 점이 있습니다

test시 a라는 값을 얻었다고 가정하자 그렇다면 train때는 어떻게 되는가?

a 노드의 경우 w0*x + w1*y입니다 여기서 dropout 확률을 0.5로 준다고 가정하겠습니다

그런 경우 노드가 2개라면 경우의 수가 총 4가지 입니다

이를 계산하게 되면 1/2*(w0*x + w1*y)로 test에서 dropout 확률로 곱해주는 것과 같다

 

H1, H2에서 보면 *p가 있는것을 알 수 있다

 

하지만 Inverted dropout으로 train시 p만큼 다시 나눠주면 test시 나누어주지 않아도 된다

이렇게 사용하는 방식이 보다 일반적이다