1. Gradient 소실과 폭주 문제
1.1 글로럿과 He 초기화
불안정한 Gradient 문제 완화를 위해, Glorot, X., & Bengio, Y. (2010, March) 논문에서 제안한 초기화 전략임.
이 방법은 Fully connected Network, symmetry하고 x=0에서 기울기 1인 activation function 사용 등의 조건 아래에서, Forward와 Backward 양방향에서 Cost function의 Gradient값의 분산이 동일하도록 초기화 한다.
- Weight (W_ij)를 평균 0, 분산 1/fan_avg인 정규분포로 초기화
- Weight (W_ij)를 Range [-r,+r]인 Uniform distribution으로 초기화. 이 때 r=sqrt(3/fan_avg)
앞서 언급한 것 처럼, 위의 가중값 초기화 전략은 모든 layer의 입력값의 분산이 동일, 모든 layer에서 gradient값의 분산이 동일하도록 만든다. 두 가지 조건을 만족하려면 결국 아래 두 가지 제약조건을 만족해야 한다. 이 때 n_i는 i번째 layer의 크기를 의미한다.
layer의 크기가 각기 다른 경우에는 위 제약조건을 만족하는 일반적인 조건을 찾기 힘들다. 논문의 저자는 대신 적절한 대안을 아래처럼 제시한다. 결국 weight 분포가 Normal or unifom 분포이면서, 이 대안적인 조건을 만족하는 경우가 Xavier initialization에서 제시하는 초기화 전략이 된다. (uniform distribution U[a,b]의 분산은 (b-a)^2/12)
다른 활성화 함수에 대한 비슷한 전략은 아래와 같음.
초기화 전략 | activation function | 정규분포일 때 분산 |
글로럿 | hyperbolic tangent, logistic, softmax | 1/fan_avg |
He | ReLU와 그 변종 | 2/fan_in |
르쿤 | SELU | 1/fan_avg |
1.2 수렴하지 않는 활성화 함수
activation function 선택도 중요함. 처음에는 주로 sigmoid function을 사용하였으나, ReLU 함수가 더 잘 작동함을 알게 되었다. 하다가 ReLU를 사용
1.2.1 LeakyReLU와 그 파생 활성화 함수
$LeakyReLU_{\alpha}(z) = max(\alpha z, z)$
hyperparameter $\alpha$가 이 함수의 새는 정도를 결정함.
1.2.2 RReLU (Randomized Leaky ReLU)
1.2.3 PReLU (Parametric Leaky ReLU)
1.2.4 ELU (Exponential Linear unit)
$ELU_{\alpha}(z) = $
$ \begin{matrix} \alpha(exp(z) - 1) & z < 0 \\ z & z \ge 0 \end{matrix}$
- $z<0$일 때 함수값이 음수. 활성화 함수의 평균 출력이 0에 가까워 지기 때문에 그레이디언트 소실 문제 완화 할 수 있음.
- $z=0$ 에서 그레이디언트 0 아님
- $\alpha = 1$이면 $z=0$에서 smooth함
- ReLU 및 그 변종 함수보다 계산량 많음. 이는 ELU 사용시 Traning 수렴속도가 빨라서 어느정도 상쇄 가능함
1.2.5 SELU (Scaled Exponential Linear unit)
Klambauer, Günter, et al. "Self-normalizing neural networks." Advances in neural information processing systems 30 (2017).
$SELU_{\alpha}(z) = $ $\begin{matrix} \lambda \alpha(exp(z) - 1) & z < 0 \\ \lambda z & z \ge 0 \end{matrix}$
스케일이 조정된 ELU 활성화 함수의 변종. 완전 연결 층만 쌓은 신경망에서 SELU 사용 시 네트워크가 자기 정규화 된다. 즉, 훈련하는 동안 각 층의 출력이 평균 0, 표준편차 1을 유지하는 경향이 있음. 단, 이를 위한 전재조건들이 필요
- 입력 특성이 표준화 되어야 함
- 모든 은닉층의 가중값은 르쿤 정규분포로 초기화 되어야 함
- 네트워크는 일렬로 쌓은 층으로 구성되어야 함.
1.3 BatchNormalizartion
각 층에서 활성화 함수를 통화하기 전 or 후에 특정한 연산을 추가함. 이 연산은 단순하게 입력을 원전에 맞추고 정규화를 한 다음, 각 층에서 두 개의 새로운 파라마터로 결괏값의 스케일을 조정하고 이동시킨다.
$\mu_B = \frac{1}{m_{B}} \sum^{m_B}_{i=1}x^{(i)}$ // 해당 Layer로 넘어온 data(1개 batch)의 평균
$\sigma_B^{2} = \frac{1}{m_{B}} \sum^{m_B}_{i=1} (x^{(i)} - \mu_{B})^2$ // 해당 Layer로 넘어온 data(1개 batch)의 분산
$\hat{x}^{(i)} = \frac{x^{(i)} - \mu_B}{\sqrt{\sigma_{B}^{2} + \epsilon}}$ // 해당 Layer로 넘어온 data를 표준화
$z^{(i)} = \gamma \otimes \hat{x}^{(i)} + \beta $ // 표준화된 data $\hat{x}^{i}$를 조정한 값.
결국 BatchNoramlizaton은, (Batch) data를 학습에 적절하도록 각 Layer에서 data를 sacling & shift 하는 방법이라 할 수 있다.
위의 과정은 Model training 시에는 위 과정을 통해 $\mu$, $\sigma^2$를 계산할 수 있지만, 주어진 data의 inference 시에는 이 paramter의 값을 추정하는 것이 불가능하다. 이는 inference 할 data가 신경망에 들어올 때에는 Batch size를 1로 취급하기 때문에 평균과 분산의 추정값을 구하기 힘들기 때문이다. 따라서, Inferene를 위한 $\mu$, $\sigma^2$를 따로 계산해야 한다.
- 학습 종료 이후, 전체 Training data를 신경망에 통과시켜 각 BatchNormalization Layer의 input에 대해 $\mu$, $\sigma^2$ 계산.
- 학습 과정에서 $\mu$, $\sigma^2$ 의 지수 이동평균값을 계산해 추정값으로 사용 (Keras dafualt)
Fixup : 새로운 가중치 초기화 기법 제안 (Zhang, Hongyi, Yann N. Dauphin, and Tengyu Ma. "Fixup initialization: Residual learning without normalization." arXiv preprint arXiv:1901.09321 (2019).)
1.4 Gradient Cliipping
Gradient 폭주 방지를 위해, 역전파시 threshold를 넘어서지 못하게 Gradient 잘라내는 방법. RNN은 BatchNormalization 적용이 어려워 Clipping 방법을 주로 사용한다.
1.ㅇㅇㅇ
ㅇㅇㅇ
3. 고속 옵티마이저
경사하강법 : 가중값 $\theta$에 대한 비용 함수 $J(\theta) $를 감소시키기 위해, 현재 가중값에서 비용 함수 Gradient $ \nabla_{\theta} J(\theta) $에 학습률 $\eta$를 곱한 vector를 차감한 값으로 갱신. 즉 $\theta \leftarrow \theta - \eta \nabla_{\theta} J(\theta) $.
3.1 Momentum
가중값 $\theta $ 업데이트 시, 직전 update 에서의 gradient 방향을 고려함. 이를위해 momentum vector $m$과 그 반영 정도를 조절하는 hyper parameter $\beta$를 도입함.
$ m \leftarrow \beta m -\eta \nabla_{\theta}J(\theta) $
$ \theta \leftarrow \theta + m $
장점 : 비용함수 $J(\theta)$가 평면일 곳에서 (즉, $J(\theta)$가 같은 값을 가지는 평평한 공간) 단순 경사하강법 보다 탈출 속도가 빠름.
iter | $\theta$ 변화량 at Momentum | $\theta$ 변화량 at GD |
1 | $-\eta \nabla_{\theta} J(\theta) $ | $-\eta \nabla_{\theta} J(\theta) $ |
2 | $-\beta \eta \nabla_{\theta} J(\theta) - \eta \nabla_{\theta} J(\theta)$ | $-\eta \nabla_{\theta} J(\theta) $ |
3 | $-\beta \eta \nabla_{\theta} J(\theta) - \eta \nabla_{\theta} J(\theta)$ | $-\eta \nabla_{\theta} J(\theta) $ |
4 | $-\beta \eta \nabla_{\theta} J(\theta) - \eta \nabla_{\theta} J(\theta)$ | $-\eta \nabla_{\theta} J(\theta) $ |
3.2 Nesterov accelerated gradient
Momentum 처럼 직전 gradient를 반영함. 다른 점은 Gradient 계산시 현재 $\theta$ 위치가 아닌, 현재위치에서 momentum 방향으로 이동한 위치($\theta + \beta m$)에서의 Gradient를 계산함.
$ m \leftarrow \beta m -\eta \nabla_{\theta}J(\theta + \beta m) $
$ \theta \leftarrow \theta + m $
직전 Gradient 방향(Momentum)으로 이동한 위치에서 최적 방향을 가늠하기 때문에, 진동 감소와 수렴속도 향상할 수 있음.
optimizer = keras.optimizers.SGD(learning_rate=0.001, momentum=0.9, nesterov=True)
3.3 AdaGrad
GD는 현 지점에서 가장 가파른 방향으로 최적해를 찾아간다. 따라서, 길쭉한 타원형의 공간에서 GD는 전역 최적점 대신 골짜기를 찾아가고, 그 이후 전역 최적점으로 움직인다. 만약 현 위치에서 바로 골짜기를 찾아가지 않는다면(= 한 방향으로 급격한 이동을 줄인다면), 전역 최적점으로 더 빨리 수렴 할 수 있다는 가정에서 만들어진 방법. 현 위치에서 Gradient를 계산한 후, 차원 축별로 가파른 정도(=$sqrt{\nabla_{\theta} J(\theta) \otimes J(\theta)}$)를 계산하고 그 크기에 반비례하게 이동 정도를 감소시킨다.
$s \leftarrow s + \nabla_{\theta} J(\theta) \otimes J(\theta)$
$\theta \leftarrow \theta - \eta \nabla_{\theta} J(\theta) \oslash \sqrt{s+\epsilon}$
AdaGrad 는 간단한 공간에서는 잘 작동하지만, 실제 신경망에 적용할 때에는 훈련이 너무 빨리 종료되는 문제가 있음.
3.4 RMSProp
AdaGrad는 전역 최적점으로 방향을 조절할 수 있지만, 수렴 속도가 늦은 문제가 있음. RMSProp 는 가장 최근 update에서 계산된 Gradient만 누적함으로써 이 문제를 해결함.
$s \leftarrow \beta s + (1-\beta)\nabla_{\theta} J(\theta) \otimes J(\theta)$
$\theta \leftarrow \theta - \eta \nabla_{\theta} J(\theta) \oslash \sqrt{s+\epsilon}$
optimizer = keras.optimizers.RMSprop(learning_rate=0.001, rho=0.9)
3.5 Adam (Adaptive Moment estimation)
ddd
3.6 Nadam
ddd
1.ㅇㅇㅇ
ㅇㅇㅇ