본문 바로가기
코딩/데이터 분석 이론 & 응용

[12] Deep Learning - Batch normalization

반응형

[12] Deep Learning - Batch normalization

 

 

 

Batch normalization

 

이전 글에서는 경사 소실 문제와 폭주 문제를 해결하기 위한 activation function들과 initialization 방법들을 살펴보았다.

 

 

[11] Deep Learning - Initialization & Activation function (tistory.com)

 

[11] Deep Learning - Initialization & Activation function

[11] Deep Learning - Initialization & Activation function 복잡한 문제를 해결해야 할수록 , Network는 점점 더 복잡하고 깊어져야 할 것이다. Network가 점점 더 깊어지고 복잡해 짐에 따라 다양한 문..

ddggblog.tistory.com

 

 

 

하지만 , 적절한 activation function과 initialization 방법을 사용했다 하더라도 경사 소실 문제와 폭주 문제가 발생할 수 있다. 이 문제를 해결하기 위한 방법으로 Batch normalization , 배치 정규화 기법이 제시되었다. 학습과정에서 배치 별로 다양한 분포를 가질 수 있으니 각 배치 별로 평균과 표준편차를 이용해 정규화하여 사용하자는 아이디어이다.

 

 

Batch normalization , 배치 정규화 기법은 각 층에서 activation function을 통과하기 전 후에 연산을 추가하는 방식으로 이루어진다. 입력을 원점에 맞추고 , 정규화 ( normalization ) 한 후 , 각 층에서 2개의 parameter로 scale을 이동해 조정한다. 2개의 parameter 중 하나는 scale 조정에 , 하나는 scale 이동에 사용한다.

 

 

배치 정규화를 사용하는 장점 중 하나는 표준화 작업을 대신해준다는 점이다. 만약 Network의 첫 층으로 배치 정규화 층을 배치한다면 , 배치 정규화 층이 input에 대한 표준화 작업을 대신한다. 단 한 번에 한 배치씩 처리하기 때문에 근사 방식으로 이루어진다.

 

 

또 다른 장점들은 Overfitting의 위험을 줄여준다는 장점과 weight initialization의 방법에 대해 의존성을 많이 덜 수 있다는 점이다. 경사 소실 문제를 해결하여 activation function으로 하이퍼볼릭 탄젠트 함수나 sigmoid 함수 등을 사용할 수 있다는 점도 장점이다. 또한 학습률을 부담 없이 높일 수 있어 높은 속도로 학습이 이루어지는 것도 배치 정규화를 사용하는 장점 중 하나다. 이에 더해 배치 정규화는 규제 기법의 역할까지 맡을 수 있어 불필요한 규제 기법을 추가하게 되는 것을 막아준다.

 

 

하지만 단점도 존재한다. 배치 정규화의 단점으로는 모델의 복잡도를 키운다는 점이 있다. 당연하게도 일반적인 Network에 배치 정규화 층을 추가하였으므로 network의 복잡도는 커질 것이다. 복잡도가 커진다는 것은 훈련에 대한 시간이 오래 걸린다는 것을 의미한다. 하지만 이는 배치 정규화를 사용하는 경우 수렴이 이전보다 빨리 지기 때문에 이는 상쇄되는 문제점이다. 즉 적은 epoch로도 동일한 성능에 도달할 수 있다는 점이다. 이러한 이유들 덕분에 실제로 배치 정규화를 사용하는 것이 시간이 좀 덜 걸리게 된다.

 

 

일단 normalization , 정규화를 위해서는 평균과 표준편차를 알아야 한다. 이를 위해서 현재의 Mini Batch에서 입력의 평균과 표준편차를 계산한다. 배치 정규화는 다음과 같은 식에 따라 진행된다.

 

 

 

 

