[논문리뷰] Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift-1(Feature Scaling)
해당 논문은 딥러닝 모델에서 당연하게 쓰이는 BatchNormalization의 탄생 배경과 BatchNorm의 성능이 좋은 이유에 대해 작성한 논문입니다. 기본 개념인 Feature Scaling부터 자세하게 작성했으니 알고 계신 부분이라면 다음 장을 보셔도 좋을 거 같습니다.
FeatureScaling
Batch Norm에 대해 알아보기전에 Feature Scaling에 대해 말씀드리겠습니다.
Feature Scaling은 변수의 단위를 조정하는 기법입니다. Feature Scaling에는 정규화(Normalization)과 표준화(Standardization)이 있습니다.
1. 정규화(Normalization)
- 변수의 단위를 0~1사이 값으로 학습 시 변수간 영향력을 같게 하는 것을 의미합니다. Min-Max Scaler가 대표적입니다.
2. 표준화(Standardization)
- 입력 변수의 평균과 표준편차를 구해 평균은 빼고 표준편차는 나눠주는 과정을 의미합니다. 만약 변수가 정규 분포를 따른 다는 가정 하에 변수의 분포를 표준 정규 분포로 변환할 수 있게 됩니다.
- Standard Scaler, Robust-Scaler가 대표적입니다.
**Robust-Scaler는 변수에서 평균 대신 중앙값을 빼주고 표준편차 대신 IQR(1분위수-3분위수)로 나눠줘 일반적인 표준화 보다 이상치에 덜 민감하도록 표준화하는 방법입니다. 목적 자체가 표준화이기 때문에 RobustScaler도 표준화에 속하게 됩니다.
Feature-Scaling in Deep Learning
지금 부터는 Feature-Scaling이 DeepLearning에서 어떤 의미를 갖는지 알아보겠습니다.
Gradient Descent
대부분 아시다시피 딥러닝 모델은 Gradient Descent 방식으로 학습이 됩니다. Gradient Descent는 최적의 모델 파라미터를 찾기 위한 방법으로 손실함수의 최솟값을 손실함수의 기울기의 반대 방향으로 움직이며 찾아내는 과정을 뜻합니다. 연속적인 함수에 있어 최솟값은 대부분 기울기가 0인 값에 존재하기 때문에 기울기의 반대 방향(기울기가 양수이면 음의 방향, 음수이면 양의 방향)으로 움직이다 보면 기울기가 0인 값에 도달하게 될 것이고 결국 최적의 파라미터를 찾게 될 것이라는 걸 의미합니다.

