Kaiming initailzation은 입력 계층의 노드수에 기반해서, 평균이 0이면서, σ는 √(2/fan_in)이다.
왜 쓰나?
ReLU계열 활성화 함수와 깊은 신경망에서 gradient vanishing현상을 효과적으로 완화하고, 효휼적인학습을 가능하게 하기 때문...
ReLU는 입력의 음수 구간에서 0이 되기 때문에, 일반적기 초기화 방식은 계층이 깊어질수록 분산이 줄어들어, 기울기가 빠르게 소실된다.
He 초기화는 분산을 2/n으로 키워서, 신호와 기울기의 분산이 계층을 지나도 유지되도록 만든다.
이를 통해서 깊은 네트워크에서도 빠르고 안정적으로 학습할 수 있다.
==> 즉, He 정규분포 초기화는 ReLU계열에서 학습 불안정과 기울기 소실을 효과적으로 막아주기에 많이 사용함.
import torch.nn as nn
def he_normal_(module: nn.Module):
if isinstance(module, nn.Conv2d):
nn.init.kaiming_normal_(module.weight, mode='fan_in', nonlinearity='relu')
if module.bias is not None:
nn.init.zeros_(module.bias)
importtorch.nn asnn
pytorch의 신경망 모듈을 불러오는데, 네임스페이스를 nn으로 설정.
defhe_normal( module : nn.Module )
매개변수 이름은 module이다.
(예상되는) 타입은 nn.Module이다.
즉, "module이라는것을 입력받는데, 들어오는 타입은 nn.Module이야."라는 의미.
if isinstance( module , nn.Conv2d ):
현재 module이 Conv2d인지 확인한다. ( 다른 모듈에 적용되는 것을 막기 위해서 )