[CS231n] 6. Training Neural Networks I
📗강의노트/CS231n

[CS231n] 6. Training Neural Networks I

728x90
반응형


읽어보기



1. Activation Functions






데이터 입력이 들어오면 가중치와 곱한다. FC or CNN

그리고 활성함수, 비선형 연산을 거치게 된다 .




<Sigmoid>




문제점 1. Saturation되는게 gradient를 없앤다. 




X=-10이면 Gradient가 0이 됨
X=0에서는 잘 동작함
X=10이면 sigmoid가 flat하기 때문에 gradient를 다 죽인다. 


문제점 2. sigmoid의 출력이 zero centered하지 않다는 것이다. 




X가 모두 양수라고 하자. 가중치와 곱해지고 활성함수를 통과할 것이다. 

Local gradient를 계산해보면 그냥 X이다. Gradient의 부호는 그저 위에서 내려온 Gradient의 부호와 같게 된다. 




즉, W가 모두 같은 방향으로만 움직일 것이라는 것이다.

파라미터를 업데이트 할 때, 다같이 증가하거나 다같이 감소할 것 이다. 

이런 gradient 업데이트는 비효율적이다. 4분면중 두 개의 영역만 사용함. 

파란색 화살표가 최적의 업데이트인데, 빨간색으로만 움직일 수 있다. 더 많이 이동해야한다. 

그래서 Zero-mean data를 원하는 이유이다. 입력 X가 음수, 양수를 모두 가지고 있다면 전부 같은 방향으로 움직이는 일은 나타나지 않을 것이다.  


<tanh>




범위가 -1,1이다. “Zero-centered”되어있다. 

하지만 여전히 Saturation 때문에 gradient가 죽는다.  


<ReLU>





이 함수는 element-wise 연산을 수행하고 음수면 0, 양수면 값 그대로를 출력한다. 

여기서는 Saturation이 되지 않는다. 

계산 효율 또한 뛰어나다. 단순한 max연산이기 때문이다. Sigmoid, tanh보다 수렴속도가 6배나 빠르다. 

하지만 “zero centered”의 문제는 여전히 가지고 있다. 

그리고 양수 값에서는 saturation이 되지 않지만, 음수 값에서는 saturation이 된다. 




x=-10이라면 gradient가 0이된다.

기본적으로 gradient의 절반을 죽여버리는 셈이다. 

그래서 "dead ReLU”라는 현상을 겪을 수 있다. 




절반만 activate된다. Data cloud( training data )에서 멀어지면 activate가 일어나지 않고 update되지 않는다.  반면 activate ReLU는 일부는 activate되고 일부는 activate되지 않을 것이다. 

첫 번째로는 초기화를 잘못한 것이 원인이 될 수 있다. 

가중치 평면이 data cloud에서 멀리 떨어져있는 경우이다. 이런 경우 어떤 데이터 입력에도 activate 되는 경우가 존재하지 않고, backprop도 일어나지 않을 것이다. 

두 번째로, 더 흔한 경우는 learning rate가 지나치게 높을 때 이다.  Update를 지나치게 크게 해버려 가중치가 날뛴다면 ReLU가 데이터의 manifold를 벗어나게 된다. 
그래서 처음에는 학습이 잘 되다가 갑자기 죽어버리는 것이다.

그래서 ReLU에 작은 positive biases를 추가해주는데, 이는 update시에 active ReLU가 될 가능성을 조금이라도 더 높혀주기 위함이다. 


< Leaky ReLU > 
 




saturation이 되는 것을 아예 막았다. Dead ReLU도 나타나지 않는다. 



< ELU > 




Zero mean의 형태를 띈다. 하지만 다시 saturation된다. 하지만 이런 saturation이 잡음(noise)에 강인할 수 있다고 한다. deactivation이 노이즈에 강인하게 만든다.



< Maxout Neuron >





기존 파라미터의 두 배 파라미터 수를 갖게 된다. 





2. Data Preprocessing





가장 대표적인 전처리 과정은 “zero-mean”으로 만들고, “normalize”하는 것이다. 

normalization을 해주면 모든 차원이 동일한 범위 안에 있게 해줘서, 전부 동등한 기여를 하게 된다. 이미지는 zero-mean만 하기도 한다( 평군은 전체 training data의 평균을 이용한다 ). 왜냐하면 이미지는 이미 각 차원 간에 스케일이 어느정도 맞춰져있기 때문이다. 


3. Weight initialization






모든 가중치가 0이라면 어떻게 될까?

-> 전부 똑같은 일을 할 것이라는 것이다. ( 모두 다 같은 연산을 수행 )
출력도 모두 같고, Gradient도 서로 같다. 모든 뉴런이 똑같이 생기게 됨.
(=“Symmetric Breaking”)

우선 초기화 문제를 해결하는 첫 번째 방법은 임의의 작은 값으로 초기화 하는 것이다. 




10개의 레이어로 구성된 네트워크. 레이어당 500개의 뉴런이 존재한다. 활성함수는 tanh

가중치는 임의의 작은 값으로 초기화한다. Forward pass하고 layer 별 activation 값을 보면 다음과 같다.




레이터 출력의 평균, 평균, 표준편차를 계산한 것이다. 

분포를 보면 처음에는 가우시안(표준정규분포) 형태로 잘 나타나있다. 하지만 W를 곱하면 곱할수록 W가 너무 작은 값들이라서 출력 값이 급격히 줄어들게 된다. 결국 0이 될 것이다. 이는 우리가 원하는 것이 아니다. 그래서 모든 활성함수들이 0이 될 것이다.  

