가중치 초기화

꼼댕이·2023년 3월 17일
0

pytorch

목록 보기
5/7

가중치 초기화 이유

가중치의 초깃값을 무엇으로 설정하느냐가 신경망 학습에 영향을 많이 끼친다.

각 neuron의 가중치를 기반으로 error를 결정하기 때문이고, 정확한 모델을 얻으려면 작은 error를 필요로 하기 때문


Weight decay

  • weight decay(가중치 감소) 기법은 overfitting을 억제해 성능을 높이는 기술

loss functiondp L2 norm과 같은 penalty를 추가하는 정규화 기법, bias가 아닌 weight에만 decay를 적용하는 것을 선호

  • overfitting 방지
  • weight를 작게 유지 -> gradient exploding 방지

zero initialization

결론적으로 0으로 초기화하게 되면 안됨
-> neuron이 training 중에 동일한 feature를 학습하기 때문

순전파 때 입력의 모든 가중치가 0이라면 두 번째 층 neuron도 똑같은 값이 전달되며, backpropagation에서 모든 weight의 값이 모두 똑같이 바뀌게 되는 것을 의미함.

model을 만들 때 어떻게 가중치 초기화 하는지 대충..

가중치 초기화 방법에는

  • nn.init.normal_(m, 0, 0.01)
  • nn.init.constant_(m, 0)
  • nn.init.xavier_uniform_(m.weight) & nn.init.xavier_normal_(m.weight)
    등... 이 있다

normal_은 말 그대로 normal distribution (정규분포)를 따르게 하는거고 일반적으로 weight를 초기화하기 위해 씀
ex) nn.init.normal_(m.weight, 0, 0.01)

constant_은 fill 0와 비슷한 느낌으로 쉽게 null값을 parameter 값으로 채워준다고 생각하면 됨, 흔히 bias를 초기화할 때 사용
ex) nn.init.constant_(m.bias, 0)

xavier_uniform_은 이전 노드 수와, 다음 노드 수를 고려해서 최적화하는 방법인데 비선형 함수인 sigmoid, tanh 에서 효과적인 모습을 보여줌

그러나 ReLU를 사용할 때는 출력값이 0으로 수렴하는 현상을 보여줘 ReLU에서는 사용하지 않는다.

-> 이 땐 He initialization을 사용하는데 nn.init 라이브러리 안에는 He가 따로 구현이 안돼있는 것 같아서 나중에 찾아보던가 일단은 pass..

profile
사람을 연구하는 공돌이

0개의 댓글