-
Normalization기초_개념/Deep Learning 2021. 1. 12. 23:37
Normalization Layer
- 등장 배경
- DNN 연구의 Bottle-neck 현상에 의해 학습시간이 길어지는 것을 해결하고 학습 시간을 단축시키고자 등장하였습니다.
- 학습 시간을 단축하고 효율을 높이고자 하는 연구는 꾸준히 등장하고 있었습니다.
- 데이터 및 DNN 자체를 분할해서 계산하는 DNN 연산 병렬화가 등장하였지만, 통신지연과 SW의 복잡화에 의한 문제가 있었습니다.
- Gradient 계산법 자체를 개선하는 방법 또한 등장하였지만, 2차 미분을 다루게 된다면 계산 비용이 커지고 어디로 튈지 예측할 수 없는 Ill-conditioned problem이 발생할 가능성이 있습니다.
- Parameter의 공간기하를 수정한다. 이는 Batch Normalization을 의미하며, 실제 학습시간 단축에 성공하였고 Gradient Vanishing 문제를 해결하였습니다.
- Gradient Vanishing 해결법 = 학습 효율 증가 방법
- ReLU 함수를 사용하여 값이 커지거나 작아지면 대부분 값이 0이 되는 것을 방지합니다.
--> 학습할 때마다 각 층의 출력분포가 바뀌는 Internal Convariate Shift* (공변량 변화)가 원인입니다. - Weight Initialization
- 작은 Learning Rate를 사용한다 = 학습에 의해 값이 지나치게 커지거나 작아지는 것을 방지합니다.
--> 학습 시간이 오래 걸리는 가장 큰 원인은 작은 Learning Rate 이다.
- ReLU 함수를 사용하여 값이 커지거나 작아지면 대부분 값이 0이 되는 것을 방지합니다.
- 동작
- 중간층의 출력을 정규화함으로써 학습 시간을 단축시킵니다.
- 각 중간층의 입력분포를 일정하게 하여 큰 Learning Rate를 사용할 수 있도록 하였습니다.
- 일반적으로 FC --> Normalization --> Activation Function --> FC 순서가 가장 좋다고 알려져 있습니다.
- 또한, Batch Normalization 논문에 의하면 Normalization이 DropOut을 대체할 수 있다고 나와 있지만 실제로는 둘 다 사용했을 때 가장 좋다고 알려져 있습니다.
- 중간층의 출력을 정규화함으로써 학습 시간을 단축시킵니다.
- 종류
- 정규화 단위에 따라 분류될 수 있습니다.
- Batch Normalization
- Layer Normalization
- Instance Normalization
- Group Normalization
- Weight Standardization
Normalization 단위를 시각화한 그림 Batch Normalization
- 배치는 전체 데이터를 한 번에 처리하기 힘들 경우 작은 단위로 나누어 처리할 때, 나누는 단위를 의미합니다.
- 배치 단위로 나누어진 데이터 그룹을 미니 배치라고 부릅니다.
- Batch Normalization은 말 그대로 배치 단위로 정규화를 진행하는 기법으로 미니배치의 데이터에서 각 feature별 평균과 분산을 구한 뒤 정규화를 통해 평균 = 0, 분산 = 1이 되도록 하는 것입니다.
- Batch Normalization의 동작을 수식과 함께 살펴보도록 하겠습니다.
$\mu_B $ <- $\frac{1}{m}\sum_{i=1}^{m}x_i$ $\sigma_B^2$ <- $\frac{1}{m}\sum_{i=1}^{m}(x_i - \mu_i)^2$ $\hat{x_B}$ <- $\frac{x_B-\mu_B}{\sqrt{\sigma_B^2+\varepsilon}}$
- 위의 수식에서 $\mu_B$는 미니배치 m개의 입력 데이터 집합에 대한 평균을 의미하며 $\sigma_B^2$는 분산을 의미합니다.
- 이렇게 구한 데이터에 대한 평균과 분산을 이용하여 평균이 0, 분산이 1로 정규화된 데이터 $\hat{x_i}$를 반환합니다.
- 이 때, $\varepsilon$은 1e-6과 같이 매우 작은 값으로, 분산이 0일 경우 divide by zero 문제가 발생하는 것을 방지해줍니다.
- 결과적으로 미니배치 $B = {x_1, x_2, ... ,x_m} --(정규화)--> {\hat{x_1}, \hat{x_2}, ... , \hat{x_m}$으로 바뀌어 활성화 함수에 입력되게 됩니다.
- 뿐만 아니라, 정규화를 커친 $\hat{x_i}$의 값은 대부분 0에 가까운 값이 됩니다. 이를 통해 학습률을 높이면 가중치의 scale이 커지게 되고, 이는 Backpropagation에서 오차가 발산하는 문제를 해결할 수 있게 됩니다.
- Batch Normalization은 이후에 Scale($\gamma$)과 Shift($\beta$)를 해주는데 정규화된 입력 데이터가 시그모이드 활성화 함수의 입력으로 들어가게 되면, 시그모이드가 선형구간에 빠지게 됩니다. Scale과 Shift는 이러한 문제를 해결하기 위해 사용됩니다.
- $y_i = \gamma\hat{x_i} + \beta$ // $\gamma$와 $\beta$는 초기 1과 0으로 초기화된 후 학습 과정에서 적합한 값으로 조정됩니다.
- Inference 단계에서의 BN
- Inference 단계에서는 미니배치의 평균과 분산이 존재하지 않기 때문에 학습 데이터셋 전체의 평균과 분산을 사용합니다.
- 이 때, 학습 데이터셋 전체를 한 번에 계산하기에는 메모리의 제약이 있기 때문에 미니배치 평균과 분산을 평균낸 값을 대신 사용합니다.
- 즉, n개의 minibatch가 있을 때 전체 평균은 $\hat{\mu} = \frac{1}{n}\sum_{i=1}^{m}\mu_B^(i)$ 이며, 전체 분산은 $\hat{\sigma} = \frac{1}{m}\sum_{i=1}^{m}\sigma_B^(i)$가 됩니다.
- RNN용으로 확장한 BN을 사용하면 RNN 계열의 뉴럴 네트워크에서도 이용 가능하나 일반적으로 Layer Normalzation이 더 놓습니다.
Layer Normalization
- Batch Noramlization이 배치 단위로 정규화한 방법이라면 Layer Normalization은 층 단위로 뉴런을 정규화한 방법입니다.
- Layer Normalization은 동일한 층의 뉴런간 정규화를 하며 mini-batch 샘플간의 의존관계가 없기 때문에 데이터가 한 개씩 순차적으로 들어가는 온라인이나 RNN으로 확장이 가능해집니다.
- 각 층의 뉴런마다 계산되며, 수식은 BN의 batch size(m)를 동일층의 뉴런의 수(H)로 바꾸기만 하면 됩니다.
$\mu_B $ <- $\frac{1}{H}\sum_{i=1}^{H}x_i$ $\sigma_B^2$ <- $\frac{1}{H}\sum_{i=1}^{H}(x_i - \mu_i)^2$ $\hat{x_B}$ <- $\frac{x_B-\mu_B}{\sqrt{\sigma_B^2+\varepsilon}}$
*Internal Convariate Shift (공변량 변화)
- 신경망의 각 층에 따라 활성화 함수로 들어가는 입력데이터의 분포가 다른 현상을 말합니다.
- 중간층의 입력 분포는 아래 층의 파라미터에 의존하기 때문에 정해진 입력분포를 각 층에서 유지하지 못하고 이로 인해, 학습을 할 때마다 중간층으로의 입력분포가 변화하게 됩니다.
- DNN에서의 문제
- 파라미터가 결과적으로 엉뚱한 방향으로 업데이트 될 우려가 있고, 활성화 함수 입력 값이 매우 커지거나 작아지기 쉬운 상태가 됩니다.
- 이러한 문제는 층이 깊어질 수록 영향을 크게 받습니다.
'기초_개념 > Deep Learning' 카테고리의 다른 글
Convolution (0) 2021.01.18 수치 미분과 기울기 (0) 2021.01.13 Optimization (0) 2021.01.11 정규화 (0) 2021.01.05 Recurrent Neural Network (0) 2020.12.31 - 등장 배경