그리고 backward pass로 다시 생각하고 gradient를 구하면, X 자체가 엄청 작은 값이기에 gradient도 작을 것이고, 결국 업데이트가 잘 일어나지 않는다. ( forward & backward )

upstream은 우리가 이미 계산한 곳 부터 온다 ( 활성함수 쪽 )

반대로 가중치가 너무 클 경우에는 다음과 같다.




값들이 saturation 될 것이다. 가중치가 큰 값을 가지므로 tanh의 출력은 항상 saturation 될 것이다. 출력이 항상 -1이거나 1이 된다.  gradient는 다 0이 될 것이고, 업데이트가 일어나지 않을 것이다. 


< Xavier initialization > 





가우시안 분포로 뽑은 값을 “ 입력의 수 “(루트 입력의 수 )로 스케일링해준다. ( W식 참조 ) 

Xavier initialization가 하는 일은 입/출력의 분산을 맞춰주는 것이다. 

하지만 ReLU를 (비선형) 쓰면 잘 작동하지 않는다




ReLU는 출력의 절반을 죽이기에 그 절반은 매번 0이 된다. 그래서 결국 출력의 분산을 반토막 낸다.  값이 너무 작아지게 되는 것이다. ( 분포가 줄어들고있다.)

이를 해결하기 위해 추가적으로 2를 더 나눠준다. 




뉴런들 중 절반이 없어진다는 사실을 고려하기 위해서 이다.

이 작은 변화가 트레이닝에 있어서 엄청난 차이를 보인다. 


4. Batch Normalization


레이어의 출력이 unit gaussian이기를 바란다. 




가중치를 잘 초기화 시키는 것 대신에 학습 할 때 마다 각 레이어에 이런 일을 해줘서 모든 레이어가 Unit gaussian이 되도록 해준다. 

평균과 분산을 “상수”로 가지고만 있으면 언제든지 미분이 가능하다. 따라서 Backprop이 가능하게 되는 것이다. 




Batch당 N개의 학습 데이터가 있고, 각 데이터가 D차원이라고 해보자. 그리고 각 차원(feature element)별로 평균을 구해준다. 한 Batch 내에 이걸 전부 계산해서 Normalize한다. 

FC나 Conv뒤에 사용한다. 

Normalization이 하는 일은 입력이 tanh의 linear한 영역에만 존재하도록 강제하는 것이다. 그래야 saturation이 일어나지 않는다. 아예 일어나지 않는 것 보다는 얼마나 일어나게 할지 조절하는 것이 더 좋다. 




감마는 scaling, 베타는 shifting (학습 가능한 파라미터 / 추가적인 유연성을 제공해줌 )
( batch 단위로 normalizaiton을 해주고 파라미터를 다시 학습시키는 것 )




입력이 있고 우리는 mini-batch에서의 평균을 계산한다. 모든 mini-batch 마다 각각 계산을 해준다. (분산도 계산)

그리고 평균과 분산으로 Normalize 한 이후에, 다시 추가적인 scaling, shifting factor를 사용한다. 

BN은 gradient의 흐름을 보다 원활하게 해주며 결국 더 학습이 더 잘되게(robust) 해준다. 
BN을 사용하면 learning rate도 높일 수 있고, 다양한 initialization을 수행할 수 있다. 

그래서 BN을 쓰면 학습이 더 쉬워진다고 말한다. 그리고 써야하는 이유이다!

BN이 regularization 역할도 한다. 각 레이어의 출력은 해당 데이터 하나 뿐만 아니라 batch 안에 존재하는 모든 데이터들에 영향을 받는다. ( 평균 ,분산 )
왜냐하면 각 레이어의 입력은 해당 배치의 (표본)평균으로 Normalize되기 때문이다. 

BN은 선형변환으로 기존의 “ 공간적인 구조 “가 잘 유지됨 ( 바뀌지 않음 )

Test time에서 추가적인 새로운 게산을 하진 않는다. 



5.Babysitting the Learning Process



(1) Data preprocessing

(2) Choose the architecture  ( 레이어 구성하기 )

(3) loss is reasonable ( loss가 합당한지 보기 )

(4) training  

(5) training with regularization and learning rate



6. Hyperparameter Optimization





Cross-validation : training set으로 학습시키고 validation set으로 평가하는 방법이다. 

Learning rate는 gradient와 곱해지기 때문에 선택범위를 log scale을 사용하는 편이 좋다. 




Gridsearch : 하이퍼파라미터를 고정된 값과 간격으로 샘플링하는 것이다. 

Gridsearch 보다는 Random search를 하는 것이 더 좋다. 

Random search를 사용하면 important variable에서 더 다양한 값을 샘플링 할 수 있으므로 더 좋다. 

Loss curve를 보고 learning rate가 적당한지 알 수 있다. 




Loss가 발산하면 Learning rate가 높은 것이고, 너무 평평하면 너무 낮은 것이다. 

비교적 가파르게 지속적으로 내려가는 것이 가장 좋은 모습이다. 




Loss 가 평평하다가 갑자기 가파르게 내려가는 것은 초기화의 문제로 볼 수 있다.

Gradient의 backpropagation이 초기에는 잘 되지 않다가 학습이 진행되면서 회복이 되는 경우이다. 




Train_acc 와 val_acc의 gap이 크다면 Overfitting을 의심해야한다. 따라서 regularization의 강도를 높혀야 할 지도 모른다. 

Gap이 없다면 아직 Overfit하지 않은 것이고 capacity을 높힐 수 있는 충분한 여유가 있다는 것을 의미한다. 

가중치 크기 대비 가중치의 업데이트 되는 정도 또한 중요하다. 
(업데이트가 너무 크거나 작으면 안되기 때문이다)




각각의 주제에 명심해야할 내용이다.












728x90
반응형