관리 메뉴

HeeJ's

[03] 신경망(1) 본문

<Machine Learning>

[03] 신경망(1)

meow00 2020. 9. 30. 13:14

퍼셉트론은

복잡한 함수도 표현할 수 있다는 장점과,

가중치를 설정하는 작업은 수동적으로 진행해야한다는 단점이 있다.

이 단점을 해결하기 위해 신경망을 사용한다.

 

신경망은 퍼셉트론의 단점을 해결하기 위해

가중치 매개변수의 적절한 값을 자동으로 학습하는 능력을 가진다.

 

인공신경망이란 기계학습과 인지과학에서 생물학의 신경망에서 영감을 얻은 통계학적 학습 알고리즘이다.

시냅스의 결합으로 네트워크를 형성한 인공 뉴런이 학습을 통해 시냅스의 결합 세기를 변화시켜, 문제 해결 능력을 가지는 모델 전반을 가리킨다.

(출처: 위키백과)

 

출처: https://ko.wikipedia.org/wiki/%EC%9D%B8%EA%B3%B5_%EC%8B%A0%EA%B2%BD%EB%A7%9D

왼쪽부터 차례대로 입력층, 은닉층, 출력층이라고 부른다.

은닉층의 뉴런은 눈에 보이지 않기 때문에 '은닉'층이라고 불린다.

 

 

퍼셉트론의 구조는 이렇게 나타냈었는데,

전에 사용했던 수식을 보면 편향(b)이 나타나있지 않다. 여기에 편향을 명시하게 된다면 0층의 노드가 3개가 된다.

(가중치가 b이고, 입력이 1인 뉴런 추가/편향의 입력신호는 항상 1이다.)

이 퍼셉트론의 동작은 x1, x2, 1이라는 3개의 신호가 뉴런에 입력되어, 각 신호에 가중치를 곱한 후, 다음 뉴런에 전달한다. 다음 뉴런에서 이 신호들의 값을 더하여, 그 합이 0을 넘으면 1을 출력하고 그렇지 않으면 0을 출력한다.

 

이를 다시 식으로 세워보면 이런 형태를 띄는데, 함수 h(x)는 조건 분기의 동작을 나타낸다.

즉, 입력 신호의 총 합이 h(x)라는 함수를 거쳐 변환되어 그 값이 y에 출력됨을 나타낸다.

여기서, 이 h(x)라는 함수를 활성화 함수라고 한다.

(h(x)를 이용해 두 식으로 분리한 이유는, 딥러닝에서 노드에 들어오는 값을 곧바로 다음 층으로 보내지 않고 주로 비선형 함수를 통과시킨 후 전달하기 때문이다.)


활성화 함수(activation function)

입력 신호의 총합을 출력 신호로 변환한다.

활성화함수를 그림으로 나타내면 이렇게 표현할 수 있다.

즉, 가중치 신호를 조합한 결과가 a라는 노드가 되고, 활성화 함수 h()를 통과하여 y라는 노드로 변환되는 과정이 나타나있다.

활성화 함수는 임계값을 경계로 출력이 바뀌는데, 이런 함수를 계단 함수(step function)라고 한다. 

이는 곧 "퍼셉트론에서는 계단 함수를 활성화 함수로 이용한다."라고 할 수 있다.


신경망에서 자주 이용하는 활성화 함수

시그모이드 함수(sigmoid function)

exp(-x)는 e^(-x)를 뜻하며, e는 자연상수로 2.7182... 의 값을 가진다.

 

신경망에서는 활성화 함수로 시그모이드 함수를 이용하여 신호를 변환하고, 그 변환된 신호를 다음 뉴런에 전달한다.

 


파이썬으로 계단 함수 그리기

def step_function(x):
	if x > 0:
    	return 1
    else:
    	return 0

