[Paper Review] Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

Happy Tosil 🐽·2022년 3월 3일
0

Paper Review

목록 보기
3/6

1. Introduction

SGD(Stochastic Gradient Descent) : 이전 포스터 참고
링크텍스트

SGD의 문제점

  1. hyperparameter들의 초기값 설정을 굉장히 신중하게 해줘야 한다.
    -> 아닐 경우, covariate shift가 발생 가능성

  2. Saturation problem
    : 기울기가 0이 되어 weight 업데이트량이 0이 되는 현상
    sigmoid 함수에서 큰 값을 가지면 기울기가 0이 되어 사라지는 문제점
    -> ReLU 함수 사용과 작은 learning rate를 사용하면서 해결하지만 완전한 해결책은 아니다.

Batch Normalization의 등장

  1. internal covariate shift 문제를 줄일 수 있다.
  2. DNN 학습을 가속화 시킬 수 있다.

우선 기존에 딥러닝 학습에 있어서 겪고 있던 문제들 중 대표적으로 각 레이어의 가중치들이 역전파 학습을 진행할 때 입력부로 올라오면서 학습이 잘 되지 않는 Gradient Vanishing / Exploding 문제가 있었다. 이를 해결하기 위해 가중치를 초기화하는 방법, ReLU와 같이 더 나은 활성화 함수(Activation Function) 방법, 규제화(Regularization) 방법을 제안하거나 학습률(Learning Rate)를 낮춰서 모든 레이어들의 가중치가 학습되도록 연구해왔다. 이러한 방법들을 이용함에도 레이어의 수가 많아질수록 여전히 학습이 잘 되지 않아 근본적인 문제를 해결하지 못하고 있었다.

BN 논문의 저자는 학습이 잘 되지 않는 근본적인 문제를 'Internal Covariate Shift'현상 때문이라고 주장을 하였고 Batch Normalization 기법이 이 현상을 해결해준다고 주장하였다.

2. Towards Reducing Internal Covariate Shift

internal covariate shift
: Training dataset을 학습시킬 때, 이전 레이어의 값에 따라서 다음 레이어의 가중치값이 영향을 받게 된다. 이 때 규제없이 가중치들이 학습하다보면 매개변수 값의 범위가 넓어질 수 있고 이 값들의 변동이 심해지는 현상
-> internal covariate shift의 이유로 overfitting이 일어나게 된다면 ?
: dataset의 분포 위치와 크기를 변경해주면 된다 !
이렇게 분포 위치, 크기를 변경하는 방법이 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 시킨다.

3. Normalization via Mini-Batch Statistics

그러면 각 레이어로 들어가는 입력 데이터들의 분포를 고르게 하기 위해 위의 방법처럼 평균 0, 표준편차 1의 값을 갖도록 standardization이나 whitening을 해주면 되는 것일까? 그렇지 않다. 입력 데이터들의 분포가 치우쳐져 있다면 데이터의 특성에 맞게 표준화(normalization)를 해주는 것이 좋은 것은 사실이다. 하지만 모든 데이터들이 평균 0, 표준편차 1이 되도록 변형시켜주는 것은(whitening) 데이터를 제대로 학습하지 못한다. 왜냐하면 whitening을 하게되면 이전 레이어로부터 학습이 가능한 parameters의 영향을 무시해버리기 때문이다.

다시말해,

현재 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을 제안하였다.


1. training data 전체를 다 학습할 수 없으므로 일정 크기에 해당하는 mini batch 안에서 평균과 분산을 계산 (정규화)
2. 입력 데이터에 대하여 각 차원(feature)별로 normalization을 수행, Mini batch 내의 한 example 내에서의 Activation 들은 각각 독립적
3. 엡실론이 붙는 이유는 0으로 나눠지는 것을 막기 위해서
4. normalization 된 값들에 대해 Scale factor(gamma)와 Shift factor(beta)를 더하여 학습이 가능한 파라미터를 추가

그러면 이제 학습이 완료되고 난 다음에 추론 과정에서 Batch Normalization layer는 어떻게 정규화를 수행할까?

추론 과정에서는 테스트 데이터 하나에 대해 답을 내야 하므로 평균과 분산을 계산할 수 없다.

따라서 추론할 때는 training set의 평균과 분산값으로 대체하여 정규화를 수행한다. 대체하는 방법으로는 크게 2가지가 있으며 학습할 때 사용했던 mini batch의 평균과 분산 값들을 이용한다.

5. Conclusion

How Does Batch Normalization Help Optimization 논문의 내용에서 ICS가 있다고 하더라고 학습에 영향을 주는 것이 아니라는 결론이 나왔다. 또한, BN은 ICS를 제거해서 성능을 높히는 방법을 제안한 것인데 이 또한 ICS가 제거되었는지 설명이 부족하다는 것이다.

하지만 결론적으로는 Batch Normalization은 성능이 좋다.

왜 성능이 좋은가?

Optimization landscape

바로 solution space를 smoothing 하기 때문이라는 것이다.

BN은 Loss function의 Lipschitzness를 증가시키는데 이는 Gradient가 stable하게 감소할수 있도록 만들어 준다.
즉 high learning rate에서도 stable하게 learning하도록 만들어준다.

Lipschitz

lipschitz 함수
: 두 점 사이의 거리가 일정비 이상으로 증가하지 않는다.

Lipschitness를 개선했다는 것은 gradient가 급격히 커지는 것을 방지할수 있다는 것이다.

f(x)f(y)xy<=K\left|\frac{f(x)-f(y)}{x-y}\right|<=K

BN은 학습 가능한 parameters가 존재하는 하나의 레이어 구조가 되며 이 기법이 발표된 이후 기존의 딥러닝 구조에서 Convolution Layer와 Activation Layer 사이에 BN Layer가 들어간 형태로 발전했다.
이 구조로 큰 성능 효과를 높이게 되어 거의 모든 딥러닝 구조에 BN기법이 사용되기 시작했다.

0개의 댓글

관련 채용 정보