본문 바로가기
Deep Learning/모두를 위한 cs231n

[모두를 위한 cs231n] Lecture 6. Batch Normalization에 대해 알아보자

by Steve-Lee 2020. 5. 19.

Batch Normalization

안녕하세요 Steve-Lee입니다. 이번 시간에는 Lecture 6. Training Neural Network Part I의 Batch Normalization에 대해 배워보도록 하겠습니다. 

 

모두를 위한 cs231n

더보기

모두를 위한 cs231n 😀

👉🏻 시작합니다! 🎈

모두를 위한 cs231n (feat. 모두의 딥러닝 & cs231n)


👉🏻 Neural Network 기초 📗
* Backpropagation
Lecture4. Backpropagation and Neural Network. 오차역전파에 대해서 알아보자😃


👉🏻 Training Neural Network Part I 📑

- Activation Function 파헤치기

Lecture 6. Activation Functions에 대해 알아보자 
Lecture 6. Activation Functions - ReLU함수의 모든 것

 

- Data Preprocessing

Lecture 6. Training Neural Network - Data Preprocessing

 

- Weight Initialization 

Lecture 6. Weight Initialization

 

- Batch Normalization

Lecture6. Batch Normalization

 

👉🏻 Deep Learning CPU와 GPU ⚙️

Lecture 8 - Part1. Deep Learning 을 위한 CPU와 GPU


👉🏻 Deep Learning Framework ☕️
Lecture 8 - Part2. Deep Learning Framework

👉🏻 TensorFlow Fraemwork 🧱
Lecture 8 - Part3. TensorFlow Framework


👉🏻 
PyTorch Framework 🔥

Lecture 8 - Part3. PyTorch Framework

 

👉🏻 Generative Model

Lecture 13 - Part2. VAE(Variational AutoEncoder)

 

모두를 위한 cs231n (feat. 모두의 딥러닝 & cs231n)

cs231n 시작합니다! 안녕하세요. Steve-Lee입니다. 작년 2학기 빅데이터 연합동아리 활동을 하면서 동기, 후배들과 함께 공부했었던 cs231n을 다시 시작하려고 합니다. 제가 공부하면서 느꼈던 점들과

deepinsight.tistory.com

 

Part I Index

  • Activation Functions
  • Data Preprocessing
  • Weight Initialization
  • Batch Normalization
  • Babysitting the Learning Process
  • Hypperparameter Optimization

Batch Normalization에 대해 배워보도록 하겠습니다!

본격적으로 Batch Normalization에 대해 배우기 앞서 강의노트를 한 번 읽어보시기를 추천해드립니다.

짧은 문장 안에 Batch Normalization의 핵심을 잘 담아놨다고 생각합니다.

 

Batch Normalization 맛보기

Batch Normalization. A recently developed technique by Ioffe and Szegedy called Batch Normalization alleviates(subtract) a lot of headaches with properly initializing neural networks by explicitly forcing the activations throughout a network to take on a unit gaussian distribution at the beginning of the training. The core observation is that this is possible because normalization is a simple differentiable operation. In the implementation, applying this technique usually amounts to insert the BatchNorm layer immediately after fully connected layers (or convolutional layers, as we’ll soon see), and before non-linearities. We do not expand on this technique here because it is well described in the linked paper, but note that it has become a very common practice to use Batch Normalization in neural networks. In practice networks that use Batch Normalization are significantly more robust to bad initialization. Additionally, batch normalization can be interpreted as doing preprocessing at every layer of the network, but integrated into the network itself in a differentiable manner. Neat!

 

Batch-Norm이란 무엇일까요?

 

Gaussian 범위로 activation을 유지시키는 하나의 아이디어입니다.

 

Neural Network를 훈련시키기 위해서는 골치 아픈 문제들이 많이 있습니다. 그중 하나는 트레이닝을 시작할 때 network가 unit gaussian distribution을 취할 수 있도록 만들어 주는 것입니다.

 

여기서 핵심은 정규화가 간단한 미분 연산이기 때문에 가능하다는 점입니다.

 

