[CS231n]Lecture06-Training Neural Networks

Optimization을 통해서 네트워크의 파라미터를 학습시킬 수 있다. Loss가 줄어드는 방향으로 이동하는데 이것은 gradient의 반대 방향으로 이동하는 것과 같다. Mini-batch SGD 알고리즘으로 가중치들(네트워크의 파라미터)을 업데이트하는 과정은 다음과 같다.

  • Mini-batch SGD로 가중치 업데이트 과정
    Loop:
  1. 데이터의 batch size를 정한 후 그만큼의 크기의 데이터만 가져온다.
  2. Forward prop을 통해 Loss값을 산출한다.
  3. gradient를 계산하기 위해서 Backpropagation을 시행한다.
  4. 계산하여 얻은 gradient를 이용해서 파라미터를 업데이트 한다.

Training Neural Networks

Neural Networks의 학습을 처음 시작할때 필요한 기본설정에 대해 말하자면 다음과 같다.

  • activation function 선택, preprocessing, weight initialization, regularization, gradient checking

Activation function

1)Sigmoid
  • $\sigma(x) = \frac{1}{1+e^{-x}}$
  • 각 입력을 받아서 그 입력을 [0,1]사이의 값이 되도록 해준다. 입력의 값이 크면 Sigmoid의 출력값이 1에 가까울 것이고 작으면 0에 가까울 것이다.
  • neuron의 firing rate를 saturation 시키는 것으로 해석할 수 있다. 왜냐하면 어떤 값이 0에서 1사이의 값을 가지면 이를 fireing rate라고 생각할 수 있기 때문이다. ReLu가 생물학적 타당성이 더 크기에 최근에는 대부분 ReLu를 사용한다.(이 부분은 생물학적인 내용인것 같다.)
  • 참조 firing rate
  • 문제점
    • Saturation되는것이 gradient를 없앤다.
      • Sigmoid에서 x가 0이면 잘 작동할 것이고, gradient도 잘 얻게 될 것이다. 허나, 음의 큰 값이거나 양의 큰값이면 sigmoid가 flat하게 되고 gradient가 0이 될 것이다. 거의 0에 가까운 값이 backprob이 되는 것이다. 그렇다면 결국 출력 노드에서는 가중치의 업데이트 의미가 있는 것이 되겠지만 밑으로 계속 Backpropagation 과정을 하다보면 0이 계속 전달되게 되므로 의미가 없어진다.
    • sigmoid의 출력이 zero centered 하지 않다는 것이다.
      • sigmoid의 입력이 항상 양수라고 가정해보자. 그런 layer에서 dL/df를 계산하면서 local gradient를 생각해보자. local gradient는 전부 양수가 되거나 전부 음수가 된다. 결론적으로는 gradient의 부호가 계속 동일하게 되기 때문에 가중치가 모두 같은 방향으로만 움직일 것임을 의미한다. 파라미터를 업데이트 할 때 다 같이 증가하거나 다같이 감소하거나 할 수 밖에 없다. 이런 gradient 업데이트는 아주 비효율적이다. 위에서 전부 양수 또는 음수로 업데이트된다는 것을 해석해보면, gradient가 이동할 수 있는 방향은 4분면 중 두 영역만 해당 될 것이다. 이러한 이유가 zero-mean data를 우리가 만들어주는 이유이다. 입력 X가 양수/음수를 모두 가지고 있으면 전부 같은 방향으로 움직이는 일은 발생하지 않을 것이기 때문이다.
    • exponential로 인해 계산비용이 크다는 것이다.(내적의 계산이 비싸다.)
2)tanh
  • sigmoid와는 비슷한 모양을 가지지만 출력값의 범위가 [-1,1]이다.
  • 가장 큰 차이라면 zero-centered라는 것이다. 이를 통해 sigmoid의 두번째 문제는 해결되지만, saturation 때문에 여전히 Gradient는 죽는다. 여전히 flat한 구간이 있기 때문이다.
    -
    3)ReLU
  • f(x) = max(0,x)
  • 적어도 양의 값에서는 saturetion되지 않는다.
  • sigmoid와는 다르게 exponential같은 연산이 없는 단순한 max 연산이므로 계산이 매우 빠르다.(sigmoid나 tanh보다 수렴속도가 6배정도로 훨씬 빠르다.)
  • 생물학적 타당성도 ReLU가 sigmoid보다 크다.
  • ImageNet 2012에서 우승한 AlexNet이 처음 ReLU를 사용하기 시작했다.
  • 문제점
    • 더 이상 zero-centered가 아니라는 점이다.
      • tanh가 이 문제는 해결했는데 ReLU는 다시 이 문제를 가지고 있게 된다.
    • 양의 수에서는 saturation이 되지 않지만 음의 경우에서는 그렇지 않다.
    • Dead ReLU가 발생되는 문제의 이유
      • initialization을 잘못한 경우
      • learning rate가 지나치게 높은 경우
