인공신경망 ( ANN ) 6-2 최적화 - 초기 가중치 설정, 기울기 소실( gradient vanishing ), 배치 정규화 ( batch normalization )
초기 가중치 설정
오버피팅 문제 때문에 언제까지고 반복을 돌려 정확도를 올릴 수는 없기 때문에, 최적의 초깃값으로 설정하는게 도움이 된다.
초기 가중치에 따른 활성화값 분포
활성화 함수의 출력 데이터를 활성화값이라고 하는데, 초기 가중치에 따른 활성화값의 분포를 관찰하면 중요한 정보를 얻을 수 있다.
활성화 함수로 sigmoid를 사용하며 W는 표준편차(stdev)가 1인 정규분포로 초기화한 경우 :
히스토그램의 세로 값은 해당 범위(계급이라 한다)내에 데이터가 몇 개나 있는지를 나타낸다. 여기서는 계급을 30개로 나눴으니 각 계급은 0.0333…의 범위를 갖는다. 즉, 0~0.0333…. 범위의 값을 가진 활성화값 이 35000개 가량 있다는 뜻이다. 각 막대를 모두 더하면 X는 1000x100, 각 layer의 가중치 W12345는 모두 100x100이므로 활성화값 Y는 1000x100이다. 따라서 1000x100개가 나온다.
시그모이드 함수의 개형을 생각해 보면
입력이 0에서 멀어질 수록, 출력은 더 큰 폭으로 0 또는 1에 가까워지며 동시에 기울기는 0으로 수렴하게 된다.
W를 평균이 0, 표준편차가 1인 표준정규분포를 이용해 초기화 한 경우 시그모이드 함수를 사용하면 시그모이드 함수의 출력(활성화값)이 0과 1에 치우쳐 분포하게 된다.
* sigmoid 함수의 입력이 W가 아니라 np.dot(X, W)
임에 유의 한다. 그냥 W가 sigmoid의 입력일 경우 활성화값이 0과 1에 치우쳐 분포하는게 아니라 W가 표준정규분포를 따르기 때문에 표준정규분포의 확률 밀도 함수를 따른다.
기울기 소실 ( gradient vanishing )
0에서 멀어질 수록 기울기가 0으로 수렴하기 때문에, 활성화값이 0 또는 1에 치우쳐 분포하게 되면 기울기가 점점 작아지다가 사라진다.
이것이 기울기 소실(gradient vanishing)이다.
* 수치 미분의 경우 출력이 0 또는 1에 가까워지면서 실수의 소수점 표현 한계로 인해 \(f(w+h) - f(w-h) = 0\)이 되면 기울기가 0이 된다.
* 오차역전파법의 경우 기울기라는게 결국 손실함수의 기울기를 의미하는거지만, 역전파하며 이전 노드들을 거쳐가기 때문에 이전 노드도 기울기에 영향을 준다. SoftmaxWithLoss의 역전파 출력은 \(y_k-t_k\)인데, 여기서 \(t\)는 one-hot-vector이므로 \(t_k\)는 0 또는 1이다. \(y_k\)가 0 또는 1에 가까운 작은 값일 때 실수의 소수점 표현 한계로 인해 \(y_k-t_k=0\)이 되어 기울기가 0이 된다.
이는 활성화 함수로 사용된 sigmoid 함수가 input을 작은 output range(0~1)로 비선형적으로 우겨넣기 때문에 발생하는 문제다. 예를 들어 sigmoid 함수에 [1 3 5 7 9]를 넣으면 [ 0.73105858 0.95257413 0.99330715 0.99908895 0.99987661]가 출력된다. tanh 함수도 마찬가지다. 값을 우겨넣는 현상은 S자 곡선의 끝 부분에서 더 심하게 발생한다.
따라서 이런 성질을 갖지 않는 비선형 함수를 활성화 함수로 선택하면 해결할 수 있다. ReLU 함수가 그렇다.
활성화 함수로 sigmoid를 사용하며 W는 표준편차(stdev)가 0.01인 정규분포로 초기화한 경우 :
표준편차를 0.01로 지정했기 때문에 초기화 값은 0 주변에 더 많이 몰려있게 된다. 따라서 sigmoid(0) = 0.5이므로, 활성화값은 0.5 부근에 몰려있게 되는데 이 경우 기울기 소실은 일어나지 않지만 뉴런들이 다양한 값을 표현하지 못하기 때문에 뉴런을 여러개 두는 의미가 없어져버린다. 즉 이렇게 활성화 값이 특정 부근에 몰려있는 경우 표현력이 제한된다.
Xavier initialization
일반적으로 sigmoid나 tanh 등의 중앙부근이 선형인 S자 모양 함수에는 Xavier 초깃값을 사용한다. Xavier 초깃값은 앞 계층의 노드가 n개일 때, 표준편차가 \(\frac{1}{\sqrt{n}}\)인 정규분포를 말한다.
sigmoid나 tanh는 물론 중첩 원리를 만족하지 않으므로 선형함수가 아니지만, 중앙 부근에서 테일러 급수를 사용하면 선형근사가 가능하므로 중앙 부근은 선형인 함수로 볼 수 있다.
활성화 함수로 sigmoid를 사용하며 W는 Xavier 초깃값을 사용한 경우 :
He initialization ( Kaiming He )
ReLU 함수를 사용할 때는 He 초깃값을 사용한다. He 초깃값은 앞 계층의 노드가 n개일 때, 표준편차가 \(\frac{2}{\sqrt{n}}\)인 정규분포를 말한다.
활성화 함수로 ReLU를 사용하며 _W는 He 초깃값을 사용한 경우 :
배치 정규화( batch normalization )
활성화값을 적절히 분포시키는 값을 좋은 가중치 초깃값으로 본다. 가중치 초깃값에 의존하지 않고, 활성화값을 강제로 분포시키는 것을 배치 정규화( batch normalization )이라 한다.
배치(Batch) 정규화(Normalization)는 각 Affine layer를 통과한 미니배치 단위 output을 표준정규분포로 정규화하는 작업이다.
Batch Norm layer를 신경망에 추가해 구현하게 된다.
그래서 network는 ... Affine layer - Batch Norm layer - ReLU layer ...
순으로 구성된다.
수식으로는 다음과 같다.
미니배치 \(B = {x_1,\ x_2,\ …,\ x_n}\)에 대해 이를 평균이 0, 분산이 1인 표준정규분포를 따르는 \({\hat{x_1},\ \hat{x_2},\ …,\ \hat{x_n}}\)으로 정규화한다.
이 때 B가 미니배치이므로, \(x_i\)는 단일 원소 값이 아니라 단일 입력 데이터(행렬)임에 유의한다.
즉, 배치 정규화는 단일 입력 데이터 단위가 아니라 미니배치 단위로 정규화 한다.
정규화에서 \(x_i-\mu_B\)가 평균을 0으로 만들고, \(\sqrt{\sigma^2_B+\varepsilon}\)가 분산을 1로 만든다.
표준편차로 나누면 분산이 1이 된다.
엡실론은 0으로 나누는 것을 예방하기 위해 더해주며 아주 작은 값으로 설정한다.
정규화 하고 나서 배치 정규화 계층마다 이 정규화된 데이터에 고유한 확대(scale, \(\gamma\)), 이동(shift, \(\beta\))변환을 수행한다.
확대 및 이동 : \(y_i \leftarrow \gamma \hat{x_i}+\beta\)
초깃값은 \(\gamma=1,\ \beta=0\)이며 학습하면서 적절한 값으로 조정해나간다.