딥러닝 Normalization (Batch Normalization, Layer Normalization, Instance Normalization, Group Normalization 비교)
이번 게시물에서는 딥러닝에서 중요한 개념인 Normalization에 대해 정리해보자. Network를 구성할 때 layer의 앞 또는 뒤에 추가되는 normalization의 필요성에 대해 정리하고, 다양한 normalization 방법에 대해 차이점 위주로 간단하게 정리해 보자.
Normalization 이란?
Normalization이란 데이터의 값을 특정 범위로 scaling 하는 것을 의미한다. 입력 데이터를 딥러닝 모델에 넣기 전에, 전처리로 normalization을 수행하는 것은 일반적인 방법이다. 이렇게 입력 데이터를 특정 범위로 scaling하는 이유는 데이터 feature에 따라 범위가 다르기 때문이다.
Network의 출력은 각 feature vector의 linear combination이다. 아래의 그림처럼 각각 다른 scale을 가지는 두개의 feature에 대해 network를 학습시킨다는 것은 network가 서로 다른 scale을 가지는 feature에 대한 weight를 학습한다는 것을 의미한다. 비교적 큰 scale을 가지는 feature에 작은 scale을 가지는 feature가 묻히는 현상이 발생할 수 있다.
이미지 출처: https://towardsdatascience.com/batch-norm-explained-visually-how-it-works-and-why-neural-networks-need-it-b18919692739
아래의 그림은 gradient descent의 관점에서 noramlization을 수행하지 않았을 경우 발생하는 문제점이다. 아래와 같이 두 가지 상황에 대해 살펴보자. 첫 번째 그림과 같은 경우에는 두 feature 중 $\text{W}_2$의 scale이 $\text{W}_2$의 scale 보다 확연히 넓은 범위를 가지고 있는 것을 볼 수 있다. 이러한 경우는 SGD 관점에서 확연히 $\text{W}_2$ 축 방향 위주로 gradient를 계산하게 된다. 이렇게 한 차원을 중심으로 이동하게 되므로 빠르게 수렴하지 못하고 더 많은 단계를 거쳐야한다.
두 feature가 동일한 scale을 가지는 두 번째 그림의 경우 loss landscape는 더 균일해지고, 비교적 완만하게 minimum으로 도달할 수 있다.
Normalization의 필요성에 대해 이해했으므로, 다음으로 입력데이터가 아니라 hidden layer에서 feature를 특정 범위로 scaling하는 Batch Normalization의 필요성에 대해 알아보자.
(Batch) Normalization의 필요성
앞서 언급했듯 입력 데이터 normalization은 network의 수렴을 빠르게 진행하는 장점이 있다.
그렇다면 hidden layer의 feature에 대해서는 왜 normalizatioin이 필요할까?
앞서 네트워크 입력 데이터에 대해서는 일정한 scale을 갖도록 조정해 주었다. 하지만 Network 내부에서 hidden layer를 거쳐 나오는 feature는 layer마다 또 다른 분포 특성을 갖게 된다. 이러한 현상을 Internal Covariate Shift라고 부른다.
Internal Covariate Shift
Internal Covariate Shift 현상은 아래 그림과 같이 layer 별로 입력되는 값의 분포가 달라지는 현상을 의미한다. Batch 단위로 학습을 진행하면 각각의 batch에 대해서 데이터 분포의 차이가 발생할 수 있다. 이렇게 batch마다 데이터 분포가 달라지면 각 layer에서는 다양한 분포에 대해 학습해야하고, 학습의 복잡성을 증가시킬 수 있다.
즉, 입력 데이터에 적용한 원리와 동일한 방법이 hidden layer에서도 적용됨으로서 학습의 안정성이 증가하고 SGD가 더 잘 수렴될 수 있다. 따라서 Batch norm과 같은 방법을 통해 입력 데이터에 사용한 것과 마찬가지로 hidden layer에서도 normalization을 진행하게 된다.
방법은 동일하게 평균과 분산을 이용하여 진행하지만, 여기서 학습 가능한 affine parameter $\beta$와 $\gamma$가 추가된다는 차이점이 있다. Normalization 공식은 다음과 같다.
다음으로는 다양한 normalization 방법에 대해 알아보자. 이 방법들은 기본적으로 hidden layer 입력(feature)에 대해 평균, 분산을 사용하여 normalization하는 것은 동일하다. 단, 평균과 분산을 어떤 단위로 구할건지가 차이점이라고 볼 수 있다. 각각의 방법에 대한 차이점 위주로 알아보자.
Batch Normalization
Batch Normalization📄은 2015년 ICML에 발표되었다.
Gradient를 구하여 network를 업데이트 할 때, 전체 학습 데이터에 대해 한번에 gradient를 구하고 평균/분산을 구하는 것은 불가능하기 때문에 일반적으로 학습시에 batch 단위로 업데이트를 진행하게 된다(stochastic gradient descent).
마찬가지로 normalization을 위한 평균과 분산은 전체 데이터 집합에 대해 계산되어야하지만, 이것은 불가능하므로 Batch normalization에서는 전체를 대표하는 집합으로 Batch가 사용된다(따라서 이를 mini-batch statics라고 한다).
즉, Batch가 전체를 대표하는 집합이 되고, 각각의 Batch 별로 평균과 분포를 계산한다.
Batch가 전체를 대표하는 집합이되므로 이론적으로는 Batch size가 클수록 좋다. 하지만 SGD 관점에서, local minima에 빠지거나 수렴속도가 느려지는 문제가 발생할 수 있으므로 실제 사용에서는 Batch size가 클수록 좋은 것은 아니다.
Batch Normalization의 Inference
Training
각 mini-batch에서 mean, std를 구해 정규화를 진행하면 된다. → mini-batch statics
- parameter
- $\gamma, \beta$: $\gamma=1, \beta=0$으로 초기화되고, backprop을 통해 점차 학습된다.
- $\mu, \sigma$: mini-batch의 mean, std(학습되는 값 아님. 각각의 batch에서 계산).
Inference
Training에서는 각 mini-batch의 평균, 분산을 구하면 되지만 inference시에는 batch 단위로 계산하지 않으므로, 평균과 분산을 구할 수 없다. 따라서 training 시에 각 mini-batch에서의 평균과 분산을 사용하고 버리는 것이 아니라, moving average를 사용하여 이 값을 축적한다(매 mini-batch마다 업데이트된다). 각각의 batch에서 구한 값이 전체 데이터에 대해 계산되므로, inference시에는 mini-batch statics가 아닌 pouplar statics를 사용한다고 볼 수 있다.
- parameter
- $\gamma, \beta$: training 시에 backprop을 통해 학습된 값.
- $\mu, \sigma$: training 시에 moving average로 계산된 mean, std
문제점
- Batch Normalization은 training 중에 mini-batch statics를 사용하고 inference 중에 popular statics로 대체하여 계산하므로 training - inference 사이에 불일치가 발생한다.(이를 해결하기 위한 Batch Renormalization등의 방법이 있음)
- Batch size를 키우기 어려운 RNN과 같은 계열에서는 좋은 성능을 기대하기 어렵다.
Layer Normalization
다음은 2016년 발표된 Layer Normalization📄이다. 기본적으로 Normalizaiton을 진행하는 공식은 동일하므로 앞의 방법과 비교하여 평균과 분산을 구하는 집합에 대한 차이점 위주로 간단하게 이해해보자.
Layer Normalization은 평균과 분산을 batch 차원이 아닌, feature 차원으로 계산한다. BN이 채널별 평균, 분산($\mu, \sigma$)라고 한다면, LN은 데이터별 평균, 분산($\mu, \sigma$)이라고 볼 수 있다. 수식으로는 아래와 같다.
LN은 batch size와 관계 없이 동작하므로, batch size를 키우기 어려운 RNN과 같은 구조에서 좋은 성능을 보인다.
Instance Normalization
마찬가지로 2016년 발표된 Instance Noramlization📄은 Layer Normalization과 비슷하지만, 각각 filter(Channel)에 관계없이 따로 정규화된다. 즉, feature의 각 channel에 HW에 대해서만 정규화가 진행되므로, Contrast Normalization의 효과를 얻을 수 있다고 보면 된다. 수식적으로는 아래와 같다.
이러한 효과 때문에 Style Transfer와 같은 task를 수행할 때 주로 사용된다. Style transfer에서는 아래 그림과 같이 Content image를 Style image의 텍스처나 화풍으로 변환하는 것을 의미하는데, 이 때 content image는 구조적인 부분이 중요하고 contrast에 의존하지 않아야한다. 따라서 이러한 Task에 IN이 효과적으로 동작한다고 볼 수 있다.
마찬가지로, Class label이 입력 이미지의 명암(intensity)에 의존하지 않아야 하는 이미지 분류에도 IN이 사용된다.(e.g.밤이나 낮에 촬영한 이미지라고 해도 강아지는 여전히 강아지인 것과 같은 문제)
Group Normalization
앞서 BN은 feature map의 mean, std를 batch 단위로 계산해서 정규화를 진행한다. 이 때, 계산되는 mean, std는 batch 안의 데이터만 이용해서 계산되지만, batch가 충분히 크다면 이 mean, std가 데이터셋 전체의 mean, std를 대표할 수 있다는 가정을 전제로 한다.
하지만 BN은 batch의 크기가 작으면 이 가정을 만족시키기 어렵고, 구해지는 mean, std도 매 iteration(각 mini-batch)마다 달라지게 된다. 이러한 문제를 해결하기 위해 나온 방법이 Group Normalization이다.
2018년 ECCV에 Group Normalization📄 논문이 발표되었으며, 형태적으로 IN과 LN이 절충된 형태라고 볼 수 있다. IN과 LN은 Batch size에는 독립적으로 동작하지만, Visual Recognition 분야에서는 좋은 성능을 보장하지 않았다.
Group Normalization에서는 각 채널을 N개의 “그룹” 단위로 나눠서 정규화를 진행한다. 채널당 그룹의 수 G는 hyperparameter이다. 여기서 G=1(그룹이 1개)이면 IN과 동일, G=C(그룹수가 채널수와 동일)인 경우 LN과 동일해진다. 평균과 분산에 대한 식은 아래와 같다.
만약 channel=6이고, group=2이면 한 그룹당 채널 수는 3개인 것이다. Group Normalization은 Visual Recognition task에서 Batch size=32에 대해 BN과 비슷한 성능을 보이고, Batch size가 32이하인 경우에 대해서는 BN보다 좋은 성능을 보인다고 한다.
Reference
[1] https://www.jeremyjordan.me/batch-normalization/
[2] https://towardsdatascience.com/batch-norm-explained-visually-how-it-works-and-why-neural-networks-need-it-b18919692739
[3] https://gaussian37.github.io/dl-concept-batchnorm/