본문 바로가기
ML, DL/Concept

[DL] 딥러닝 성능 향상(전처리, 가중치초기화, 모멘텀, 활성함수)

by Wordbe 2019. 9. 24.

성능 향상을 위한 요령

들어가기 전에 한가지 명심해야 할 사항은 다음의 방법들이 절대적인 것이 아니라, 경험규칙(Heuristics)에 기반하므로 자신에게 주어진 데이터에 잘 맞을 지는 실험을 통해 알아보야 한다.

1) 데이터 전처리

특징값이 모두 양수(또는 모두 음수)이거나 특징마다 값의 규모가 다르면, 수렴 속도가 느려질 수 있다.
$$
w = w - \sigma x
$$
그레이언트 업데이트 값은 입력(x) 부호에 영향을 받기 때문이다. 모든 x가 양인 상황에서 어떤 오차역전파 σ값은 음수인 상황에는 양의 방향으로 업데이트 되지만, σ값이 양수인 상황에서는 음의 방향으로 업데이트 된다. 이처럼 여러 가중치가 뭉치로 같이 증가하거나, 감소하면 최저점을 찾아가는 경로를 갈팡질팡하여 수렴 속도 저하로 이어진다.

이를 위해 특징값의 평균이 0이 되도록 변환한다. 특징별로 독립적으로 평균을 구한 다음 원래 특징에서 빼준다.

또한 특징의 규모가 달라 (예를 들어, 1.75m 등의 값을 가지는 키 특징과, 60kg 등의 값을 가지는 몸무게 특징은 스케일이 다르다) 특징마다 학습속도가 다를 수 있으므로, 전체적인 학습 속도는 저하될 것이다.

따라서 특징별로 독립적으로 구한 표준편차를 특징 마다 나누면 된다.

위 두 변환 과정을 정규화(Nomarlize)라고 한다.
$$
x_i = \frac{x_i - \mu_i}{\sigma_i}
$$

2) 가중치 초기화(Weight Initialization)

같은 값으로 가중치를 초기화 시키면, 두 노드가 같은 일을 하게 되는 중복성 문제가 생길 수 있다. 따라서 이런 일을 피하는 대칭 파괴(Symmetry break)가 필요하다.

난수는 가우시안분포(Gaussian Distribution 또는 균일 분포(Uniform Distribution) 추출할 수 있고, 실험 결과 둘의 차이는 별로 없다고 한다.

바이어스는 보통 0으로 초기화 한다.

중요한 것은 난수의 범위인데, 극단적으로 가중치가 0에 가깝게 되면 그레디언트가 아주 작아져 학습이 느려지고, 반대로 너무 크면 과잉적합의 위험이 있다.

균등분포(Uniform Distribution)에서는 난수의 범위를 결정하는 규칙으로 아래 두 식에서 r을 사용하여 [-r, r] 를 이용하면 된다.

$$
\begin{align}
r = \sqrt{\frac{3}{n_{in}}} [LeCun1998] \newline
r = \sqrt{\frac{6}{n_{in} + n_{out}}} [Glorot2010] \newline
r = \sqrt{\frac{6}{n_{in}}}[Kaiming He2015]
\end{align}
$$

가우시안분포(Gaussian Distribution)에서는 다음과 같다.

$$
\begin{align}
r = \sqrt{\frac{1}{n_{in}}} [LeCun1998] \newline
r = \sqrt{\frac{2}{n_{in} + n_{out}}} [Glorot2010] \newline
r = \sqrt{\frac{2}{n_{in}}}[Kaiming He2015]
\end{align}
$$

3) 모멘텀 (Momentum)

훈련집합을 가지고 그레디언트를 추정하므로 잡음이 섞일 가능성이 크다.

따라서 그레디언트에 스무딩을 가하면 수렴 속도를 개선할 수 있다.
$$
p = mv
$$
운동량(p, momentum)은 질량(m) x 속도(v)이다.

신경망에서는 질량을 1로 가정하여 속도만 나타낸다. 즉 모멘텀 = 속도이다.

SGD 알고리즘에서는 처음 시작 속도를 0으로 놓고 시작한다.
$$
\theta' = \theta + \alpha v \
v = \alpha v - \rho \frac{\partial J}{\partial \theta} |_{\theta'} \
\theta = \theta + v
$$
우리가 알던 파라미터 업데이트 방식에서, v를 설정하여 조금 더 가속된 업데이트를 할 수 있게 해준다.

위 식에서 처음 식은 어디로 방향을 잡아서 갈지 예견(lookahead)한다.

둘째 식에서는 알파값에 따라 속도를 정할 수 있는데 주로 0.5, 0.9, 0.99 등을 사용하며 에폭 수가 증가함에 따라 점점 키워나가 0.99에 도달하는 방법을 사용한다.

4) 적응적 학습률 (Adaptive Learning Rate)

학습률은 최적화 과정에서 수렴 여부와 그 속도를 결정하는 중요한 요소이다.

학습률이 너무 높으면 해를 중심으로 오버슈팅 현상이 발생해서 진동할 가능성이 크고, 너무 낮으면 해까지 도달하는 시간이 너무 오래 걸리거나 local minima에 빠질 수 있다.

적응적 학습률은 매개변수마다 자신의 상황에 맞게 학습률을 조정해서 사용하는 기법이다.

  • AdaGrad (Adaptive Gradient) [Duchi2011]

    AdaGrad는 이전 그레디언트를 누적한 벡터 r을 이용한다. 이전 그레디언트 누적값이 크면, 다음에는 파라미터가 조금만 이동하고, 반대로 누적값이 작으면 많이 이동한다.

  • RMSProp [Hinton2012]

    RMSProp은 오래된 그레디언트의 영향력을 지수적으로 줄이기 위해 가중 이동평균(weighted moving average) 기법을 이용한다.

  • Adadelta [Zeiler2012]

    RMSProp과 마찬가지로, AdaGrad의 성능을 개선하기 위해 만들어졌다.

  • Adam (Adaptive Moment) [Kingma2015]

    RMSProp에서 모멘텀을 추가로 적용한 알고리즘이다.

5) 활성함수 (Activation Function)

linear,

step,

tanh,

ReLU (Rectified Linear Unit) 등이 있는데,

ReLU는 양의 영역이 선형이므로 포화 현상이 발생하지 않고,

음의영역은 0이 되므로 신경망을 희소하게 만드는 효과가 있다. 신경망이 희소한 상태가 되면 서로 다른 변화 인자를 풀어내는 데 장점이 있다고 여겨진다.

이를 응용한 활성함수로 leaky ReLU, PReLU (Parametric ReLU) 가 있으며 ReLU의 음의 영역이 ax인 함수이다.

leaky ReLU는 a < 1이어야 하는데, 보통 0.01을 사용하고, PReLU에서는 이를 학습으로 알아낸다.

6) 배치 정규화 (Batch Normalization)

convolution layer 뒤에 배치 정규화를 하자.

<참고: 기계학습, 오일석>

댓글0