일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- Node
- phpredis
- python
- 기초 수학
- 블레이드 템플릿
- webpack
- Go
- deep learning
- php
- rabbitmq
- nginx
- Switch
- javascript
- CentOS
- AWS
- fastapi
- docker
- mariadb
- SQL
- Redis
- NCP
- For
- linux
- Machine Learning
- laravel
- React
- nodejs
- Redux
- Backbone.js
- Babel
- Today
- Total
개발일기
딥러닝/머신러닝 - 활성화(Activation) 함수 본문
활성화(Activation) 함수
활성화 함수는 입력을 비선형 형태로 변환하여 출력해주는 함수이다. 선형 함수는 직선으로 간단하게 y=ax+b로 편할 수 있다. 층을 계속 쌓아도 y=ax+b로 다시 변환이 가능하기에 여러 은닉층을 쌓는 이점이 사라진다. 물론 선형 함수를 활성화 함수로 사용할 수 있지만 은닉층을 여러개 늘려갈 수 있는 비선형 함수와 다르게 층을 여러개 확장해도 결국엔 첫 번째 층으로 귀속되는 속성을 가진다.
Sigmoid
출력 값의 범위가 0~1인 함수이다. 입력 값의 절대 값이 커질 수록 출력 값은 1 또는 0에 수렴하며 기울기는 0에 가까워진다.
정규화가 가능하며 기울기가 자연스레 수렴하는 장점을 가지며 0또는 1로 분류하는 모델에 적합하다. 하지만 일정 값을 넘어가면 기울기 변화 없이 양 끝에 데이터가 과도하게 몰리게 된다. 이로 인해 잘못된 학습이 진행되며 원치 않는 출력 값이 나올 수 있다. 이러한 단점으로 인해 Sigmoid함수는 은닉 층이 아닌 주로 출력 층의 활성화 함수로 사용된다.
# sigmoid
import matplotlib.pyplot as plt
import numpy as np
def sigmoid(arr, scale=1):
arr = np.asarray(arr)
result = 1/(1 + np.exp(-arr*scale))
return result
x = np.arange(-5, 5, 0.1)
y = sigmoid(x)
plt.plot(x,y)
plt.show()
# sigmoid
# tensorflow의 sigmoid메소드 활용
import tensorflow as tf
x = tf.constant(np.arange(-5, 5, 0.1), dtype = tf.float32)
y = tf.keras.activations.sigmoid(x)
plt.plot(x, y)
plt.show()
Hyperbolic tangent
하이퍼볼릭 탄젠트 함수는 Sigmoid함수와 모양이 동일하다. 하지만 이 두 함수에는 출력값의 중심이 다르다는 차이점이 존재한다. Sigmoid의 출력 값의 중심은 0.5이며 하이퍼볼릭 탄젠트 함수는 0이다.
중심이 0이기에 출력 값의 범위는 -1 ~ 1로 음수 값도 출력할 수 있다. 출력 값 범위의 확장으로 기울기 손실이 덜 발생한다. 하지만 Sigmoid와 동일하게 일정 입력 값을 넘어가면 기울기가 0에 수렴하게 된다.
# tanh
# tensorflow의 tanh메소드 활용
import tensorflow as tf
x = tf.constant(np.arange(-5, 5, 0.1), dtype = tf.float32)
y = tf.keras.activations.tanh(x)
plt.plot(x, y)
plt.show()
# tanh
x = np.arange(-5, 5, 0.1)
y = np.tanh(x) # numpy tanh 메소드 활용
plt.plot(x, y)
# plt.yticks( np.arange(-1, 1.5, 0.5) )
plt.show()
ReLU
입력 값이 0이하면 0을 반환한다. 0보다면 크면 선형 함수로 값을 대입하여 출력한다. 음수 부분에서 출력 값의 손실이 발생하지만 양수 부분에서는 기울기의 손실과 출력 값의 손실이 발생하지 않는다. sigmoid함수와 다르게 기울기 손실이 없다는 장점을 가지고 있기 때문에 은닉 층에 가장 많이 쓰이는 활성화 함수다.
# ReLU
import tensorflow as tf
x = tf.constant(np.arange(-5, 5, 0.1), dtype = tf.float32)
y = tf.keras.activations.relu(x)
plt.plot(x, y)
plt.show()
LeakyReLU
음수 부분은 0으로 반환하는 ReLU함수의 단점을 보완하는 함수이다. 양수 부분은 ReLU와 동일하지만 음수 부분은 일정 값을 곱해 기울기가 0이 아닌 작은 값이라도 나오게 된다.
tf.nn.leaky_relu(output, alpha=0.01)
LeakyRelu를 사용하면 alpha에 0.01, 0.2와 같은 작은 값을 기울기로 지정한다. 이 기울기는 음수 부분의 기울기로 음수 쪽의 출력 값도 확인할 수 있다.
Softmax
Sigmoid와 다르게 다중 클래스 분류에 사용되는 활성화 함수다. 주로 출력 층에 사용된다.
mnist 손글씨 데이터를 기반으로 학습한다면 출력 층의 활성화 함수를 softmax로 지정하고 노드의 개수는 10으로 지정한다. 손글씨 데이터는 0~9까지의 숫자 클래스를 가지며 이 클래스는 10개이므로 클래스와 개수와 동일하게 노드 개수를 지정한다.
tf.keras.Dense(10, activation='softmax')
# 노드 개수는 클래스의 개수와 동일하다
# 출력층에 쓰이며 다중 클래스 분류면 마지막 층에 추가한다.
참고 사이트:
https://www.tensorflow.org/api_docs/python/tf/keras/activations
'Deep Learning, Machine Learning' 카테고리의 다른 글
딥러닝, 머신러닝 - 미분이란 무엇일까? (0) | 2024.01.06 |
---|---|
딥러닝, 머신 러닝 - 손실 함수(Loss Function) (0) | 2023.12.30 |
딥러닝/머신러닝 - 모델 평가지표 (0) | 2023.12.28 |