4)Leaky ReLU
  • f(x) = max(0.01x, x)
  • ReLU와 유사하지만 음수 영역에서 더이상 0이 아니며, 여전히 계산이 효율적이어서 sigmoid나 tanh보다 수렴을 빨리 할 수 있다.
  • Dead ReLU가 없다!
5)Parametric ReLU
  • f(x) = max(alpha*x, x)
  • Leaky ReLU와 유사하게 음의 영역에서도 기울기를 가지고 있다는 것을 확인할 수 있다. 다만 alpha라는 파라미터를 정해 놓는 것이 아니라, backprob으로 학습시키는 점이 다르다.
6)Exponential Linear Units(ELU)
  • ReLU의 장점을 그대로 가져오는데, 추가적으로 zero-mean에 가까운 출력을 보여준다. zero-mean에 가까운 출력은 앞서 Leaky ReLU, PReLU가 가진 이점이있다.
  • 하지만 Leaky ReLU와 비교해보면 ELU는 negative에서 기울기를 가지는 것 대신 또 다시 saturation이 된다.ELU가 주장하는건 이런 saturation이 좀더 noise에 강인할 수 있다는 것이다.
  • ReLU와 Leaky ReLU의 중간 정도이다. Leaky ReLU처럼 zero-mean의 출력을 내지만 Saturation의 관점에서 ReLU의 특성도 가지고 있다.
6)Maxout “Neuron”
  • maxout는 ReLU와 leaky ReLU의 좀 더 일반화된 형태이다.
  • 선형함수이기 때문에 saturation되지 않으며 gradient가 죽지 않을 것이다.
  • 문제점은 뉴런당 파라미터의 수가 두배가 된다는 것이다. w1과 w2를 지니고 있어야하기 때문이다.

실제로 가장 많이들 쓰는 것은 바로 ReLU이다. 다만 ReLU를 사용하려면 learning rate를 아주 조심스럽게 결정해야 할 것이다. Leaky ReLU, Maxout, ELU와 같은 것들도 써볼 수 있지만 아직 실험단계이긴 하다. 여러분들의 문제에 맞춰 어떤 활성함수가 잘 동작하는지 확인해 볼 수 있을 것이다. tanh도 써볼 수 있지만, 대게는 ReLU, ReLU의 변종들이 좀 더 잘 동작한다고 생각하면 된다.

Data Preprocessing

가장 대표적인 전처리 과정은 zero-mean으로 만들고 normalize하는 것이다. 이런 과정은 왜 거치는 것일까? zero-centering은 가중치의 업데이트시에 좀 더 다양한 방향의 gradient를 얻기 위함이며, normalization을 해주는 이유는 모든 차원이 동일한 범위한에 있게 해줘 동등한 기여를 하게 하기 위해서이다. 이미지의 경우 실제로는 전처리로 zero-centering 정도만 해준다. 왜냐하면 이미지는 이미 각 차원간에 스케일이 어느정도 맞춰져 있기 때문에 normalization이 필요치 않기 때문이다. 다른 PCA나 whitening같은 더 복잡한 전처리 과정도 잘 사용치 않는다.

-AlexNet은 전체 이미지의 평균을 빼주는 방식으로 zero-centering을 해주지만 VGGNet은 각 채널별 평균을 빼주는 방식으로 진행한다. 이런 방식의 결저을 각자의 판단에 맡겨진다.

weight Initialization

모든 가중치를 0으로 세팅한다면 어떻게 될까? 가중치가 0이라서 모든 뉴런은 모두 다 같은 연산을 수행한다. 출력도 같을 것이고, 결국 gradient도 서로 같을 것이다. 모든 가중치가 똑같은 값으로 업데이트 된다. 이것이 모든 가중치를 동일하게 초기화시키면 발생하는 일이다. 위와 같은 문제들을 해결하기 위해 다음과 같은 방법들을 제시한다.

  • 표준 정규 가우시안 분포에서 임의의 작은 값으로 초기화한다.
    • 이 방법은 깊은 네트워크에서 문제가 생길 수 있다. 왜냐하면 가중치를 업데이트 하는데 있어서 가중치의 값이 작기 때문에 가중치가 0으로 수렴되는 상황이 발생될 수 있기 때문이다.

적절한 가중치를 얻는 것은 너무 어렵다. 너무 작으면 사라져버리고 너무 크면 saturation(가중치의 gradient가 0)이 되어버린다.

1)Xavier Initialization

