코딩 및 기타

He( kaiming ) 정규분포

정지홍 2025. 9. 26. 10:57

He 정규분포

  • 가중치를 초기화할 때 사용하는 분포방식 중 하나다.
  • 주로 ReLU 계열의 활성화 함수와 감께 사용한다.
    • ==> 즉, ReLU 활성화에서 가중치 W를 정규분포로 초기화할때 사용ㅇ.

fan in은 입력 계층의 노드 수.

  • Kaiming initailzation은 입력 계층의 노드수에 기반해서, 평균이 0이면서,
  • 왜 쓰나?
    • 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)
  • import torch.nn as nn
    • pytorch의 신경망 모듈을 불러오는데, 네임스페이스를 nn으로 설정.
  • def he_normal( module : nn.Module )
    • 매개변수 이름은 module이다.
    • (예상되는) 타입은 nn.Module이다.
    • 즉, "module이라는것을 입력받는데, 들어오는 타입은 nn.Module이야."라는 의미.
  • if isinstance( module , nn.Conv2d ):
    • 현재 module이 Conv2d인지 확인한다. ( 다른 모듈에 적용되는 것을 막기 위해서 )
  • nn.init.kaiming_normal_
    • kaiming_normal"in-place"로 가중치 텐서를 HE(=Kaiming)정규분포로 초기화한다.
      • in-place는 새 텐서를 만들지않고, 기존 텐서(혹은 모듈 파라미터)의 값을 바로 덮어쓰는 동작을 말함.
    • mode=fan_in ==> 입력 채널 기준(fan_in) 분산 유지.
      ReLU류 활성함수와 함께 사용할때, forward시에 분산이 유지되도록 설계
    • nonlinearity='relu' ==> 활성화 함수는 relu
    • module.weight는  [ out_channels , in_channels , kernel_h , kernel_w ] 모양의 Conv 필터 가중치이다.
    • ==> 즉, 해당 문장은 Conv2d 가중치에 He 정규 초기화 적용(제자리 변경),
  • if module.bias is not None
    • 일부 conv2D는 bias=False로 생성될 수 있어서, 존재할때만 안전하게 초기화.
  • nn.init.zeros_
    • 바이어스를 0으로 초기화.( 학습 초기에 출력 편향을 없애서, 안정적인 시작을 유도 ) 

 

 

 

'코딩 및 기타' 카테고리의 다른 글

YNet train코드  (0) 2025.10.29
YNet 코드  (0) 2025.10.17
ELBO( evidence Lower Bound )  (1) 2025.09.22
kullback-Leibler divergence , 쿨백-라이블러 발산  (0) 2025.09.14
VAE , Variational AutoEncoder , CVAE  (0) 2025.09.14