Neural Network 구현시 이 기술을 적용하면 일반적으로 Fully-connected layer의 뒤나 non-linearity function 앞에 Batch-Norm을 삽입해줍니다.

 


다시 강연으로 돌아가보도록 하겠습니다.

 

Batch Normalization

activation 값을 gaussian 범위로 유지시키는 것에 관련한 또 다른 아이디어를 하나 소개해 드리겠습니다.

우리는 레이어의 출력이 unit gaussian 이길 바랍니다. Batch normalization이라 불리는 이 아이디어는 강제로 그렇게 만들어보자는 데 있습니다.

 

그러면 Batch Normalization은 어떻게 동작할까요?

 

어떤 레이어로부터 나온 Batch 단위만큼의 activation이 있다고 했을 때, 이 값들이 Unit gaussian이기를 원합니다.

 

현재 Batch에서 계산한 mean과 variance를 이용해서 Normalization 해 볼 수 있을 것입니다. 가중치를 잘 초기화시키는 대신에 학습할 때마다 각 레이어에 이런 일을 해줘서 모든 레이어가 Unit gaussian이 되도록 해줍니다.

그래서 결국 학습하는 동안 모든 레이어의 입력이 unit gaussian이 됬으면 좋겠다는 것입니다.

 

따라서 이제부터 할 일은 네트워크의 forward pass 동안에 그렇게 되도록 '명시적으로' 만들어 주는 것입니다.

 

각 뉴런을 평균과 분산으로 Normalization 해주는 함수를(functionally) 구현하는 것입니다.

 

  • 정리하면
    • Batch 단위로 한 레이어에 입력으로 들어오는 모든 값들을 이용해서 평균과 분산을 구한다.
    • 평균과 분산값을 이용해 Normalization 해주는 것입니다.
    • Batch Norm은 미분이 가능한 함수입니다.

 

위의 슬라이드에는 Batch당 N개의 학습 데이터가 있고 각 D차원인 데이터가 있습니다. 그리고 각 차원별로(feature element 별로) 평균을 각각 구해줍니다. 한 Batch 내에 이걸 전부 계산해서 Normalize 합니다.

 

 

Batch Normalization 위치

질문입니다.

Batch 연산은 레이어의 어디에 위치하면 좋을까요?

Batch Norm 연산은 FC(Fully-Connected Layer)나 Conv(Convolution Layer) 직후에 넣어줍니다.

 

깊은 네트워크에서 각 레이어의 W가 지속적으로 곱해져서 Bad scaling effect가 발생했습니다만 Normalization은 그 bad effect를 상쇄시켜 버립니다. (Q. bad scaling effect?)

 

Batch-Norm은 입력의 스케일만 살짝 조정해주는 역할이기 때문에 FC와 Conv 어디에든 적용할 수 있습니다.

 

Conv Layer에서 차이점이 있다면  Conv Layer는 Normalization을 차원마다 독립적으로 수행하지 않습니다. Conv Layer는 같은 Activation Map의 같은 채널에 있는 요소들은 같이 Normalize 해줍니다. 왜냐하면 Conv 특성상 같은 방식으로 normalize 시켜야 하기 때문입니다.

 

  • 정리하면 Conv Layer의 경우
    • Activation map(채널, Depth)마다 평균과 분산을 하나만 구합니다.
    • 그리고 현재 Batch에 있는 모든 데이터로 Normalize 해줍니다.

부록 - Batch Normalization과 Conv Layer 비교

  • Batch Normalization vs Conv Layer
    • Batch Norm 
      • feature element별로(차원별로) 평균과 분산을 구해줍니다
    • Conv Layer
      • Activation map(채널, Depth)마다 평균과 분산을 하나만 구합니다
  • 한편 CNN에서는... 왜 평균과 분산을 한 번만 구할까요?
    • CNN을 보면 우리는 데이터의 '공간적 구조(Spatial Structure)'가 잘 유지되기를 바랍니다.
    • Conv Layer 출력인 activation maps이 그런 '공간적 구조'를 유지하고 있기를 원합니다. 이 점을 고려해서 CNN Activation Map을 normalize 할 때는 전체 map의 평균과 분산을 같이 구합니다. 

