가중치 매개 변수의 적절한 값을 데이터로부터 자동으로 학습하는 능력이 이제부터 살펴볼 신경망의 중요한 성질이다.
3.1 퍼셉트론에서 신경망으로
3.1.1 신경망의 예

신경망을 그림으로 나타내면 위와 같다. 여기서 왼쪽부터 입력층, 은닉층, 출력층이라고 한다. 은닉층의 뉴런은 (입력층이나 출력층과 달리) 사람 눈에는 보이지 않는다. 그래서 '은닉'이라고한다.
*위 그림의 신경망은 모두 3층으로 구성되지만, 가중치를 갖는 층은 2개뿐이기 때문에 '2층 신경망'이라고 한다. 문헌마다 다를 수도 있으니 주의하자.
3.1.2 퍼셉트론 복습
퍼셉트론에 관하여는 이전 포스팅에 잘 정리해 놓았으므로 생략한다.
3.1.3 활성화 함수의 등장
입력 신호의 총합을 출력 신호로 변환하는 함수를 일반적으로 활성하 함수(activation function)라 한다. '활성화'라는 이름이 말해주듯 활성화 함수는 입력 신호의 총합이 활성화를 일으키는지를 정하는 역할을 한다.
a=b+w1x1+w2x2 [식 3.4]
식 3.4는 가중치가 달린 입력 신호와 편향의 총합을 계싼하고 이를 a라 한다.
y=h(a) [식 3.5]
식 3.5는 a를 함수 h()에 넣어 y를 출력하는 흐름이다.
이를 그림으로 나타내면 다음과 같다.

가중치 신호를 조합한 결과가 a라는 노드가 되고, 활성화 함수 h()를 통과하여 y라는 노드로 변환하는 과정이 나타나 있다.

3.2 활성화 함수
이는 개인적인 포스팅을 하겠다.
출처는 blog.naver.com/handuelly/221824080339에서 많은 자료를 공유했다.
1. Sigmoid 함수
신경망에서 자주 사용하는 함수이다. 이는 흔히 통계학에서 사용하는 Logistic 함수라고 불리기도 하며, input 값에 따라 0~1을 출력하는 s형 곡선 함수이다. 식과 정의는 다음과 같다.


코딩으로 출력해보면,
import numpy as np
import matplotlib.pylab as plt
def sigmoid(x):
return 1/(1+np.exp(-x))
x=np.linspace(-10,10,100)
y=sigmoid(x)
plt.figure(figsize=(4,4))
plt.plot(x,y,'black',linewidth=3)
plt.xlim(-10,10)
plt.grid(True)
plt.show()

2. Tanh 함수
Tanh함수는 쌍곡선 함수 중 하나로, 시그모이드 함수를 변형해서 얻을 수 있다.

코딩으로 출력해보면,
def tanh(x,diff=False):
if diff:
return (1+tanh(x))*(1-tanh(x))
else:
return np.tanh(x)
x=np.linspace(-10,10,100)
y=tanh(x)
plt.figure(figsize=(4,4))
plt.plot(x,y,'black',linewidth=3)
plt.xlim(-10,10)
plt.grid(True)
plt.show()

3. ReLU
ReLu(Rectified Linear Unit,경사함수)는 가장 많이 사용되는 활성화 함수 중 하나이다.
Sigmoid와 tanh가 갖는 Gradient Vanishing문제를 해결하기 위한 함수이다.

코딩으로 출력해보면,
def relu(x):
return np.maximum(0,x)
x=np.linspace(-10,10,100)
y=relu(x)
plt.figure(figsize=(4,4))
plt.plot(x,y,'black',linewidth=3)
plt.xlim(-10,10)
plt.grid(True)
plt.show()

4. Leaky ReLU
Leaky ReLU는 ReLU가 갖는 Dying ReLU(뉴런이 죽는 현상)을 해결하기 위해 나온 함수이다.

위 출처 자료에서는 0.01이 아니라 매우 작은 값이라면 무엇이든 사용 가능하다고 한다.
Leaky ReLU는 x가 음수인 영역의 값에 대해 미분값이 0이 되지 않는다는 점을 제외하면 ReLU의 특성을 동일하게 갖는다.
코딩으로 출력해보면,
a=0.1
def leaky_ReLU(x):
return np.maximum(a*x,x)
x=np.arange(-5.0,5.0,.1)
y=leaky_ReLU(x)
plt.plot(x,y)
plt.plot([0,0],[5.0,0.0],':')
plt.title('Leaky ReLU Function')
plt.show()

5.PReLU
Leaky ReLU와 거의 유사하지만 새로운 파라미터 α를 추가해 X가 음수인 영역에서도 기울기를 학습한다.
코딩으로 출력하면,
b=0.5 #새로운 파라미터 값은 임의로
def PReLU(x):
return np.maximum(b*x,x)
x=np.arange(-5.0,5.0,.1)
y=PReLU(x)
plt.plot(x,y)
plt.plot([0,0],[5.0,0.0],':')
plt.title('PReLU Function')
plt.show()

6. ELU
Exponential Linear Unit은 ReLU의 모든 장점을 포함하며 Dying ReLU문제를 해결했다. 출력 값이 거의 zero-centered에 가까우며, 일반적인 ReLU와 다르게 exp 함수를 계산하는 비용이 발생한다.

코딩으로 표현해보면,
def ELU(x,alpha):
return (x>0)*x +(x<=0)*(alpha*(np.exp(x)-1))
x=np.arange(-5.0,5.0,.1)
y1=PReLU(x)
y2=ELU(x,alpha)
plt.plot(x,y2)
plt.plot([0,0],[5.0,0.0],':')
plt.title('ELU Function')
plt.show()

개형은 ReLU와 유사하며, 0보다 작은 경우는 alpha값을 이용해서 그래프를 부드럽게 만든다. 때문에 elu를 미분해도 부드럽게 이어지는 모습을 확인할 수 있다.
7. 소프트맥스 함수
은닉층에서 ReLU(또는 ReLU 변형) 함수들을 사용하는 것이 일반적이지만 그렇다고 해서 앞서 배운 시그모이드 함수나 소프트맥스 함수가 사용되지 않는다는 의미는 아니다. 분류 문제를 로지스틱 회귀와 소프트맥스 회귀를 출력층에 적용하여 사용한다.

코딩으로 출력해보면,
def Softmax(x):
return np.exp(x)/np.sum(np.exp(x))
x=np.arange(-5.0,5.0,.1)
y1=Softmax(x)
plt.plot(x,y1)
plt.title('Softmax Function')
plt.show()



(이미지 출처 : http://cs231n.github.io/neural-networks-3/)
참고자료: blog.naver.com/handuelly/221824080339
딥러닝 - 활성화 함수(Activation) 종류 및 비교
# 활성화 함수딥러닝 네트워크에서 노드에 입력된 값들을 비선형 함수에 통과시킨 후 다음 레이어로 전달하...
blog.naver.com
'Deep Learning > 밑바닥부터 시작하는 딥러닝(1)' 카테고리의 다른 글
Chapter 6. 학습 관련 기술들(1) (0) | 2021.03.02 |
---|---|
Chapter 5. 오차역전파법 (0) | 2021.01.25 |
Chapter 4. 신경망 학습 (0) | 2021.01.23 |
Chapter 3-2 다차원 배열의 계산 (0) | 2021.01.18 |
2.1 퍼셉트론이란? (0) | 2021.01.17 |