(CS231N 정리)Lecture 6 : Training Neural Networks
활성화 함수는 딥러닝에 있어서 비선형성을 가해주는 매우 중요한 역할을 합니다.
활성화함수를 넣지 않고 layer들만 쌓아주면 의미가 없다고 합니다. layer에 활성화 함수가 없으면, w2(w1x+b)+b로 넘어가고 그냥 wx+b와 다름 없어지므로 single layer와 다름이 없다는 것이죠.
활성화 함수의 종류들입니다.
가장 먼저 시그모이드 함수입니다.
우리는 시그모이드 함수를 이미 살펴본 바 있습니다.
앞 노드에서 wx+b의 linear 함수를 시그모이드 함수에 적용하면, 0~1로 값을 갖게 됩니다.
문제가 3가지가 있습니다.
1. graident vanishing(기울기 소실): sigmoid의 함수 그래프 모양을 보면 x=10인 부분에서 기울기가 0에 가까운 것을 알 수 있습니다. 또한 기울기의 최대값이 0.5로서 backpropagation을 하게 되면 모두 최대값이라도 0.5*0.5 = 0.25로 계속 gradient가 작아지게 되며 layer을 많이 쌓은 경우 기울기가 소실되게 됩니다.
2. not zero centered: 시그모이드 그래프를 보면 0을 중심으로 되어 있지 않다는 것을 확인할 수 있습니다. 모든 input에 대해 양수 값으로 output이 나오게 되버립니다.
3. compute expensive of exp(): exp의 연산의 값이 어렵고 비싸기 때문에 좋지 않습니다.
이런 3가지 이유 때문에 sigmoid는 잘 사용하지 않습니다.
Tanh: sigmoid의 단점을 개선하기 위해 zero centered된 tanh를 사용했지만, gradient vanishing과 exp 연산의 문제가 있어 잘 사용하지 않는다.
Relu: 가장 대중적으로 사용하는 activation function인 Relu이다. 0이하의 값을 가진 input은 0으로 내보내 주고, 그 이외의 것들은 그대로 내보내줍니다.
Relu에도 2가지 문제가 있습니다. non zero-centered와 0 이하의 값들은 모두 버려지게 됩니다.
즉 입력의 값이 -10, 0 이렇게 두 개가 들어온다면 gradient가 output과 gradient가 모두 0인 상태에 빠지게 되어버립니다.(Dead ReLU)
dead Relu 상태를 해결하기 위해서, 0.01의 bias 값을 주는 방법을 생각해냈는데 효능은 반반입니다.
Leaky ReLU: ReLU에 대한 보완으로 Leaky ReLU가 나오게 되는데 0이하의 값에 대해 작은 양수의 값을 주는 것이다. 그리고 이 것을 조금 변형한게 PReLU인데, 일종의 알파 값을 주고 학습을 통해 찾아가는 방법이다.
ELU: 또한 ReLU의 변형으로 나온 ELU도 있다. ReLU의 모든 장점을 가지고 있고, zero mean과 가까운 결과가 나오지만, exp() 연산이 있다는 단점이 있습니다.
Maxout "Neuron": maxout은 2개의 파라미터를 넘겨주고 max()를 이용해 더 좋은 것을 선택하는 것이지만, 연산량이 2배가 되어 잘 사용하지 않는다고 합니다.
일반적으로 Relu와 Leaky Relu를 많이 사용하고, 필요에 따라 ELU, Maxout의 방법을 고려해보는 것이 좋습니다.
그리고 Tanh는 RNN, LSTM에서 자주 사용하지만 CNN에서는 사용하지 않습니다. sigmoid는 절대 사용하지 않습니다.
Data Preprocessing
데이터 전처리는 zero-centered, normalized를 많이 사용하게 됩니다.
zero centered는 앞서 본 것처럼 양수, 음수를 모두 가지는 행렬을 가질 수있습니다.
효율적으로 이동할 수 있다는 장점이 있고, normalized는 표준편차로 나눠주어 데이터의 범위를 줄여 학습을 더 빨리 할 수 있으며 또한 local optimum에 빠지는 가능성을 줄여줍니다.
이미지에서는 이미 [0, 255]의 범위를 가지고 있어 normalized를 잘 사용하지 않고, zero-centered를 많이 사용합니다.
그 외에도 분산에 따라 차원을 감소시켜주는 PCA, whitened data 등이 존재하는데 이미지에서 잘 사용 되지 않는다고 합니다.
Weight Initialization: weight이 어떻게 초기화 되었는지에 따라, 학습의 결과에 영향을 줌으로 중요한 영역입니다.
만약 W=0인 경우 output layer가 모두 0이 나오게 되고 gradient도 0이 나와 정상적으로 학습이 가능하지 않습니다.
Batch Normalization
batch norm을 사용하면 굳이 weight init을 안해도 됩니다.
Batch Norm는 기본적으로 training 과정에서 Gradient vanishing의 문제를 일어나지 않도록 합니다.
Batch Normalization은 각 층의 input distribution을 평균 0, 표준편차 1로 만듭니다.
network 각 층의 activation 마다 input distribution이 달라지는 internal covariance shift이 달라지는 문제를 해결하기 위해 사용 됩니다.
보통 batch 별로 데이터를 train 시키는데, 이때 N*D의 batch input이 들어오면 이 것을 normalize합니다.
평균값을 빼줘 평균을 0으로 만들게되며 다음 분산을 나누어 분산 값을 1로 만들어 줘야 합니다.
BN는 일반적으로 activation layer 전에 사용되어 잘 분포되도록 한 후, activation을 진행할 수 있도록 합니다.
BN의 목적이 네트워크 연산 결과가 원하는 방향의 분포대로 나오는 것이기 때문에 activation function이 적용되 분포가 달라지기 전에 적용하는 것입니다.
근데, BN을 사용할 때 과연 unit gaussian이 적합한지에 대해서 판단하여야 합니다.
하지만 BN이 적절한지에 대한 판단을 학습에 의하여 조절가능 합니다.
normalize를 진행하고, 다음 감마 값과 같은 하이퍼 파라미터 값들을 조정하여 batch norm을 할지 안할지 선택합니다.
감마 값은 normalizing scale를 조절해주고, 베타 값은 shift를 조절해주는 파라미터 값입니다.
이 값들을 학습을 통해 조절함으로서 normalize 정도를 조절할 수 있습니다.
먼저 mean과 variance를 구하고 normalize를 하며 다음 scale, shift를 얼마나 할지 학습을 통해 값을 정하게 됩니다.