활성화 함수(Activation Function)
임계값에 따라서 입력 신호의 총합을 출력 신호로 변환하는 함수 h(x)
딥러닝에서 비선형 함수를 사용함으로써 비선형성을 증가시키는 역할을 함
(1) Linear function 선형 함수
f(x) =a+bx
:( 층을 아무리 깊이해도 은닉층이 없는 네트워크로도 똑같은 기능 할 수 있음
h(x) =cx를 사용하는 3층 네트워크
y(x) =h(h(h(x))) =c*c*c*x= c^3x=ax (if a=c^3)
여전히 선형 함수형태임을 알 수 있다.
(2) non-linear fucntion 비선형 함수 : 다층 신경망에서 층이 많아질수록 비선형 함수가 더 중요함
(2.1) Binary Step function (이진 계단 함수):
0,1 사이에서 값이 0을 기준으로 크면 1 작으면 1로 이진 출력(이산형)
한계: 다중 출력을 할 수 없다, 미분이 불가능하여 역전파를 통한 학습이 불가능하다.
계단 함수 코드 구현
def step_function(x):
if x>0:
return 1
else:
return 0
def step_funciton(x):
y=x>0 # 해당 조건에 따라 bool배열 ;boolean type array
return y,astype(np.int) #bool => integer 예.True =1 , FAlse=0
import numpy as np
x= np.array([-1.0, 1.0, 2.0])
step_function(x) #array([0,1,1])
(2.2) Sigmoid (시그모이드 함수):
0,1 사이에서 값이 0에 가까울수록 0에 가까워지고 1에 가까워지는 실수 출력(연속형)
함수가 연속성을 갖고 있어 모든 구간에서 미분가능
문한계: 입력값이 아무리 크더라도, 출력되는 값의 범위가 매우 좁기 때문에 경사하강법 수행 시에 범위가 너무 좁아, 0에 수렴하는 기울기 소실(Gradient Vanishing)이 발생
-계단 함수의 부드러운 s형태와 유사
시그모이드 함수 코드 구현
def sigmoid(x):
return 1/(1 + np.exp(-x))
x= np.array([-1.0, 1.0, 2.0])
sigmoid(x) # 0.268 , 0.731, 0.88]
(2.3) ReLu(Rectified Linear Unit, 렐루) :
0 기준으로 작으면 0 크면 값 그대로(예. x=5 , 5로 출력, x=-1이면 0)
sigmoid의 vanishing gradient 문제를 해결하기 위해 나옴
한계: 음수 값들이 모두 0이 되면서 역전파에서 제대로 학습이 이루어 지지 않음
렐루 함수 코드 구현
def relu(x):
return np.maximum(0,x)# 최대값 반환
(2.4) Leaky ReLu(Leaky Rectified Linear Unit, 리키 렐루)
dying relu 문제를 해결하기 위해, 음수를 일부 반영하도록 ReLU를 변형시킨 함수 중 하나
0 기준으로 작으면 값에서 1/10 곱하고 크면 값 그대로(예. x=5 , 5로 출력, x=-1이면 -0.1 로 출력)
리키 렐루 함수 코드 구현
def leaky_relu(x):
return np.maximum(0.1x ,x)# 최대값 반환
(2.5) 소프트 맥스(Softmax)
데이터가 어떤 클래스에 속하는지 분류 중 2개 이상의 클래스를 분류할때 출력하는 함수
- 모든 출력층의 합 1
- 확률과 같은 개념으로 해당 데이터 i번째 클래스일 경우의 확률로 해석 가능
- 0 <softmax(xi)<1 사이 실수 값을 가짐
- 분모는 모든 출력층의 뉴런의 모든 입력 신호의 합(영향을 받기 때문)
- Mutually Exclusive: 클래스 분류 중 오직 하나만 있음.(확률로 표현하기 때문에 가장 큰 값 선택)
- 분류 개수 = 출력 층수
- overflow e^x, x가 특정값 이상이면 inf로 계산되므로 계산 수치가 불안정해지기 때문에 최댓값을 각 원소에 제하여 계산.
- 예. [1010, 1000, 900]에서 최댓값 1010을 각 원소를 빼며 [0, -10, -20], 이를 exp취하면 문제 피할 수 있음
""" Softmax: Overflow 문제
"""
def new_softmax(a) :
c = np.max(a) # 최댓값
exp_a = np.exp(a-c) # 최댓값 뺀 값에 exp. ( overflow 대첵)
sum_exp_a = np.sum(exp_a)
y = exp_a / sum_exp_a
return y
a = np.array([1010, 1000, 990])
print (softmax(a)) # [0.018, 0.245, 0.737]
이 외에도 ELU, tanh이 있다.
(3) 회귀
데이터 바탕으로 수치 예측
(3.1) 항등 함수(identity function)
입력 그대로 출력 예. f(x)= x
Reference
https://towardsdatascience.com/backward-propagation-for-feed-forward-networks-afdf9d038d21
https://glassboxmedicine.com/2019/05/26/classification-sigmoid-vs-softmax/
'Data > ML' 카테고리의 다른 글
TensorFlow.js 소개 및 Python 모델 변환 (0) | 2022.01.18 |
---|---|
Deep Learning(딥러닝) - 4.오차역전파(Error Backpropagation) (0) | 2021.10.17 |
Deep Learning(딥러닝) - 2.인공신경망 (0) | 2021.10.14 |
Deep Learning(딥러닝) - 1.딥러닝의 역사와 Perceptron(퍼셉트론) (0) | 2021.10.13 |
[Python] 파이썬 시작하기(파이썬, 아나콘다,주피터 노트북 다운로드 설치, 실행) (0) | 2021.08.27 |