Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 백준
- 정보처리기사 c언어
- 노마드코딩
- NumPy
- Matplotlib
- 데이터시각화
- 알고리즘스터디
- Algorithm
- python
- 자료구조
- javascript
- Selenium
- openCV
- 파이썬
- pandas
- 가상환경
- aws jupyter notebook
- dataframe
- 알고리즘
- queue
- 프로그래머스
- Stack
- 선그래프
- String Method
- 코딩테스트
- type hint
- Join
- MySQL
- 알고리즘 스터디
- programmers
Archives
- Today
- Total
조금씩 꾸준히 완성을 향해
[DeepLearning] 활성화 함수(Activation Function) +코드 구현 (Sigmoid, ReLU, LeakyReLu, Elu, tanh, Softmax 등) 본문
AI/Deep Learning
[DeepLearning] 활성화 함수(Activation Function) +코드 구현 (Sigmoid, ReLU, LeakyReLu, Elu, tanh, Softmax 등)
all_sound 2022. 11. 13. 19:11활성화 함수(Activation Function)
- 입력 신호의 총합을 출력 신호로 변환하는 함수
- 활성화 함수에 따라 출력값이 결정
- 단층, 다층 퍼셉트론 모두 사용
- 대표적인 활성화 함수
- Sigmoid
- ReLU
- tanh
- Identity Function
- Softmax
- 하나의 layer에서 다음 layer로 넘어갈 때는 항상 활성화 함수를 통과
- [참고] 여러가지 활성화 함수
https://en.wikipedia.org/wiki/Activation_function
Step Function(계단 함수)
def step_func(x):
if x > 0 :
return 1
else:
return 0
def step_func_for_numpy(x):
y = x > 0
return y.astype(np.int)
print(step_func(-3)) # 0
print(step_func(5)) # 1
a = np.array([5,3,-4, 2.0])
print(step_func_for_numpy(a)) # [1 1 0 1]
Sigmoid Function(시그모이드 함수)
- 이진분류(binary classification)에 주로 사용
- 마지막 출력층의 활성화 함수로 사용
- 출력값이 0~1 의 값이며, 이는 확률로 표현 가능
def sigmoid(x):
return 1 / (1 + np.exp(-x))
print(sigmoid(3))
print(sigmoid(-3))
# 0.9525741268224334
# 0.04742587317756678
시그모이드 함수와 계단 함수 비교
- 공통점
- 출력값이 0~1 내의 범위
- 입력값의 정도에 따라 출력값의 정도가 달라짐 즉, 입력이 중요하면(입력값이 크면) 큰 값을 출력
- 차이점
계단함수에 비해 시그모이드 함수는- 입력에 따라 출력이 연속적으로 변화
- 출력이 '매끄러움'
이는 모든 점에서 미분 가능함을 의미
plt.grid()
x = np.arange(-5.0, 5.0, 0.01)
y1 = sigmoid(x)
y2 = step_func_for_numpy(x)
plt.plot(x, y1, 'r-', x, y2, 'b--')
plt.legend(['sigmoid', 'step_function'])
plt.show()
ReLU(Rectified Linear Unit)
- 가장 많이 쓰이는 함수 중 하나
def ReLU(x):
if x > 0:
return x
else:
return 0
print(ReLU(5)) # 5
print(ReLU(-3)) # 0
하이퍼볼릭탄젠트 함수(Hyperbolic tangent function, tanh)
def tanh(x):
return (np.exp(x) - np.exp(-x)) / (np.exp(x)+ np.exp(-x))
print(tanh(3))
print(tanh(-3))
# 0.9950547536867306
# -0.9950547536867306
- sigmoid vs tanh
plt.grid()
x = np.arange(-5.0, 5.0, 0.01)
y1 = sigmoid(x)
y2 = tanh(x)
plt.plot(x, y1, 'r-', x, y2, 'b--')
plt.legend(['sigmoid', 'tanh'])
plt.show()
Identity Function(항등 함수)
- 회귀(Regression) 문제에서 주로 사용
- 출력층의 활성화 함수로 활용
- y=x
- 입력값 그대로 출력하기 때문에 굳이 정의할 필요는 없지만
신경망 중간 레이어 흐름과 통일하기 위해 사용
def identify(x):
return x
print(identify(4)) # 4
print(identify(-1)) # -1
X = np.array([2, -3, 0.4])
print(identify(X)) # [ 2. -3. 0.4]
Softmax
- 다중 클래스 분류에 사용(Multi Class Classification)
- 입력값의 영향을 크게 받음
입력값이 크면 출력값도 큼 - 출력값을 확률에 대응가능
- 출력값의 총합은 1
def softmax(a):
exp_a = np.exp(a)
sum_exp_a = np.sum(exp_a)
y = exp_a / sum_exp_a
return y
a = np.array([0.3, 0.2, 4.0, -1.2])
print(softmax(a))
print(np.sum(softmax(a))) # softmax 값의 합은 1
plt.grid()
x = np.arange(-7, 7, 0.01)
y1 = softmax(x)
plt.plot(x, y1, 'r-')
plt.legend(['softmax'])
plt.show()
소프트맥스 함수 주의점
- 오버플로우(overflow) 문제
- 지수함수(exponential function)을 사용하기 때문에
입력값이 너무 크면 무한대(inf)가 반환됨 - 개선한 수식
A = np.array([1000, 900, 1050, 500])
print(softmax(A)) #softmax 함수
# [nan nan nan 0.]
# overflow 문제
def softmax(a): # 개선한 수식
C = np.max(a)
return (np.exp(a-C) / np.sum(np.exp(a-C)))
A = np.array([1000, 900, 1050, 500])
print(softmax(A))
# [1.92874985e-022 7.17509597e-066 1.00000000e+000 1.37415257e-239]
# 해결!
LeakyReLU
def LeakReLU(x):
a = 0.01
return np.maximum(a*x, x)
x = np.array([0.5, -1.4, 3, 0, 5])
print(LeakReLU(x))
# [ 0.5 -0.014 3. 0. 5. ]
ELU(Exponential Linear Units)
def ELU(x):
a = 0.1
return(x >= 0)*x + (x < 0)*a + (np.exp(x)-1)
print(ELU(4)) # 57.598150033144236
print(ELU(-0.5)) # -0.2934693402873666
x = np.array([-2, 0.1, 4])
print(ELU(x))
# [-0.76466472 0.20517092 57.59815003]
활성화 함수를 비선형 함수(non-linear function)로 사용하는 이유
- 신경망을 깊게(deep) 하기 위함
- 만약 활성화 함수를 선형함수(linear function)으로 하게 되면 은닉층의 갯수가 여러개이더라도 의미가 없어짐
- 만약, h(x)=cx이고,3개의은닉층이존재한다면y=h(h(h(x))) =c∗c∗c∗x =c3x
이므로 결국에는 선형함수가 되어버림
활성화 함수 참고
- 일반적인 사용 순서
1. ELU
2. LeakyReLU
3. ReLU
4. tanh
5. sigmoid 순으로 사용
- 스탠포드 강의에서 언급한 사용 순서
1. ReLU
2. ReLU Family(LeakyReLU, ELU)
3. sigmoid는 사용 X
출처 : 이수안 컴퓨터 연구소 립러닝 강의 www.suanlab.com