딥러닝 | 가중치 초기화? (Weight Initialization)
딥러닝은 손실 함수를 최소화 하는 모델의 파라미터 즉, 모델의 weight 값을 알아내는 것이다. 일반적으로 gradient descent 알고리즘을 사용하는데, gradient descent 알고리즘은 initial point가 꽤나 중요하다. 이번에는 가중치를 초기화 하는 몇 가지 방법에 대해 정리하려 한다.
일단, 만약 표준정규분포(평균 0, 표준편차 1)를 이용해서 랜덤하게 weight를 초기화 하면 어떻게 될까? 레이어를 지날수록 점점 weight 값이 커지고 분산도 커진다. 이는 활성 함수를 통과하면 saturation 될 가능성이 높아지고 학습이 더 이상 진행이 되지 않는다. 그렇다고 평균은 0, 표준 편차가 0.01인 분포를 이용해서 초기화를 하면 어떻게 될까? 레이어를 지날수록 점점 weight 값이 작아지고 이 역시 더 이상 학습이 어려워진다. 따라서 우리는 input의 분산과 output의 분산이 동일했으면 하는 것이고 따라서 weight의 분산이 [yellow]$1/n$[/yellow] 가 되기를 원한다! (n은 input 차원이라고 생각하면 될 듯)
자비에르 초기화 (Xavier Initialization)
weight들이 먼저 평균이 0이고 표준편차가 1인 랜덤 가우시안 분포로 만들어진다. 그 다음, weight를 $1 / \sqrt{n}$ 으로 나눠준다.
허 초기화 (He Initialization) 또는 카이밍 초기화 (Kaiming Initialization)
ReLU와 함께 사용한다고 한다. ReLU 함수를 생각해보면 확률적으로 input의 절반은 0이 된다. 즉, variation이 줄어든다. 사실상 전체 weight 중 절반만 사용되니, 자비에르 초기화와는 다르게 [yellow]$1 / \sqrt{n/2}$[/yellow] 로 나눠준다.
참고로, Pytorch의 CNN이나 layer의 default 초기화 법이라고 알고 있다. (정규분포는 아니고 uniform 버전으로!)