[논문 리뷰] Batch Normalization: Acceleraing Deep Network Training by Reducing Internal Covariate Shift

woonho·2022년 7월 6일
4
post-custom-banner
  1. Introduction

Deep Neural Network의 optimize방식에는 SGD방식이 있다.
SGD는 결국 loss값을 최소화 하는 parameter를 찾는 것이다. 식은 다음과 같다.

이러한 SGD는 간단하고, 효율적이지만, 몇가지 문제가 있다.

첫 번째, hyper-parameter가 제대로 tuning되어야 한다.
두 번째, parameter의 초기 값이 제대로 설정 되어야 한다.
세 번째, 각 layer에 들어가는 Input이 앞에 layer의 parameter에 따라 뒤쪽 layer의 input 분포가 변한다.

여기서 세번째 문제를 논문 저자는 internal covariate shift라고 정의하며, 가장 큰 문제로 보고 있다.

covariate shift란 learning system에 들어가는 input 분포가 변하는 것으로, 일반적으로 domain adaptation을 통해 해결이 가능하다.

하지만, 여기서 말하는 internal covariate shift는 layer를 지날 때 마다 input 분포가 변하는 것을 말한다.

예를 들어, 두개의 layer를 가진 아래의 네트워크를 생각해보자.

x를 첫번째 layer를 거친 결과값이라 생각하면,

l을 다음과 같이 나타낼 수 있다.

여기서 gradient descent step을 보면, 이와 같이 나타난다.

=> 이는 결국 다음 parameter는 이전 input의 분포에 따라 결정됨을 알 수 있다.

하지만 이렇게 input의 분포가 계속 변화하면 여러 문제가 생기는데,
예를 들면, Sigmoid 함수를 활성함수로 가지는 경우에, 각 layer input의 분포가 고정되지 않는다면, 각 layer의 output 분포가 요동치게 될 것이므로, gradient vanishing이 일어남에 따라, 학습속도가 매우 느려질 것이다.

  • gradient vanishing

=> 시그모이드 함수의 경우 input의 절댓값이 커짐에 따라서, gradient값이 0에 수렴하게 되므로, 학습속도가 매우 느려진다.

따라서, input분포를 계속 normalize해준다면, saturated regime에 빠질 위험이 줄어들 것이고, 학습 속도도 빨라지게 될 것이다.

  1. Internal Covariate Shift

=> 각 layer를 통과할 때마다, Covariate Shift가 일어나, input 분포가 변화하는 것을 말한다.
(이 논문에서는 SGD로 학습할 때, 학습이 불안정한 이유를 이러한 이유라고 주장하고 있다)

이러한 현상을 막기위해 input을 normalize하는 것이 중요한데, 예전 부터 학습에 있어서 수렴이 빠르게 되도록 하는데에 whitening 기법이 자주 사용되었다.

  • whitening
    => 데이터의 평균을 0으로 갖고, 공분산을 단위 행렬로 갖도록 하는 기법입니다.(데이터를 uncorrelated 시키는 것)

하지만 각 layer의 input마다 whitening을 수행하는 것은 좋은 것만은 아니다.
일단 whitening은 covariance matrix와 inverse 계산이 필요하기 때문에 계산량도 많고, 일부 parameter의 영향이 무시된다.

여기서 parameter의 영향이 무시되는 이유는 다음과 같다.

위의 식과 같이 bias가 update되더라도, normalize한 값은 변화가 없다.
그래서 학습을 진행할 수록 bias값만 커지고, loss값은 고정된다.
=> 따라서, whitening을 하게 되면, 이전 layer로부터 학습 가능한 parameter의 영향을 무시해버리는 결과가 나타난다.

또한, whitening을 통해 평균 = 0, 표준편차 = 1로 고정한다면, Sigmoid 함수를 activation function으로 선택했을 때, 비선형성을 잃게 되는 현상이 생긴다.

그래서 논문 저자는 Batch Normalization이라는 새로운 Normalization 방법을 제안한다.

  1. Batch Normalization via mini-batch

각 layer의 input마다 full whitening을 하는 것은 너무 비효율적이고, 여러 단점들이 있다.
그래서 저자는 두 가지 simplifications를 도입한다.

첫 번째는, whitening을 feature들 끼리 전부 수행하는 것이 아니라, 각 feature마다 독립적으로 normalize를 수행하는 것이다.

=> 각 feature dimension마다 normalize를 수행한다.

이는 convergence를 빠르게 하도록 도와준다.

하지만, 여기서 normalizing만 수행한다면, 평균 = 0, 표준편차 = 1이기 때문에, 시그모이드 함수 중앙에 데이터가 쏠리게 되고, 데이터는 시그모이드 함수의 선형적인 부분에 위치하게 되어, 비선형성을 잃게 되는 현상이 생긴다.

따라서, normalize한 값에 아래 식과 같이 약간의 scaling을 하고, shift하는 과정이 필요하다.

=> 여기서 감마와 베타 값 또한 학습되어지는 값이다.

두번째는, mini batch를 도입하는 것이다.
=> 모든 데이터를 전부 고려해서 normalize를 수행하는 것은 너무 비효율적이기 때문에, batch size를 적절히 조절해서 normalize를 수행한다.

이러한 방법을 적용한 알고리즘은 다음과 같다.

=> 여기서 입실론이 분모에 들어간 이유는 분모가 0이되는 것을 방지하기 위한 아주 작은 숫자이다.

=> 여기서 감마와 베타는 학습가능한 값이고, Backpropagation을 통해 이와 같이 학습된다.

4. Inference with Batch-Normalization

training과정에서는 데이터가 배치 단위로 들어오기 때문에, 배치 단위의 평균과 분산을 계산하여 Normalization을 수행했지만, Inference 과정에서는 배치 단위로 평균과 분산의 계산이 어려워, 배치 단위의 평균과 분산을 저장해 놓고, 고정된 평균과 분산을 사용하여 Normalization을 수행한다.

이 때 사용되는 고정된 평균과 분산을 논문 저자는 이동평균(moving average)을 사용한다.
그래서 Inference 시에는 위에서 구해 놓은 배치단위 평균들의 평균을 사용하고, 분산은 배치단위 분산의 평균에 m/m-1을 곱한 값을 사용한다.
=> 이동 평균을 적용하면, 미니배치들의 분산을 통해 전체 분산을 추정하는 것이므로, 통계학적으로 “Bassel Correction”을 통해 보정해주는 것이다.

  • 이동 평균(moving average)

길이가 2인 경우의 이동 평균 예시는 다음과 같다. 처음엔 값이 100 하나 밖에 없기 때문에 이동 평균이 100이지만, 값이 업데이트 됨에 따라 가장 최근 2개 정보만을 통해 평균을 구한 것이 길이가 2인 경우의 이동 평균이다. 

따라서, 전체적인 알고리즘은 아래와 같다.

Reference
[1] https://cvml.tistory.com/5
[2] http://computing.or.kr/14804/vanishing-gradient-problem기울기-소멸-문제/
[3] https://eehoeskrap.tistory.com/430
[4] https://gaussian37.github.io/dl-concept-batchnorm/

post-custom-banner

1개의 댓글

comment-user-thumbnail
2022년 7월 7일

잘 봤습니당~~^^
더운데 몸 조심하시고 건강하시길 바랍니다

답글 달기