본문 바로가기

컴린이 일기장/Today I Learned

[TIL] 가슴💘으로 이해하는 Batch Normalization

반응형

[주절주절]

주변 사람들한테 자주하던 한탄 중에 하나가 Residual block, Normalization, Pooling 등 몇몇 개념들이 머리로는 어느정도 알겠는데 가슴으로(?) 이해가 안된다는 것이다. 그런데 오늘(8/6) 연구실 스터디 준비하다가 Normalization 이야기가 나왔고, 다시 한 번 가슴으로 이해하는 것에 도전해보고자 대장정(?)을 시작하게 되었다. 오늘은 Batch Normalization으로 시작! 

 

[Today I Learned]

#  Gradient Vanishing / Exploding

- Backpropagation : Loss 값을 최소화하는 방향으로 weight를 업데이트하는 방법. 다음과 같이 chain rule을 이용해 gradient를 계산한다.

- 그런데, sigmoid와 같이 gradient 값이 매우 작은 activation function이 끼어들게 되면 (= 위의 수식에서 곱해지는 한 항의 값이 소수가 됨) activation function 이전의 값들의 gradient 값은 아주 작아지게 된다. 따라서 weight들은 아주 조금 update가 되게 된다.

(직관적으로 생각해보면... sigmoid, tanh와 같은 activation function은 넓은 input space를 squashing 시키게 되고, input에서 아주 큰 변화가 있더라도 squashing 된 후의 space에서는 아주 작은 변화로 나타나게 된다.)

- Gradient vaninshing / exploding 문제를 해결하는 방법으로는 ① ReLU와 같이 vanishing 문제로부터 비교적 자유로운 activation function 사용 / ② Weight init 잘하기 / ③ Learning rate 작게 주기 등이 있다.

- 하지만 직접적으로 학습과정을 안정화시키는 방법이 있는데, 이것이 바로 Batch Normalization이다.

 

#  Normalization (정규화)

- 기본적으로 머신러닝에서 정규화를 하는 이유는 데이터 내 feature들간 스케일 차이가 있기 때문이다. (ex. 연도는 1000 단위 값, 개수는 1~10 단위 값) 따라서 모든 데이터 포인트가 동일한 정도의 스케일(=중요도)로 반영되도록 하는 것이 정규화이다.

 

#  Internal Covariance Shift

+ Covariate shift : 머신러닝에서 아래 그림과 같이 train 데이터와 test 데이터의 분포가 다른 현상을 의미한다. 

- 한편 Internal Covariance shift는 네트워크의 각 layer마다 input의 분산이 달라지는 현상을 뜻한다. (internal - 내부의) 학습이 진행됨에 따라 인풋의 분포가 바뀌기 때문에 학습이 잘 진행되지 않게 된다.

- Batch Normalization 논문에서는 학습이 불안정하게 진행되는 이유로  바로 이 'Internal Covariance Shift' 문제를 꼽았다. 그 이유는 각각의 layer의 파라미터는 layer의 input 뿐만 아니라 다른 모델의 파라미터에도 영향을 받기 때문이다. ( 다른 layer의 gradient 값에 영향을 받아 초기 layer에서 gradient vanishing 문제가 발생하는 것과 유사하다는데... 일단 세모. 직관적으로는 이해했다!) 

(+ 오늘은 위와 같이 가정하고 공부하겠지만, <How Does Batch Normalization Help Optimization? (No, It Is Not About Internal Covariate Shift)>라는 논문도 있더라 😬)

 

#  Batch Normalization

- 미니 배치의 평균과 분산을 이용해 정규화한 후, 감마와 베타를 통해 scale, shift 해주는 방법이다. 이 때 감마와 베타는 학습 가능한 변수이다.

- Whitening : 입력의 평균을 0, 분산을 1로 바꿔주는 과정이다. Whitening만으로도 문제를 해결할 수 있을 것 같지만 backpropagation과는 무관하게 진행되기 때문에, gradient updated 과정에서 bias 값이 무시된다는 문제가 발생한다. (수식은 링크 참고)

- 따라서 평균과 분산을 조정하는 과정을 신경망 내에 포함시켜, 학습 시에 이 과정 역시 같이 조정이 될 수 있도록 한 방법이 Batch Normalization이다. 분포를 항상 N(0,1)이 아닌 적절하게 scaling, shifting 된 분포로 맞춰줄 수 있다는 것 역시 BN의 장점이다.

+ Sigmoid와 같은 활성화 함수는 0 주변에서 linear한 성질을 갖기 때문에 데이터를 계속 정규화해 input으로 쓰게 되면 활성화 함수의 비선형 성질을 잃을 수 있다. BN은 이러한 문제를 완화시켜주기도 한다.

- 전체 데이터에 대해 Normalization 해주는 것이 베스트이지만, 파라미터의 update를 배치 단위로 하기 때문에 Normalization 역시 Batch 단위로 실시한다. (배치 내의 데이터끼리는 correlation이 적어, 배치가 전체 데이터를 대표한다는 가정이 필요하다.)

- 일반적으로 BN은 non-linear한 활성화함수 앞쪽에 배치 된다.

- 한편, Test 시에는 미니 배치마다 구했던 (정확히는 이동평균) 감마와 베타의 평균을 사용하게 된다.

 

#  Batch Normalization의 장점

- Invariant Covariate Shift 문제 해결

- 감마(scale), 베타(shift)를 통한 변환을 통해 비선형 성질을 유지하며 학습 가능

- gradient의 scale, 초기값에 대한 dependency 감소 → gradient vanishing, exploding 을 비교적 신경 쓰지 않고 LR을 높게 설정할 수 있음 → 빠르고 안정적인 학습이 가능해짐

- regularization 효과. 따라서 dropout 등의 기법을 사용하지 않아도 됨

- ...

 

+ CNN에서의 Batch Normalization

- CNN의 경우 채널을 기준으로 감마와 베타 값을 갖게 된다. 배치 사이즈가 m인, n 채널 컨볼루션 레이어에서 배치 정규화를 적용한다 가정해보자. Convolution을 거친 후의 feature map 사이즈가 np * q라고 가정한다면, 같은 채널에 대해 m * p * q의 스칼라 값이 있게 되고, 이들 값의 평균과 분산을 구해 normalize하게 된다. 결과적으로 n개의 감마와 베타 변수가 생성된다.

 

[세줄 요약]

1. Train, Test 셋의 분포가 다르면 문제가 되듯이 네트워크의 layer들의 input의 분포가 달라지는 것 역시 학습에 문제가 된다. (Internal Covariate Shift)

2. 이 문제를 해결하기 위해 도입된 방식이 Batch Normalization. 

3. BN은 1번 문제를 포함한 학습시 발생할 수 있는 여러 문제를 해결, 빠르고 안정적인 학습을 돕는다.

 

[Reference]

http://sanghyukchun.github.io/88/

https://de-novo.org/2018/05/28/batch-normalization-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0/

https://eehoeskrap.tistory.com/430

https://shuuki4.wordpress.com/2016/01/13/batch-normalization-%EC%84%A4%EB%AA%85-%EB%B0%8F-%EA%B5%AC%ED%98%84/

 

반응형