CS231n | 6강 - Training Neural Networks part I
[CS231n] Lecture-6-Training-Neural-Networks-part-I
6강 Video 바로가기
- Contents
- Activation functions
- Data Preprocessing
- Weight Initialization
- Batch Normalization
- Babysitting the Learning Process
- Hyperparameter Optimization
이번 6강에서는 Neural Networks를 어떻게 train하는지에 대한 실제적인 디테일한 이슈들에 대해 배운다. 다양한 활성화 함수(activation function), 데이터 전처리(data preprocessing), 가중치 초기화(weight initialization), 그리고 배치 정규화(batch normalization)에 대해 다룰 것이다. 또한 학습 과정을 전반적으로 모니터링하는 방법과 하이퍼파라메터를 고르는 방법에 대해서도 배운다.
[Activation Functions]
W’x+b의 선형합의 output은 파란색 cell body라 적혀있는 부분에서 activation function을 통해 f(W’x+b)로 활성화된다. 이때 사용되는 activation function은 앞서 살펴본 sigmoid와 ReLU 이외에 대표적인 몇가지 함수가 더 존재한다.
위의 6가지의 비선형 함수들의 트레이드 오프에 대해 살펴본다.
1. Sigmoid
먼저 Sigmoid 함수는 해석이 쉽다는 장점이 있다. 그러나 3가지 문제점이 있다. 첫번째 문제점은 그래디언트를 죽인다는 것이다(Saturated neurons “kill” the gradients)
여기서 x=-10이거나 x=10이면 사실상 플랫해서 그래디언트가 0에 가까워진다. 그래서 전체 그래디언트를 0으로 죽인다는 문제점이 있다. (따라서 가운데 기울기가 있는 부분을 active region of sigmoid라고 하고 좌우 끝 부분을 saturated regime이라고 한다.)
두번째 문제점은 시그모이드 결과가 원점에 위치하지 않는다는 것이다. (Sigmoid outputs are not zero-centered) 그래프의 y축을 보면 sigmoid 함수의 결과 값이 모두 양수이기 때문에 0을 중심으로 하고 있지 않다는 것이다! 이것은 convergence가 느려지게 한다.
sigmoid function을 지나면 무조건 양수의 값이 나오고 이 양수 값이 다음 뉴런에 input으로 들어간다. 이렇게 항상 양수의 값이 x input으로 들어간다면 gradient에 어떤 영향을 미치는지 보면 \(\frac{df}{dw_i}=x_{i} \\ \frac{dL}{dw_i}=\frac{dL}{df}*\frac{df}{dw_{i}}=\frac{dL}{df}*x_{i}\) 여기서 x는 항상 양수이므로 W의 그라이언트는 모두 양수이거나 모두 음수여야한다. 이것을 w에 대한 2차원 그래프의 예시로 표현해보면, 녹색으로 칠해진 방향으로만 움직일 것이다. optimal w vector인 파란색 방향으로 이동해야하는데 지그재그로 이동하게 되어서 결과적으로 convergence가 매우 느리게된다! 따라서 zero-center가 아닌 activation function은 convergence를 느리게 한다는 단점을 알 수 있다.
세번째 문제점은 Exponential function의 연산이 비싸다는 점이다. (Exp() si a bit compute expensive)
이러한 이유로 sigmoid function는 거의 쓰이지 않는다.
2. tanh
tanh 함수는 zero-center이기는 하나 여전히 좌우 끝 부분에서 그래디언트를 죽인다는 단점이 있다.
3. ReLU
ReLU는 현재 디폴트로 택하는 activation function이다. 그렇지만 이것의 특징과 한계점을 제대로 알아야 나중에 문제가 생겼을 때 디버깅이 가능하므로 잘 알고 있어야한다.
- 양수에서 전혀 saturated되지 않고
- 6배나 연산이 빠르며
- 진짜 뉴런이 ReLU 함수와 비슷하게 반응하여 생물학적 타당성이 더 높다고 한다.
따라서 2012년에 나온 Alexnet부터 ReLU가 더 많이 쓰였다.
그러나 여기에도 3가지 문제가 존재한다.
- zero-center가 아니기 때문에, 여전히 convergence가 느리고
- x가 음수일 때 gradient가 여전히 죽게 되며
- Dead ReLU라는 ReLU가 활성화되지 않는 구역이 있다는 것이다.
여기서 Dead ReLU라는 개념에 대해 살펴보겠다. Dead ReLU란 절대 업데이트가 되지 않는 것을 뜻한다. 회색의 별모양 부분을 input이 들어가는 DATA CLOUD라고 할 때, 뉴런이 DATA CLOUD안에 있으면 ReLU 함수가 반응하는 active ReLU이고, DATA CLOUD 외부에 있으면 ReLU함수가 activation되지 않고 죽어버리는 dead ReLU이다. 이렇게 Dead ReLU가 되는 경우는 크게 2경우이다. 첫번째 경우는 초기값이 잘못 설정된 경우로 dead ReLU 구역에서 시작해서 어떤 activation도 일어나지 않는 경우이다. 두번째 경우는 학습 시에 learning rate가 지나치게 큰 경우로 뉴런의 값이 dead ReLU존으로 나가버려서 활성화 되지 못하는 경우가 생긴다. 이것을 방지하기 위해 0.01 정도의 아주 작은 값으로 초기화하는 방법을 사용하기도 한다.
4. Leaky ReLU
2013년, 2015년에 나온 방법으로 ReLU를 변형한 모양이다. ReLU와 달리 X<0일때 기울기를 가지고 있기 때문에 음수에서 gradient가 죽는 saturated가 발생하지 않는다.
또한 alpha를 넣어서 parametric Rectifier된 PReLU가 있다. 이것은 x<0일때 Leaky ReLU의 0.01x 부분의 계수를 alpha러 두고 alpha 자체를 학습해서 사용하는 것이다. Flexibility가 더 높지만 완전히 이 방법이 더 좋다는 검증이 아직 있는 것은 아니다
5. ELU
ReLU와 LeakyReLU의 중간에 있는 모양이다. 그러나 exponential을 계산하는 비용이 많이 든다는 단점이 존재한다.
6. Maxout Neuron
유명한 굿펠로우가 만든 함수로 ReLU와 Leaky ReLU의 장점을 가져왔다. 그러나 2개의 파라미터 값을 가진다는 단점이 있다.
정리하자면 통상적으로 Learning Rate를 잘 조정해서 ReLU를 쓰는 것이 좋고, 좀 더 실험이 필요한 경우에는 변형된 ReLU를 써보는 것이 좋다. tanh()는 더 이상 사용하지 않는다. Sigmoid는 LSTM을 제외하고 사용하지 않는다.
[Data Preprocessing]
머신러닝 수업에서도 데이터 전처리시 zero-centered와 normalize의 중요성에 대해 배웠을 것이다. 동일한 range로 해서 같은 영향을 주게 하는 것이다. 그러나 이미지의 경우는 이미 0~255의 특정 범위에 들어있기 때문에 normalize를 하지 않아도 되기 때문에 zero-center만 해주면 된다.
정리하자면, 이미지는 zero-center만 신경써주면 된다. 데이터 전체 mean을 빼거나, 채널별로 mean을 빼서 사용한다. normalize나 PCA, whitening은 잘 사용하지 않는다.
[Weight initialization]
2006년에 restricted 볼츠만 머신이 잘 도착하지 않았던 가장 큰 이유가 가중치 초기화가 잘못되어있었던 점이었다고 한다. 그만큼 가중치 초기화는 매우 중요하다.
만약 모든 초기 가중치를 0으로 한다면 어떻게 될까?
모두 동일한 연산을 수행하게 되고 백프로퍼게이션도 동일하게 수행하니까 가중치가 업데이트 되지 않는다. 그래서 가중치를 초기화 하는 가장 기본적인 아이디어는 작은 랜덤 숫자로 시작하는 것이다!
first idea
0의 평균과 0.01의 표준편차를 가진 가우시안 분포에서 작은 랜덤 값으로 초기값을 두는 것이다. 그러나 이 경우는 네트워크가 커지면 문제가 생긴다. 10개의 레이어에 500개씩의 노드를 가지고 tanh의 activation 함수를 사용해서 시뮬레이션을 해본다.
tanh 함수를 사용하였기 때문에 평균은 0으로 수렴하는데, 표준편차가 0으로 수렴한다. 즉 점점 collapse되어서 activations이 0으로 간다는 것이다. 이때 backward pass를 생각하면, \(dW_{1} = X*dW_{2}\) x가 매우 작아지기 때문에 gradient가 점점 작아지는 즉 vanishing gradient가 발생한다.
만약 0.01이 아니라 1을 곱하면 어떻게 될까? 오버 슈팅이 되면서-1로 1로 saturated된다. 실제로 학습시에 Loss가 어느 순간부터 전혀 변하지 않는 경우가 초기 가중치값을 처음에 크게 잡은 경우가 있기 때문에 주의가 필요하다.
Xavier initialization
가장 합리적인 초기화 방법으로 input의 개수가 많으면 가중치 값이 적어지고, input의 개수가 적으면 가중치 값이 커지는 방법이다. 가중치가 Saturated가 되지 않고 잘 되는 것을 위의 시뮬레이션으로 확인할 수 있다. (그러나 이것은 ReLU를 사용하면 잘 안된다는 단점이 있다.)
이것을 보완하기 위해 2015년에 제안된 방법으로 input 개수를 2로 나눠주는 방법이 제안되었다.
[Batch Normalization]
그런데 가중치 초기화에 너무 의존하지 않아도 되는 방법이 개발되었다. 그것이 바로 2015년에 제안된 Batch Normalization(배치 정규화)이다. 우리가 지금까지 가중치 초기화를 신중하게 하거나 activation function을 바꾸는 방법을 생각했는데, 이것은 그런 간접적인 방법이 아니라 안정적인 학습이 되도록 제시한 방법이다.
학습에서 불안정화가 일어나는 이유가 입력값의 covariance 분포가 달라지는것 때문이다. 그러므로 각 레이어를 거칠 때 마다 노말라이제이션을 해주자는 방법이다!
미니 배치인 N을 뽑아서 (D는 feature) 그 배치에 대해서 노말라이즈를 한다.
이것은 FC와 activation function이전에 배치된다.
Batch Normalizaton은 결과적으로 learning rate가 다소 큰 값을 가지더라도 그것을 허용해서 빠른 학습이 가능하다. 그리고 가장 핵심은 초기화에 의존하지 않아도 된다는 것이다. 그리고 이 자체가 정규화 효과(Regularization)가 있어서 드랍 아웃을 사용하지 않아도 된다.
그러나 주의해야할 점은 train과 test에서 배치에 평균 값이 다르다는 점이다.
[Babysitting the Learning Process]
이제 어떻게 학습을 모니터링하고 Hyperparameter를 조정하는지 전반적인 프로세스에 대해 배워보자. (강의안 61-74 참고)
- step1 - Preprocess the data: zero-centered data로 만듦
- Step2 - Choose the architecture: layer와 node수의 결정
- step3 - Loss가 제대로 가고 있는지 체크: Regularization term이 없이 구한 Loss보다 Regularization term을 추가한 Loss가 올라가는 것을 확인하고 추가한다
- Step4 - train data 일부분을 이용해서 오버피팅 확인: Loss가 매우 작고 train accuracy가 1.00이 되는지 체크
- Step5 - 적당한 Learning rate 구간 찾는다: 작은 Learning rate부터 시작한다. loss가 별로 바뀌지 않으면 너무 작은 learning rate이고 loss가 NaN으로 exploding하면 너무 큰 learning rate이다. 이렇게 learning rate를 줄이고 키우면서 어느 사이에 적당한 러닝레이트가 존재하겠구나 알 수 있다. (정확한 러닝레이트는 Cross-validation을 통해 알 수 있다.)
[Hyperparameter Optimization]
이제 learning rate와 regularization을 결정하는 일이 남았다.
Regularization term과 learning rate를 log space화하여 찾는 것이 연산에 유리하다.
그런데 grid search를 하여 찾는 것이 더 좋지 않는가?라고 생각할 수 있다. 그러나 이 때 grid search는 사용하지 않는다. random search를 통해 중요한 변수의 optimal을 찾을 수 있기 때문이다.
이러한 hyperparameter tuning작업은 마치 디제이가 믹싱 작업을 하는 것 처럼 정교한 예술 작업과 비슷하다.
Loss function을 모니터링하면서 regularization term, weight initialization, model capacity 등을 점검한다.
드디어 길었던 강의의 Summary이다!
이번 6강에서는 Neural Networks를 어떻게 train하는지에 위의 내용에 대해 배워보았다. 다음 시간에도 train하는 나머지 과정에 대해 배워볼 것이다.