일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- Paper
- IROS
- 융합연구
- 경희대
- Computer Vision
- paper review
- Vae
- Python
- 리눅스
- 논문
- 딥러닝
- panoptic nerf
- 2022
- pytorch
- 논문 리뷰
- docker
- ICCV
- NERF
- CVPR2023
- NeRF paper
- ICCV 2021
- Deep Learning
- GAN
- 파이토치
- Semantic Segmentation
- linux
- CVPR
- 논문리뷰
- Neural Radiance Field
- panoptic segmentation
- Today
- Total
윤제로의 제로베이스
기울기 소실(Gradient Vanishing)과 폭주(Exploding) 본문
10. 기울기 소실(Gradient Vanishing)과 폭주(Exploding)
깊은 인공 신경망을 학습하다보면 역전파 과정에서 입력층으로 갈 수록 기울기(Gradient)가 점차적으로 작아지는 현상이 발생할 수 있습니다. 입력층에 가까운 층들에서 가중 ...
wikidocs.net
깊은 인공 신경망을 학습하다보면 역전파 과정에서 입력층으로 갈수록 기울기가 점차적으로 작아지는 현상이 발생할 수 있다.
입력층에 가까운 층들에서 가중치들이 업데이트가 제대로 되지 않으면 결국 최적의 모델을 찾을 수 없게 된다.
이를 기울기 소실(Gradient Vanishing)이라고 한다.
반대의 경우 기울기가 점차 커지더니 가중치들이 비정상적으로 큰 값이 되면서 발산하기도 한다. 이를 기울기 폭주(Gradient Exploding)이라고 하며 순환신경망(Recurrent Neural Network, RNN)에서 발생할 수 있다.
1. ReLU와 ReLU의 변형들
시그모이드 함수를 사용하면 입력의 절댓값이 클 경우에 시그모이드 함수의 출력값이 0 또는 1에 수렴하면서 기울기가 0에 가까워진다.
그래서 역전파 과정에서 전파시킬 기울기가 점차 사라져서 입력층 방향으로 갈수록 제대로 역전파가 되지 않는 기울기 소실 문제가 발생할 수 있다.
기울기 소실을 완화하는 가장 간단한 방법은 은닉층의 활성화 함수로 시그모이드나 하이퍼볼릭타젠트 함수 대신에 ReLU나 ReLU 변형 함수와 같은 Leaky ReLU를 사용하는 것이다.
- 은닉층에서는 시그모이드를 사용하지 마라.
- Leaky ReLU를 사용하면 모든 입력값에 대해서 기울기가 0으로 수렴하지 않아 죽은 ReLU문제를 해결할 수 있다.
- 은닉층에서는 ReLU나 Leaky ReLU를 사용해야 한다.
2. 가중치 초기화(Weight initialization)
같은 모델을 훈련시키더라도 가중치가 초기에 어떤 값ㅇ르 가졌느냐에 따라서 모델의 훈련 결과가 달라지기도 한다.
다시 말해 가중치 초기화만 적절히 해줘도 기울기 소실 문제를 완화시킬 수 있다.
1) 세이비어 초기화(Xavier Initialization)
이 방법은 균등 분포 또는 정규 분포로 초기화할 떄 두 가지 경우로 나뉘며, 이전 층의 뉴런 개수와 다음 층의 뉴런 개수를 가지고 식을 세운다.
균등 분포를 사용하여 가중치를 초기화할 경우 다음과 같은 범위를 사용한다.
정규분포로 초기화할 경우 평균이 0이고 표준편차가 아래와 같도록 한다.
세이비어 초기화는 여러층의 기울기 분산 사이에 균형을 맞춰서 특정층이 너무 주목받거나 다른층이 뒤쳐지는 것을 막는다.
세이비어 초기화는 시그모이드 함수나 하이퍼볼릭탄제트 함수와 같은 S자 형태인 활성화 함수와 함께 사용할 경우 좋은 성능을 보이지마나 ReLU나 ReLU 변형 함수와는 성능이 좋지 않다.
ReLU나 ReLU 변형 함수들을 활성화 함수로 사용하는 경우에는 다른 초기화 방법을 사용하는데, 이를 He 초기화(He Initialization)이라고 한다.
2) He 초기화(He Initialization)
He 초기화(He Initialization)는 세이비어 초기화와 유사하게 정규 분포와 균등 분포 두가지로 나뉜다.
다만, He 초기화는 세이비어 초기화와 다르게 다음층의 뉴런 수는 반영하지 않는다.
He 초기화는 균등 분포로 초기화할 경우 다음과 같은 균등 분포 범위를 가지도록 한다.
정규 분포로 초기화할 경우 표준 편차가 다음을 만족하도록 한다.
- 시그모이드 함수나 하이퍼볼릭탄젠트 함수를 사용할 경우에는 세이비어 초기화 방법이 효율적이다.
- ReLU 계열 함수를 사용할 경우 He 초기화 방법이 효율적이다.
- ReLU + He 초기화 방법이 더 보편적이다.
3. 배치 정규화(Batch Normalization)
ReLU 계열의 함수와 He 초기화를 사용하는 것만으로도 어느 정도 기울기 소실과 폭주를 완화시킬 수 있지만, 이 두 방법을 사용하더라도 다시 발생할 수 있다.
기울기 소실이나 폭주를 예방하는 또다른 방법이 배치 정규화이다.
배치 정규화는 인공 신경망의 각 층에 들어가는 입력을 평균과 분산으로 정규화하여 학습을 효율적으로 만든다.
1) 내부 공변량 변화(Internal Covariate Shift)
내부 공변량 변화란 학습 과정에서 층 별로 입력 데이터 분포가 달라지는 현상을 말한다.
이전 층들의 학습에 의해 이전층의 가중치값이 바뀌게 되면, 현재 층에 전달되는 입력 데이터의 분포가 현재층이 학습했던 시점의 분포와 차이가 발생한다.
배치 정규화를 제안한 논문에서는 기울기 소실/폭주 등의 딥러닝 모델의 불안정성이 층마다 입력의 분포가 달라지기 때문이라고 주장한다.
- 공변량 변화는 훈련 데이터의 분포와 테스트 데이터의 분포가 다른 경우를 의미한다.
- 내부 공변량 변화는 신경망 층 사이에서 발생하는 입력 데이터의 분포 변화를 의미한다.
2) 배치 정규화(Batch Normalization)
배치 정규화는 배치 단위로 정규화하는 것을 말한다.
배치 정규화는 각 층에서 활성화 함수를 통과하기 전에 수행된다.
입력에 대해 평균을 0으로 만들고 정규화를 하게 된다.
그리고 정규화 된 데이터에 대해서 스케일과 시프트를 수행하게 된다.
이 때 두개의 매개변수를 사용하는데, 하나는 스케일을 위해, 또다른 하나는 시프트를 하는 것에 사용하며 일정한 범위의 값들만 전달하게 된다.
배치 정규화는 학습 시 배치 단위의 평균과 분산들을 차례대로 받아 이동 평균과 이동 분산을 저장해 놓았다가 테스트를 할 때 해당 배치의 평균과 분산을 구하지 않고 구해놓았던 평균과 분산으로 정규화를 한다.
- 배치 정규화를 사용하면 시그모이드 함수나 하이퍼볼릭탄젠트 함수를 사용하더라도 기울기 소실 문제가 크게 개선된다.
- 가중치 초기화에 훨씬 덜 민감해진다.
- 훨씬 큰 학습률을 사용할 수 있어 학습 속도를 개선시킨다.
- 미니 배치마다 평균과 표준편차를 계산하므로 훈련 데이터에 일정의 잡음을 넣는 부수 효과로 과적합을 방지하는 효과도 낸다. 하지만 부수적 효과이므로 드롭 아웃과 함꼐 사용하는 것이 좋다.
- 배치 정규화는 모델을 복잡하게 하며, 추가 계산을 하는 것이므로 테스트 데이터에 대한 예측 시에 실행 시간이 느려진다. 그래서 서비스 속도를 고려하는 관점에서는 배치 정규화가 꼭 필요한지 고민이 필요하다.
3) 배치 정규화의 한계
① 미니 배치 크기에 의존적이다.
배치 정규화는 너무 작은 배치 크기에선 잘 작동하지 않을 수 있다.
단적으로 배치 크기를 1로 하게 되면 분산이 0이 된다.
작은 미니 배치에서는 배치 정규화의 효과가 극단적으로 작용되어 훈련에 악영향을 줄 수 있다.
배치 정규화를 적용할 때 작은 미니 배치보다는 크기가 어느정도 되는 미니 배치에서 하는 것이 좋다.
이처럼 배치 정규화는 배치 크기에 의존적인 면이 있다.
② RNN에 적용하기 어렵다.
RNN은 각 시점(time step)마다 다른 통계치를 갖는다.
이는 RNN에 배치 정규화를 적용하기 어렵게 만든다.
RNN에서 배치 정규화를 적용하기 위한 몇 가지 논문이 제시되었지만, 여기서는 이를 소개하는 대신 배치 크기에도 의존적이지 않으며, RNN에도 적용하는 것이 수월한 층 정규화 라는 방법을 소개하고자 한다.
4. 층 정규화(Layer Normalization)
층 정규화를 이해하기 앞서 배치 정규화를 시각화해보자.
아래의 그림은 m이 3이고 특성 개수가 4일 때 배치 정규화이다.
'Background > Pytorch 기초' 카테고리의 다른 글
CNN으로 MNIST 분류하기 (0) | 2022.01.19 |
---|---|
합성곱과 풀링(Convolution and Pooling) (0) | 2022.01.19 |
과적합(Overfitting)을 막는 방법들 (0) | 2022.01.17 |
비선형 활성화 함수(Activation function) (0) | 2022.01.17 |
역전파(Backpropagation) (0) | 2022.01.17 |