본문 바로가기

Machine Learning & Deep Learning

04. 배치정규화 (Batch Normalization)

!! Natation

지금까지 gradient vanishing을 풀기 위해 한 일

1) 활성함수를 시그모이드 -> ReLU로 교체

2) 초기화를 잘 하기

그렇다면 Gradient exploding 문제는? learning rate를 낮게 조절하면 된다. (주로 0.001, 0.01)

   하지만 낮은 learning rate에 의해 학습 수렴이 매우 느리다.

 

!! 배치정규화 (Batch Normalization)

- 다양한 초기화 전략은 활성함수의 출력값을 정규분포로 만들기 위해 한 작업

- 그럼 그냥 출력값을 정규화 하면 되지 않을까?

+ 배치 단위로 정규화를 진행 (계산이 간편함)

+ 각각 차원을 독립으로 보고, 차원마다 정규화를 따로 진행

* N은 배치사이즈, D는 차원

- 문제점

1) 평균과 분산을 0, 1로 고정하는 것은 비선형성을 깨뜨릴 수 있다.

2) 각 차원을 독립이라고 한 가정이 모델을 제한할 수 있음

- 해결책

정규화 된 값을 추가적인 파라미터를 사용하여 변형시킴

즉, 배치단위로 정규화하여 정규분포를 만들고, 감마와 베타를 이용해 새로운 값을 내놓는다.

 

- 일반적으로 레이어를 거친 뒤, 배치 정규화를 수행하고 이를 활성함수의 입력값으로 전달

  즉, 배치정규화를 일종의 레이어라 생각하고 구현 가능

 

- 장점

1) gradient vanishing 문제를 매우 잘 해결한다.

2) Learning rate를 높게 주어도 학습을 잘하기 때문에 수렴속도가 빠름

3) 학습을 할대마다 출력값을 정규화로 만들어 주기 때문에, 초기화 전략에 영향을 덜 받음 (물론 어느정도 중요하지만)

4) 배치정규화(BN)이 regularizer의 역할을 한다.

+ 항상 그렇지는 않지만 Dropout을 제거해도 비슷한 성능을 보이고, 일반적으로 성능이 상승한다.

+ 배치 단위로 정규화를 하면서 모델에 노이즈를 주는 것으로 해석 가능. 이 노이즈로 인해 성능이 좋아짐

   (배치단위로 정규화를 하면 평균과 분산이 전체 평균의 분산과 값이 약간 다를 수 있다. 이는 일종의 노이즈가 됨)

 

- 테스트 단계

+ Dropout처럼 학습/테스트 단계의 연산이 다름

+ 학습단계는 데이터가 배치단위로 들어오기 때문에 배치의 평균, 분산을 구하는 것이 가능 하지만,

   테스트 단계에서는 배치 단위로 평균/분산을 구하기가 어려움

+ 이를 해결하기 위해서는?

1) 학습단계에서 배치단위의 평균/분산을 저장해놓기 (이동평균)

2) 테스트시에는 구해진 이동평균을 사용하여 정규화

 

 

 

 

반응형