본문 바로가기
  • Deep dive into Learning
  • Deep dive into Optimization
  • Deep dive into Deep Learning
Deep dive into Deep learning

Deep dive into Deep learning part 19 : Regularization(4) - Updated

by Sapiens_Nam 2023. 5. 16.

모바일 앱 환경에서는 latex 수식이 깨져 나타나므로, 가급적 웹 환경에서 봐주시길 바랍니다.

 

 

 

오늘은 Regularization의 마지막 글 Batch normalization, Layer normalization에 대한 이야기이다.

 

둘의 기저에 깔린 메커니즘은 비슷하다. 다만 무엇을 기준으로 'normalzation'을 하는가의 차이만 있을 뿐이다.

우선, Batch normalization부터 알아보자.

 

 

일반적인 color image는 C, H, W 3차원 텐서로 이루어져 있다. 

이때 C는 Color channel(R,G,B) , H는 Height, W는 width로서 color image 1장은 $H * W$ 만큼의 픽셀값을 R, G, B 채널에 각각 가지고 있다. 흑백 이미지의 경우 Color channel의 크기는 1이다.

 

 

그런데 우리는 일반적으로 data sample 하나를 neural network의 input으로 집어넣지 않고 묶음으로 집어넣는다.

이를 딥러닝에서 'batch'라고 한다. 전체 Training dataset을 Full-batch, 전체 Training dataset에서 Sampling된 일부 Training dataset을 'Mini-batch'라고 한다.

 

Batch normalization에서의 Batch는 Mini-batch를 의미한다.

그렇다면 만약 mini-batch의 크기가 $128$이고 (GPU 특성상 일반적으로 2의 거듭제곱을 사용한다.) Height와 Width가 $256$이라면, color image data는 $4$차원 텐서 $(128, 3, 256, 256)$이 Neural network의 input으로 들어가서 학습이 진행되는 것이다.

 

통계에서 Normalization에는 다양한 기법들이 존재하는데 Batch normalization에서는 'Standardization'과 같은 의미에서의 Normalization을 의미한다.

Standardization은 변수의 값이 'Standard Normal distribution' 즉 $\mathbb{N}(0, 1^2)$를 따르도록 값을 변환하는 것이다. 이때 다음의 방식을 활용해 변수의 값들을 변경해준다.

 

$\hat{x} = \frac{x - \mathbb{E}(x)}{\sqrt{Var[x]}}$

 

사실 Batch normalization에서 작업해주는 것은 엄밀하게 이야기하면 Standardization이다.

 

 

위 방식이 Batch normalization 연산인데 Mini-batch의 feature 값들을 x라고 하였을 때, $x_i$들의 평균 (sample mean), $x_i$들의 분산 (variance) 을 이용하여 Standardization을 진행하고, 그 결과인 $\hat{x}_i$를 두 파라미터 $\gamma, \beta$를 활용해 scaling과 shift를 진행해준다. 이 두 parameter에 대해서는 뒤에서 다시 이야기하자.

즉, Mini-batch에 있는 모든 데이터들의 "각 feautre들의 평균과 분산"을 구하여 Standardization하는 것이다. (batch 차원을 단위로 하여)

앞으로는 위 방식을 그냥 'Normalization'이라 부르겠다.

 

먼저 이 방식을 왜 사용하는가? 그리고 이 방식이 왜 효과가 좋은가에 대한 이야기부터 진행하도록 하겠다.

먼저 Batch normalization을 처음 소개한 논문 'Batch normalization : Accelerating Deep Network Training by reducing Internal Covariate Shift"에서는 제목에서 보면 알 수 있듯이 'Internal Covariate Shift'라는 현상을 완화하기 때문에 Batch normalization이 학습 속도를 더 빠르게 한다고 (= 안정적인 학습) 이야기한다.

이 설명은 이후 논문에 의해서 반박이 되었는데 이에 대해서도 뒤에서 간단히 언급하겠다.

 

Neural network는 여러 개의 층 (layer)들이 겹겹이 쌓인 구조를 가지고 있다. 각 layer는 Convolution layer, Fully connected layer 등이 있을 것이고, 이 layer에서 파라미터 $W$와 선형 연산이 이뤄진 후, Non-linear activation function을 거쳐서 다음 layer의 input으로 들어간다.

