[pytorch]nn.BatchNorm2d()

ma-kjh·2024년 3월 2일
0

Pytorch

목록 보기
15/20

BatchNorm2d는 4D input (a mini-batch of 2D inputs with additional channel dim)에 적용되는데, Internal Covariate Shift는 줄여주는 역할을 한다고 함.

코드는 아래와 같이 동작 시킬 수 있음

torch.nn.BatchNorm2d(num_features, eps=1e-05, momentum=0.1, affine=True,
track_running_stats=True, device=None, dtype=None)
y=xE[x]Var[x]+ϵγ+βy = {x-\text{E}[x]\over{\sqrt{\text{Var}[x]+\epsilon}}}*\gamma+\beta

위 식처럼 동작됨.

여기서 평균과 분산은 mini-batch의 각 디멘션에서 계산되는 것이고 γ\gammaβ\beta는 학습 가능한 파라미터를 의미함. default는 γ\gamma는 1이고 β\beta는 0으로 셋팅되어있음.

그럼 이런 BatchNoramlization을 왜 사용하는건가 ?

batch-normalization이 등장한 이유는 우리가 deep neural network를 훈련시킬 때 발생하는 gradient vanishing 혹은 exploding graidents 문제를 해결하기 위해서 등장했다.

chain rule에 의해서 우리가 어떤 에러함수 EE에 대해 첫번째 레이어의 파라미터에 대한 gradient를 구하게 되면,

Ewi=mljzm(1)wizj(K)zl(K1)Ezj(K){\partial{E}\over{\partial{w_i}}}=\sum_m\cdots \sum_l \sum_j {\partial{z_m^{(1)}}\over{\partial{w_i}}}\cdots {\partial{z_j^{(K)}}\over{\partial{z_l^{(K-1)}}}} {\partial{E}\over{\partial{z_j^{(K)}}}}

여기서 zj(k)z_j^{(k)}는 layer kk에서의 node jj의 activation값이다.
우측 항은 각 layer의 해당하는 Jacobian matrix의 요소들이다.

그런데 이렇게 많은 값들을 곱하게 됐을 때, magnitude가 1보다 작은 경우에는 0이될 가능성이 높고, 1보다 큰 경우 발산해 버리는 경우가 많다. 결과적으로 네트워크의 깊이가 깊어질수록 에러함수에 대한 gradient는 매우 크거나, 매우 작게 될 수 밖에 없다. Batch normalization은 이를 해결하고자 등장하였다.

  • num_features(int) - (N,C,H,W)(N,C,H,W)CC에 해당하는 값을 받음
  • eps(float) - numerical stability를 위해 분모에 더해주는 값 . Default=1e-5
  • momentum(float) - running_mean과 running_var를 계산하기 위한 값인데, None으로 셋팅하면 cumulative moving average(simple average)를 사용한다. default:0.1
  • affine(bool) - True로 셋팅하면 affine parameter가 learnable하다. (default : True)
  • track_running_stats - True로 셋팅하면 running mean이랑 variance를 tracking함. (default True)
profile
거인의 어깨에 올라서서 더 넓은 세상을 바라보라 - 아이작 뉴턴

0개의 댓글