이 포스트는 Do it 딥러닝 교과서 (윤성진 저)를 참고하여 만들어졌음!
신경망 모델을 학습할 때 loss function의 최적해와 가까운 곳에서 학습을 시작하면 빠르게 최적해를 찾을 수 있다. loss function의 차원은 신경망 모델의 parameter 개수와 같다. (신경망 모델의 parameter 전부를 거쳐서 나온 output과 target을 비교하여 loss를 계산하므로) 따라서 loss function을 간략하게 도식화 하는 것 조차 불가능한 와중에 어느 지점이 최적해와 가까운지 어림잡는 것은 불가능해 보인다.
weights의 학습 시작지점에 따라 모델의 성능이 크게 변동될 수 있기 때문에 초기화를 잘 해주는 것 역시 중요하다.
상수 초기화
가중치를 전부 0으로 초기화
이때 hidden layer 뉴런 $h_1, h_2$의 출력결과는 항상 0이된다.
$$z=\vec{w}^T \vec{x} + b =0 \\ a=\text{activation}(z) \in {0, 0.5} $$
activation function이 ReLU 혹은 hyperbolic tangent이면 출력은 항상 0이며 sigmoid이면 항상 0.5이다. 역전파를 위해 맨 첫 계층 $\vec{x}$으로 loss function $J$를 편미분해보자.
$$\frac{\partial J}{\partial \vec{x}} = \frac{\partial J}{\partial z} \cdot \frac{\partial z}{\partial \vec{x}} $$
이때 $\frac{\partial z}{\partial \vec{x}}=\vec{w}=0 $이므로 $\frac{\partial J}{\partial \vec{x}}=0$이 되어 학습이 불가능하다.
가중치를 전부 0이 아닌 상수로 초기화
이 경우 weights 값이 0이 아니므로 학습은 가능하다. ($\frac{\partial z}{\partial \vec{x}}$값 존재) 하지만 hidden neuron $h_1, h_2$의 입력과 weights가 전부 동일하므로 출력도 같다. 따라서 역전파를 이용한 update 결과도 같을 것이므로 결과적으로 두 뉴런은 완벽하게 동일해진다. 실제 뉴런은 2개 존재하지만 하나의 뉴런만 있는 것 처럼 동작하므로 모델의 성능이 크게 나빠진다.
가우시안 분포 초기화
따라서 weights들은 서로 다른 0이 아닌 값으로 초기화되어야 한다. 이를 위해 gaussian distribution을 따르는 난수를 이용하여 초기화 할 수 있다. 10개의 layer를 가지며 activation으로 hyperbolic tangent를 사용하는 딥러닝 신경망 모델을 예시로 들어본다.
가중치를 $\mathcal{N}(0, 0.01) $으로 초기화
위 그림은 가중치를 아주 작은 수로 초기화 한 경우 각 layer들의 output 분포를 나타낸 것이다. $z = \vec{w}^T\vec{x}+b$에서 $\vec{w}$의 영향으로 가중합산값이 계속 작아지게 된다. 따라서 3번째 layer부터는 output이 거의 0에 수렴하는 것을 확인할 수 있다. 따라서 파라미터가 적절히 학습되지 못하고 weights를 0으로 초기화 한 경우와 비슷한 현상이 발생한다.
가중치를 $\mathcal{N}(0, 1)$으로 초기화
weights를 너무 크게 초기화 한 경우 layer를 거치면서 output은 위와 같이 나타난다. 값들이 -1과 1로 수렴하는 이유는 activation으로 hyperbolic tangent를 사용하였기 때문이다. 즉 뉴런의 출력인 $z=\vec{w}^T \vec{x}+b$이 매우 커서 $a=\text{activation}(z)$가 -1 혹은 1을 출력하는 것이다. 이때 activation function의 gradient가 0으로 saturation 되어 학습이 중단되는 문제가 발생한다.
위까지는 망한 초기화의 예시이다. 가중치 초기화를 너무 크거나 너무 작게하면 학습에 지장이 생긴다. 우리는 입력 데이터가 layer를 통과하더라도 데이터의 크기가 유지되는 가중치를 사용해야 한다. 어떤 방법이 있을까?
Xavier Initialization
Xavier 초기화는 activation으로 sigmoid 계열을 사용할 때 채택하는 가중치 초기화 방법이다. Input data의 분산이 output에서 유지되도록 하여 데이터가 layer를 거쳐도 같은 크기로 유지되게 한다.
Xavier Initialization을 유도하기 위한 몇 가지 가정이 존재한다.
- Activation은 선형이다.
- Sigmoid를 사용하는 경우 입력 데이터가 0 근처의 값이라면 선형으로 근사할 수 있다.
- 따라서 activation의 입력값의 절댓값이 굉장히 작다고 가정한다.
- Input data와 weights는 다음 성질을 만족한다.
- Input data $(x_1, x_2, \cdots, x_n)$와 weights $(w_1, w_2, \cdots, w_n)$는 서로 독립
- Input data의 각 차원 $x_i$는 서로 같은 분포를 따르며 서로 i.i.d
- weights의 각 차원 $w_i$ 역시 서로 같은 분포이며 i.i.d
- 각 $x_i, w_i$는 평균이 0이다.
이제 Xavier 초기화 식을 유도한다. 먼저 activation이 linear라고 가정했으므로 activation의 출력 $y$는 가중합산 $z$와 같다. $$y=a(z)=z=w_1 x_1+w_2 x_2+\cdots+w_n x_n+b $$
위 식의 양변의 variance를 구하면 다음과 같다.
$$\begin{align} \text{Var}(y) &= \text{Var}(w_1 x_1 + w_2 x_2 + \cdots + w_n x_n) \\ &= \text{Var}(w_1 x_1) + \text{Var}(w_2 x_2) + \cdots + \text{Var} (w_n x_n) \\ &=\sum_{i=1}^{n} \text{Var}(w_i x_i) \end{align}$$
여기서 $n$=데이터 개수이고 우리는 $E(w_i)=0, E(x_i)=0$을 가정했으므로 $\text{Var}(x_i w_i) = \text{Var}(x_i) \text{Var}(w_i)$를 만족한다.
$$\text{Var}(y) = \sum_{i=1}^{n} \text{Var}(x_i) \text{Var}(w_i) $$
이때 각 $x_i$와 $w_i$는 서로 같은 분포를 따르므로 variance가 전부 동일하다. 따라서 위 식을 다음과 같이 쓸 수 있다.
$$\text{Var}(y) = n\text{Var}(x_i) \text{Var}(w_i) $$
Xavier 초기화의 목적은 뉴런의 입력과 출력의 variance를 같게 만드는 것이었으므로 $\text{Var}(x_i)=\text{Var}(y)$로 가정하면 다음을 얻는다.
$$\text{Var}(w_i)=\frac{1}{n} $$
따라서 Xavier 초기화는 weights의 variance $\text{Var}(w_i)$이 Input data의 개수 $n$에 반비례하도록 초기화 한다.
He Initialization
Sigmoid 계열 (ex hyperbolic tangent) activation을 사용할 때는 Xavier 초기화가 잘 동작한다. 하지만 ReLU를 사용하는 경우에는 input이 음수일 때 input이 0으로 변하여 출력되므로 activation이 선형이라는 가정을 할 수 없다. 예를들어 ReLU를 사용했을 때 input의 50% 가량이 0으로 출력된다면 input data의 variance (input data의 크기)는 절반으로 줄어든다. (input과 output의 variance가 유지되지 못한다는 것이다.)
실제로 ReLU에 입력되는 input 중 절반이나 음수인 경우는 잘 없겠지만 (진짜 그런가?) 중요한 점은 ReLU에 음수가 입력되는 경우 그것들을 전부 0으로 만들어버리므로 ReLU를 거칠수록 데이터의 분산이 작아진다는 것이다.
위 그림은 activation으로 ReLU를 사용할 때 Xavier Initialization을 사용한 결과이다. 매 layer를 거칠 때마다 data의 분산이 작아져서 input과 output의 variance가 달라지는 문제점이 발생한다.
이를 개선하기 위한 것이 바로 He Initialization이다. He는 ReLU를 사용했을 때 뉴런의 input과 output의 variance를 같게 유지해준다. ReLU 특성 상 negative input이 입력되면 전부 0으로 만드는 특성 때문에 variance가 절반으로 감소한다. 절반으로 줄어드는 variance를 weights에 미리 보상하는 느낌으로 다음과 같이 초기화를 해준다.
$$\text{Var}(w)=\frac{2}{n} $$
Xavier 초기화에서 사용했던 weights variance에 2를 곱한 형태로 나타난다. ReLU를 사용하며 절반 감소한 variance를 weights를 통해 다시 복구시켜주는 것이다.
ReLU activation을 사용할 때 He Initialization을 적용한 결과이다. output 값들 중 0의 비율이 압도적으로 높은 이유는 negative input은 전부 0으로 만들어버리는 ReLU의 특성 때문이다. 출력 표준편차가 layer를 여러 번 거쳐도 0으로 죽지 않는다는 것을 확인할 수 있다.
'딥러닝' 카테고리의 다른 글
VGG net 논문리뷰 + 실습 (0) | 2023.10.04 |
---|---|
11. 컨볼루션 신경망, CNN (Convolution neural network) (0) | 2023.09.27 |
8. 최적화 Optimization (0) | 2023.09.20 |
7. 손실함수 Loss function (0) | 2023.09.15 |
6. 배치, 미니배치, SGD (0) | 2023.09.15 |