Search
Duplicate

Weight Initialization

가중치를 어떻게 초기에 정하느냐에 라 모델의 학습 성능이 달라질 수 있다.

모든 가중치를 0으로 초기화

모든 뉴런은 모두 다 같은 연산을 수행하게 된다. 출력값도 같을 것이고 gradient도 서로 같아져 모든 가중치가 똑같은 값으로 업데이트된다. 모든 뉴런이 모두 똑같은 형태를 갖게 되어 Symmtric Breaking(가중치 설정을 잘못하여 모든 뉴런이 같은 연산을 수행해 출력도 같고, gradient도 같아 발생하는 문제)이 발생한다.

작은 랜덤 값으로 초기화

아래의 함수를 사용하여 평균=0, 표준편차=0.01인 가우시안 정규분포에서 랜덤하게 샘플링한 후, 0.01을 곱해 작은 수를 만들어준다.
W = 0.01 * np.random.randn(D, H)
Python
복사
Small data에서는 잘 동작하지만 activation 함수가 있는 Deep Network에서는 잘 작동하지 않는다.
레이어를 따라 진행할수록 평균은 그대로 0에 가깝지만 표준 편차는 1에서 0으로 계속 줄어들게 되고 모든 출력값이 0에 가까운 값을 갖는다. 때문에 backpropagation 단계에서 X가 엄청 작은 값이기 때문에 gradient도 작을 것이고 업데이트가 이루어지지 않게 된다.

큰 값으로 초기화

W = 1 * np.random.randn(D, H)
Python
복사
가중치가 큰 값을 가지므로 출력은 항상 saturation 될 것이다. X는 -1 또는 1로 수렴하고 gradient는 0을 갖게 되어 가중치 업데이트가 일어나지 않는다.

Xavier initialization

W = np.random.randn(D,H)/np.sqrt(D)
Python
복사
초기화 값을 input 뉴런의 수에 맞게 조정한다. input의 개수가 많아지면 크게 나눠주기 때문에 값이 작아지고, input의 개수가 적으면 weight 값이 커지게 된다. 이전 레이어에서 들어오는 input 뉴런의 수가 많다면 파라미터의 초기화값을 조금 더 낮춰 너무 큰값이 되지 않도록 조정하고 그 반대의 경우에는 초기화값을 조금 높히는 역할을 한다.
ReLU의 경우 음수부분이 모두 0이 되기 때문에 출력값, 평균, 표준편차가 모두 0으로 수렴하므로 gradient가 죽어, 분산이 반만 나와 분포가 줄어들기 때문에 같이 사용하지 않는 것이 좋다.