계단 함수는 입력이 0을 넘으면 1을 출력하고, 그 외에는 0을 출력한다. 이걸 단순하게 구현한다면 이렇게 나타낼 수 있다. 하지만 이 인수 x는 실수(부동소수점)만 받아들입니다. 즉, x에 3.0은 넣을 수 있지만 넘파이 배열을 인수로 넣을 수 없다. ex. step_function(np.array([1.0,2.0]))

 

이를 구현하기 위해서는

def step_function(x):
	y = x > 0
    return y.astype(np.int)

이렇게 진행해주면 된다.

 

넘파이 배열에 부당호 연산을 수행하면 배열의 원소 각각에 부등호 연산을 수행한 bool 배열이 생성된다.

배열 x의 원소 각각이 0보다 크면 True로, 0 이하면 False로 변환한 새로운 배열이 생성된다.

 

하지만 이 y는 bool 배열로, 계단함수는 int형(0이나 1)의 출력을 요구한다. 그래서 배열 y의 원소를 int형으로 바꿔주었다.

 

 

위의 계단 함수를 matplotlib 라이브러리를 사용해서 그래프로 그려보자.

더보기
import numpy as np
import matplotlib.pylab as plt

def step_func(x):
    return np.array(x>0, dtype=np.int)

x = np.arange(-5.0,5.0,0.1)
y = step_func(x)

plt.plot(x,y)
plt.ylim(-0.1,1.1) #y축의 범위 지정
plt.show()

np.array(-5.0,5.0,0.1)은 -5.0에서 5.0전까지 -.1 간격의 넘파이 배열을 생성한다.
즉, [-5.0,-4.9,...,4.9]를 생성

 


시그모이드 함수 구현하기

위의 시그모이드 함수를 파이썬으로 작성해보면

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

이렇게 나타낼 수 있다.

 

이 함수를 그래프로 그려볼 것이다.

더보기
import numpy as np
import matplotlib.pylab as plt

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

x= np.arange(-5.0,5.0,0.1)
y = sigmoid(x)
plt.plot(x,y)
plt.ylim(-0.1,1.1) #y축 범위 지정
plt.show()

시그모이드(sigmoid)란 'S모양'이라는 뜻으로 모양을 따서 이름을 지은 것이다.

퍼셉트론(계단 함수)는 0을 경계로 0과 1을 반환하는 반면,

시그모이드 함수는 곡선(연속적인 실수)으로 이루어져있다.

=> 신경망에서는 연속적인 실수가 흐른다.

 

하지만 둘 다 입력이 작을 때의 출력은 0에 가깝고, 입력이 커지면 1에 가까워진다는 공통점이 있다.

출력이 전부 0에서 1 사이에서 이루어지며, 입력이 중요하면 큰 값, 중요하지 않으면 작은 값을 출력하게 된다.

 

또 다른 공통점으로는 비선형 함수라고 할 수 있다.

[02] 퍼셉트론 에서 이야기하듯이, 계단 함수와 시그모이드 함수 모두 '하나의 직선으로 구성'할 수 없는 비선형 함수로 이루어져있다. (신경망에서는 선형 함수를 활성화 함수로 사용할 수 없다.)


ReLU 함수(Rectified Linear Unit)

입력이 0을 넘으면 그 입력을 그대로 출력하고, 0 이하이면 0을 출력한다.

 

ReLU함수 파이썬으로 구현

더보기
import numpy as np
import matplotlib.pylab as plt

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

x= np.arange(-5.0,5.0,0.1)
y = relu(x)
plt.plot(x,y)
plt.ylim(-0.1,6) #y축 범위 지정
plt.show()

 

 

 

 

밑바닥부터 시작하는 딥러닝 +a

'<Machine Learning>' 카테고리의 다른 글

[06] 신경망 학습 (1)  (0) 2020.11.04
[05] 항등 함수와 소프트맥스 함수  (0) 2020.10.07
[04] 신경망(2)  (0) 2020.10.07
[02] 퍼셉트론  (0) 2020.09.25
[01] 러닝 모델(Learning Model) :: Machine Learning  (0) 2020.08.17