본문 바로가기

AI & Big Data/AI

[AI 이론] Layer, 레이어의 종류와 역할, 그리고 그 이론 - 2 (BatchNormalization)

반응형

BatchNormalization

딥러닝 모델을 만들다보면,

딥러닝 네트워크에 있는 n개의 히든 레이어에서, n개의 미분값이 서로 곱해지게된다.

 

만약 미분값이 크다면 Gradient는 지수함수적으로 증가할 것이고, 모델 밑바닥으로 이를 전파할수록 Gradient는 결국 폭발하게된다.

이것을 Exploding Gradient 문제라고 부른다.

Exploding Gradient 문제가 발생한다면, 딥러닝 모델에서 매우 큰 미분결과값의 적층으로 인해 모델 자체가 굉장히 불안정(unstable)해지고, 효과적인 학습이 불가능해진다.

모델의 가중치는 불안정(unstable)한 네트워크를 형성하고, 가중치 자체가 너무 거대해지다 못해 오버플로우(Overflow) 현상이 일어나기까지 한다. 이렇게 되면 더 이상 학습이나 업데이트는 진행되지 못한다.

 

반대로, 만약 미분값이 작다면, Gradient는 지수함수적으로 감소할 것이고, 모델 밑바닥으로 이를 전파할수록 Gradient는 결국 사라져버리게 된다.

이것을 Vanishing Gradient 문제라고 부른다.

Vanishing Gradient 문제가 발생한다면, 딥러닝 모델에서 매우 작은 미분결과값의 적층으로 인해 학습은 의미있는 인사이트를 저장할 수 없게 되고, 가중치들과 bias는 처음의 initial layer와 크게 다를 바가 없게 된다.

Gradient가 만약 0가 된다면, 학습 자체가 중단되고 더 이상 인사이트를 얻지 못한다.

 

레이어 수가 적은 경우에는 문제가 되지 않지만, 레이어 수가 많아질수록 Vanishing Gradient, 혹은 Exploding Gradient 문제가 누적되어 나타나는 문제가 발생한다.

Activation=sigmoid

이 현상은 활성함수(Activation)로 Sigmoid, hypertangent 등의 Non-linear Saturating Function(비선형 포화 함수)를 사용할 때, 입력의 미분값이 0 근처로 가기 때문에 Back propagation(역전파)을 통한 학습이 어려워지거나, 최소 느려지기 때문이다.

Activation=ReLU

이러한 문제의 해결책으로 2011년에는 위 사진에 나와 있는 ReLU(Rectifier Linear Unit)을 활성함수로 등장했지만, 이는 본질적인 해결책이 아니기 때문에 결국 레이어가 쌓이고 딥러닝 네트워크가 깊어지면 여전히 문제점을 발생시킨다.

 

그리고 2015년에 새로운 논문이 두 가지 발표되는데, 하나가 Batch Normalization이었고 다른 하나가 Residual Network이다.

Residual Network는 다음 포스팅에서 다뤄보도록 하고, 이번 포스팅에서는 Batch Normalization에 집중해보도록 하자.

 

(Sergey Ioffe, Christian Szegedy. Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift. arXiv:1502.03167v3, 2015.)

 

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

위 링크에서 원본 논문을 찾을 수 있으며, 논문의 주요 골자는 Batch Normalization이라는 새로운 개념의 도입, 그리고 이를 통한 네트워크 레이어가 깊어질 때의 문제점인 Covariate Shift를 줄여주어 학습의 결과의 성능을 향상시키고 학습 자체도 빠르게 만들어주는 것이다.

 

mini-batch의 활성함수 x에 적용을 위한 Batch Normalization 방법은 아래와 같다.

Batch Normalizing Transform, applied to activation x over a mini-batch

평균과 분산을 구하고, 입력을 정규화 시켜준다.

정규화 과정에서 평균을 빼주고 그것을 분산으로 나눠주게 되면 Batch의 분포는 [-1, 1]의 범위로 좁혀지게 된다.

 

즉, 평균과 분산을 구한 후에 정규화시키고, 다시 Scale과 Shift 연산을 위한 감마와 베타가 추가됨으로써, 정규화시켰던 부분을 원래대로 롤백하는 Identity Mapping이 가능하고, 학습을 통해 감마와 베타를 정할 수 있기 때문에 단순 정규화보다 훨씬 뛰어난 학습이 가능해지게 된다.

 

BatchNormalization 레이어는 Activation Function 앞에 배치되며, 위 그림과 같은 형태가 된다.

또한, BatchNormalization은 그 자체로 레이어이기 때문에, 역전파를 통한 학습이 가능하며, 역전파 시에는 아래와 같은 Chain Rule이 적용된다.


BatchNormalization의 적용

PyTorch와 Tensorflow에서의 용례는 각각 아래와 같다.

 

# PyTorch

torch.nn.BatchNorm2d(num_features, eps=1e-05,
                     momentum=0.1, affine=True, track_running_stats=True)

 

# Tensorflow 2.X

tf.keras.layers.BatchNormalization(
    axis=-1, momentum=0.99, epsilon=0.001, center=True, scale=True,
    beta_initializer='zeros', gamma_initializer='ones',
    moving_mean_initializer='zeros', moving_variance_initializer='ones',
    beta_regularizer=None, gamma_regularizer=None, beta_constraint=None,
    gamma_constraint=None, renorm=False, renorm_clipping=None, renorm_momentum=0.99,
    fused=None, trainable=True, virtual_batch_size=None, adjustment=None, name=None,
    **kwargs
)

 

PyTorch에서 BatchNorm2d에 대한 수학적 표현식은 아래와 같이 표명하고 있다.

그리고 이는 위에서 나온 논문의 수학적 표현식과 동일한 식이다.

이때, 유의해야할 점으로, torch.nn.BatchNorm2d, 혹은 tf.keras.layers.BatchNormalization에는 유효 옵션으로 training 옵션이 있다.

 

이 옵션은 training=False, training=True 로 나뉘게 되는데,이 이유는 위 논문에서 Batch Normalization이 학습 시와 activation x over a mini-batch에 적용되는 방법이 다르다고 명시해놓았기 때문이다.

 

Batch Normalizing Transform, applied to activation x over a mini-batch

위에 그림은 mini-batch의 활성함수 x에 적용을 위한 Batch Normalization이며,아래 그림은 학습 시의 Batch Normalization 적용이다.


다음 레이어는 다음 포스팅에 계속…….


 

반응형