코딩 및 기타
He( kaiming ) 정규분포
정지홍
2025. 9. 26. 10:57
He 정규분포
- 가중치를 초기화할 때 사용하는 분포방식 중 하나다.
- 주로 ReLU 계열의 활성화 함수와 감께 사용한다.
- ==> 즉, ReLU 활성화에서 가중치 W를 정규분포로 초기화할때 사용ㅇ.

- 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 정규 초기화 적용(제자리 변경),
- kaiming_normal은 "in-place"로 가중치 텐서를 HE(=Kaiming)정규분포로 초기화한다.
- if module.bias is not None
- 일부 conv2D는 bias=False로 생성될 수 있어서, 존재할때만 안전하게 초기화.
- nn.init.zeros_
- 바이어스를 0으로 초기화.( 학습 초기에 출력 편향을 없애서, 안정적인 시작을 유도 )