Machine Learning/Theory

[개념 정리] Batch Normalization in Deep Learning - part 1.

족제비다아 2021. 5. 11. 17:06

딥러닝을 공부하다 보면 자주 접하는 이론적인 내용이자 실제 구현에서도 라이브러리를 이용하여 쉽게 Layer로 추가하여 사용하는 Batch Normalization에 대해 알아보자.

 

개요

ICML 2015에 한 논문이 등장했다.

"Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift" - Sergey loffe and Christian Szegedy[1]

 

Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

Training Deep Neural Networks is complicated by the fact that the distribution of each layer's inputs changes during training, as the parameters of the previous layers change. This slows down the training by requiring lower learning rates and careful param

arxiv.org

이는 딥러닝에서 hidden layer의 데이터들을 정규화하는 방법에 대한 논문으로 다음과 같은 성능 향상을 보여주었다.

  • 학습 속도(training speed)를 빠르게 할 수 있다.
  • 가중치 초기화(weight initialization)에 대한 민감도를 감소시킨다.
  • 모델 일반화(regularization)효과가 있다.

이 논문이 발표된 이후로 대부분의 딥러닝 학습에  Batch Normalization은 선택이 아닌 필수가 되었다. 물론 한계점도 존재한다.

  • 이름 그대로 batch size로 normalization을 하기 때문에 batch size의 크기가 성능에 영향을 준다.
  • RNN과 같이 sequential 데이터를 처리하는 경우에 BN을 적용시키기 어렵다. 

그러면 Batch Normalization(BN)이 어떻게 나오게 되었고 어떻게 작동하는 것일까?

 

Covariate Shift

Covariate shift는 공변량 변화라고 부르며 입력 데이터의 분포가 학습할 때와 테스트할 때 다르게 나타나는 현상을 말한다. 이는 학습 데이터를 이용해 만든 모델이 테스트 데이터셋을 가지고 추론할 때 성능에 영항을 미칠 수 있다.

예를 들어, 고양이와 강아지를 분류하는 모델을 학습시킬 때 학습 데이터로 고양이 이미지를 '러시안 블루'종만 사용하고 테스트 데이터로 '페르시안'종의 고양이를 분류하려고 한다면 모델은 잘 학습할 수 있을까? 학습 데이터의 분포와 테스트 데이터의 분포가 다르기 때문에 학습시킨 모델의 분류 성능은 떨어질 것이며 이처럼 학습 데이터와 테스트 데이터의 분포가 다른 것을 covariate shift라 부른다.

covariate shift 예시

Internal Covariate Shift

위에서 언급한 Covariate Shift(공변량 변화)가 뉴럴 네트워크 내부에서 일어나는 현상을 Internal Covariate Shift라고 한다. 즉, 매 스텝마다 hidden layer에 입력으로 들어오는 데이터의 분포가 달라지는 것을 의미하며 Internal Covariate Shift는 layer가 깊을수록 심화될 수 있다. (나동빈님의 강의를 참고하였습니다.)

 

출처: https://github.com/ndb796/Deep-Learning-Paper-Review-and-Practice

우선 기존에 딥러닝 학습에 있어서 겪고 있던 문제들 중 대표적으로 각 레이어의 가중치들이 역전파 학습을 진행할 때 입력부로 올라오면서 학습이 잘 되지 않는 Gradient Vanishing / Exploding 문제가 있었다. 이를 해결하기 위해 가중치를 초기화하는 방법(Xavier, He), ReLU와 같이 더 나은 활성화 함수(Activation Function) 방법, 규제화(Regularization) 방법을 제안하거나 학습률(Learning Rate)를 낮춰서 모든 레이어들의 가중치가 학습되도록 연구해왔다. 이러한 방법들을 이용함에도 레이어의 수가 많아질수록 여전히 학습이 잘 되지 않아 근본적인 문제를 해결하지 못하고 있었다.

 

BN 논문의 저자는 학습이 잘 되지 않는 근본적인 문제를 'Internal Covariate Shift'현상 때문이라고 주장을 하였고 Batch Normalization 기법이 이 현상을 해결해준다고 주장하였다.

 

Normalization, Whitening

다른 분포를 가지는 두 데이터를 같은 분포를 가질 수 있게 변환을 해주는 방법으로 Normalization과 Whitening을 생각해 볼 수 있다. 정규화(Normalization)는 데이터를 동일한 범위 내의 값을 갖도록 하는 기법으로 대표적으로 Min-Max, Standardization이 있다. 이 중에서 Standardization은 데이터를 평균 0, 표준편차 1이 되게 변환하여 정규화시킨다.

 

Normalization (Standardization)

화이트닝(Whitening)은 데이터의 평균을 0, 그리고 공분산을 단위행렬로 갖는 정규분포 형태로 변환하는 기법으로 Decorrelation + Standardization으로 볼 수 있다. 보통 PCA를 이용해 데이터를 decorrelated 시킨다.

 

Whitening

Batch Normalization

그러면 각 레이어로 들어가는 입력 데이터들의 분포를 고르게 하기 위해 위의 방법처럼 평균 0, 표준편차 1의 값을 갖도록 standardization이나 whitening을 해주면 되는 것일까? 그렇지 않다. 입력 데이터들의 분포가 치우쳐져 있다면 데이터의 특성에 맞게 표준화(normalization)를 해주는 것이 좋은 것은 사실이다. 하지만 모든 데이터들이 평균 0, 표준편차 1이 되도록 변형시켜주는 것은(whitening) 데이터를 제대로 학습하지 못한다. 왜냐하면 whitening을 하게되면 이전 레이어로부터 학습이 가능한 parameters의 영향을 무시해버리기 때문이다

