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)
위 식처럼 동작됨.
여기서 평균과 분산은 mini-batch의 각 디멘션에서 계산되는 것이고 와 는 학습 가능한 파라미터를 의미함. default는 는 1이고 는 0으로 셋팅되어있음.
그럼 이런 BatchNoramlization을 왜 사용하는건가 ?
batch-normalization이 등장한 이유는 우리가 deep neural network를 훈련시킬 때 발생하는 gradient vanishing 혹은 exploding graidents 문제를 해결하기 위해서 등장했다.
chain rule에 의해서 우리가 어떤 에러함수 에 대해 첫번째 레이어의 파라미터에 대한 gradient를 구하게 되면,
여기서 는 layer 에서의 node 의 activation값이다.
우측 항은 각 layer의 해당하는 Jacobian matrix의 요소들이다.
그런데 이렇게 많은 값들을 곱하게 됐을 때, magnitude가 1보다 작은 경우에는 0이될 가능성이 높고, 1보다 큰 경우 발산해 버리는 경우가 많다. 결과적으로 네트워크의 깊이가 깊어질수록 에러함수에 대한 gradient는 매우 크거나, 매우 작게 될 수 밖에 없다. Batch normalization은 이를 해결하고자 등장하였다.
num_features(int)
- 의 에 해당하는 값을 받음eps(float)
- numerical stability를 위해 분모에 더해주는 값 . Default=1e-5momentum(float)
- running_mean과 running_var를 계산하기 위한 값인데, None으로 셋팅하면 cumulative moving average(simple average)를 사용한다. default:0.1affine(bool)
- True로 셋팅하면 affine parameter가 learnable하다. (default : True)