728x90

머신러닝을 반드시 파이썬으로 배울 필요는 없다.

여기서는 특정 라이브러리를 사용해서 머신러닝을 하는 방법을 가르키는게 아니다.

머신러닝의 가장 기초적인 사항에 대해서 배우는 것이므로 사실 프로그래밍 못지 않게 개념이 중요하다.

개념만 이해한다면 굳이 파이썬이 아니더라도 다른 언어로 사용해도 무방하다.

이 강의에서는 그때 그때 필요한 라이브러리가 다르므로 모르는 라이브러리가 등장한다면 쪽지를 남겨주거나 검색하기를 바란다.


전시간에 여러게이트를 구현했다.

단일 퍼셉트론으로 구현한 and,or,nand부터 다중 퍼셉트론으로 구현한 xor까지 존재했다.

이번에는 활성화 함수에 대해서 이야기해 보려고한다.

그러기 위해서 저번시간에 배웠던 and게이트를 다시 꺼집어내서 와보자.


import numpy as np


def and_gate(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = -0.7
if np.sum(x * w) + b < 0:
return 0
else:
return 1

저번에 대략적으로 설명을 마쳤다.

다시 복습을 하자면 x는 입력값이라고 하였다. w는 가중치를, b는 임계값(편향도)를 의미한다고 했다.

그런데 사실 저번시간 아직 설명을 안한게 있다.

바로 if-else부분이다. 아예 설명을 안한건 아니고 활성화 함수 h라는 이야기만 잠깐 하고 넘어갔다.

사실 이 if-else부분이 바로 활성화 함수이다.

쉽게 이야기해서 활성화 함수의 역활은 계산해서 나온 결과를 우리가 원하는 데이터로 바꿔준다는 것이다.


가령 예를 들어 컴퓨터 활용능력 필기 시험을 본다고 쳐보자.

결과가 60점,70점,50점이 나왔다고 가정해보자. 여러분은 시험 점수는 사실 중요하지 않다.

결과인 합격을 했느냐 안했느냐가 중요한 것이다. 그럼 60,70,50의 점수는 "불합격"이라는 데이터로 치환가능하다.

이렇게 특정 데이터를 우리가 원하는 데이터로 가공하는 것을 활성화 함수라고 한다.

위의 코드를 조금 수정하여 보자.


import numpy as np


def and_gate(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = -0.7
result = np.sum(x * w) + b
return h(result)


def h(result):
if result < 0:
return 0
else:
return 1

여기서 우리는 계산해서 얻은 결과는 result라는 값이다.

그러나 사실 이 결과는 중요치 않다. 우리는 이 게이트의 결과가 and의 연산결과로 0인지 1인지만 궁금할 뿐이다.

따라서 우리는 이를 최종 출력값으로 내보내줘야할 필요가 있다. 이 때 사용하는 것이 바로 활성화 함수이다.

퍼셉트론 모델에서 이 활성화 함수는 계단함수(Step Function)라고 부른다.

해당 함수가 어떻게 생겼는지는 누구나 쉽게 예측할 수 있다.

그러나 머릿속 계산 회로 돌려서 도식화를 하기 귀찮아하는 사람들을 위해서 그림으로 보여주겠다.


출처


그렇다. 계단함수는 우리가 계산한 값이 0 이상이면 1이, 아니면 0이나오는 아주아주아주 심플한 함수이다.

퍼셉트론에서는 이 계단함수를 사용하지만 실제로는 계단함수를 잘 쓰지는 않는다.

그 이유는 값이 너무 극단적이라서 그렇다. 값이 0과 1밖에 없기 때문이다.

물론 이게 최종 결과로 쓰여야한다면 상관없지만 중간층에서 써야한다면 계단 함수를 선택하는건 리스크가 있다.

우리는 퍼셉트론을 쌓을 것인데 최종 결과가 아닌 중간 계층에서는 값이 계산하기 유용한 상태로 전달되는것이 좋다.

계단함수는 극단적으로 반환값이 0과 1이므로 중간 계층에서 값을 살리기 너무 힘들게 되어 있다.

그래서 등장한 것이 바로 시그모이드 함수이다.


시그모이드(sigmoid) 함수


시그모이드 함수의 식은 아래와 같다.


이 함수를 도식화 하면 어떻게 될까. 일단 이 값이 0과 1사이라는건 누구나 알 수 있다.

(음수가 될수도 1보다 커질수도 없다.)

마찬가지로 머리굴리기 귀찮으므로 활성화함수가 어떻게 생겼는지 그림으로 보도록 하자.


시그모이드 함수는 완만한 함수이다. 이는 0과 1사이의 값을 내뱉는다.

계단 함수가 0과 1밖에 가질 수 없지만 시그모이드 함수는 0과 1시이의 값을 골고루 받을 수 있다.

대신 가중치에 따라서 이게 내가 찾으려는 값에 가까운지 아닌지를 알 수 있게 된다.

보통은 그 기준을 0.5로 잡는다. 즉 계산한 결과가 0.5보다 크다면 true에 가깝고

반대의 경우는 false에 가깝게 되는것이지만 이 역시 경우에 따라서 바뀔수 있다.

만약 최종값으로 sigmoid가 쓰이게된다면(최종 활성화 함수로는 계단함수를 써도 비슷한 결과가 나오겠지만)

sigmoid를 거친값이 0.5보다 크면 1(True)를 아니면 0을(False)를 주면된다.

그럼 시그모이드 함수를 한번 제작해보자.


import numpy as np


def sigmoid(x):
return 1 / (1 + np.exp(-x))

이는 우리가 만든 시그모이드함수다.

사실 만드는게 어렵지는 않다.

그럼 값을 몇개 대입하여서 어떤 값이 나오는지 보라.


print(sigmoid(100))
print(sigmoid(-5))
print(sigmoid(0))
print(sigmoid(-0.8))

해당 결과값을 보면 아래와 같다.


1.0

0.00669285092428

0.5

0.310025518872


보다 시피 0과 1사이에 값이 나옴을 알 수 있다. 그리고 0이 정확히 가운데인것을 확인할 수 있다.

계단함수와 시그모이드함수의 특징은 둘다 비선형 함수라는데에 있다.

일반적으로 활성화 함수는 선형함수를 쓰지 않는다.

그 이유는 선형함수를 쓴다면 이는 머신러닝에서 큰 의미를 가지지 않기 때문이다.

가령 y = ax꼴의 활성화 함수는 백번을 가하면 y = a^100x인데 둘다 y=ax꼴인 건 변하지 않기 때문이다.


ReLU 함수


최근에는 ReLU함수를 자주 사용하고 있다. ReLU는 Rectified Linear Unit의 줄임말인데

입력이 0을 넘으면 그 입력을그대로 출력하고 0 이하이면 0을 출력하는 함수이다.


import numpy as np


def relu(x):
return np.maximum(0, x)


'Programming > Python-MachineLearning' 카테고리의 다른 글

[MachineLearning-01]Perceptron과 머신러닝  (0) 2018.03.10

+ Recent posts