본문 바로가기
Data Science/문과생도 이해하는 딥러닝

문과생도 이해하는 딥러닝 (10) - 배치 정규화

by 싸코 2018. 1. 7.


2017/09/27 - 문과생도 이해하는 딥러닝 (1) - 퍼셉트론 Perceptron

2017/10/18 - 문과생도 이해하는 딥러닝 (2) - 신경망 Neural Network

2017/10/25 - 문과생도 이해하는 딥러닝 (3) - 오차 역전파, 경사하강법

2017/12/24 - 문과생도 이해하는 딥러닝 (4) - 신경망구현, 활성화함수, 배치

2017/12/26 - 문과생도 이해하는 딥러닝 (5) - 신경망 학습 실습

2018/01/05 - 문과생도 이해하는 딥러닝 (6) - 오차역전파법 실습 1

2018/01/05 - 문과생도 이해하는 딥러닝 (7) - 오차역전파법 실습 2

2018/01/07 - 문과생도 이해하는 딥러닝 (8) - 신경망 학습 최적화

2018/01/07 - 문과생도 이해하는 딥러닝 (9) - 신경망 초기 가중치 설정




어느덧 10번째 포스팅이 됐다. 슬슬 다음 코스로는 무엇을 할지 고민해야 겠다.


이전 포스팅에서는 초기 가중치 설정에 따라서 활성화 값의 분포가 어떻게 나타나는지 파악했으며 활성화함수 별로 적절한 초기 가중치 설정 방법이 있다는 것을 알았다. 이번에는 또다른 이슈에 대해 다루고자 한다. 4번째 포스팅에서 배치(Batch)에 대해서 포스팅을 했었다. 배치는 일종의 랜덤 샘플링으로 전체 학습데이터를 한 번 학습할 때 다 학습에 사용하면 많은 시간이 걸리기 때문에... (수천만, 수억 개의 데이터를 한 번에 다 사용한다면???) 미니배치 방식으로 랜덤하게 학습 데이터에서 배치 크기만큼 꺼내서 한 번의 학습에 사용하는 방식이다.


이번 포스팅에서 다루는 배치 정규화는 초기 가중치 설정 문제와 비슷하게 가중치 소멸 문제(Gradient Vanishing) 또는 가중치 폭발 문제(Gradient Exploding)를 해결하기 위한 접근 방법 중 하나이다. 정규화(Normalization)는 통계에서 다루는 정규화를 말한다. 기본적인 개념으로 사용되기 때문에 먼저 이를 숙지해야 된다. 



배치 정규화 Batch Normalization

문과생도 이해하는 딥러닝 (10)


1. 배치 정규화 도입

학습의 효율을 높이기 위해 도입되었다. 배치 정규화는 Regularization을 해준다고 볼 수 있음

  • 학습 속도가 개선된다 (학습률을 높게 설정할 수 있기 때문)
  • 가중치 초깃값 선택의 의존성이 적어진다 (학습을 할 때마다 출력값을 정규화하기 때문)
  • 과적합(overfitting) 위험을 줄일 수 있다 (드롭아웃 같은 기법 대체 가능)
  • Gradient Vanishing 문제 해결

배치 정규화는 활성화함수의 활성화값 또는 출력값을 정규화(정규분포로 만든다)하는 작업을 말한다. 배치 정규화를 활성화함수 이전에 하는지 이후에 하는지는 계속된 논의와 실험이 진행중이라고 한다. 신경망의 각 layer에서 데이터(배치)의 분포를 정규화하는 작업이다. 일종의 노이즈를 추가하는 방법으로 (bias와 유사) 이는 배치마다 정규화를 함으로써 전체 데이터에 대한 평균의 분산과 값이 달라질 수 있다. 학습을 할 때마다 활성화값/출력값을 정규화하기 때문에 초기화(가중치 초깃값) 문제에서 비교적 자유로워진다.

