본문 바로가기
인공지능/딥러닝

[밑바닥부터 시작하는 딥러닝] 퍼셉트론, 신경망

by julysein 2021. 10. 21.
728x90

 

 

퍼셉트론 정의

 

퍼셉트론 : 많은 input을 입력받아 하나의 output 을 출력하는 것

뉴런 or 노드 : 신호값 (0 또는 1)

가중치 : 노드가 input 값으로 보내질 때 곱해지는 값

임계값 : output이 1이 되게 하는 어떤 값 (input 신호의 합이 임계값을 넘어서면 output이 1이 된다)

편향 : 결과값에 더해지는 값 (일차 함수에서 상수항)

 

퍼셉트론의 한계

 

일차 함수이기 때문에 직선으로만 표현이 가능하다. 따라서 직선 하나로 나눈 영역만 표현할 수 있다.

 

다층 퍼셉트론

뜻 : 여러 퍼셉트론을 층으로 쌓은 것

 

ex) XOR은 하나의 퍼셉트론으로 표현이 불가능하기 때문에 다음과 같이 NANA, OR, AND 를 쌓아서 만들어야 한다.

XOR = ((NAND) AND (OR))

 

신경망

신경망에는 입력층, 은닉층, 출력층이 존재한다.

 

 

활성화 함수

- 입력값으로 가중치가 곱해진 입력 신호의 총합을 받고 이를 x 로 사용하는 함수

 

신경망에서 활용되는 활성화 함수의 예시

 

 

1. 계단함수

 

계단함수는 임계값을 넘는 경우에는 1을, 임계값 이하인 경우에는 0을 return 하는 함수이다.

임계값을 0으로 설정하고 함수를 짜 보았다.

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

 

배열까지 처리하도록 만들고 싶다면 다음과 같이 작성하면 된다.

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

 

계단 함수를 이용한 그래프를 그려보자

 

1) numpy와 matplotlib을 이용할 예정이다.

import numpy as np
import matplotlib.pylab as plt

 

2) 아까 했던 계단 함수를 정의하고 x를 설정한다.

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

# x의 값을 -5.0 에서 5.0까지 0.1의 간격으로 넘파이 배열 생성
x = np.arange(-5.0, 5.0, 0.1)
print(x)
[-5.00000000e+00 -4.90000000e+00 -4.80000000e+00 -4.70000000e+00
 -4.60000000e+00 -4.50000000e+00 -4.40000000e+00 -4.30000000e+00
 -4.20000000e+00 -4.10000000e+00 -4.00000000e+00 -3.90000000e+00
 -3.80000000e+00 -3.70000000e+00 -3.60000000e+00 -3.50000000e+00
 -3.40000000e+00 -3.30000000e+00 -3.20000000e+00 -3.10000000e+00
 -3.00000000e+00 -2.90000000e+00 -2.80000000e+00 -2.70000000e+00
 -2.60000000e+00 -2.50000000e+00 -2.40000000e+00 -2.30000000e+00
 -2.20000000e+00 -2.10000000e+00 -2.00000000e+00 -1.90000000e+00
 -1.80000000e+00 -1.70000000e+00 -1.60000000e+00 -1.50000000e+00
 -1.40000000e+00 -1.30000000e+00 -1.20000000e+00 -1.10000000e+00
 -1.00000000e+00 -9.00000000e-01 -8.00000000e-01 -7.00000000e-01
 -6.00000000e-01 -5.00000000e-01 -4.00000000e-01 -3.00000000e-01
 -2.00000000e-01 -1.00000000e-01 -1.77635684e-14  1.00000000e-01
  2.00000000e-01  3.00000000e-01  4.00000000e-01  5.00000000e-01
  6.00000000e-01  7.00000000e-01  8.00000000e-01  9.00000000e-01
  1.00000000e+00  1.10000000e+00  1.20000000e+00  1.30000000e+00
  1.40000000e+00  1.50000000e+00  1.60000000e+00  1.70000000e+00
  1.80000000e+00  1.90000000e+00  2.00000000e+00  2.10000000e+00
  2.20000000e+00  2.30000000e+00  2.40000000e+00  2.50000000e+00
  2.60000000e+00  2.70000000e+00  2.80000000e+00  2.90000000e+00
  3.00000000e+00  3.10000000e+00  3.20000000e+00  3.30000000e+00
  3.40000000e+00  3.50000000e+00  3.60000000e+00  3.70000000e+00
  3.80000000e+00  3.90000000e+00  4.00000000e+00  4.10000000e+00
  4.20000000e+00  4.30000000e+00  4.40000000e+00  4.50000000e+00
  4.60000000e+00  4.70000000e+00  4.80000000e+00  4.90000000e+00]

3) x를 계단 함수에 적용한다.

y = step(x)
print(y)
내용을 입력하세요.

 

[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]

 

4) y 축의 범위를 지정해주고 그래프를 그린다

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

 

 

 

2. 시그모이드 함수

 

신경망에서는 계단 함수보다 시그모이드 함수가 더 자주 사용된다.

 

시그모이드 함수의 구현은 다음과 같이 이루어질 수 있다.

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

 

조금 더 직관적인 이해를 위해 시그모이드 함수를 그려보았다.

 

1) 먼저 계단함수와 동일하게 numpy와 matplotlib을 이용할 예정이다.

import numpy as np
import matplotlib.pylab as plt

 

2) 앞서 했던대로 시그모이드 함수를 구현한다.

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

 

3) x와 표시해줄 y의 범위를 지정해주고 그래프를 그린다.

x = np.arange(-5.0, 5.0, 0.1)
y = sigmoid(x)
plt.plot(x,y)
plt.ylim(-0.1, 1.1)
pt.show()

 

 

시그모이드 함수 그래프

 

3. ReLU 함수

 

최근에 가장 주로 사용되는 함수는 ReLU 함수이다.

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

 

앞부분은 똑같이 한 뒤에 relu 함수를 구현하고 다음과 같이 작성하면 그래프를 그릴 수 있다.

x = np.arange(-5.0, 5.0, 0.1)
y = relu(x)
plt.plot(x,y)
plt.ylim(-0.1, 4)
plt.show()

 

 

 

 

 

728x90