ML

기울기 소실(Gradient Vanishing)과 폭주(Exploding)

지미닝 2024. 6. 5. 17:10

깊은 인공 신경망을 학습하다보면 역전파 과정에서 입력층으로 갈 수록 기울기(gradient)가 점차적으로 작아지는 현상이 발생할 수 있다. 입력층에 가까운 층들에서 가중치 업데이트가 제대로 되지 않으면 결국 최적의 모델을 찾지 못하는데 이를 기울기 소실(Gradient Vanishing)이라고 한다.

반대의 경우도 존재하는데, 기울기가 점차 커지더니 가중치들이 비정상적으로 큰 값이 되면서 결국 발산하게 되는 기울기 폭주(Gradient Exploding)도 존재한다. 이는 순환 신경망(Recurrent Neural Network,RNN)에서 쉽게 발생한다.

1. ReLU와 ReLU의 변형들

시그모이드 함수: 입력의 절대값이 클 경우에 출력값이 0 또는 1에 수렴하면서 기울기가 0에 가까워진다. ➡️ 역전파 과정에서 전파시킬 기울기가 점차 사라져서 입력층 방향으로 갈수록 역전파가 제대로 되지 않는 기울기 소실 문제 발생

✏️ 완화 방법
은닉층의 활성화 함수로 시그모이드하이퍼볼릭탄젠트 함수 대신에 ReLUReLU 변형 함수와 같은 Leacky ReLU를 사용하는 것이다.

  • 은닉층에서는 시그모이드 함수를 사용하지 말자.
  • Leaky ReLU를 사용하면 모든 입력값에 대해서 기울기가 0에 수렴하지 않아 죽은 ReLU 문제를 해결한다.
  • 은닉층에서는 ReLU나 Leaky ReLU와 같은 ReLU 함수의 변형들을 사용하자.

2. 그래디언트 클리핑(Gradient Clipping)

"기울기 값을 자르는 것" ➡️ 기울기의 폭주를 막기 위해 임계값을 넘지 않도록 값을 자르는 것이다.
이는 RNN에서 유용하다.. (🤔Why? : 역전파 과정에서 시점을 역행하면서 기울기를 구하는데 이때 기울기가 너무 커질 수 있다고..한다)
아래와 같이 케라스에서 수행한다.

from tensorflow.keras import optimizers

Adam = optimizers.Adam(lr=0.0001, clipnorm=1.)

3. 가중치 초기화(Weight Initalization)

같은 모델이라도 가중치가 초기에 어떤 값을 가졌느냐에 따라서 모델의 훈련 결과가 달라진다.
➡️ 가중치 초기화만 적절히 해줘도 기울기 소실 문제 완화 가능!

1) 세이비어 초기화(Xavier Initialzation)

이 방법은 균등 분포 또는 정규 분포를 초기화 할 때로 두 가지 경우로 나뉜다. 이전 층의 뉴런 개수와 다음 층의 뉴런 개수를 가지고 식을 세운다.

균등 분포를 사용하여 가중치를 초기화 할 경우

아래와 같은 균등분포 범위를 사용한다.
$$W \sim Uniform(-\sqrt{\frac{6}{ n_{in} + n_{out} }}, +\sqrt{\frac{6}{ n_{in} + n_{out} }})$$

$$\sqrt{\frac{6}{ n_{in} + n_{out} }}$$를 m이라고 하여씅ㄹ 때, -m과 +m사이의 균등 분포를 의미한다.

정규 분포를 사용하여 가중치를 초기화할 경우

평균이 0이고, 표준 편차 σ가 다음을 만족하도록 한다.
$$σ=\sqrt{\frac { 2 }{ n_{ in }+n_{ out } } }$$

세이비어 초기화는

여러 층의 기울기 분산 사이에 균형을 맞춘다. 그러나, 시그모이드 함수하이퍼볼릭 탄젠트 함수와 같은 s자 형태인 활성화 함수와 함께 사용할 경우에는 좋은 성능을 보이지만, ReLU와 함께 사용할 경우에는 성능이 좋지 않다.

따라서 이런 함수들을 활성화함수로 사용하는 경우에는 다른 초기화 방법을 사용하는데 He 초기화(He Initialization)를 사용한다.

2) He 초기화(He Initialization)

정규 분포균등 분포 두 가지로 나뉜다. 다만, 다음 층의 뉴런 수를 반영하지 않는다는 점에서 세이비어 초기화와 다르다.

He 초기화는 균등 분포로 초기화 할 경우에는 다음과 같은 균등 분포 범위를 가진다.
$$W\sim Uniform(- \sqrt{\frac { 6 }{ n_{in} } } , \space\space + \sqrt{\frac { 6 }{ n_{ in } } } )$$

정규 분포로 초기화할 경우에는 표준편차 σ가 다음을 만족한다.
$$
σ=\sqrt{\frac { 2 }{ n_{ in } } }
$$

  • 시그모이드 함수나 하이퍼볼릭탄젠트 함수를 사용할 경우에는 세이비어 초기화 방법이 효율적이다.
  • ReLU 계열 함수를 사용할 경우에는 He 초기화 방법이 효율적이다.
  • ReLU + He 초기화 방법이 좀 더 보편적이다.

4. 배치 정규화(Batch Normalization)

가중치 초기화를 통해서도 기울기 소실과 폭주를 완화할 수 있으나, 이 방법을 사용하더라도 훈련 중에 언제든 다시 발생할 수 있다. 그래서 또 다른 방법으로 배치 정규화를 사용한다.
"인공 신경망의 각 층에 들어가는 입력을 평균분산으로 정규화하여 학습을 효율적으로 만듦
배치 정규화는 인공 신경망의 각 층에 들어가는 입력을 평균과 분산으로 정규화하여 학습을 효율적으로 만든다.

1) 내부 공변량 변화(Interval Covariate Shift)

층 별로 입력 데이터 분포가 달라지는 현상을 말한다. ➡️ 이전 층들의 학습에 의해 이전층의 가중치 값이 바뀌게 되면 ➡️ 현재 층이 학습했던 시점의 분포와 차이가 발생한다.

배치 정규화를 제안한 논문에서는 기울기 소실/폭주 등의 딥 러닝 모델의 불안전성이 층마다 입력의 분포가 달라지기 때문이라고 주장한다.

  • 공변량 변화는 훈련 데이터의 분포와 테스트 데이터의 분포가 다른 경우를 의미한다.
  • 내부 공변량 변화는 신경망 층 사이에서 발생하는 입력 데이터의 분포 변화를 의미한다.

2) 배치 정규화(Batch Normalization)

"한 번에 들어오는 배치 단위로 정규화 하는 것"
입력에 대해 평균을 0으로 만들고, 정규화를 한다. ➡️ 입력에 대해 평균을 0으로 만들고, 정규화를 한다. ➡️ 정규화 된 데이터에 스케일과 시프트를 수행한다.