각 hidden layer에서 정규화를 하면서 입력분포가 일정하게 되고, 이에 따라 Learning rate을 크게 설정해도 괜찮아진다. 결과적으로 학습속도가 빨라지게 된다.
http://sanghyukchun.github.io/images/post/88-5.png
출처: http://sanghyukchun.github.io/88/


입력 분포의 균일화

학습을 할 때 hidden layer의 중간에서 입력분포가 학습할 때마다 변화하면서 가중치가 엉뚱한 방향으로 갱신될 문제가 발생할 수 있다. 신경망의 층이 깊어질수록 학습 시에 가정했던 입력분포가 변화하여 엉뚱한 학습이 될 수 있다.



2. 배치 정규화 알고리즘

간다하게 배치 정규화는 학습 시의 미니배치를 한 단위로 정규화를 하는 것으로 분포의 평균이 0, 분산이 1이 되도록 정규화하는 것을 말한다.


먼저 Input으로 사용된 미니배치의 평균과 분산을 계산을 한다. 그 다음 hidden layer의 활성화값/출력값에 대해서 평균이 0, 분산이 1이 되도록 정규화(Normalization)를 한다(=변환; transform). 그럼으로써 데이터 분포가 덜 치우치게 되고 배치 정규화 단계마다 확대scale와 이동shift 변환(transform)을 수행한다.



파란색 선이 배치 정규화를 했을 때의 결과이다. 훨씬 학습이 빠른 것을 알 수 있다. 가중치 초깃값에 영향을 받지 않는 것도 확인할 수 있다.

3. 기타 참고

배치 정규화는 가중치의 scale을 정규화하여 gradient exploding을 방지한다

기타 참고자료
배경 : 은익층의 정규화
정규화 층의 도입
• 각 중간층에서 출력을 정규화한다
 각 중간층의 입력분포를 일정하게
 큰 학습률의 사용이 가능
 학습의 효율을 개선시킴
• 다양한 approach
 Batch Norm...
출처: https://image.slidesharecdn.com/normalization1-170224122539/95/normalization-17-1024.jpg?cb=1487939204

Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariance Shift

NIPS 2015와 관련하여 그리고 배치 정규화와 연결되어 본 논문이 많이 언급된다. 국내, 해외 가릴 것 없이 리뷰가 많이 되고 있으며 대부분의 배치 정규화에 대한 블로그 정리 글은 이 paper에 기반한 것들이 많다. 활성화함수의 변경(ReLU 사용)이나 낮은 학습률의 설정, 초기화 작업 등은 간접적으로 Gradient Vanishing 또는 Gradient Exploding을 해결하는 방법이라고 보고 training 과정 자체에서 학습을 안정화시키고(vanishing, exploding 해결) 학습속도를 개선하는 방법으로 배치 정규화가 제안되었다. 일종의 Whitening 이라고 한다.



"Training 할 때는 mini-batch의 평균과 분산으로 normalize 하고, Test 할 때는 계산해놓은 이동 평균으로 normalize 한다. Normalize 한 이후에는 scale factor와 shift factor를 이용하여 새로운 값을 만들고, 이 값을 내놓는다. 이 Scale factor와 Shift factor는 다른 레이어에서 weight를 학습하듯이 back-prop에서 학습하면 된다."

출처 :

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




참고자료

배치 정규화에 대해서 잘 정리된 블로그
  1. Batch Normalization (ICML 2015)
    http://sanghyukchun.github.io/88/
  2. Normalization in Deep Learning
    https://calculatedcontent.com/2017/06/16/normalization-in-deep-learning/
  3. Batch Normalization 설명 및 구현
    https://shuuki4.wordpress.com/2016/01/13/batch-normalization-%EC%84%A4%EB%AA%85-%EB%B0%8F-%EA%B5%AC%ED%98%84/
  4. Layer Normalization
    https://www.slideshare.net/ssuser06e0c5/normalization-72539464
  5. 배치정규화 (Batch Normalization)
    http://astralworld58.tistory.com/65

댓글