깊은 인공 신경망을 학습하다보면 역전파 과정에서 입력층으로 갈 수록 기울기(gradient)가 점차적으로 작아지는 현상이 발생할 수 있다. 입력층에 가까운 층들에서 가중치 업데이트가 제대로 되지 않으면 결국 최적의 모델을 찾지 못하는데 이를 기울기 소실(Gradient Vanishing)이라고 한다.
반대의 경우도 존재하는데, 기울기가 점차 커지더니 가중치들이 비정상적으로 큰 값이 되면서 결국 발산하게 되는 기울기 폭주(Gradient Exploding)도 존재한다. 이는 순환 신경망(Recurrent Neural Network,RNN)
에서 쉽게 발생한다.
1. ReLU와 ReLU의 변형들
시그모이드 함수
: 입력의 절대값이 클 경우에 출력값이 0 또는 1에 수렴하면서 기울기가 0에 가까워진다. ➡️ 역전파 과정에서 전파시킬 기울기가 점차 사라져서 입력층 방향으로 갈수록 역전파가 제대로 되지 않는 기울기 소실 문제 발생
✏️ 완화 방법
은닉층의 활성화 함수로 시그모이드
나 하이퍼볼릭탄젠트
함수 대신에 ReLU
나 ReLU 변형 함수
와 같은 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으로 만들고, 정규화를 한다. ➡️ 정규화 된 데이터에 스케일과 시프트를 수행한다.
'ML' 카테고리의 다른 글
[만들면서 배우는 생성 AI]생성 모델링 (0) | 2024.06.05 |
---|---|
과적합(Overfitting)을 막는 방법들 (1) | 2024.06.05 |
역전파(BackPropagation) 이해하기 (1) | 2024.06.05 |
딥 러닝의 학습 방법 (1) | 2024.06.05 |
행렬곱으로 이해하는 신경망 (0) | 2024.06.05 |