기울기 소실 문제와 ReLU 함수

박재한·2022년 2월 9일
0

Deep Learning

목록 보기
3/22

1. 기울기 소실 문제

참고
기울기 소실 문제(Vanishing Gradient problem)는 역전파(Backpropagation) 알고리즘에서 처음 입력층(input layer)으로 진행할수록 기울기가 점차적으로 작아지다가 나중에는 거의 기울기의 변화가 없어지는 문제를 말한다.
이 문제의 원인은 활성화 함수(Activation function)로 시그모이드 함수(sigmoid function)을 사용하는데 이 함수의 특성으로 인해 기울기 소실 문제가 발생한다. 다음 sigmoid 함수와 sigmoid 함수의 미분 그래프를 보자.
Imgur

sigmoid 함수 중 대표적인 로지스틱 함수 11+ex\cfrac{1}{1+e^{-x}}의 그래프와 이를 미분한 함수의 그래프이다. sigmoid 함수를 미분한 함수의 그래프를 보니 기울기가 최대가 0.25이고 최소가 0에 수렴한다. 즉 0 ~ 0.25사이의 값을 가진다. 역전파에서 입력층에 가까운 앞쪽의 layer로 갈수록 sigmoid 함수의 미분을 연쇄적으로 곱하는데 기울기가 1보다 작으므로 곱할수록 값은 점점 작아진다. layer가 아주 많으면 입력층에 가까운 앞쪽의 layer로 갈수록 기울기의 값은 거의 0에 가깝게 작아져서 가중치의 변화가 거의 없게 되고 error값도 더 이상 줄어들지 않게 된다.

구체적으로 다음의 예를 가지고 살펴보자.
설명을 위해 인공신경망의 구조을 단순하게 하였다.
Imgur
z1, z2, z3는 각 layer의 node의 출력과 가중치의 합성곱이다. h1(hidden1), h2(hidden2), h3(hidden3)는 z1, z2, z3값의 활성함수, sigmoid 함수의 결과이다.(결과이자 각 노드의 출력이다.) 끝의 상자 J는 시스템의 에러를 집계하여 반환한다.(손실함수,loss function) 그런 다음 J의 출력 이 최소화 되도록 경사 하강법(gradient descent)을 통해 weight를 업데이트 하기 위해 Backpropagation을 수행한다.

가중치 w1에 대해 미분하려면 chain rule에 따라 다음과 같이 미분이 된다.
errorw1=erroroutputoutputhidden2hidden2hidden1hidden1w1\cfrac{\partial error}{\partial w1}=\cfrac{\partial error}{\partial output}* \cfrac{\partial output}{\partial hidden2}* \cfrac{\partial hidden2}{\partial hidden1}* \cfrac{\partial hidden1}{\partial w1}
여기서
outputhidden2hidden2hidden1\cfrac{\partial output}{\partial hidden2}* \cfrac{\partial hidden2}{\partial hidden1}
를 자세히 살펴보자.
outputhidden2=outputz1z1hidden2\cfrac{\partial output}{\partial hidden2}=\cfrac{\partial output}{\partial z1}* \cfrac{\partial z1}{\partial hidden2}
z1=hidden2w3z1=hidden2* w3이고, output=sigmoid(z1)output=sigmoid(z1)이므로,
outputhidden2=sigmoid(z1)z1w3\cfrac{\partial output}{\partial hidden2}=\cfrac{\partial sigmoid(z1)}{\partial z1}* w3

마찬가지로,
hidden2hidden1=hidden2z2z2hidden1\cfrac{\partial hidden2}{\partial hidden1}=\cfrac{\partial hidden2}{\partial z2}* \cfrac{\partial z2}{\partial hidden1}
z2=hidden1w2z2=hidden1* w2이고, hidden2=sigmoid(z2)hidden2=sigmoid(z2)이므로,
hidden2hidden1=sigmoid(z2)z2w2\cfrac{\partial hidden2}{\partial hidden1}=\cfrac{\partial sigmoid(z2)}{\partial z2}* w2

따라서,
outputhidden2hidden2hidden1=sigmoid(z1)z1w3sigmoid(z2)z2w2\cfrac{\partial output}{\partial hidden2}* \cfrac{\partial hidden2}{\partial hidden1}=\cfrac{\partial sigmoid(z1)}{\partial z1}* w3* \cfrac{\partial sigmoid(z2)}{\partial z2}* w2

layer가 진행될 수록 sigmoid 함수가 연속으로 곱해지는 것을 알 수 있다. sigmoid 함수의 미분은 0 ~ 0.25로 1보다 작으므로 곱해지는 횟수가 많을 수록 값은 점점 더 작아진다. 즉 layer가 많을 수록 기울기의 값은 더 작아진다.

이를 해결하기 위하 나온 활성함수가 바로 ReLU(Rectified Linear Unit)이다.

2. ReLU(Rectified Linear Unit) 함수

참고
Neural Network를 처음 배울 때 activation function으로 sigmoid function을 사용한다. sigmoid function이 연속이여서 미분가능한 점과 0과 1사이의 값을 가진다는 점 그리고 0에서 1로 변하는 점이 가파르기 때문에 사용해왔다. 그러나 기존에 사용하던 Simgoid fucntion을 ReLu가 대체하게 된 이유 중 가장 큰 것이 Gradient Vanishing 문제이다. Simgoid function은 0에서 1사이의 값을 가지는데 gradient descent를 사용해 Backpropagation 수행시 layer를 지나면서 gradient(sigmoid함수의 gradient)를 계속 곱하므로 gradient는 점점 0으로 수렴하게 된다. 따라서 layer가 많아지면 잘 작동하지 않게 된다.