이때 각 layer별로 입력 데이터 분포 (Feature 값들의 분포)가 계속 바뀌는 현상이 생기는데 이를 'Internal covariate Shift'라고 한다. 즉, 이 말은 layer를 거치면서 데이터의 분포가 변화되는 것을 의미하고 결국 하나의 Mini-batch에서의 분포 차이와 Mini-batch 서로 간의 데이터 분포 차이도 발생할 것이다. 

이러한 현상을 Internal Covariant Shift라고 한다.

Batch normalization은 각각의 Layer들 사이에 'Batch normalization layer'를 추가하여 각각의 batch 별 mean과 variance로 정규화를 진행하여 $\mathbb{N}(0,1^2)$의 분포로 만들어준 다음에 다음 layer input으로 집어넣어준다.

 

또한 앞서 본 것처럼 scaling과 shift를 위한 파라미터 $\gamma$와 $\beta$가 있는데 이 두 값은 모두 backpropagation을 통해 학습이 되는 parameter들이며 이들의 역할은 다음과 같다.

우리가 batch normalization을 적용하면 feature tensor의 값이 평균이 $0$, 분산이 $1$인 상태로 분포가 이뤄지는데, (특히 정규분포이므로 $0$ 주변에서의 분포가 가장 클 것이다.) 이 상태에서 ReLU activation function에 집어넣으면 전체 분포에서 절반 가량이 음수에 해당하므로 0이 되어 버릴 것이다. 또한 만약 Sigmoid 같은 activation function에 집어넣으면 역시나 'Non-linearity'가 많이 사라질 것이다. 

 

Activation function을 적용하는 이유는 'Non-linearity'를 위해서인데 Sigmoid를 보면 0주변에서 곡선이 아닌 직선에 가까운 형태를 가지고 있고, ReLU는 $\max (0,x)$ 함수이므로 0 이하의 값은 전부 0이 나오므로 batch normalization의 output이 위 함수들의 input으로 들어갈 경우 이러한 문제가 발생할 수 있음을 알 수 있다.

이를 위해 $\gamma$, $\beta$를 통해서 분포의 이동을 통해 ReLU나 Sigmoid activation function들이 적용되더라도 대다수의 Feature 값들이 의미가 없어지는 상황을 방지해준다.

 

또한, Batch normalization은 Test 시에는 약간 다른 방식으로 사용이 되는데, Test 시에는 매 Mini-batch 별로 평균과 분산을 구하지 않고, Train 시에 사용한 Mini-batch 별 평균과 분산등을 저장해놓아 이 값들을 사용한다.

이때 Moving average 또는 Exponential average등을 활용하여 Test 단계에서 Mini-batch의 평균과 분산값으로 사용한다.

이는 실제 Batch normalization을 적용한 Neural network를 Train / Inference 하는 것을 구현할 때 주의해야 한다.

 

어쩄든 Batch normalization은 상당히 좋은 효과를 가지고 있음이 알려졌고, 현재까지도 많이 사용하는 테크닉 중 하나이다. 

 

하지만 이후의 논문들에서 Batch normalization이 정말로 Internal covariate shift를 완화할까라는 것에 대한 의문이 제기되었고 이에 대해 반박하는 논문들이 등장하였다.

Batch normalization이 잘 동작하는 이유는 Loss function (Loss landscape)을 smooth하게 만들기 때문인데 이는 다시 말해서 gradient의 Lipshchitzness가 향상되기 때문에 더 빠르고 안정적인 학습이 가능하다는 것을 Theoretically / Empirically 보이는 논문도 있었다. ( = Lipschitz constant가 작아졌다.)

* How Does Batch Normalization Help Optimization? (Neurips 2018)

 

추가적으로, Batch normalization의 평균과 분산에는 Mini-batch size가 직접적으로 영향을 미치기 때문에 Mini-batch size가 너무 작으면 그 효과가 떨어진다는 것이 알려져 있다.

 

마지막으로 Layer normalization에 대해 간단하게 언급하고 마치겠다.

Layer normalization은 주로 RNN계열의 architecture들에서 사용되며 동일하게 Normalization을 진행하는데 'hidden unit' 단위로 Normalization을 진행하는 것이다. 

이는 각 sample에 대해서 feature들의 평균과 분산을 구하는 것이다. 하나의 data sample의 feature들을 normalize하는 것이기 때문에 이는 Mini-batch size의 영향을 받지 않는다.

728x90

댓글