* 본 내용은 공부한 것을 정리한 글이므로, 오류가 있을 수 있습니다.
Internal covariate shift
Internal covariate shift는 번역하면 '내부 공변량 변화'으로, 데이터가 모델에 입력으로 들어갈때, 은닉층의 입력 분포가 다르다는 것이다.(입력은 정규화 할 수 있다.) 내부 레이어의 입력은 이전 레이어의 출력과 같으므로, 학습할 때마다 가중치 값이 변하고 분포는 또 바뀌게 된다.
Batch Normalization을 하게 된 이유가 이러한 문제를 해결하기 위함이였다.
Batch Normalization
논문에서는 입력 데이터의 정규화 처럼 은닉층의 입력도 정규화를 하면, 안정적으로 학습이 가능할 것 이라는 것으로 생각했다. (실제로도 그렇고)
그렇다면 어떻게 정규화를 할까?
간단히 평균과 분산을 0,1로 하게되면 정규화 과정은 레이어에 activation function을 적용하기 전에 실시되기 때문에 문제가 생간다.
sigmoid에서 빨간 네모 부분에 맞춰 정규화가 되는 것인데, 선형그래프와 유사한 형태를 가진다. 결국 activation function으로 $y=ax$를 쓰는 것과 비슷한 효과가 된다.
당연히 위의 방식은 바람직하지 않고, (relu같이 선형을 이용한 함수도 있지만, sigmoid와 같은 함수의 비선형 효과가 사라진다.)
아래와 같은 방식을 사용한다.
입력을 미니배치의 평균과 분산으로 N(1, 0)으로 정규화를 한 후
γ, β변수를 통해서 정규화 범위를 조정하는 것이다. γ, β는 학습이 가능한 변수이다.
즉, 레이어의 출력이 $ y = f(wx+b) $ 에서 $ y = f(BN(wx+b))$ 가 되는 것이다.
다만, test 시에는 test데이터의 평균과 분산을 모르기 때문에, 논문에서는 미니배치의 이동평균을 구해서 정규화한다.
이동평균은 아래와 같이 최근 2개 데이터의 평균값을 말한다.
데이터 | 500 | 600 | 700 | 500 | 900 |
이동평균 | 500 | 550 | 650 | 600 | 700 |
CNN에서 Batch Normalization
cnn에서의 Batch Normalization을 쓸 땐, 다른 방법을 사용해야 한다.
먼저, activation function의 입력으로 들어가는 bias를 없애야 한다. (β가 이것을 대체한다고 보는 것이다.)
또, 각 입력 channel 에 대해 γ, β변수를 만들어 줘야 한다.
-참고-
'프로그래밍 > 머신러닝' 카테고리의 다른 글
뱀게임 인공지능을 만들어보자.(2) (0) | 2020.11.16 |
---|---|
[컨볼루션] ShuffleNet (0) | 2020.09.06 |
[컨볼루션] Group convolution (0) | 2020.09.06 |
[컨볼루션] Mobilenet (0) | 2020.09.06 |
[컴퓨터 비전] SRCNN, Image Super-Resolution Using Deep Convolutional Networks (0) | 2020.09.05 |