다시말해,

  • 현재 Hidden Layer의 입력 데이터 X'은 이전 레이어의 입력 데이터 X로부터 학습 가능한 파라미터(weight, bias)와 계산을 통해 나온다. X' = weigth * X + bias
  • 정규화 과정에서 입력 데이터 X'의 평균(E[X'])을 입력 데이터에서 빼준다. X'' = X' - E[X']
  • E[X'] = weight * E[X] + bias 이므로 식을 정리하면 X'' = X' - E[X'] = weight * (X - E[X])
  • 이 과정에서 bias가 없어지므로 학습 가능한 파라미터의 영향이 사라져 제대로 학습이 불가능해진다.

또, 평균 0, 표준편차 1로 데이터의 분표를 변환하게 될 경우 활성화 함수로 Sigmoid를 사용하게 되었을 때 비선형성(non-linearity)의 특징을 잃어버리게 되는 문제가 생긴다.

 

sigmoid

따라서 단순히 평균을 0으로 만들고 표준편차가 1이 되도록 정규화를 하는 것이 아니라 다음의 주요한 특징을 갖는 Batch Normalization을 제안하였다.

 

batch normalization

  • training data 전체를 다 학습할 수 없으므로 일정 크기에 해당하는 mini batch 안에서 평균과 분산을 계산

$$\mu_{B}\leftarrow\frac{1}{m}\sum_{i=1}^{m}x_{i}$$

$$\sigma^{2}_{B}\leftarrow\frac{1}{m}\sum_{i=1}^{m}\left( x_{i}-\mu_{B} \right)^{2}$$

  • 입력 데이터에 대하여 각 차원(feature)별로 normalization을 수행
  • epsilon이 붙는 이유는 0으로 나눠지는 것을 막기 위해

$$\hat{x}_{i}\leftarrow\frac{x_{i}-\mu_{B}}{\sqrt{\sigma^{2}_{B}+\epsilon}}$$

  • normalization 된 값들에 대해 Scale factor(gamma)와 Shift factor(beta)를 더하여 학습이 가능한 파라미터를 추가함

$$y_{i}\leftarrow\gamma\hat{x}_{i}+\beta\equiv BN_{\gamma,\beta}\left(x_{i}\right)$$

 

Scale factor와 Shift factor를 두게 되면 입력 데이터의 원래 형태(normalization 하기 전)로도 학습이 가능하여 각 층별로 입력 데이터의 optimal uncorrelated distribution을 구할 수 있게 된다. 또 위에서 언급했던 문제중에 하나인 Sigmoid와 같은 활성화 함수에서 비선형성을 잃어버리는 것을 방지할 수 있다. 정규화 이후에 사용되는 두 factors가 학습됨에 따라 non-linearity를 유지하도록 해준다.

따라서 BN은 학습 가능한 parameters가 존재하는 하나의 레이어 구조가 되며 이 기법이 발표된 이후 기존의 딥러닝 구조에서 Convolution Layer와 Activation Layer 사이에 BN Layer가 들어간 형태로 발전했다. 이 구조로 큰 성능 효과를 높이게 되어 거의 모든 딥러닝 구조에 BN기법이 사용되기 시작했다.

Batch Normalization architecture

 

Inference with Batch Normalization

그러면 이제 학습이 완료되고 난 다음에 추론 과정에서 Batch Normalization layer는 어떻게 정규화를 수행할까?

추론 과정에서는 테스트 데이터 하나에 대해 답을 내야 하므로 평균과 분산을 계산할 수 없다.

따라서 추론할 때는 training set의 평균과 분산 값으로 대체하여 정규화를 수행한다. 대체하는 방법으로는 크게 2가지가 있으며 학습할 때 사용했던 mini batch의 평균과 분산 값들을 이용한다.

  • 모집단 추정 방식

통계적으로 표본집단 데이터들의 평균, 분산을 이용해 모집단의 평균과 분산을 추정할 수 있다.

$$E \left [ x^{\left(k\right)}\right] = E_{B}\left[\mu^{\left(k\right)}_{B}\right]$$

$$Var\left[x^{\left(k\right)}\right] = \frac{m}{m-1}E_{B}\left[\sigma^{\left(k\right)^{2}}_{B}\right]$$

  • Moving Average 방식

$$\hat{\mu}\leftarrow\alpha\hat{\mu}+\left(1-\alpha\right)\mu^{\left(i\right)}_{B}$$

$$\hat{\sigma}\leftarrow\alpha\hat{\sigma}+\left(1-\alpha\right)\sigma^{\left(i\right)}_{B}$$

모집단 추정 방식의 경우 모든 mini batch 의 평균, 분산 값들을 저장하고 있어야 하기 때문에 비효율적이며 주로 이전 정보들을 바탕으로 모집단의 정보를 예측하는 방식인 Moving Average를 이용한다고 한다. 지수 추정 방식을 이용하는 Exponential Moving Average도 있다.

 

 

 

Reference

[1] https://arxiv.org/pdf/1502.03167.pdf

[2] https://www.quora.com/Why-does-batch-normalization-help 

[3] https://taeu.github.io/cs231n/deeplearning-cs231n-Neural-Networks-2/

[4] lifeignite.tistory.com/47

[5] shuuki4.wordpress.com/2016/01/13/batch-normalization-%EC%84%A4%EB%AA%85-%EB%B0%8F-%EA%B5%AC%ED%98%84/

[6] www.youtube.com/watch?v=58fuWVu5DVU&t=3296s