제가 공부한 내용을 정리하는 글입니다. 작성의 편의를 위해 아래는 반말로 작성하였습니다. 잘못된 내용이 있다면 지적 부탁드립니다. 감사합니다.
Batch Normalization 배치 정규화의 목적
Batch normalization 을 설명하기 전에 Nomalization 이 무엇인지 먼저 이해해야 한다. Normalization 에 대한 설명은 아래 링크로 대체한다.
Normalization 설명 글 링크
위 글에선 입력 데이터를 왜 정규화해야 하는지 설명했다. 딥러닝 모델의 구조를 단순화하여 설명하면 흔히들 입력층 → 은닉층 → 출력층으로 묘사한다. 입력층의 입력 데이터는 쉽게 normalization 할 수 있지만, 입력층을 지나서 만나게 되는 layer 들의 입력은 normalization 하기 쉽지 않다. Batch normalization 은 이런 문제를 해결하기 위한 알고리즘이다.
Internal covariate shift
Batch normalization 을 처음 창안한 논문의 저자들은 말한 DNN 이 학습하기 어려운 이유(후속 논문에 의해 반박되었지만, 이는 후술한다.)를 의역하면 다음과 같다.
"DNN 이 학습하기 어렵고 느리고 복잡한것은 DNN 이 학습중, 각 layer 입력의 분포가 이전 layer 들 의 parameter 가 변화하면서 함께 계속 변화하는 성질을 가지고 있기 때문이다."
이러한 성질을 Internal covariate shift 라고 한다. Batch Normalization 은 layer 의 output 인 feature map 을 normalize 하여 Internal covariate shift 를 해결하고자 했다.
Batch Normalization 배치 정규화 알고리즘의 설명
위에서 언급했듯이 각각의 layer input 의 distribution 은 학습 중 이전 layer 의 변화에 의해 매번 달라진다. 이를 막기 위해 각 층의 출력물을 다음 층에 입력하기 전에 평균 0, 표준편차 1 로 normalize 할 수 있다.(이를 whitening 이라고도 한다.) 하지만 이렇게 단순하게 normalize 할 경우 문제가 생긴다.
입력이 N(0, 1) 로 normalize 될 경우 activation function 의 비선형성이 없어질 수도 있다. 예를 들어 sigmoid 의 경우
그래프가 이런 형태인데, 입력이 N(0, 1) 이므로 95% 의 입력은 sigmoid 그래프의 중간(x = (-1.96, 1.96) 구간) 에 속하고 이 부분이 선형이기 때문이다.
또한, 입력을 항상 N(0, 1) 로 normalize 할 필요는 없다. 적당한 scaling factor 를 사용하면 적절한 모양으로 입력 분포를 조정할 수 있다.
Z = WX+b 라고 했을 때, 이를 normalize 하기 위해 Z-E(Z) 를 하게 되면 parameter b 의 영향은 완전히 무시되게 된다. 이를 해결하기 위해 b 를 대신하는 parameter β 를 추가하게 된다.
β 가 normalization 을 통해 상쇄되는 b 의 역할을 대신 하고, γ 가 scaling factor 로 적용 된다. 이때 필요하다면 γ = δz 이고, β = E(Z) 로 하여 Batch normalization 의 효과를 완벽하게 상쇄 할 수도 있다.
논문 링크: 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 변수쌍이 생기게 된다.