경사소실 문제 해결

1. 경사 소실 문제

출력층으로부터 되돌아가면 각 층의 가중치를 수정하려면 미분 값, 즉 기울기가 필요하다. 그런데 층이 늘어나면서 기울기가 중간에 0이 되어버리는 경사 소실(vanishing gradient) 문제가 발생한다.


115_1



이는 시그모이드 함수의 미분 최대치는 0.3, 즉 1보다 작은 값이기 때문이다. 은닉층이 많아질수록 기울기는 점점 0에 가까워지게 된다.


115_2



이를 해결하기 위해서 시그모이드 함수를 대체할 수 있는 활성화 함수를 사용하려면 시그모이드 함수와 모양이 비슷하고 경사가 소실되지 않는 함수를 사용한다. 

116



1.1 쌍곡탄젠트 함수(Hyperbolic Tangent Function) tanh(x)


tanh(x) 함수 정의와 그래프이다. 


* 시그모이드 함수 : 입력값 <x<∞에 대하여 함수값의 범위는 0<σ(x)<1
 * 쌍곡탄젠트 함수 : 입력값 <x<∞에 대하여 함수값의 범위는 1<tanh(x)<1
  

다음은 쌍곡탄젠트 함수의 경사를 구하기 위해 필요한 tanh(x)의 도함수를 구하는 과정이다.


아래는 tanh′(x) σ′(x)의 그래프를 비교한 그림이다. 
σ′(x)의 최대값은 σ′(0)=0.3이고 tanh′(x)의 최대값은 tanh′(0)=1이기 때문에 시그모이드 함수와 비교했을 때 경사가 소실되기 힘들다는 것을 알 수 있다.


* TensorFlow에서 구현은 tf.nn.tanh() 이다. 


1.2 ReLU(Rectified Linear Unit) 함수

tanh(x) 함수를 사용하면 미분값의 범위가 확장된다. 그러나 고차원 데이터를 다룰 경우에는 값이 커질 수 있어 다시 경사가 소실될 수 있다. 복잡한 데이터일 수록 고차원일 경우가 많은데 이를 회피할 수 있는 활성화 함수가 ReLU 함수로 램프 함수 또는 정규화 선형 함수라고도 한다.

x가 0보다 작을 때는 모든 값을 0으로 처리하고, 0보다 큰 값은 x를 그래도 사용한다. x가 0보다 크기만 하면 미분 값이 1이 되기 때문에 여러 은닉층을 거쳐도 맨 처음 층까지 사라지지 않고 남아있을 수 있다.  이 간단한 방법이 여러 층을 쌓을 수 있게 했고, 이로써 딥러닝의 발전에 속도가 붙게 되었다. 이후 0이 되는 순간을 완화한 소프트플러스(softplus) 등 ReLU 함수를 변형한 함수도 개발 중이다.

ReLU(x) 함수 정의와 그래프이다. 

f(x) = max(0, x)




ReLU 함수는 시그모이드나 쌍곡탄젠트 함수와 달리 곡선 부분이 없으며, 미분하면 다음과 같은 간단한 식이 된다.


ReLU 함수의 도함수는 x가 아무리 커져도 1을 반환하므로 경사가 소실되지 않기 때문에 시그모이드 함수나 쌍곡탄젠트 함수에 비교해 학습 속도가 빠르다. 또한 ReLU ReLU의 도함수는 지수 함수가 포함되지 않은 단순한 식으로 표현되기 때문에 빠르게 계산이 가능하다.

단점으로는 x0일 때는 함수값도 경사도 0이기 때문에 ReLU를 활성화 함수로 사용한 신경망 모델의 뉴런 중 활성화되지 못한 뉴런은 학습 동안 활성화가 되지 않는 문제가 있다.

학습률을 큰 값으로 설정하면 첫 오차역전파에서 뉴런의 값이 너무 작아져 해당 뉴런은 신경망 모델에서 존재하지 않는 것이나 다름없는 상태가 되기 때문에 주의해야 한다.

* TensorFlow에서 구현은 tf.nn.relu() 이다. 





시그모이드 함수 : 입력값 <x<에 대하여 함수값의 범위는 0<σ(x)<1
쌍곡탄젠트 함수 : 입력값 <x<에 대하여 함수값의 범위는 1<tanh(x)<1

댓글

이 블로그의 인기 게시물

파이참에서 인터프리터 꼬인 경우 처리

근무 시작시간과 근무시간 입력 받아 근무 종료시간 반환하는 함수