IT

QGIS에서 신경망 활성화 함수(activation function) 그려보기

유병혁 2017. 10. 9. 00:04

이번 글에서는 신경망에서 이용하는 활성화 함수(activation function)들을 그려보도록 하겠습니다.

QGIS 파이썬 콘솔에서 NumPy와 Matploblib을 불러와 3종의 활성화 함수를 구현해 보려고 합니다.


본 글의 내용은 아래 깃허브로부터 일부 내용을 수정 작성하였습니다.

'밑바닥부터 시작하는 딥러닝(Deep Learning from Scratch)'


한국어 깃허브 저장소 | https://github.com/WegraLee/deep-learning-from-scratch
도서정보(한빛미디어) | http://www.hanbit.co.kr/store/books/look.php?p_code=B8475831198


시중에 나와있는 대다수 딥러닝 관련 서적들이 인기있는 라이브러리 사용법을 다루는데 반해,

이 책은 파이썬과 NumPy, Matploblib만을 가지고 딥러닝을 맡바닥부터 구현해내고 있습니다.

따라서 저와 같은 QGIS 유저들은 책의 소스코드를 파이썬 콘솔을 통해 연습하실 수 있습니다.


제가 사용 중인 QGIS 2.14는 파이썬 2.7.5 버전을 지원하고 있는데요, 버전 확인방법은 아래와 같습니다.

상단 메뉴에서 '플러그인 > 파이썬 콘솔'을 실행하고, 아래 코드를 입력합니다.


import sys
sys.version
sys.version_info


참고로, 2017년 12월 8일에 QGIS 3.0이 출시될 예정이며, 3.0 버전부터는 파이썬 3이 지원된다고 합니다.

QGIS 3.0 plans | http://blog.qgis.org/2016/02/10/qgis-3-0-plans/


0. 활성화 함수(activation function)


위 그림은 활성화 함수의 처리 과정을 도식화한 것입니다. x1, x2, 1이라는 3개 입력신호에 가중치를 곱한 후,

이들 신호의 총합 a를 활성화 함수 h()에 넣어 y를 출력하고 있습니다. 여기서 b는 편향을 명시하고 있습니다.

그림, 식 이미지 출처: https://github.com/WegraLee/deep-learning-from-scratch/blob/master/equations_and_figures.zip?raw=true


활성화 함수는 여기서 입력 신호의 총합 a가 활성화를 일으키는지를 정하는 역할을 합니다.

퍼셉트론에서는 활성화 함수로 계단 함수(step function)을 이용하며, 신경망에서는 시그모이드 함수

(sigmoid function)와 최근에는 ReLU(Rectified Linear Unit, 렐루)를 주로 이용합니다. 이 3종 함수를 그려보겠습니다.


Numpy와 Matplotlib을 불러오겠습니다.

import numpy as np
import matplotlib.pyplot as plt


1. 계단 함수(step function)


계단 함수는 a가 0보다 크면 1, 그 외에는 0을 출력합니다.

color_seq = ['#1f77b4', '#ff7f0e', '#2ca02c']
def step(x):
    return np.array(x > 0, dtype=np.int)
x = np.arange(-5.0, 5.0, 0.1)
y = step(x)
plt.plot(x, y, '-', color=color_seq[0], linewidth=2.0)
plt.ylim(-0.1, 1.1)
plt.title('Step function')
plt.grid(True)
plt.show()



2. 시그모이드 함수(sigmoid function)


시그모이드는 'S자 모양의' 의미를 가지고 있습니다.

def sigmoid(x): return 1 / (1 + np.exp(-x)) y = sigmoid(x) plt.plot(x, y, '-', color=color_seq[1], linewidth=2.0) plt.ylim(-0.1, 1.1) plt.title('Sigmoid function') plt.grid(True) plt.show()


계단 함수와 시그모이드 함수를 함께 그려본 그림입니다. 차이가 뚜렷하죠?!

y1 = step(x)
y2 = sigmoid(x)
plt.plot(x, y1, ':', color=color_seq[0], linewidth=2.0, label="Step")
plt.plot(x, y2, '-', color=color_seq[1], linewidth=2.0, label="Sigmoid")
plt.title('Step & Sigmoid')
plt.legend()
plt.grid(True)
plt.show()


3. 렐루 함수(ReLU function)


렐루 함수는 a가 0보다 크면 a를 그대로 출력하고, 0 이하이면 0을 출력하는 함수입니다.

def relu(x):
    return np.maximum(0, x)
y = relu(x)
plt.plot(x, y, '-', color=color_seq[2], linewidth=2.0)
plt.ylim(-0.1, 5.5)
plt.title('ReLU function')
plt.grid(True)
plt.show()