활성화 함수란?
딥러닝 네트워크에서는 노드에 들어오는 값들에 대해 곧바로 다음 레이어로 전달하지 않고 주로 비선형 함수를 통과시킨 후 전달한다. 이때 사용하는 함수를 활성화 함수(Activation Function) 이라 부른다.
활성화 함수로는 비선형 함수를 사용해야 한다. 선형함수인 h(x)=cx를 활성화함수로 사용한 3층 네트워크를 떠올려 보자. 이를 식으로 나타내면 y(x)=h(h(h(x)))가 된다. 이는 실은 y(x)=ax와 똑같은 식이다. a=c3이라고만 하면 끝. 즉, 은닉층이 없는 네트워크로 표현할 수 있다. 뉴럴네트워크에서 층을 쌓는 혜택을 얻고 싶다면 활성화함수로는 반드시 비선형 함수를 사용해야 한다.
시그모이드 함수 : σ(x)=1/1+e^−x
sigmoid에 대해 특징을 살펴보자.
신경망(Neural Network)은 기울기(Gradient)를 이용해 최적화된 값을 찾아 가는데, 계층(Layer)이 많아지면 점점 값이 0에 수렴되는 문제가 발생해 성능이 떨어지게 됩니다.
이러한 이유로 은닉층(Hidden Layer)에서는 활성화 함수(Activation Function)로 사용하지 않으며, 주로 출력층(Output Layer)에서만 사용됩니다.
이러한 특징을 가지는 sigmoid는 신경망 초기에는 많이 사용되었지만, 최근에는 아래의 단점들 때문에 사용하지 않는다.
sigmoid의 단점들
딥러닝 분야에서 Layer를 많이 쌓을수록 데이터 표현력이 증가하기 때문에 학습이 잘 될 것 같지만, 실제로는 Layer가 많아질수록 학습이 잘 되지 않습니다. 바로 기울기 소실(Vanishing Gradient) 현상때문입니다. 기울기 소실이란 역전파(Backpropagation) 과정에서 출력층에서 멀어질수록 Gradient 값이 매우 작아지는 현상을 말합니다(그림 1 참고). 그렇다면 왜 이런 기울기 소실 문제가 발생할까요? 이어지는 섹션에서 자세히 알아봅니다.
2. tanh 함수, (Hyperbolic tangent function)
하이퍼볼릭탄젠트란 쌍곡선 함수중 하나이다.
tanh 함수의 정의
tanh(x)=(e^x-e^-x)/(e^x+e^-x)
tanh(x)=2σ(2x)−1
tanh(x)=e^x−e^−x/e^x+e^−x
tanh′(x)=1−tanh2(x)
3. ReLU 함수 (Rectified Linear Unit)
ReLu함수는 최근 가장 많이 사용되는 활성화 함수이다. 함수는 아래와 같이 정의된다.
f(x)=max(0,x)
ReLU함수의 특징을 살펴보자.
5. PReLU
f(x)=max(αx,x)
Leakly ReLU와 거의 유사하지만 새로운 파라미터 α 를 추가하여 x<0에서 기울기를 학습할 수 있게 하였다.
6. Exponential Linear Unit(ELU)
ELU는 비교적 가장 최근에 나온 함수이다.
f(x)=x i f x>0
f(x)=α(e^x−1) i f x≤0
ELU 의 특징은 다음과 같다.
7. Maxout 함수
Maxout 함수는 다음과 같다.
f(x)=max(wT1x+b1,wT2x+b2)
이 함수는 ReLU가 가지는 모든 장점을 가졌으며, dying ReLU문제 또한 해결한다. 하지만 계산량이 복잡하다는 단점이 있다.
위와 같이 여러 활성화 함수가 있는데, 어떤 함수를 사용해야 할지에 대한 결론은 다음고 같다.
<Relu함수가 단점이 있는데도 불구하고 많이 사용되는 이유는????>
-relu은 연산 비용이 크지 않습니다.
-임계치보다 작으면 0을 크면 그 수를 그대로 반환하기 때문이죠.
-leaky relu는 임계치보다 작으면 0.01을 곱해야 하기 때문에 연산 비용이 상대적으로 큽니다.
-연산 비용이 크다는 것은 속도가 그만큼 느리다는 것을 의미합니다.
-relu가 속도면에서 leaky relu보다 좋습니다.
-때문에 실제로 relu를 많이 사용하는 것입니다.
헤비사이드,시그모이드, 렐루 함수의 파이썬 소스코드
import matplotlib.pylab as plt
import numpy as np
x= np.array([-1,1,2])
#헤비사이드 함수
def step_function(x):
return np.array(x > 0, dtype=np.int)
X = np.arange(-5,5,0.1)
Y = step_function(X)
plt.plot(X,Y)
plt.ylim(-0.1,1.1)
plt.show()
#시그모이드 함수
def sigmoid(x):
return 1 / (1 + np.exp(-x))
X = np.arange(-5,5,0.1)
Y = sigmoid(X)
plt.plot(X,Y)
plt.ylim(-0.1,1.1)
plt.show()
#렐루함수, 음수일때는 0 양수일때는 x그대로 내보낸다
def relu(x):
return np.maximum(0, x)
X = np.arange(-5,5,0.1)
Y = relu(X)
plt.plot(X,Y)
plt.ylim(-0.1,1.1)
plt.show()
#하이퍼볼릭 탄젠트
import matplotlib.pylab as plt
import numpy as np
def tanh(x):
a = np.exp(x)
b = np.exp(-x)
y = (a-b)/(a+b)
return y
x = np.arange(-5,5,0.1)
y = tanh(x)
fig=plt.figure(figsize=(10,7))
fig.set_facecolor('white')
plt.plot(x,y)
plt.xlabel('x', fontsize=20)
plt.ylabel('y',fontsize=20)
plt.yticks([-1,0,1])
plt.axvline(0, color='k')
ax = plt.gca
plt.show()
7.수치미분과 기울기 (0) | 2023.01.22 |
---|---|
6.엔트로피 (0) | 2023.01.22 |
4.손실함수 (0) | 2023.01.22 |
3.인공신경망 (0) | 2023.01.22 |
1.퍼셉트론 (0) | 2023.01.22 |