SGD의 문제점
hyperparameter들의 초기값 설정을 굉장히 신중하게 해줘야 한다.
-> 아닐 경우, covariate shift가 발생 가능성
Saturation problem
: 기울기가 0이 되어 weight 업데이트량이 0이 되는 현상
sigmoid 함수에서 큰 값을 가지면 기울기가 0이 되어 사라지는 문제점
-> ReLU 함수 사용과 작은 learning rate를 사용하면서 해결하지만 완전한 해결책은 아니다.
Batch Normalization의 등장
internal covariate shift 문제를 줄일 수 있다.
DNN 학습을 가속화 시킬 수 있다.
우선 기존에 딥러닝 학습에 있어서 겪고 있던 문제들 중 대표적으로 각 레이어의 가중치들이 역전파 학습을 진행할 때 입력부로 올라오면서 학습이 잘 되지 않는 Gradient Vanishing / Exploding 문제가 있었다. 이를 해결하기 위해 가중치를 초기화하는 방법, ReLU와 같이 더 나은 활성화 함수(Activation Function) 방법, 규제화(Regularization) 방법을 제안하거나 학습률(Learning Rate)를 낮춰서 모든 레이어들의 가중치가 학습되도록 연구해왔다. 이러한 방법들을 이용함에도 레이어의 수가 많아질수록 여전히 학습이 잘 되지 않아 근본적인 문제를 해결하지 못하고 있었다.
BN 논문의 저자는 학습이 잘 되지 않는 근본적인 문제를 'Internal Covariate Shift'현상 때문이라고 주장을 하였고 Batch Normalization 기법이 이 현상을 해결해준다고 주장하였다.
By whitening the inputs to each layer, we ould take a step towards achieving the fixed distributions of inputs that would remove the ill effects of the internal covariate shift.
what is whitening?
: 데이터의 평균을 0, 그리고 공분산을 단위행렬로 갖는 정규분포 형태로 변환하는 기법으로 Decorrelation + Standardization으로 볼 수 있다. 보통 PCA를 이용해 데이터를 decorrelated 시킨다.
다시말해,
현재 Hidden Layer의 입력 데이터 X'은 이전 레이어의 입력 데이터 X로부터 학습 가능한 파라미터(weight, bias)와 계산을 통해 나온다. X' = weigth X + bias 정규화 과정에서 입력 데이터 X'의 평균(E[X'])을 입력 데이터에서 빼준다. X'' = X' - E[X']
E[X'] = weight E[X] + bias 이므로 식을 정리하면 X'' = X' - E[X'] = weight * (X - E[X])
이 과정에서 bias가 없어지므로 학습 가능한 파라미터의 영향이 사라져 제대로 학습이 불가능해진다.
또, 평균 0, 표준편차 1로 데이터의 분표를 변환하게 될 경우 활성화 함수로 Sigmoid를 사용하게 되었을 때 비선형성(non-linearity)의 특징을 잃어버리게 되는 문제가 생긴다.
따라서 단순히 평균을 0으로 만들고 표준편차가 1이 되도록 정규화를 하는 것이 아니라 다음의 주요한 특징을 갖는 Batch Normalization을 제안하였다.
그러면 이제 학습이 완료되고 난 다음에 추론 과정에서 Batch Normalization layer는 어떻게 정규화를 수행할까?
추론 과정에서는 테스트 데이터 하나에 대해 답을 내야 하므로 평균과 분산을 계산할 수 없다.
따라서 추론할 때는 training set의 평균과 분산값으로 대체하여 정규화를 수행한다. 대체하는 방법으로는 크게 2가지가 있으며 학습할 때 사용했던 mini batch의 평균과 분산 값들을 이용한다.
하지만 결론적으로는 Batch Normalization은 성능이 좋다.
왜 성능이 좋은가?
Optimization landscape
바로 solution space를 smoothing 하기 때문이라는 것이다.
BN은 Loss function의 Lipschitzness를 증가시키는데 이는 Gradient가 stable하게 감소할수 있도록 만들어 준다.
즉 high learning rate에서도 stable하게 learning하도록 만들어준다.
Lipschitz
lipschitz 함수
: 두 점 사이의 거리가 일정비 이상으로 증가하지 않는다.
Lipschitness를 개선했다는 것은 gradient가 급격히 커지는 것을 방지할수 있다는 것이다.
∣
∣
∣
∣
∣
x−y
f(x)−f(y)
∣
∣
∣
∣
∣
<=K
BN은 학습 가능한 parameters가 존재하는 하나의 레이어 구조가 되며 이 기법이 발표된 이후 기존의 딥러닝 구조에서 Convolution Layer와 Activation Layer 사이에 BN Layer가 들어간 형태로 발전했다.
이 구조로 큰 성능 효과를 높이게 되어 거의 모든 딥러닝 구조에 BN기법이 사용되기 시작했다.