Batch Normalization NEED TO CHECK
Batch Normalization 배치 정규화
Batch Normalization 의 목적
Batch normalization 을 설명하기 전에 Nomalization 이 무엇인지 먼저 이해해야 한다. Normalization 에 대한 설명은 아래 링크로 대체한다.
위 글에선 입력 데이터를 왜 정규화해야 하는지 설명했다. 딥러닝 모델의 구조를 단순화하여 설명하면 흔히들 입력층 → 은닉층 → 출력층으로 묘사한다. 입력층의 입력 데이터는 쉽게 normalization 할 수 있지만, 입력층을 지나서 만나게 되는 레이어들의 입력은 normalization 하기 쉽지 않다. Batch normalization 은 이런 문제를 해결하기 위한 알고리즘이다.
Batch Normalization 알고리즘의 설명
위에서 언급한 각각의 레이어의 출력물을 normalization 하는 이유를 다른 말로 설명하면, 각 층 input 의 distribution 이 매번 달라지기 때문이다. 이를 저자는 Iternal covariance shift 라고 정의한다. 이를 막기 위해 각 층의 출력물을 다음 층에 입력하기 전에 평균 0, 표준편차 1 로 normalize 할 수 있지만, 이렇게 단순하게 normalize 할 경우 문제가 생긴다.
Z = WX+b 라고 했을 때, 이를 normalize 하기 위해 Z-E(Z) 를 하게 되면 parameter b 의 영향은 완전히 무시되게 된다. 이를 해결하기 위해 b 를 대신하는 parameter 를 추가하게 된다.
입력이 N(0, 1) 로 normalize 될 경우 activation function 의 비선형성이 없어질 수도 있다. 예를 들어 sigmoid 의 경우
그래프가 이런 형태인데, 입력이 N(0, 1) 이므로 95% 의 입력은 sigmoid 그래프의 중간(x = (-1.96, 1.96) 구간) 에 속하고 이 부분이 선형이기 때문이다.
또한, 입력을 항상 N(0, 1) 로 normalize 할 필요는 없다. 적당한 scaling factor 를 사용하면 적절한 모양으로 입력 분포를 조정할 수 있다.
β 가 normalization 을 통해 cancel 되는 b 의 역할을 대신 하고, γ 가 scaling factor 로 적용 된다. 이때 필요하다면 γ = δz 이고, β = E(Z) 일 경우 batch normalization 의 효과를 완벽하게 cancel 할 수도 있다.
논문 링크: https://arxiv.org/pdf/1502.03167.pdf
원 논문 저자는 normalization 을 위와 같이 설명하였다. mini-batch 의 평균과, 분산을 이용해서 normalize 후, scale and shift 를 γ, β 를 통해 실행한다. 이 때 γ와 β 는 학습 가능한 변수이다.
이렇게 normalization 이 된 값을 activation function 에 입력으로 사용하고 최종 출력물을 다음 층에 입력으로 사용하는 것이다.
즉 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 |
처음엔 값이 100 하나 밖에 없기 때문에 이동평균이 100이지만, 값이 업데이트 됨에 따라 가장 최근 2개의 정보만을 통해 평균을 구한 것이 길이가 2인 경우의 이동평균이다.
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 변수쌍이 생기게 된다.
source:
'Machine Learning' 카테고리의 다른 글
XGBoost(Boosting / Gradient Boosting Algorithm(GBM) / Adaptive boosting) (0) | 2019.09.25 |
---|---|
Momentum, AdaGrad, RMSProp, Adam --- NEED TO CHECK (0) | 2019.09.18 |
MGD(Mini-batch gradient descent) vs SGD(stochastic gradient descent) (0) | 2019.09.18 |
Normalization (0) | 2019.09.18 |
Cross Validation (0) | 2019.09.18 |
댓글