Machine Learning/Advanced (hands on machine learning)

11. 심층 신경망 훈련 - 그레이디언트 소실과 폭주(활성화 함수)

jwjwvison 2021. 6. 3. 21:09

 고해상도 이미지에서 수백 종류에 물체를 감지하는 것처럼 아주 복잡한 문제를 다뤄야 한다면 수백 개의 뉴런으로 구성된 10개 이상의 층을 수십만 개의 가중치로 연결해 훨씬 더 깊은 심층 신경망을 훈련해야 한다. 심층 신경망을 훈련하는 것은 쉬운 일이 아니다. 훈련 중에 다음과 같은 문제를 마주할 수 있다.

 

 알고리즘이 하위층으로 진행될수록 그레이디언트가 점점 작아지는 경우가 많다. 경사 하강법이 하위층의 연결 가중치를 변경되지 않은 채로 둔다면 훈련이 좋은 솔루션으로 수렴되지 않을 것이다. 이 문제를 그레이디언트 소실(vanishing gradient)라고 한다. 어떤 경우엔 반대 현상이 일어날 수 있다. 그레이디언트가 점점 커져서 여러 층이 비정상적으로 큰 가중치로 갱신되면 알고리즘은 발산한다. 이 문제를 그레이디언트 폭주(exploding gradient)라고 하며 순환 신경망에서 주로 나타난다. 일반적으로 불안정한 그레이디언트는 심층 신경망 훈련을 어렵게 만든다. 층마다 학습 속도가 다라질 수 있기 때문이다.

 

< 글로럿과 He 초기화 >

 케라스는 기본적으로 균등분포의 글로럿 초기화를 사용한다. 다음과 같이 층을 만들 때 kernel_initializer='he_uniform' 이나 kernel_initializer='he_normal'로 바꾸어 He 초기화를 사용할 수 있다.

 

< 수렴하지 않는 활성화 함수>

 활성화 함수를 잘못 선택하면 그레이디언트 소실이나 폭주로 이어질 수 있는데 시그모이드 활성화 함수보다 ReLU 함수가 심층 신경망에서 훨씬 더 작동한다는 사실이 밝혀졌다. 함수는 특정 양숫값에 수렴하지 않는다는 큰 장점이 있다(그리고 계산도 빠르다). 

 그러나 ReLU 함수는 완벽하지 않는데 죽은 ReLU로 알려진 문제가 있다. 훈련하는 동안 일부 뉴런이 0 이외의 값을 출력하지 않는다는 의미에서 죽었다고 말한다. 이 문제를 해결하기 위해 LeakyReLU 같은 ReLU 함수의 변종을 사용한다.

 하이퍼파라미터 a는 이 함수가 새는 정도를 결정한다. z<0 일때 이 함수의 기울기 이며 일반적으로 0.01로 설정한다.

 최근 한 논문에서 여러 ReLU 함수의 변종을 비교해 얻은 결론 하나는 LeakyReLU가 ReLU보다 항상 성능이 높다는 것이다. 사실 a=0.2(많이 통과)로 하는 것이 a=0.01(조금 통과)보다 더 나은 성능을 내는 것으로 보인다.

 이 함수는 몇가지를 제외하고는 ReLU와 매우 비슷하다.

  ELU 활성화 함수의 주요 단점은 (지수 함수를 사용하므로) ReLU나 그 변종들보다 계산이 느리다는 것이다. 

 

 

 LeakyReLU 활성화 함수를 사용하려면 LeakyReLU 층을 만들고 모델에서 적용하려는 층 뒤에 추가한다.