심층 신경망 훈련하기 - Gradient 소실과 폭주 문제 해결 방법
2020. 12. 29. 14:31ㆍML&DL
본 글은 핸즈온 머신러닝 Part2-11장(심층 신경망 훈련하기)를 공부한 후 정리한 내용입니다.
✅ 보다 깊은 심층 신경망을 학습시켜 아주 복잡한 문제를 다룰 때 발생할 수 있는 문제들
- Gradient 소실 or gradient 폭주 문제에 직면.
- 심층 신경망의 아래쪽으로 갈수록 gradient가 점점 더 작아지거나 커지는 현상
- 하위층을 학습하기 매우 어렵게 만듦.
- 대규모 신경망을 위한 학습 데이터가 충분하지 않거나 레이블을 만드는 작업에 비용이 많이 들 수 있음.
- 학습이 극단적으로 느려질 수 있음.
- 수백만 개의 파라미터를 가진 모델은 학습 할 때 과대적합 될 위험이 큼.
- 특히, 학습 샘플이 충분하지 않거나 잡음이 많은 경우
그 중 Gradient 소실 or gradient 폭주 문제를 해결하는 방법에 대해 알아보겠습니다.
🔸 Gradient 소실 or gradient 폭주?
- 역전파 알고리즘에서 모든 파라미터에 대한 오차 함수의 그레디언트를 계산하면 경사 하강법 단계에서 이 gradient를 이용하여 각 파라미터를 수정하는데 이때 하위층으로 갈수록 gradient가 작아지는 것을 gradient 소실, 점점 값이 커지면서 여러 층이 비정상적으로 큰 가중치로 갱신되어 알고리즘이 발산되는 것을 gradient 폭주라고 함.
- 불안정한 gradient는 층마다 학습 속도가 달라질 수 있기 때문에 학습을 어렵게 만듦.
🔸 원인?
- 로지스틱 시그모이드 활성화 함수와 평균이 0이고 표준편차가 1인 정규분포를 이용한 가중치 초기화 방법의 조합 (by 2010년 세이비어 글로럿과 요슈아 벤지아가 발표한 논문)
- 각 층에서 출력의 분산이 입력의 분산보다 더 크다.
- 신경망의 위쪽으로 갈수록 층을 지날 때마다 분산이 계속 커져 가장 높은 층에서는 활성화 함수가 0이나 1로 수렴.
🚫 입력값이 양수나 음수로 커지면 0이나 1로 수렴
- 기울기가 0에 가까워지기 때문에 역전파 시 전파할 gradient가 거의 없고 조금 남아 있는 gradient는 최상위층에서부터 역전파가 진행되면서 점차 약해지기 때문에 실제로 아래쪽 층에는 아무것도 도달하지 않게됨.
🔸 해결방안 1. 적절한 초기화
- 예측을 할 때 정방향으로, gradient 를 역전파할 때는 역방향으로 양방향 신호가 적절하게 흐르기 위해 각 층의 출력에 대한 분산이 입력에 대한 분산과 같도록 만든다.
- 역방향에서 층을 통과하기 전과 후의 gradient의 분산이 동일해야 한다고 주장. (by 글로럿과 벤지오 논문)
- 글로럿 초기화: 로지스틱 활성화 함수를 사용할 대 층의 입력과 출력 연결 개수 합의 평균을 이용하여 가중치를 무작위로 초기화하는 방법
- 르쿤 초기화: SELU 함수에 사용되는 초기화 방법으로 층의 연력 연결 수 만큼 나누는 방법
- keras는 기본적으로 균등분포의 글로벌 초기화 사용
🔸 해결방안 2. 적절한 활성화 함수 선택 (수렴하지 않는 활성화 함수)
- 활성화 함수를 잘못 선택하면 gradient의 소실이나 폭주로 이어질 수 있음.
- ReLU
- 특정 양숫값에 수렴하지 않고 계산이 빠르다는 장점이 있음.
- 학습하는 동안 일부 뉴런이 0 이외의 값을 출력하지 않는다는 의미에서 죽은 ReLU라고 알려진 문제도 있음.
- 학습률이 크면 신경망의 뉴런 절반이 죽어있기도함.
- 뉴런의 가중치가 바뀌어 학습 세트에 있는 모든 샘플에 대해 입력의 가중치 합이 음수가 되면 ReLU함수의 gradient가 0이 되므로 경사하강법은 작동하지 않음.
- ReLU 함수의 변종인 LeakyReLU를 이용하여 해결할 수 있음.
- LReLU (Leaky Relu)
- Leaky Relu로 새는 정도(Leaky)를 설정해주는 함수로 z<0 일 때, 𝛼는 함수의 기울기를 이용하여 새는 정도를 설정.
- 〖𝐿𝑒𝑎𝑘𝑦𝑅𝑒𝐿𝑈〗_𝑎 (𝑧)=max(𝑎𝑧, 𝑧)
- 보통 𝑎는 0.01로 설정하고 항상 ReLU보다 더 좋은 성능을 보임.
- 0.2로 설정하는 것이 더 나은 성능을 나타내는 것으로 보임.
- PReLU (Parameter Leaky Relu)
- 하이퍼파라미터가 아닌 역전파에 의해 𝑎가 학습되어 값이 변경되며 데이터를 학습하는 방법.
- 대규모 이미지 데이터셋에서는 ReLU보다 좋은 성능을 보이지만, 소규모 데이터셋에서는 과대적합 우려.
- RReLU (Randomized Leaky Relu)
- 𝑎를 정해진 범위 내에서 무작위로 선택하고 테스트 시에는 평균 값을 사용하는 함수
과대적합의 위험을 줄이는 규제 역할
- 𝑎를 정해진 범위 내에서 무작위로 선택하고 테스트 시에는 평균 값을 사용하는 함수
- ELU (Expotential Linear Unit)
- 모든 변종의 ReLU함수보다 더 좋은 성능을 보이지만 지수함수를 사용하므로 ReLU함수나 그 변종들보다 느리다는 단점이 있음.
- SELU (Scaled ELU)
- ELU함수의 변종으로 𝑎값이 1외 다른 값으로 스케일링 된 함수
- 완전 연결층만 쌓아서 신경망을 만들고 모든 은닉층이 SELU함수를 사용한다면 네트워크가 자기 정규화됨.
- 자기 정규화가 일어나기 위한 조건
- 입력의 특성이 반드시 표준화(평균 0, 표준편차 1)가 되어야함.
- 모든 은닉층의 가중치는 르쿤 정규분포 초기화로 초기화되어야함.
- 네트워크는 일렬로 쌓은 층으로 구성되어야함.
- 순환신경망이나 스킵 연결(와이드 &딥 네트워크에서 건너뛰어 연결된 층)과 같은 순차적이지 않은 구조에서 사용하면 자기 정규화 보장 못함.
- SELU가 다른 활성화 함수보다 더 좋지 못한 성능이 나타날 수 있음.
- 자기 정규화가 일어나기 위한 조건
- 학습하는 동안 각 층의 출력이 평균 0과 표준편차 1을 유지하는 경향이 존재하여 gradient 소실과 폭주 문제를 막아 줌.
- 특히, 아주 깊은 네트워크에서 다른 활성화 함수보다 뛰어난 성능을 보임.
✔ 활성화 함수 선택하는 법
- *SELU > ELU > Leaky ReLU(변종들) > ReLU > than > sigmoid *
- 네트워크가 자기 정규화되지 못하는 구조라면 SELU보다 ELU가 더 좋은 성능을 보일 수 있음.
- SELU함수는 z = 0 에서 불연속적인 값을 가지기 때문.
- 실행속도가 중요하면 Leaky ReLU.
- 시간과 컴퓨팅 파워가 충분하다면 교차 검증을 사용해 여러 활성화 함수를 평가.
- 신경망이 과대적합되었다면 RReLU, 학습 데이터셋이 매우 크다면 PReLU.
🔸 해결방안 3. 배치 정규화
활성화 함수와 함께 He 초기화를 사용하면 학습 초기 단계에서 gradient의 소실이나 폭주 문제를 크게 감소.
but, 훈련하는 동안 다시 발생할 수도 있기 때문에 배치 정규화 필요.
? 배치 정규화 ?
- 각 층에서 활성화 함수를 통과하기 전이나 후에 모델에 단순하게 입력을 원점에 맞추고 정규화한 다음, 각 층에서 두 개의 새로운 파라미터로 결괏값의 스케일을 조정하고 이동시키는 연산을 추가
- 신경망의 첫 번째 층에 배치 정규화를 추가하면 학습 데이터에 Standard Scaler와 같은 표준화 작업을 하지 않아도 됨.
- 입력 데이터를 원점에 맞추고 정규화 하기 위해서는 알고리즘은 평균과 표준편차를 추정해야함.
- 미니 배치에서 입력의 평균과 표준편차를 구해서 정규화.(이름이 배치 정규화인 이유)
### 즉, 학습하는 동안 입력을 정규화한 다음 스케일을 조정하고 이동시킴.###
? test에 배치 정규화가 어떻게 작동하는가?
- 샘플의 배치가 아니라 샘플 하나에 대한 예측을 만들어야 하기 때문에 입력의 평균과 표준편차를 계산할 방법이 없음.
- test 시에는 새로운 데이터에 대해 예측을 하는 것처럼 샘플이 하나씩 주입된다고 가정하기 때문.
- 학습이 끝난 후 전체 학습 데이터셋을 신경망에 통과시켜 배치 정규화 층의 각 입력에 대한 평균과 표준편차를 계산하여 예측할 때 배치 입력 평균과 표준편차로 대신 사용.
- 대부분 배치 정규화 구현은 층의 입력 평균과 표준편차의 이동 평균을 사용해 학습하는 동안 최종 통계를 추정.
- Keras의 BatchNormalization 층이 자동으로 수행
- 정규화 층마다 4개의 파라미터 벡터가 학습됨.
- 출력 스케일 벡터, 출력 이동 벡터가 역전파를 통해 학습됨.
- 최종 입력 평균 벡터, 최종 입력 표준편차 벡터가 지수 이동 평균을 사용하여 추정됨.
- 최종 입력 평균 벡터와 최종 입력 표준편차 벡터는 학습이 끝난 후에도 test 시에 사용됨.
- 정규화 층마다 4개의 파라미터 벡터가 학습됨.
- Keras의 BatchNormalization 층이 자동으로 수행
즉, 정리하면 학습할 대는 mini batch의 평균과 분산으로 정규화하고 TEST할 때는 계산해놓은 이동 평균으로 정규화.
추가적으로 정규화에 대한 내용을 더 알고 싶다면 이곳을 참고하면 좋을 것 같습니다.
✅ 배치 정규화는 gradient 소실 문제를 크게 감소시키기 때문에 tahn, sigmoid 함수와 같은 수렴성을 가진 활성화 함수 사용 가능
✅ 드롭아웃과 같은 규제역할을 하기 때문에 다른 규제 기법의 필요성을 줄여줌.
- 배치 정규화는 미니배치마다 평균과 표준편차를 계산하기 때문에 일종의 잡음을 넣어 과대적합을 방지.
- 미니배치의 크기가 클수록 효과가 줄어듦.
- 규제의 효과가 비교적 크지 않기 때문에 규제를 위해서는 드롭아웃과 같이 사용하는 것이 좋음.
✅ 배치 정규화를 사용할 때 에포크마다 학습 속도는 오래 걸리지만 수렴이 훨씬 빨라지므로 더 적은 에포크로 동일한 성능에 도달 할 수 있음.
🚫 배치 정규화는 입력 데이터를 정규화하는 것보다 모델의 복잡도를 키우고 층마다 추가되는 계산이 신경망의 예측을 느리게 함.
- 이전 층의 가중치를 바꾸어 바로 스케일이 조정되고 이동된 출력을 만드는 방법으로 이전 층과 배치 정규화 층을 합쳐 실행 속도 저하를 피할 수 있음.
- 이전 층의 가중치와 편향을 업데이트된 가중치와 편향으로 바꾸어 배치 정규화층을 제거하여 사용.
✅ 배치 정규화 논문의 저자들은 활성화 함수 이전에 배치 정규화 층을 추가하는 것이 좋다고 함.
- 하지만 두 가지 방법 모두 실험해보고 어떤 것이 주어진 데이터셋에 가장 잘 맞는지 확인하는 것이 좋음.
🔸 해결방안 4. gradient clipping
- gradient 폭주 문제를 완화할 때 사용하는 방법으로 일정 임곗값을 넘어서지 못하게 gradient를 잘라내는 방법
- 순환 신경망은 배치 정규화를 적용하기 어렵기 때문에 gradient clipping을 사용하여 완화시킴.
참고
[1] (도서) 핸즈온 머신러닝
[2] ML&AI
728x90
'ML&DL' 카테고리의 다른 글
심층 신경망 훈련하기 - 학습 속도를 높이는 방법 (0) | 2020.12.29 |
---|---|
심층 신경망 훈련하기 - 레이블 된 데이터가 적을 때 복잡한 문제를 다루는 데 도움이 되는 전이 학습과 비지도 사전 훈련 하는 방법 (0) | 2020.12.29 |
[DL] 06. 새로운 데이터를 생성하는 법, GAN? (0) | 2020.12.08 |
[DL] 05. 데이터를 압축하고 생성하는 AutoEncoder? (0) | 2020.12.08 |
[DL] 음성 신호 모델링하는 방법, Wavenet 알아보기 - A Generative Model for Raw Audio (0) | 2020.11.13 |