Batch Normalization(배치 정규화)

이승규·2024년 7월 31일

Deep Learning[공부용]

목록 보기
10/10

1. Batch Normalization란?

  • Batch Normalization은 학습 과정에서 각 배치 단위 별 다양한 분포를 가진 데이터를 각 배치별로 평균과 분산을 이용해 정규화하는 것이다.
  • Batch Normalization는 별도의 과정으로 있는 것이 아닌, 신경망 안에 포함되어 학습시 평균과 분산으로 조정하는 과정이다.
  • 평균은 0, 표준 편차는 1로 데이터의 분포를 조정할 수 있다.

즉, 배치 정규화란 말 그대로 배치 단위로 normalization(표준정규화)을 해주는 layer를 말한다.

2. Batch Normalization 필요성

  1. 기울기 소실 문제
    • 배치 normalization이 없었을때, 뉴럴 네트워크의 학습이 잘 안 되는 이유는 기울기 소실 문제 때문이다.
    • 뉴럴 네트워크는 손실 함수(Loss Function)에 대한 기울기(Gradient)를 이용해 역전파(Backpropagation) 과정을 통해 학습을 한다.
    • 하지만 밑의 그림과 같이 활성화 함수로 들어오는 값이 매우 크거나 매우 작아질 경우, Tanh 함수의 기울기는 0에 가깝기 때문에 역전파 과정에서 뉴럴 네트워크의 파라미터가 거의 업데이트되지 않게 된다.


💡 뉴럴 네트워크에 들어오는 값들을 정규분포를 그리도록 보정해주면 활성화 함수를 통한 gradient가 매우 잘되어 역전파 과정도 원활하게 되고, 결과적으로 뉴럴 네트워크가 잘 학습된다. 이것이 Batch Normalization이 필요한 이유이다.

참고
pytorch를 사용하면 간단하게 forward pass 안에서 print를 함으로서 활성화 함수로 들어오는 값이 매우 크거나 매우 작아질 경우를 알 수 있다.
하지만 대부분 간단한 네트워크에서 학습이 잘 안된다면, vanishing gradient 문제인 경우가 많다고 한다 :)


Batch Normalization에서 가장 중요한 것은 training 단계와 test 단계에서 다르게 적용되어야 한다.

3. training 단계의 배치 정규화

Image Resize Example Resized Image

다음과 같은 뉴럴 네트워크가 있다고 하자.

여기서 동그라미 친 뉴럴 네트워크의 중간 layer를 한번 살펴보자. 문제는 활성화 함수로 들어오는 값이 너무 크거나 작아서 gradient가 0이 된다는 것이다. 이때 활성화 함수로 들어가기 전에 배치 방향으로 배치 정규화를 시켜준다면 활성화 함수로 들어가는 값들은 0을 중심으로 표준화되어 들어가게 된다.

그렇다면 우리는 배치 정규화를 통해 input을 모두 정규화하면, 활성화 함수에는 정규화된 input이 들어가게 된다. 하지만 여기까지만 수행하면 뉴럴 네트워크가 학습되지 않는다. 왜냐하면 모든 레이어에 똑같이 0의 평균을 가지고 1의 분산을 가진 정규화된 input만 들어오면, 늘 어디서든 똑같은 분포만 들어오게 되기 때문이다.

이러면 뉴럴 네트워크가 구분하거나 학습해야 할 의미 있는 input이 들어오지 않게 된다. 활성화 함수(non-linear 함수)가 의미가 있기 위해서는 어떤 input은 좁은 정규분포를 가진 input, 어떤 input은 넓은 분포를 가진 input, 오른쪽이나 왼쪽으로 치우친 분포를 가진 input들이 들어와야 한다.

즉, layer 마다 다른 형태의 정규분포의 input 들이 들어와야 한다는 말이다

Image Resize Example Resized Image

이제 수식을 통해 살펴보자


Image Resize Example Resized Image

