🖥️ 컴퓨터 싸이언스

딥러닝 | 가중치 초기화? (Weight Initialization)

노바깅 2023. 5. 16. 21:55

 딥러닝은 손실 함수를 최소화 하는 모델의 파라미터 즉, 모델의 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 버전으로!)