Batch Normalization: Accelerating Deep Network Training b y Reducing Internal Covariate Shift

 

 

  • μ는 미니 배치에 대해 구한 입력의 평균 벡터다.
  • σ는 미니 배치에 대해 구한 입력의 표준편차 벡터다.
  • m은 미니 배치에 있는 샘플의 수이다.
  • xi는 평균이 0으로 정규화된 샘플 i의 입력이다.
  • γ는 층의 출력에 대한 scaler parameter 벡터다. 입력마다 하나의 scaler parameter가 존재한다.
  • ε는 분모가 0이 되는 것을 막기 위한 항으로 smoothing term이라고 한다. 일반적으로 매우 작은 숫자를 사용한
  • yi 즉 결과는 배치 정규화 연산을 마친 후 나오는 출력 결과다. 입력의 scale을 조정하고 이동시킨 결과를 의미한다.
  • 식에 대한 더 자세한 설명은 Batch Normalization: Accelerating Deep Network Training b y Reducing Internal Covariate Shift를 참고하자.

 

 

정리하자면 배치 정규화는 모델 학습 과정에서는 mini batch의 평균 , 분산을 이용해 정규화를 하고 , test 과정에서는 moving average , 이동 평균을 사용해 정규화를 진행한다. 위에서 이야기 한 2개의 parameter를 통해 scale을 조정하고 scale을 이동해 값을 출력한다. 이후 이 2개의 parameter들은 Backpropagation 과정을 통해 학습되고 이러한 과정을 통해 나온 parameter 값을 사용한다.

 

 

 

 

keras에서는 이러한 배치 정규화를 간단하게 구현할 수 있다.

 

 

 

#keras를 통한 배치 정규화 코드 예시

model = keras.models.Sequential([
    keras.layers.Flatten(input_shape=[28,28]),
    keras.layers.BatchNormalization(),
    keras.layers.Dense(300 , activation="elu" , kernel_initializer="he_normal"),
    keras.layers.BatchNormalization(),
    #......

 

 

위와 같이 단순하게 hidden layer의 위나 아래에 배치 정규화 층을 추가하면 된다. 배치 정규화 층은 입력마다 이동 parameter가 추가되어 이전층의 bias를 뺄 수 있다. 만약 빼고 싶은 경우 , 아래 코드처럼 use_bias = False로 두면 된다. 

 

 

 

#keras를 통한 배치 정규화 코드 예시 - use_bias=False

model = keras.models.Sequential([
    keras.layers.Flatten(input_shape=[28,28]),
    keras.layers.BatchNormalization(),
    keras.layers.Dense(300 , activation="elu" , 
    	kernel_initializer="he_normal" , use_bias=False),
    keras.layers.BatchNormalization(),
    #......

 

 

 

keras의 배치 정규화 층의 경우 μ,σ,γ,β 4개의 parameter가 존재한다. 이때 μ,σ는 이동평균으로 Backpropagation을 통해 학습되지 않는 parameter들이다.

 

 

배치 정규화 논문의 저자들은 activation function 이후보다 이전에 배치 정규화 층을 추가하는 것이 좋다고 이야기한다. 하지만 배치 정규화 층이 activation function 이전이 좋은지 이후가 좋은지에 대한 이야기는 아직도 다양하게 나오고 있다. 결국 데이터 set에 따라 달린 것이므로 두 가지 방법 모두 해보고 괜찮은 결과를 보여주는 방법을 택하는 것이 맞아 보인다.

 

 

keras에서의 배치 정규화 층과 관련한 parameter들은 momentum과 axis parameter가 있다. momentum parameter는 배치 정규화 층에서 이동 평균을 업데이트할 때 사용된다. 보통 1에 가까운 값을 사용하며 미니 배치가 작거나 데이터 셋이 클수록 더 1에 가깝게 만든다.

 

 

axis parameter는 정규화할 축을 결정하는 parameter다. 기본값은 -1로 마지막 축을 정규화한다. 위의 parameter들의 경우 기본값으로도 잘 동작하니 바꿔야 할 경우는 드물다.

 

 

 

ref

  • "Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow, 2nd Edition"
  • Sergey Ioffe, Christian Szegedy , Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift 
반응형