Batch Normalization에 대해 이해하고 사용하기 위해서는 논문을 읽어보는 것을 추천했습니다.

 

Batch Normalization의 흐름도 한번 살펴보고 Batch-Norm에서 gradient를 어떻게 구현하는지도 한 번 살펴보는 것을 추천한다고 합니다.

 

그런데 한 가지 문제가 있습니다 FC Layer를 거칠 때마다 매번 normalization을 해주는 것에 대한 의문이 있습니다. 

 

우리가 정말 tanh의 입력이 unit gaussian 이기를 바라는 걸까요?

 

normalization이 하는 일은 입력이 tanh의 linear 한 영역에만 존재하도록 강제하는 것입니다. 그렇게 되면 saturation이 전혀 일어나지 않게 됩니다.

 

saturation이 전혀 일어나지 않는 것보다는 '얼마나' saturation이 일어날지를 우리가 조절하면 더 좋지 않을까요?

 

Batch Normalization에서는 normalization 연산이 있었습니다. normalization 연산 이후에 Batch-Norm에서는 scaling 연산을 추가합니다.

감마와 베타로 스케일링 효과와 이동의 효과를 줄 수 있습니다

이를 통해 Unit gaussian으로 normalize 된 값들을 감마로는 스케일링 효과를 베타는 이동의 효과를 줄 수 있습니다.

이렇게 하면 normalized 된 값들을 다시 원상복구 할 수 있도록 해줍니다. 즉 normalized 된 값을 원상복구 하고 싶다면 그렇게 할 수 있다는 것입니다. 

 

네트워크 값들을 원상복구 하고 싶다면 감마에 분산 값을(감마 = 분산), 베타에 평균값을(베타 = 평균) 넣어주면 됩니다.

 

이처럼 네트워크가 데이터를 tanh에 얼마나 saturation 시킬지를 학습하기 때문에 우리는 유연성을 얻을 수 있습니다.

 

Batch Normalization Summary

Batch Normalization을 다시 한번 요약해보겠습니다.

  • 정리
    • 어떤 입력이 있고 우리는 mini-batch에서의 평균을 계산합니다. 모든 mini-batch마다 평균과 분산을 각각 계산해줍니다
    • 그리고 평균과 분산으로 Normalize를 해줍니다
    • 다시 추가적인 scaling, shifting factor를 사용합니다

Batch Norm은 gradient의 흐름을 보다 원활하게 해 주며 결국 더 학습이 잘되게(robust) 만들어줍니다.

 

Batch Norm을 쓰면 learning rate를 더 키울 수도 있고 다양한 초기화 기법들도 사용해 볼 수 있습니다.

 

이것이 바로 Batch Norm을 써야 하는 이유입니다.

 

그리고 하나 또 집고 넘어가야 할 것은 바로 Batch Norm이 regularization의 역할도 한다는 것입니다.

 

각 레이어의 출력은 해당 데이터 하나뿐만 아니라 batch안에 존재하는 모든 데이터들에 영향을 받습니다(평균, 분산)

왜냐하면 각 레이어의 입력은 해당 배치의 (표본) 평균으로 Normalize 되기 때문입니다.

 

그렇기 때문에 이 레이어의 출력은 이제 오직 하나의 샘플에 대한 deterministic 한 값이 아니게 되고 Batch 내의 모든 데이터가 입력으로 한대 묶인다고 볼 수 있습니다.

 

