본문 바로가기

AI

Batch Normalization

하이퍼 파라미터의 민감도를 낮추어 매우 깊은 deep network를 사용 가능하게 만들어주는 기법

 

batch normalization을 알기 위해서는 먼저 batch와 mini-batch가 무엇인지 알아야한다

input으로 데이터 전부를 사용하는 것을 batch라고 한다

하지만 최근에는 데이터가 많아져서 전부 사용하면 메모리도 부족하고 오래걸려 잘 사용하지 않고 mini batch를 사용한다

5000000개의 데이터가 있을 때 이 데이터를 1000개 씩 5000개로 나누면 mini batch 5000개가 있는 것이다

 

데이터 전부를 사용하는 경우가 별로 없기 때문에 batch라고 하면 거의 mini batch를 말한다고 한다

실제로 사용할 때에는 1000개씩 미리 나누어 놓기 보다는 랜덤으로 1000개를 뽑고 5000번 반복한다면 모든 데이터를 확률적으로 볼 수 있다고 가정하고 사용한다

 

한번에 1000개를 이용하여 mini batch 단위로 gradient descent를 진행한다

5000번 반복하면 전체 데이터를 다 사용하여 gradient descent를 진행했다고 생각할 수 있는데 이를 1 epoch이라고 한다

 

batch 전체를 gradient descent에 사용한다면 training set error는 항상 감소한다

mini batch를 사용한다면 전체 training set error는 감소와 증가를 반복하며 전체적으로는 우하향 할 것이다

하지만 증가하는 경우 Local minimum을 탈출할 수도 있다는 장점이 있다

 

mini batch size는 1~$\infty $이다

실제로는 전체 데이터 개수인 m보다 크게 사용하는 경우는 없겠지만 이론적으로는 무한히 증가할 수 있다

이 중 size가 1인 경우는 특별히 stochastic gradient descent라고 한다

 

stochastic proper size batch ( size = m )
vectorization으로 인한 속도 향상이 없어져서
속도가 느리다
element wise training과 똑같다
vectorization을 사용하고 전체 데이터를 사용하지 않아 속도가 빠르다 한번 학습시키는데 너무 오래 걸린다

 

적절한 mini batch 사이즈를 정할 때는 메모리에서 효율적으로 사용할 수 있도록 2의 제곱수로 결정한다

 

이렇게 batch와 mini batch를 알아보았으니 이제 batch normalization을 알아보자

normalization을 사용하면 데이터별로 scale 차이를 줄여줘서 특정 feature가 너무 큰 영향을 주지 않도록 해준다

또한 loss가 빨리 줄어들도록 할 수 있어 학습 속도도 빨라진다

 

batch normalization은 이와 비슷한데 layer별로 적용하므로 input data 뿐만 아니라 hidden unit의 input에서도 위와 같은 효과를 얻을 수 있게 해준다

layer 별로 적용할 때에는 activation function 들어가기 전, 선형 변환 후에 적용한다

 

- batch normalization 구현하기

 

$ \mu = \frac{1}{m}\sum_{i}z^{(i)} $

$ \sigma ^2=\frac{1}{m}\sum_i(z^{(i)}-\mu)^2$

$ z^{(i)}_{norm} = \frac{z^{(i)}-\mu}{\sqrt{\sigma ^2 + \epsilon}} $

 

분산 1, 평균 0이 best라는 보장이 없으므로 $ z^{(i)}_{norm} $를 그대로 사용하지 않고 $ \widetilde{z}^{(i)} = \gamma \cdot z^{(i)}_{norm}+ \beta $로 바꾸어서 사용한다

이렇게 바꾸어주면 분산이 gamma 평균이 beta가 되고 학습 가능하다

이 gamma와 beta는 layer별로 하나씩 갖게 되고 gradient descent를 적용하여 업데이트 한다

 

beta를 사용하면 $ Z^{[l]} = W^{[l]}a^{[l-1]}+b^{[l]} $이 $ \widetilde{Z}^{[l]} = \gamma^{[l]}Z^{[l]}_{norm}+\beta^{[l]} $이 되므로 굳이 bias term을 사용하지 않아도 괜찮다

 

만약에 학습 결과가 $ \gamma = \sqrt{\sigma ^2 + \epsilon} $, $ \beta = \mu $ 이렇게 나온다면 normalization 전 후가 같아서 하지 않은게 나은 상황이 된다

따라서 학습을 시키는 것이 좋을지 안 시키는 것이 좋을지의 여부도 학습 과정에서 결정이 된다고 알 수 있다

 

또한 전체 데이터에서 normalization 하지 않고 batch normalization을 하면 같은 데이터라도 약간의 노이즈가 생겨 data augmentation 효과도 얻을 수 있다는 장점도 존재한다

 

- batch norm 으로 구현된 네트워크에 test data 넣기

 

테스트 데이터는 m=1 이라 학습때처럼 normalization을 적용할 수 없다

따라서 학습 할 때 나온 mu과 sigma의 exponentially weighted 평균값을 사용한다

gamma와 beta는 학습의 결과로 구해진 값을 사용한다

 

- covariate shift

같은 class내에서 input이 같은 label 인데 너무 variance가 큰 경우 네트워크가 다루기 힘들어하고 이러한 경우를 covariate shift가 있다고 한다

 

- internal covariate shift

covariate shift의 일종

 

위와 같은 이미지는 $a^{[2]}$에 맞추어 $W^{[3]},b^{[3]}$을 업데이트 해준다

하지만 전체 weight을 업데이트 해주면 동일한 input에 대해서 $a^{[2]}$가 바뀌어서 들어와 학습한 효과가 떨어진다

 

batch normalization을 걸어주면 비슷한 평균과 분산을 가져서 똑같은 sample에 대해서 학습 도중에 feature가 흔들리는 걸 막아줄 수 있다

이러한 internal covariate shift를 처리하는게 batch normalization의 초창기의 원리로 연구되었는데 최근에는 gradient를 잘 만들어주는 점이 효과가 더 크다는 가설도 있다고 한다

 

- dropout과 같이 쓰기

 

dropout은 최근에 많이 쓰는 추세는 아니라는데 batch normalization은 아직도 많이 쓴다고 한다

둘이 같이 쓰는 것도 가능하지만 둘다 regularization의 효과가 있기 때문에 같이 쓰지 않아도 괜찮다

dropout에서 해당 노드가 선택되지 않으면 gamma와 beta를 업데이트 하지 않으면 된다

 

ITE4053 : Deep Lerarning ( Hanyang University )

'AI' 카테고리의 다른 글

Convolution & CNN  (0) 2021.05.31
Optimization Algorithms  (0) 2021.04.20
Regularization 4 - Early Stopping  (0) 2021.04.18
Regularization 3 - Data Augmentation  (0) 2021.04.18
Regularization 2 - Dropout regularization  (0) 2021.04.18