『밑바닥부터 시작하는 딥러닝』 도서를 공부한 후 복습하는 글입니다.
퍼셉트론(perceptron) 알고리즘은 신경망(딥러닝)의 기원이 되는 알고리즘이다!
그렇기에 퍼셉트론의 구조를 배우는 것은 신경망과 딥러닝으로 나아가는데 중요한 아이디어가 될 것이다.
2.1. 퍼셉트론이란?
- 다수의 신호를 입력받아 하나의 신호를 출력한다. 여기서 신호란 흐름이 있는 것을 의미한다.
- 전류가 전선을 타고 흐르는 전자를 내보내듯, 퍼셉트론 신호도 흐름을 만들고 정보를 앞으로 전달한다.
- 다만, 퍼셉트론 신호는 두가지 값 '흐른다(0) / 안흐른다(1)' 두가지 값을 가질 수 있다.
⇒ 입력으로 2개의 신호를 받은 퍼셉트론. <<입력이 2개인 퍼셉트론>>이라고 한다.
⇒ w1, w2는 가중치.
⇒ 입력신호가 뉴런(or 노드)에 보내질 때는 각각 고유한 가중치가 복수의 입력신호에 곱해진다.
(w1x1, w2x2)
⇒ 뉴런에서 보내온 신호의 총합이 정해진 한계(임계값, Θ)을 넘어설 때 1을 출력한다.
('뉴런이 활성화한다'라고도 표현!)
* 가중치란?
각 '신호가 결과에 주는 영향력'을 조절하는 요소로 작용한다. 즉, 가중치가 높아지면, 신호의 중요도도 커진다고 보면된다. 다시말해, 신호가 얼마나 잘(or 어렵게) 흐르는가를 통제하는 '저항'과 같은 기능이라고 생각하자.
- 이를 수식으로 표현하면 다음과 같다.
[퍼셉트론의 동작원리]
y= 1 (w1x1 + w2x2 > Θ)
0 (w1x1 + w2x2 <= Θ)
2.2. 단순한 논리회로 (퍼셉트론 활용 문제)
1) AND 게이트
- 입력이 2개, 출력이 1개.
- AND 게이트의 진리표(입력 신호와 출력 신호의 대응 표)
x1 | x2 | y1 |
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
- AND 게이트를 퍼셉트로 표현하려면? 진리표대로 작동하도록 하는 'w1, w2, Θ의 값을 정하는 것'이다!
- 즉, x1, x2가 1일 때만 주어진 임계값을 넘도록 w1,w2,Θ값을 지정해주면 된다.
- ex1) (w1, w2, Θ) : (0.5, 0.5, 0.7)일 경우,
x1=0, x2=0 : 0 <= 0.7
x1=0, x2=1 : 0.5 <= 0.7
x1=1, x2 =0 : 0.5 <= 0.7
x1=1, x2=1 : 1.0 > 0.7
- ex2) (w1, w2, Θ) : (0.5, 0.5, 0.8)일 경우도 마찬가지이고,
- ex3) (w1, w2, Θ) : (1.0, 1.0, 1.0)일 경우,
x1=0, x2=0 : 0 <= 1.0
x1=0, x2=1 : 1.0 <= 1.0
x1=1, x2 =0 : 1.0 <= 1.0
x1=1, x2=1 : 2.0 > 1.0
모두 AND 게이트의 진리표대로 나온다. 이외에도 만족하는 매개변수 조합은 무한히 많다.
2) NAND 게이트와 OR 게이트
- NAND : Not AND (AND게이트의 출력을 뒤집은 것이다.)
- NAND 게이트의 진리표
x1 | x2 | y1 |
0 | 0 | 1 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
- ex1) (w1, w2, Θ) : (-0.5, -0.5, -0.7)
x1=0, x2=0 : 0 > -0.7
x1=0, x2=1 : -0.5 > -0.7
x1=1, x2=0 : -0.5 > -0.7
x1=1, x2=1 : -1.0 <= -0.7
- OR : 입력신호 중 하나 이상이 1면 1이 출력되는 논리회로이다.
- OR 게이트의 진리표
x1 | x2 | y1 |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
- ex1) (w1, w2, Θ) : (0.5, 0.5, 0.5)
x1=0, x2=0 : 0 < 0.5
x1=0, x2=1 : 0.5 >= 0.5
x1=1, x2=0 : 0.5 >= 0.5
x1=1, x2=1 : 1.0 >= 0.5
★중요한 점★
퍼센트론의 구조는 AND, NAND, OR 게이트 모두에서 똑같다는 것이다. 세 게이트에서 다른 것은 매개변수(가중치w1,w2와 임계값Θ)의 값뿐이다.
다시말해, 똑같은 구조의 퍼셉트론이 매개변수의 값만 적절히 조정하여 AND, NAND, OR로 변신하는 것이다!
여기서, 퍼셉트론의 매개변수(w1, w2, Θ)을 정하는 것을 우리가 했다.
기계학습 문제는 이 매개변수의 값을 정하는 작업을 컴퓨터가 자동으로 하도록 한다.
'학습'이 적절한 매개변수 값을 정하는 작업이고,
사람은 퍼셉트론의 구조(모델)를 고민하고 컴퓨터에 학습할 '데이터를 주는 일'을 한다.
2.3. 퍼셉트론 구현하기
1) AND 함수
def AND(x1, x2):
w1, w2, theta = 0.5, 0.5, 0.7
tmp = x1*w1 + x2*w2
if tmp > theta:
return 1
elif tmp <= theta:
return 0
print(AND(0,0)) # 0
print(AND(0,1)) # 0
print(AND(1,0)) # 0
print(AND(1,1)) # 1
2.3.2. 가중치와 편향 도입
- 위의 AND게이트는 직관적이고 알기 쉽지만, 앞으로를 위해 다른 방식으로 수정해야한다. 그전에 Θ를 -b로 치환하게 되면 변형된 퍼셉트론의 동작과정은 다음과 같다.
[퍼셉트론의 동작 원리]
y= 0 (b + w1x1 + w2x2 <= 0)
1 (b + w1x1 + w2x2 > 0)
- 여기에서 b를 편향이라한다.
- 퍼셉트론은 입력 신호에 가중치를 곱한 값과 편향을 합하여, 그 값이 0을 넘으면 1을 출력, 그렇지 않으면 0을 출력한다.
- 넘파이를 사용해서 다시 구현해보자. x1=0, x2=1인 경우이다.
>>> import numpy as np
>>> x = np.array([0, 1]) # x1=0,x2=1인 경우
>>> w = np.array([0.5, 0.5]) # w1=0.5, w2=0.5로 설정
>>> b = -0.7 # 편향
>>> w*x # x1과 w1이, x2와 w2가 곱하게 된다.
array([0. , 0.5])
>>> np.sum(w*x) # array([0. , 0.5])의 총합.
0.5
>>> np.sum(w*x)+b # w1x1 + w2x2 + b
-0.19999999999999996
2.3.3. 가중치와 편향 구현하기
- 위의 가중치와 편향을 도입하여 AND 게이트를 구현해보자. x1과 x2를 인수로 받아야한다.
- 바로 위의 코드와 비슷하지만 함수로 만들어보겠다.
# AND 게이트
import numpy as np # np.array를 쓰기위해 import한다.
def AND(x1, x2):
x = np.array([x1, x2]) # x1,x2를 배열로 생성하고
w = np.array([0.5,0.5]) # w1,w2를 배열로 생성하면
b = -0.7
tmp = np.sum(w*x)+b # 같은 위치의 원소끼리 곱셈이 가능하다. np의 sum()로 편하게 계산 가능하다.
if tmp <= 0:
return 0
else:
return 1
- 처음에 적었던 AND 함수와 다른점은 크게 2가지가 있다.
- Θ가 -b(-Θ가 편향 b)로 치환된 점.
- numpy 모듈을 이용하여 배열로 가중치를 생성해주었다는 점.
* 편향이란?
'한쪽으로 치우쳐 균형을 깬다.'라는 의미이다. 실제로, 변형된 [퍼셉트론의 동작 원리]를 보면 두 입력(x1,x2)이 모두 0이어도 결과는 편향값을 출력한다.
★중요한 점★
편향과 가중치w1,w2는 기능이 다르다!
w1,w2는 각 입력 신호가 결과에 주는 영향력(중요도)을 조정하는 매개변수이다.
다시 말해, w1,w2가 큰 값일수록, 결과에 더 큰 영향을 미치는 요소라고 생각하면된다.
편향은 뉴런이 얼마나 쉽게 활성화 (결과로 1을 출력)하느냐를 조정하는 매개변수이다.
ex) b가 -20.0(혹은 0.1)이면, 각 입력 신호에 가중치를 곱한 값들의 합이 20.0(혹은 0.1)을 넘지 않으면 뉴런은 활성화되지 않는다.
즉, 편향의 값은 뉴런이 얼마나 '쉽게' 활성화되는지를 결정한다.
- 이어서 NAND 게이트와 OR 게이트를 구현해보자.
# NAND 게이트
def NAND(x1,x2):
x = np.array([x1, x2])
w = np.array([-0.5, -0.5]) # AND와 가중치만 다르면 NAND!
b = 0.7 # -b가 -0.7이니까!
tmp = np.sum(w*x) + b
if tmp<=0:
return 0
else:
return 1
# OR 게이트
def OR(x1, x2):
x = np.array([x1, x2])
w = np.array([1.0, 1.0])
b = -1.0
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1
- AND, NAND, OR는 모두 같은 구조이다! 다른 것은 가중치 매개변수의 값뿐이다. 그렇기 때문에 코드 내에서도 w(가중치)와 b(편향값)만 수정하면 된다.
'Python > Review' 카테고리의 다른 글
데이터 시각화 기초 (0) | 2021.01.04 |
---|---|
클래스와 넘파이, 그리고 matplotlib (0) | 2021.01.03 |
Parameter Learning (Gradient Descent) (0) | 2020.12.31 |
Const Function - Intuition 1,2 (0) | 2020.12.28 |
Linear Regression(선형 회귀) (0) | 2020.12.27 |