그러므로 더 이상 레이어의 출력은 deterministic하지 않고 조금씩 바뀌게 되고 이는 regularization effect를 줍니다.

 

 


  • Questions
    • Q1. 왜 감마와 베타를 학습시켜서 다시 identity function이 되게 만드는 것인가요?
    • A1. 유연성을 갖기 위함입니다.
      • batch normalization이 하는 일을 생각해보면 레이어의 입력이 unit gaussian이 되도록 강제하는 것입니다. 일반적으로 이렇게 Normalize 하는 것은 좋지만 그렇다고 항상 좋은 것은 아닙니다. 
      • tanh의 예시에서도 보았듯이 우리는 입력 데이터가 tanh로 인해 얼마나 saturation 될지를 조절하고 싶을 수도 있습니다. 
      • 이런 유연성을 통해서 gaussian normalization이 필요하면 그렇게 해주고 또 그 방법이 최선이 아닐 때가 있으면 unit gaussian을 조금씩 조금씩 scaling 하고 shifting 할 수 있는 여지를 주는 것입니다.
      • 정리하면 감마와 베타 파라미터는 이런 추가적인 유연성을 제공해 주는 것입니다
    • Q2. Batch Normalization은 각 뉴런의 출력에 적용하는 건가요?
    • A2. 맞습니다. 출력으로 나온 뉴런마다 각각 batch normalization을 적용하는 것입니다.
    • Q3. reinforcement learning과 같이 batch 사이즈가 작은 경우 어떻게 해야 하나요?
    • A3. 실제 Bath-Norm은 CNN에서 정말 널리 사용되고 있습니다. 그리고 recurrent/reinforcement learning 등 다양한 네트워크에 어떻게 적용하는지에 대한 많은 논문들이 있습니다.... 중략
      • Batch 사이즈가 작으면 정확도가 떨어지긴 하겠지만 여전히 비슷한 효과를 줄 수 있습니다.
      • Batch 사이즈가 작은 경우 더 많은 샘플들을 이용해서 평균과 분산을 구할 수 있도록 디자인하는 방법도 하나의 방법이 될 수 있습니다. 
    • Q4. 우리가 입력을 gaussian으로 강제해버리면 기존의 구조(structure)를 잃는 것이 아닌가요?
    • A4. 우선 아닙니다. 데이터의 전처리를 할 때도 gaussian을 씁니다. 모든 입력들(features)을 가우시안 분포(gaussian distribution)로 만든다 해도 데이터에 '연산이 잘 수행되도록' 우리는 그저 데이터를 조금만 움직이고 스케일링하는 것입니다.
    • Q5. 레이어의 가중치를 Normalize 하는 이유가 gaussian으로 만들기 위해서 인가요?
    • A5. 우선 '레이어의 가중치'가 아니라 '레이어의 입력'을 Normalize 하는 것입니다. 
    • Q6. Shift와 Scale 요소를 추가시키고 학습을 시켜버리면 결국 identity mapping이 돼서 Batch-Norm이 사라지는 것이 아닌가요?
    • A6. 네트워크가 Batch-Norm이 쓸모없다고 판단해서 identity mapping으로 만들어 버린다면 물론 그렇게 될 수 있습니다. 하지만 실제로 그런 일은 일어나지 않는다고 합니다.
      • 실제로 감마와 베타를 학습시키게 되면 identity가 되지는 않습니다.
      • shift와 scale이 일정량 변하기는 하지만 보통은 identity mapping이 될 정도는 아닙니다. 따라서 여전히 Batch Normalization은 효과를 얻을 수 있습니다.

Batch Normalization Test time

 

이제 마지막입니다. 조금만 힘내세요!

 

마지막으로 다룰 내용은 Test time에서 어떻게 동작하는가입니다.

Batch-Norm에서 평균과 분산은 학습 데이터에서 구한 것입니다. Test time에 추가적인 계산은 하지 않습니다. 


지금까지 Training Neural Network의 Batch Normalization에 대해 배워보았습니다. 

 

뉴럴 네트워크의 입력값을 uniform gaussian distribution으로 만들어주는 Batch Normalization은 이후에도 계속해서 등장하는 개념입니다. 이번 기회에 하나하나 정리하시면 많은 도움이 되리라 생각합니다.

 

오늘도 긴 글을 읽어주셔서 감사합니다. 부족한 내용은 추후에 보충할 수 있도록 하겠습니다. 감사합니다. 좋은 하루 보내세요. 이상 Steve-Lee였습니다.

 

Reference

  •  

 

댓글