따라서 이러한 문제를 해결하기위해 ReLu를 새로운 activation function을 사용한다. ReLu는 입력값이 0보다 작으면 0이고 0보다 크면 입력값 그대로를 내보낸다.
f(x)={0x<0xx0f(x)=\begin{cases} 0\quad x<0 \\ x\quad x\geq0 \end{cases}
다음과 같이 간단히 표시할 수 있다.
f(x)=max(0,x)f(x)=max(0, x)

그래프는 다음과 같다.
Imgur
ReLU 함수의 기울기에 대한 그래프는 다음과 같다.
Imgur

ReLU함수의 장점과 단점은 다음과 같다,
장점
1) 다른 활성화 함수보다 학습이 빠르다. (tanh함수 대비 6배 빠른 학습속도)
2) 기울기 소실(Gradient Vanishing)문제가 발생하지 않음 (은닉층에 많이 사용되는 이유)
3) 학습을 느리게하는 원인인 기울기(gradient) 0이 되는 것을 막아줌
4) 가중치 업데이트 속도가 매우 빠르다.
5) 가장 많이 사용되는 활성화 함수(activation function)

단점
1) 음수 값을 입력 받으면 항상 0으로 반환
2) 입력값이 음수인 경우 기울기가 0이 되어 가중치 업데이트가 안될 수 있음(가중치가 업데이트 되는 과정에서 가중치 합이 음수가 되면 0만 반환되어 아무것도 변하지 않는 현상 발생)
3) 2번 현상을 죽은 뉴런(Dead Neuron) 또는 죽어가는 렐루(Dying ReLU) 이라고 함
4) 출력값은 0 또는 양수이고, 기울기도 0 또는 1인 양수이다. (최적의 가중치를 찾는 지그재그 현상 발생)
5) 0에서 미분이 안됨

용도
은닉층(Hidden layer)의 활성화 함수(activation function)에서 주로 많이 사용된다.

다양한 형태의 ReLU 함수

대부분의 경우 인공 신경망(Neural network)에서 활성 함수로는 ReLU함수를 사용하지만 ReLU 함수의 단점을 보완하는 다양한 형태의 ReLU 함수들이 있고 일부 사용되어 지기도 한다.

(1) Leaky ReLU

Imgur
f(x)=max(0.1x,x)f(x)=max(0.1x, x)
Leaky ReLU는 ReLU가 갖는 Dying ReLU(뉴런이 죽는 현상) 을 해결하기 위해 나온 함수이다.
xx가 0보다 크면 xx를, 0보다 같거나 작으면 0.1x0.1*x를 반환한다. xx에 곱해진 0.1은 꼭 0.1일 필요는 없고 0.01도 되고 1보다 작은 매우 작은 값이면 무엇이라도 가능하다. Leaky ReLU는 xx가 음수인 영역의 값에 대해 미분값이 0이 되지 않는다는 점을 제외하면 ReLU의 특성을 동일하게 갖는다.

(2) PReLU(Parametric ReLU)

Leaky ReLU와 거의 유사하지만 새로운 파라미터 α 를 추가해 x가 음수인 영역에서도 기울기를 학습한다. 즉 Leaky ReLU에서 x에 곱해지는 작은 수를 사용자가 지정할 수 있도록 hyper paramerter로 만들어 준 점만 다르다.
f(x)=max(αx,x)f(x)=max(\alpha x, x)
Imgur

(3) ELU

ELU(Exponential Linear Unit)은 ReLU의 모든 장점을 포함하며 Dying ReLU 문제를 해결했다. x가 0이하일 때 f(x)값이 0이 아니라 음수값으로 부드럽게 이어지며 x가 음수에서 아무리 커져도 -1(α\alpha에 의해 -1외에 조절 가능)의 일정한 음수값에 수렴하므로 노이즈에 덜 민감하다. x가 음수일때도 기울기가 exponential로 부드럽게 감소하며 x가 음수로 아무리 커져도 기울기는 0으로 수렴하므로 역시 노이즈에 덜 민감하다.
단점은 지수 연산이 들어가므로 연산에 비용이 발생한다.

f(x)={x  x>0α(ex1)x0f(x)=\begin{cases} x\qquad\qquad\; x>0 \\ \alpha(e^x-1)\quad x\leq0 \end{cases}
f(x)={1  x>0αex    x<0f'(x)=\begin{cases} 1\qquad\qquad\; x>0 \\ \alpha\cdot e^x\qquad\;\; x<0 \end{cases}

ELU 그래프
Imgur
ELU 미분 그래프
Imgur

(4) ReLU6

embedded 장치에서 성능 최적화를 위해 데이터의 bit수를 제한할 목적으로 ReLU의 값을 0~6사이로 제한하고자 할 때 사용한다. 6말고 다른 값도 사용해도 되지만 보통 6을 가장 많이 사용한다.
이외에는 ReLU와 동일하다.

f(x)=min(max(0,x),6)f(x)=min(max(0,x),6)
Imgur

(5) Maxout

ReLU의 장점을 모두 갖고, Dying ReLU 문제 또한 해결한다. 하지만 계산해야 하는 양이 많고 복잡하다는 단점이 있다.
f(x)=max(w1Tx+b1,  w2Tx+b2)f(x)=max(w_1^Tx+b_1,\; w_2^Tx+b_2)
이 활성 함수는 알고리즘 공부한 사람은 알겠지만 동적 계획법 최적화 항목의 Convex Hull Trick(CHT)의 동작 방식과 유사하다.

5. 활성함수 비교

Imgur

profile
바쁘게 부지런하게 논리적으로 살자!!!

0개의 댓글