Back Propagation
딥러닝 모델은 학습 시에 모든 Trainable Parameter들에 대한 기울기의 값을 구해야 하는데 이때 사용하는 방법이 BackPropagation이고 역전파 과정에서 각 파라미터들의 기울기는 Chain-Rule을 통해 구하게 됩니다.
example) f(x)=4x, x=2a, a=3Θ 일때
$$ \frac{\partial f}{\partial \Theta} = \frac{\partial f}{\partial x} \frac{\partial x}{\partial a} \frac{\partial a}{\partial Θ} $$ 로 나타낼 수 있으며 4*2*3이되어 24가 될 것입니다. 이는 Θ가 1만큼 움직일 때 f(x)가 24만큼 움직인 다는 것을 뜻합니다.
Θ의 업데이트 과정은 이런 식으로 진행될 것입니다. $$ \Theta(t) = \Theta(t-1) - α \sum_{i=1}^{n} \frac{\partial L}{\partial Θ} $$
(여기서 L은 손실함수를 의미합니다.)
여기서 n은 전체 training set의 개수를 의미합니다. 전체 학습 데이터의 Gradient의 평균으로 학습이 되며 Training Step을 여러번 반복해서 손실함수의 값을 줄여나가게 됩니다. 하지만 보통 한 번에 할 수 있는 연산량에 제한이 있어 Batch 단위로 학습하는 Mini-Batch Gradient Descent과정으로 학습이 이뤄지므로 Batch Size를 m으로 둔다면 이렇게 나타날 것입니다.
$ \Theta(t) = \Theta(t-1) - α \sum_{i=1}^{m} \frac{\partial L}{\partial Θ} $
Learning Rate
Batch의 Gradient의 평균값으로 파라미터를 움직이게 되는 것입니다. Gradient의 평균에 곱해진 α는 Leaning rate를 의미합니다. Learning Rate는 계산된 Gradient로부터 파라미터를 얼마나 이동시킬 것인가를 결정하는 하이퍼파라미터 입니다.
너무 높은 Learning rate를 사용하면 최솟값을 두고 주변에만 머물러 수렴하는데 오래 걸리거나 수렴하지 못하게 될 수도 있습니다. 반대로 너무 낮은 Learning rate를 사용하면 언젠가 수렴은 할 수 있겠으나 상당히 긴 시간이 소요될 수 있습니다.
따라서 적당한 Learning rate를 찾는 것이 중요합니다. 적당한 learning rate라 하면 Task마다 Data마다 모두 다를 수 있습니다. 특히 Down Stream Task에 적응시키는 Finetunning시 학습이 Learning rate에 굉장히 민감하게 되는데 이는 실험을 진행하며 경험적으로 찾아보는 게 가장 정확합니다.
이제 지금까지 본 것들을 바탕으로 예시를 들어보겠습니다.
X1과 X2 값을 가지고 Y를 맞추는 문제입니다. 여기서 주목할 점은 X1의 값이 X2보다 압도적으로 크다는 것입니다. 사용할 모델은 간단하게 Y = W1* X1 + W2*X2로 정의하고 Loss는 MSE를 사용하겠습니다.
이번에는 글로만 쓰기가 어려우니 노트필기로 보여드리겠습니다.
위 식은 파라미터 w1이 업데이트 되는 과정을 나타낸 것입니다. 식에서 주목할 점은 Gradient에 단위가 큰 X1이 곱해졌다는 것입니다. 똑같은 값 Y를 예측하는데 있어 X1이 커지면 w1의 값은 작아질 것입니다. 이는 w1이 잘 예측했다고 할 수 있는 Boundary가 작아진 것이라 할 수 있습니다. 간단한 예시로 Y = Θ*X1이라 할 때 Y=300 , X1 =200 이라면 Θ=1.5가 되겠고 X1=2라면 Θ=150이 될 것 입니다. 딥러닝 모델도 완전히 수렴하는 경우는 거의 없으므로 어느 정도 허용오차를 둔다고 할때 X1이 200일때 파라미터 Θ의 바운더리는 X1=2 일때의 Θ의 바운더리보다 100배 작아지게 될 것 입니다. 이는 파라미터가 업데이트 될 때 예측값이 민감하게 반응한다고도 할 수 있겠죠. 이를 다시 W1에 대해 나타내보면
Scaling이 되지 않았을 때 바운더리가 작음에도 불구하고 Update되는 값 Gradient가 커지므로 수렴이 잘 일어나지 않게 되는 반면 Scaling이 되었을 때는 바운더리가 커지는데 비해 Gradient의 값이 상대적으로 작으므로 수렴이 더 안정적으로 이뤄지게 됩니다.
이미지 데이터를 다룰 때 픽셀값에 대해 255로 나눠줘 0~1사이 값으로 만들어준 후 Standard Scaling을 해주게 됩니다. 아래는 차례대로 255로 나누지 않은 것의 결과이고 두 번째는 255로 나누기만 한 결과, 나머지는 모두 적용한 결과입니다. 수렴 속도와 수렴 결과의 차이가 난다는 것을 알 수 있을 것 입니다.
이러한 점으로 보아 Feature Scaling은 안정적인 수렴을 위해 파라미터의 크기와 변수의 크기의 비율을 맞춰주는 것이라고도 해석할 수 있겠습니다.
아래는 추가적으로 진행한 실험인데 픽셀의 값을 255가 아닌 2550으로 나눠서 0~0.1 사이의 값으로도 25.5로 나눠 1~10 사이 값으로도 학습을 시켜봤습니다. 결과적으로 0~1 사이 값이 가장 좋았는데 이는 Activation Function의 작용 범위 때문이 아닐까 생각해 보게 되었습니다. 0~1 사이 값이 Activation Function과 상호작용하기 가장 좋은 크기일 것이라는 뜻이죠.(확실하진 않습니다.)