안녕하세요, 이번 포스팅에서는 Weight Initialization에 대해서 배워보도록 하겠습니다.
위와 같은 신경망에서 초기 Weight값을 0으로 주는 것은 일반적으로 보입니다.
하지만 그렇게 된다면, 각 뉴런들이 학습을 할 때, 같은 역할을 하게 되며, gradient 또한 같아질 것입니다. (Same update)
저희가 신경망 모델을 사용하는 이유는 각 뉴런별로 y를 예측하는 데 있어서 가중치를 주어서 어떠한 Feature가 y의 예측에 가장 중요한지를 파악하는데 있는데, 이러한 역할이 없어지는 것이지요.
즉, 신경망 학습에 있어서 초기 Weight에 어떠한 값을 주느냐는 중요한 문제로 받아들여집니다.
이 문제에 대해 첫번째로 제시된 방법은 다음과 같습니다.
바로 Small random numbers를 초기의 Weight 값으로 주는 것입니다.
이 때 random number는 평균 0, 표준편차 0.01을 따르는 Gaussian 분포에서 발생시킵니다.
하지만 이러한 방법은 shallow network에서는 잘 작동하지만, deep network에서는 문제가 발생합니다.
예를 들어서, 10개의 Layer를 가지는 network에서 층이 깊어질수록 weight들이 곱해지므로 평균은 0에 수렴하지만, 표준편차마저 점점 줄어들어 0으로 수렴하게 됩니다. 즉, 모든 값들이 0으로 수렴한다는 것입니다. 즉 back propogation에서 업데이트 할 때, Input 값들이 애초에 너무 작아서, gradient가 매우 작아 Weight들의 업데이트가 거의 발생하지 않게됩니다.
반면에, 표준편차를 0.01이 아닌 1을 주면 어떻게 될까요?
위의 그림과 같이 Weight 값들이 1아니면 -1로 매우 치우쳐지게 됩니다. Gradient가 0으로 수렴하게 되고, update가 발생하지 않는 문제가 발생합니다.
이 처럼 초기 Weight 값을 너무 작게주어도 문제가 있고, 그렇다고 크게 주어도 문제가 발생합니다.
이를 해결하기 위한 방법이 2010년에 Glorot에 의해서 제시가 되게 됩니다. (Xavier Initialization)
이 방법은 이전 노드와 다음 노드의 개수에 의존하는 방법입니다.
Input 노드의 수가 적으면 Weight를 크게하여 output에 같은 큰 Variance를 가지게 하며, 노드의 수가 많으면 Weight를 작게하여 output에 같은 작은 Variance를 가지게 합니다.
즉 input variance와 output variance를 최대한 일정하게 만드는 방법입니다.
하지만 Xavier Initialization은 Relu 활성화 함수에서는 잘 작동하지 않고, 0으로 수렴하는 문제가 발생합니다.
이러한 문제를 해결하기 위해서 2015년에 He 라는 사람이 He Initialization을 발명합니다.
'데이터 다루기 > 신경망' 카테고리의 다른 글
[신경망] 13. Regularization (0) | 2019.06.04 |
---|---|
[신경망] 12. Batch Normalization (0) | 2019.06.04 |
[신경망] 10. Parameter Search Method (0) | 2019.06.04 |
[신경망] 9. Deep Learning (0) | 2019.06.03 |
[신경망] 8. 오토인코더 (AutoEncoder) (2) (1) | 2019.06.03 |