-Standard gaussian으로 뽑은 값을 입력의 수로 스케일링해준다. 기본적으로 Xavier initialization가 하는 일은 입/출력의 분산을 맞춰주는 것이다.

  • 입력의 수가 작으면 더 작은 값으로 나누고 좀 더 큰 값을 얻는다. 더 큰 가중치를 얻는 이유는 작은 입력의 수와 가중치가 곱해지기 때문에 가중치가 커야만 출력의 분산 만큼 큰 값을 얻을수 있기 때문이다. 반대로 입력의 수가 많은 경우에는 더 작은 가중치가 필요하다. 각 레이어의 입력이 Unit gaussian이길 원한다면 이런 류의 초기화 기법을 사용해 볼 수있다. 이런 결과는 Linear activation이 있다고 가정하는 것이다. tanh의 경우를 예를 들면 active region안에 있다고 가정하는 것이다. 하지만 ReLU를 쓰면 잘 작동하지 않는다. ReLU는 출력의 절반이 0이되어 죽는다. 결국 출력의 분산을 반토막 내버린다. 그러므로 값이 너무 작아지는 것이다. 이런 문제를 해결하기 위해 추가적으로 2로 나눠주는 즉 입력의 반밖에 들어가지 않는 점을 추가해주는 방법을 사용하기도 한다.
2)Batch Normalization

gaussian의 범위로 activation을 유지시키는 것에 관련한 아이디어 중 하나이다. 우리는 layer로 부터 나온 activation의 값들이 Unit gaussian이기를 바란다. 가중치를 잘 초기화 시키는 것 대신에 학습 할 때 마다 각 레이어에 이런 일을 해줘서 모든 layer가 Unit gaussian이 되도록 해준다.

  • Batch size 만큼의 데이터에서 각 피처별로 평균과 분산을 계산한후 Normalization을 해준다. 이러한 연산은 Fully connected layer나 Conv Layer직후에 넣어준다. 깊은 네트워크에서 각 layer의 가중치가 지속적으로 곱해져서 Bad scaling effect가 발생했지만, Normalization은 그런 Bad effect를 상쇄시켜 버린다. Batch Normalization은 입력의 스케일만 살짝 조정해 주는 역할이기 때문에 Fully connected와 Conv layer 어디에든 적용가능하다. Conv layer에서 차이점이 있다면 Normalization을 차원마다 독립적으로 수행하는 것이 아니라 같은 Activation Map의 같은 채널에 있는 요소들은 같이 Normalize해 준다. 왜냐하면 Conv 특성상 같은 방식으로 normalize 시켜야 하기 때문이다. 즉, Conv Layer의 경우 Activation map(채널, Depth)마다 평균과 분산을 하나만 구한다. 그리고 현재 Batch에 있는 모든 데이터로 Normalize를 해준다. 이처럼 layer의 입력이 unit gaussian이 되도록 강제하는 것이다. tanh를 예시로 생각해 보면 입력데이터가 tanh로 인해 얼마나 saturation 될지를 조절하고 싶은 경우 같이 유연성을 줄 수도 있다. 학습가능한 감마와 베타를 통해 normalization 단계 이전으로 다시 복원 시켜주는 것과 같은 작업을 통해 유연성을 갖게할 수 있다. 때문에 batch 단위로 normalization을 일단 해주고 파라미터를 다시 학습시키는 것이다. 또한 Batch Normalization은 regularization의 역할도 한다. 각 layer의 출력은 해당 데이터 하나 뿐만 아니라 batch 안에 존재하는 모든 데이터들에 영향을 받는다. 더 이상 layer의 출력은 deterministic하지 않고 조금씩 바뀌게 되고 이는 regularization effect를 준다.

  • 우리가 입력을 강제로 gaussian 분포로 만들어 버리게 되면 기존의 구조를 잃는 것은 아닌지에 대한 의문이 생길 수 도 있다. 특히 CNN의 경우 입력의 공간적 특성을 유지시켜 계산하는 방법이므로 더 강한 의문이 들수도 있겠지만, 예를 들어 설명하자면 데이터의 전처리를 할 때도 gaussian을 사용하는데 그럴 경우도 모든 피처들을 가우시안 분포로 만든다고 해도 어떠한 구조도 잃어버리지 않는다. 단지, 데이터에 연산이 잘 수행되도록 선형변환(스케일링, 시프트)을 해주는 것이다.

  • 또한, shift와 scale요소를 추가시켜 학습을 시켜버리면 결국 identity mapping이 되서 Batch normalization이 사라지는 것이 아닌지의문이 들 수 있다. 실제로 감마와 베타를 학습시키게 되면 identity가 되지는 않는다. sift와 scale이 일정량 변하긴 하지만 보통은 identity mapping이 될 정도는 아니다. 그러므로 여전히 batch normalization의 효과를 얻을 수 있다.

  • Batch Noramalization에서 평균과 분산은 학습데이터에서 구한것이며, test시에는 추가적인 계산은 하지않는다.

  • 하이퍼 파라미터 최적화 시에는 Log scale로 값을 주는 것이 좋다. 파라미터 값을 샘플링할때 10^-3 ~10^-6을 샘플링하지 말고 10의 차수 값만 샘플링하는 것이 좋다. 최적의 값이 내가 정한 범위의 중앙 쯤에 위치하도록 범위를 잘 설정해 주는 것이 중요하다. 실제로는 grid search보다는 random search를 하는 것이 더 좋다. 왜냐하면 실제로는 어떤 파라미터가 더 중요할 수도 있는데 그러한 important variable에서 더 다양한 값을 샘플링 할 수 있기 때문이다.