Paper
Abstrct
DNN을 훈련시키는 데 어려움은, 매 타임 스텝마다 layer에 들어오는 input의 distribution이 달라진다는 것이다. 이 문제는 이전 layer의 파라미터가 업데이트되기 때문에 발생한다. Figure 1의 설명처럼, 첫 번째 타임 스텝의 backpropogation이 일어나면 세타1, 세타2, 세타3가 모두 세타1', 세타2', 세타3'으로 업데이트되어 이전과는 달라진다. 이 상태에서 새로운 입력 x'이 들어오면 바뀐 파라미터 분포에 대해 계산이 될 것인데, 그럼 두 번째 layer로 들어오는 입력의 분포도 달라질 것이다. 그렇게 되면, 세타2는 첫 번째 타임 스텝과는 다른 입력 분포를 입력으로 받는 것이고, 이 과정이 반복된다면 세타2는 매 타임 스텝마다 다른 분포를 갖는 입력에 대해 최적화되어야 하므로 전반적인 수렴(최적화)가 느리게, 또는 잘 안 되게 된다. 당연히 이 문제는 layer2에만 국한되는 것이 아니라 layer3, layer4...까지 적용되어 결국 layer의 깊이가 매우 깊어지는 DNN에서 수렴이 잘 안된다는 문제를 발생시키는 것이다. 또한 layer의 입력은 이전 layer들의 파라미터 값에 영향을 받기 때문에 layer가 깊어질수록, 파라미터의 조그마한 변화도 amplifying된다.
논문에서는 이 문제를 internal covariate shift(ICS)라고 정의하고, 이로 인해 발생하는 어려움을 두 가지로 제시한다.
- small learning rate
- careful parameter intialization
즉, small learning rate로 인해 수렴이 늦게 될 수 있고 parameter initialization이 잘 안되면 학습이 잘 안 될 수 있다는 제약이 발생한다.
논문에서 internal covariate shift과 이로 인한 두 가지 문제를 해결하기 위해 batch normalization(BN)을 제시한다. BN를 사용하면 ICS를 완화시켜 파라미터의 분포를 안정화시킬 수 있다. 이로 인해 higher learning rate를 사용하여 더 빠르게 훈련이 가능하며, parameter intialization에 대해서도 덜 민감해진다.
Introduction
논문에서는 SGD 중에서도 mini-batch gradient descent를 사용하고자 한다. Eqn. (1)의 식을 사용해 파라미터를 업데이트할 때 사용하는 gradient를 계산한다. 기존 SGD를 사용한다면 training example 1개 당의 loss를 구하기 때문에 m으로 나눠줄 필요가 없지만, mini-batch gradient descent에서는 하나의 배치 당 m개의 training example이 있기 때문에, 각각의 loss를 모두 더해준 뒤 구한 gradient를 m으로 평균내어주는 것이다.
BN은 입력이 fully connected layer나 convolutional layer를 거치고 난 이후에 적용되어 데이터의 평균을 0, 분산을 1로 조절해 분포를 안정화시킨다. 만약 BN이 적용되지 않는다면 NN의 깊이가 깊어질수록 입력 분포는 계속해서 달라질 것이고, 이것이 파라미터를 계속 바뀌게 할 것이다. 파라미터 W, b가 계속 바뀌는 것은 입력의 여러 차원으로 하여금 nonlinearity function의 saturated regime으로 이동시킨다. saturated regime은 gradient vanishing 문제를 일으켜 수렴을 매우 느리게 한다. 그러나 BN을 적용하면 NN의 깊이가 깊어지더라도 (평균 0, 분산 1로 맞춰줌으로써) 각 layer의 입력 분포가 크게 달라지지 않고 안정화되어 전반적인 학습이 안정화 및 가속될 수 있다.
Towards Reducing Internal Covariate Shift
ICS를 해결하기 위해 입력 분포를 고정시키는 방안으로, 기존에 whitening을 사용했다. whitening은 데이터의 평균을 0으로, 분산을 1로 고정하고 데이터를 decorrelate시킨다. 그러나 whitening에는 크게 두 가지 문제가 있다.
- 비용이 비싸다. whitening을 수행하기 위해선 covariance matrix와 covariance matrix의 inverse square root를 계산해야 한다. 또 backpropagation을 할 때 derivatives를 구하는 데도 비용이 많이 든다.
- gradient descent가 normalization을 고려하지 않는다. Figure 3를 보면, x를 x hat으로 normalize를 해줬음에도 gradient descent(b를 업데이트하는 것)는 이를 고려하지 않기 때문에 x hat은 업데이트되지 않았다. 따라서 b는 무한으로 커질 것이고 loss는 줄어들지 않을 것이다.
그래서 논문에서 differentiable하면서도 전체 training set에 대한 분석이 필요하지 않는(비용이 싼) normalization 방법을 찾은 것이다.
Normalization via Mini-Batch Statistics
whitening은 비용이 비싸고 언제든 differentiable하지 않다는 문제를 해결하기 위해 논문의 연구진들은 두 가지 simplification 방법을 제시한다.
- normalize each scalar feature independently, by making it have the mean of zero and variance of 1: Figure 4를 보면 k차원에 대한 m개의 training example에 대한 평균과 분산을 구하고, 그것으로 normalizing하고 있다. 그러나, 단순히 입력을 normalizing하면 해당 layer의 representation이 변할 수 있다. 따라서 shift(베타)와 scaling(감마)을 추가로 해준다. 최종 BN 식은 Eqn. (2)와 같다. 이때, 감마와 베타도 each feature, 즉 k차원에 대해 존재하는 것으로 학습의 대상이다.
- use mini-bathces in SGD, each mini-batch produces estimates of the mean and variance of each activation: 전체 training example을 사용하여 normalization하는 것은 비실용적이므로 mini-batch의 statistics를 사용하여 normalization을 한다.
Algorithm of BN
Algorithm 1은 하나의 feature(하나의 차원)에 대한 batch normalization을 구현하기에 d개의 차원에 대해 똑같이 적용해주면 된다.
<알고리즘 설명>
먼저, 하나의 미니 배치에 m개의 training example이 있다고 하자. 감마와 베타는 각 차원마다 존재하는, BN의 파라미터이다.
m개의 training example에 존재하는 k차원의 값에 대해 평균 뮤를 구한다.
m개의 training example에 존재하는 k차원의 값에 대해 분산 시그마^2를 구한다.
평균과 분산을 이용해 m개의 training example에 존재하는 k차원의 값을 normalize해준다.
k차원마다 따로 존재하는 감마와 베타를 이용해 scaling과 shift를 해준다.
결과는 m개의 training example의 k차원에 존재하는 값들의 normalization 값이다.
BN의 backpropagation도 다음과 같이 파라미터에 대한 gradient를 구해서 수행할 수 있다. 자세한 내용은 Figure 5 참고.
Training and Inference with Batch-Normalized Networks
이제 각 layer의 입력으로 x가 아니라 BN(x)가 들어가게 된다. 그러나 training과 다르게 inference 때에는 파라미터들이 업데이트되지 않아야 한다. inference 때는 오로지 입력에 의해 결정론적으로 출력이 정해지길 바란다. 따라서 inference 때는 모든 파라미터를 frozen시키고, normalization은 Eqn. (3)와 같이 이루어진다. 미니 배치 별 statistics를 사용하는 것이 아니라 전체 statistics를 사용한다. 즉, Eqn. (3)의 E[x]는 training 때 사용된 mini-batch의 평균들의 평균이고 Var[x]는 training 때 사용된 mini-batch의 분산들의 평균이다. 이때 mini-batch의 평균들의 평균이라 함은, 마찬가지로 각각의 차원인 k에 대해 계산되는 것이다. Figure 6을 보면, 배치당 k차원의 평균과 분산을 구할 수 있는데, 이것들의 평균과 분산을 계산하여 inference에서 사용하는 것이다.
inference에서의 BN 알고리즘은 Algorithm 2와 같다.
<알고리즘 설명>
K개의 feature 차원의 x가 입력으로 들어온다.
---Algorithm 1을 따라 training을 진행한다.---
frozen parameter를 이용해 inference를 진행한다.
inference의 BN에 사용되는 평균과 분산을 training에 사용된 배치들로부터 구한다. 이때, 감마와 베타는 training으로부터 고정된 파라미터이다.
Batch-Normalized Convolutional Networks
BN은 어떤 네트워크에도 적용될 수 있다. BN은 nonlinearity를 더해주기 전 단계에 실행되어 nonlinearity function을 거치면 안정적인 분포의 activations를 출력한다. Eqn. (4)에서 u는 입력이고 W는 가중치이다. 이 연산은 fully connected layer가 될 수도 있고 convolutional layer가 될 수도 있다. normalize를 하면 어차피 편향 b는 상쇄되므로 표기에서 뺀다.
그렇다면 BN이 CNN에서 어떻게 적용되는지 그 양상을 알아보자. CNN의 입력은 이미지로, 각 이미지는 픽셀을 갖고 있다. 이 픽셀이 앞선 표기의 차원과 같다. 또한 하나의 convolution layer는 N개의 필터를 갖고 있는데, 하나의 필터 당 하나의 feature map을 만든다. 만약 하나의 배치에 m개의 이미지가 있다면 각각의 이미지에 같은 N개의 필터가 적용되어 하나의 이미지 당 N개의 feature map이 만들어질 것이다. 이때 normalize는 m개의 이미지들의 k번째 필터끼리 평균 내고, 분산 구해서 이루어진다. 마찬가지로 감마와 베타도 각각의 feature map마다 존재하게 된다.
Batch Normalization enables higher learning rates
BN을 사용하면 high learning rate를 사용해서 빠르게 학습을 진행할 수 있다. BN은 네트워크 전체의 값을 안정화시키기 때문에 layer가 깊어질수록 심화되는 gradient exploding이나 gradient vanishing 문제를 피해갈 수 있게 한다. 또한 파라미터의 크기가 커지더라도 BN을 사용하면 안정적으로 학습할 수 있다.
Batch Normalization regularizes the model
BN은 미니 배치 단위로 이루어지기 때문에, 본인이 속한 example 외의 example은 보지 못한다. 따라서 BN은 일반화 및 정규화 효과도 있다.
Experiments
MNIST
입력 이미지 하나당 100차원을 가지고, 3개의 fully connected hidden layer를 가지며 각각의 layer는 y = g(BN(Wu + b))로 계산된다. 이때 g는 sigmoid nonlinearity를 가진다. cross-entropy loss를 사용하고 5000번의 step을 거치며 배치 하나 당 60개의 example을 가진다. 이 실험의 목적은 MNIST의 start-of-the-art를 기록하는 게 아니라 base model과 BN을 적용한 모델의 성능 차이를 보는 것이다. Figure 7의 (a)를 보면 BN을 적용한 모델의 accuracy가 높은 것을 확인할 수 있다. 또한 Figure 7의 (b)와 (c)를 비교해보면 BN이 입력 분포를 잘 고정시켜 학습에 도움을 주는 것을 확인할 수 있다.
ImageNet Classification
논문에서는 base model인 Inception 모델을 다음과 같이 설정했다. 여러 개의 convolutional layer와 pooling layer를 가지고 1000개의 클래스를 분류할 수 있도록 softmax classifier를 이용한다. covolutional layer는 ReLU nonlinearity를 사용한다. optimizer로는 SGD with momentum을 사용했고 미니 배치 사이즈는 32이다.
논문에서는 Inception을 이런 형태 저런 형태로 BN를 적용시켜서 실험했다.
Acclerating BN networks
Inception with BN network를 빠르게 할 수 있는 방법을 소개한다.
- increasing learning rate
- remove dropout
- reduce the L2 weight regularization
- acclerate the learning rate decay
- remove local response normalization
- shuffle training set more thoroughly
- reduce the photometric distortions
Single Network Classification
Inception을 base model로 설정하고 BN modification을 적용한 single network의 classification 성능 비교 결과다.
- Inception: learinng rate = 0.0015
- BN-baseline: same as Inception but with BN
- BN-x5: Inception with BN and applications of above 7 factors which help a model accelerate its speed. learning rate = 0.0075
- BN-x30: Like BN-x5, but with initial learning rate = 0.045
- BN-x5-sigmoid: Like Bn-x5, but with sigmoid nonlinearity instead of ReLU
<Results>
By adding above 7 factors which help a model accelerate its speed, BN-x5 and BN-x30이 다른 모델에 비해 빠르게 훈련되는 것을 확인할 수 있다. BN-x5 모델은 Inception보다 14배나 빠르게 72.2%의 정확도에 도달했다. 흥미로운 것은, BN-x30이 BN-x5보다 72.2%의 정확도에 도달하기까지는 오래 걸렸지만 최종 정확도는 가장 높았다. 또한, BN은 nonlinearity function으로 sigmoid를 써도 69.8%의 높은 정확도에 도달할 수 있도록 한다. (by reducing ICR)
Ensemble Classification
6개의 BN-x30 모델로 앙상블 모델을 구성한 결과, top-5 error가 4.9%라는 좋은 성능을 거뒀다.
Conclusion
본 논문은 DNN 훈련을 가속화시키는 새로운 mechanism을 제시하고 있다. 이는 네트워크 안에서 internal covariate shift라는 문제가 훈련 속도를 느리게 한다는 것과 이를 제거하면 훈련 속도를 높일 수 있다는 것을 전제한다. BN은 감마와 베타, 두 가지의 파라미터만 추가함으로써 activations를 normalize한다.