여기에 추가적으로 parameterγ(scale), β(shift)가 나온다.

  • γ는 정규화된 input에 곱해지면서 정규화된 input이 더 좁거나 넓어지게 만들고 (scale을 의미)
  • β는 그 정규분포를 오른쪽 왼쪽으로 움직이는 값을 의미한다
Image Resize Example Resized Image

그림을 보면 현재 feature는 4개이고 각각의 feature에 대한 γ(scale), β(shift)가 추가된다. 이런 학습 가능한 parameter들이 추가되면 뉴런에는 다양한 형태의 인풋들이 들어오게 되어, training 속도를 빠르고 안정적으로 만든다.

이렇게 배치 normalization을 적용하면 bias는 의미가 없어지게 되므로, 배치 normalization 이전에는 bias를 더해주지 않아도 된다.

Training 단계 정리

  • 깊은 뉴럴 네트워크의 vanishing gradient 문제를 완화하기 위해 배치 normalization을 적용한다.

  • 배치 normalization은 배치 방향으로 표준화하고, activation 함수의 의미 있는 값을 전달하기 위해 각 feature별로 γ(scale), β(shift)를 역전파 과정을 통해 학습한다.

  • 배치 normalization을 적용하면 bias term이 의미가 없어지므로, 삭제하는 것이 좋다.


4. test 단계의 배치 정규화

  • test 단계에서는 test 데이터에 대해 답을 내야 하므로 평균과 분산을 계산할 수 없다.

  • 그렇기 때문에 , test 단계에서 BN을 적용할때는 training data를 모두 가져와서 이때의 평균과 분산을 사용해야한다.

  • 하지만 실제 뉴럴 네트워크를 training 시킬때에는 데이터가 무수히 많아서 전체 데이터에 대한 통계를 내는것은 불가능하다.

💡 이때 test 단계에서는 moving average라는 개념을 통해 전체 데이터에 대한 평균과 분산을 구하게 된다.

💡 그리고 이 값을 뉴럴 네트워크를 실행할때 정규화를 위해 쓰게된다

이동 평균(Moving average)

μ^αμ^+(1α)μβ(i)\hat{\mu} \leftarrow \alpha \hat{\mu} + (1-\alpha)\mu_\beta^{(i)}
σ^ασ^+(1α)σβ(i)\hat{\sigma} \leftarrow \alpha \hat{\sigma} + (1-\alpha)\sigma_\beta^{(i)}

최종적으로 하나의 배치 놈에서 하나의 feature에 대한 parameter는 총 4개가 된다.

  • γ, β → 역전파 과정을 통해 학습

  • μ^, σ^ → moving average를 통해 학습

그렇기 때문에 Batch norm layer는 training 과정과 test 과정에서 특성이 달라진다.

5. 왜 Learning rate를 키워도 될까?**

평균 0, 표준 편차 1인 가운데로 값들을 뿌려주기 때문에, 입력 값들에 대한 update 해야하는 편차들이 크지 않는다. 즉, Learning rate를 크게 해도 상관없다.

6. 최종 정리

  • 배치 정규화는 평균과 분산을 구하는 것이 아닌 γ(Scale), β(Shift)을 학습 파라미터로 사용하여 비선형성을 유지하며 학습한다.

  • 배치 정규화는 별도의 과정으로 있는 것이 아닌, 신경망 안에 포함되어 학습시 평균과 분산으로 조정하는 과정이다.

  • 기존 방법에서는 Learning rate를 높게 잡을 경우 gradient vanishing/explode 하는 경향이 있었었다.

  • gradient의 scale, 초기값에 대한 dependency 감소 -> 배치 정규화를 사용할 경우 파라미터의 scale에 영향을 받지 않게 되기 때문에 Learning rate를 높게 설정할 수 있다. -> 빠르고 안정적인 학습이 가능해짐.

  • Regularization 효과가 있기 때문에 dropout을 안해도 되는 장점이 있다.

profile
Self supervised Learning, Time Series, Multimodal Learning

0개의 댓글