배치 정규화 (Batch Normalization) 란?
배치 정규화는 2015년 arXiv에 발표된 후 ICML 2015에 게재된 아래 논문에서 나온 개념이다.
‣
Gradient Vanishing / Exploding 문제
학습을 시킬 때, 파라미터 값의 작은 변화가 신경망 출력에 얼마나 영향을 미칠 것인가를 Gradient로 정의한다. 그런데 Gradient 값이 매우 작아지거나(Vanishing) 커진다면(Exploding) 신경망을 효과적으로 학습시키지 못하고, Error rate가 낮아지지 않고 수렴해버리는 문제가 발생한다.
이러한 문제를 해결하기 위해 sigmoid나 tanh 등의 활성화 함수들은 비선형적인 방식으로 입력값을 작은 출력 값의 범위로 squash 해버리는데, 이렇게 출력의 범위를 설정할 경우 매우 넓은 입력값의 범위가 극도로 작은 범위의 결과 값으로 매핑된다. (가령, sigmoid 함수의 경우 0~1 사이의 값을 갖는다.)
이러한 현상은 여러 활성화 함수들을 거치며 더욱 악화되며, 첫 레이어의 입력 값에 대해 매우 큰 변화량이 있더라도 결과 값의 변화량은 극소가 되어버리는 결과를 낳는다.
이러한 문제점을 해결하기 위한 방법들은 아래와 같다.
- 활성화 함수 변경 : 활성화 함수 중 ReLU와 같은 이와 같은 문제점을 해결한 활성화 함수를 사용한다.
- 가중치 초기화 : 가중치 초기화를 할 때 He Initialization과 같은 방식을 사용한다.
- 작은 learning rate : Gradient Exploding 문제를 해결하기 위해 작은 learning rate 값을 사용한다
위와 같은 방법을 사용하여 문제를 해결하는 것도 좋지만, “학습하는 과정 자체를 전반적으로 안정화”하여 학습 속도를 가속시킬 수 있는
배치 정규화(Batch Normalziation)
를 사용하는 것이 좋다.이는 위와 마찬가지로 Gradient Vanishing / Gradient Exploding을 방지하기 위해 고안되었다.
정규화 (Normalization)
그렇다면 우선 정규화를 왜 해야 되는지 직관적으로 이해해보자.
정규화는 학습을 더 빨리 하기 위해서 or Local optimum에 빠질 가능성을 줄이기 위해서 사용한다.
아래의 그림을 보면 직관적으로 이해할 수 있을 것이다. 왼쪽의 그림을 오른쪽으로 바꾸어 Local optimum에 빠질 가능성을 낮추게 된다.
내부 공변량 변화 (Internal covariate shift)
Batch Normalization을 처음 제안한 논문의 저자들은 DNN이 학습하기 어려운 이유를 각 layer의 입력의 분포가 이전 layer들의 parameter가 변화하면서 함께 계속 변화하는 성질을 가지고 있기 때문이라고 주장한다. (이는 추후 반박되었지만, 후술하도록 하겠다.)
이러한 성질을 Internal covariate shift라고 한다. Batch Normalization은 layer의 output인 feature map을 normalize하여 이 문제를 해결하고자 했다.
Batch Normalization 배치 정규화 알고리즘 설명
위에서 언급했듯 각각의 layer의 input의 distribution이 이전 layer들을 거치면서 변화하는 것을 막기 위해 출력물을 다음 층에 입력하기 전에 평균 0, 표준편차 1로 normalize할 수 있다. (이를 whitening이라고 한다.)
하지만 N(0, 1)로 normalize할 경우 activation function의 비선형성이 없어질 수 있다.
예를 들어, sigmoid 함수의 경우 입력이 N(0, 1)이므로 95%의 입력은 sigmoid 그래프의 (-1.96, 1.96) 구간에 속하게 되고, 이 부분이 선형이기 때문이다. (이해가 안될 시, 정규분포에 대해 찾아보기를 바란다.)
이렇게 비선형성을 잃게 되면, 복잡한 데이터를 학습시킬 수 없게 된다.
또한, 입력을 항상 N(0, 1)로 normalize할 필요는 없다. 적당한 scaling factor를 사용하면 적절한 모양으로 입력 분포를 조정할 수 있다.
Z = WX+b라고 했을 때, 이를 normalize하기 위해 Z-E(Z)를 하게 되면 parameter b의 영향은 완전히 무시하게 된다.
이를 해결하기 위해 b를 대신하는 parameter β를 추가하게 된다.
β가 normalization을 통해 상쇄되는 b의 역할을 대신 하고, γ가 scaling factor로 적용된다.
원 논문 저자는 normalization을 mini-batch의 평균과 분산을 이용해서 normalize 후, scale and shift를 γ와 β를 통해 실행하는 것으로 설명하였다.
이렇게 정규화 된 값을 활성화 함수의 입력으로 사용하고, 최종 출력 값을 다음 레이어의 입력으로 사용하는 것이다.
기존 output = g(Z), Z = WX+b의 식을 output = g(BN(Z)), Z = WX+b로 변경하는 것이다.
Inference with Batch Normalization
위의 내용은 학습까지의 Batch normalization의 적용이다. 학습 시에는 mini-batch의 평균과 분산을 이용했지만, inference 혹은 test 시에는 이를 이용할 수 없다.
inference 시에 입력되는 데이터의 평균과 분산을 이용하면 batch normalization이 온전하게 이루어지지 않는다.
애초에 batch normalization을 통해서 하고자 하는 것은 학습동안 모델이 추정한 입력 데이터 분포의 평균과 분산으로 normalization을 하고자 하는 것인데, inference 시에 입력되는 값을 통해서 normalization을 하면 모델이 학습을 통해서 입력 데이터의 분포를 추정하고자 하는 의미가 없어지게 된다.
논문의 저자는 이러한 문제를 미리 저장해둔 mini-batch들의 이동 평균을 사용해 해결한다.
다음은 길이가 2인 경우의 이동평균의 예시이다.
입력값 | 100 | 110 | 130 | 120 | 140 | 110 | 130 |
이동평균 | 100 | 105 | 120 | 125 | 130 | 125 | 120 |
Batch Normalization with CNN
Convolution 구조의 네트워크에서는 적용방법이 약간 다르다. Convolution layer에서 activation function에 입력되기 전에 Wx+b로 weight가 적용되었을 때, b의 역할을 β가 완벽히 대신 할 수 있기 때문에 b를 삭제한다. 또한, CNN의 경우 convolution의 성질을 유지시키고 싶기 때문에, 각 channel마다 각각의 γ, β를 만든다.
예를 들어 mini-batch size 가 m, channel size 가 n 인 Convolution Layer에서 Batch Normalization을 적용하면, convolution을 적용한 후의 feature map의 사이즈가 p x q 일 경우, 각 channel 에 대해 m x p x q 개의 스칼라 값(즉, n x m x p x q 개의 스칼라 값)에 대해 평균과 분산을 구한다. 최종적으로 γ, β 는 각 channel 에 대해 한개 씩, 총 n개의 독립적인 Batch Normalization 변수쌍이 생기게 된다.
본 글은
‣
‣
위 글들을 참고하였습니다. (_ _)