퍼셉트론으로 XOR 게이트를 표현할 수 없었지만(단층 퍼셉트론으로는 비선형 영역을 분리할 수 없다), 퍼셉트론의 층을 하나 더 쌓아서 XOR 을 표현할 수 있다.

 

1. 기존 게이트 조합하기

XOR 게이트를 만드는 방법은 다양하지만, 그중 하나는 AND, NAND, OR 게이트를 조합하는 것이다.

 

AND, NAND, OR 게이트 기호

$x_1$ 과 $x_2$ 가 입력 신호, $y$ 가 출력 신호이다. $x_1$ 과 $x_2$ 는 NAND 와 OR 게이트의 입력이 되고, NAND 와 OR 의 출력이 AND 게이트의 입력으로 이어진다.

 

AND, NAND, OR 게이트를 조합해 구현한 XOR 게이트

NAND 의 출력을 $s_1$, OR 의 출력을 $s_2$ 로 해서 진리표를 만들면 아래의 표가 나온다. $x_1$, $x_2$, $y$ 에 주목하면 XOR 의 출력과 같다.

 

XOR 게이트의 진리표

 

2. XOR 게이트 구현

앞에서 조합된 XOR 게이트를 파이썬으로 구현한다. 

def XOR(x1, x2):
    s1 = NAND(x1,x2)
    s2 = OR(x1, x2)
    y = AND(s1, s2)
    return y
print(XOR(0,0))
print(XOR(1,0))
print(XOR(0,1))
print(XOR(1,1))
[실행 결과]
0
1
1
0

위에서 구현한 XOR 을 뉴런을 이용한 퍼셉트론으로 표현할 수 있다.

 

XOR 의 퍼셉트론

XOR 은 다층 구조의 네트워크를 가진다. 이처럼 층이 여러 개인 퍼셉트론을 다층 퍼셉트론이라고 한다.

 

3층으로 이루어진 퍼셉트론에서 가중치를 갖는 층을 2개이다. 0층과 1층 사이, 1층과 2층사이다. 

 

2층 퍼셉트론의 동작을 자세하게 설명하자면,

1. 0층의 두 뉴런이 입력 신호를 받아 1층의 뉴런으로 신호를 보낸다.

2. 1층의 뉴런이 2층의 뉴런으로 신호를 보내고, 2층의 뉴런은 $y$ 를 출력한다.

 

이처럼 퍼셉트론은 층을 쌓아 더 깊게 만들어서 더 다양한 것을 표현할 수 있다.

 

3. 퍼셉트론 정리

1. 퍼셉트론은 입출력을 갖춘 알고리즘이다. 입력을 주면 정해진 규칙에 따른 값을 출력한다.

2. 퍼셉트론에서는 '가중치' 와 '편향' 을 매개변수로 설정한다.

3. 퍼셉트론으로는 AND, OR 게이트 등의 논리 회로를 표현할 수 있다.

4. XOR 게이트는 단층 퍼셉트론으로는 표현할 수 없다.

5. 2층 퍼셉트론을 이용하면 XOR 게이트를 표현할 수 있다.

6. 단층 퍼셉트론은 직선형 영역만 표현할 수 있고, 다층 퍼셉트론은 비선형 영역도 표현할 수 있다.

7. 다층 퍼셉트론은 (이론상) 컴퓨터를 표현할 수 있다.

'Deep Learning 1 > 퍼셉트론' 카테고리의 다른 글

4. 퍼셉트론의 한계  (0) 2020.02.06
3. 퍼셉트론 구현하기  (0) 2020.02.05
2. 단순한 논리 회로  (0) 2020.02.04
1. 퍼셉트론이란?  (0) 2020.02.03

 

1. XOR 게이트

XOR 게이터는 배타적 논리합인 논리 회로이다. $x_1$ 과 $x_2$ 중 한쪽이 1일 때만 1을 출력한다. 

XOR 게이트의 진리표

지금까지의 퍼셉트론으로는 XOR 게이트를 구현할 수 없다. 

OR 게이터를 예로 들자면, ( $b$, $w_1$, $w_2$ ) = (0.5, 1.0, 1.0) 일 때 아래의 수식으로 표현된다.

 

위 수식의 퍼셉트론은 직선으로 나뉜 두 영역을 만든다. 한쪽 영역은 1을 출력하고 다른 한쪽은 0을 출력한다.

회색영역은 0을 출력하고, 전체영역은 OR 게이트의 성질을 만족

OR 게이트는 ( $x_1$, $x_2$ ) = (0, 0) 일 때만 0을 출력하고 나머지는 모두 1을 출력한다. OR 게이트를 만들려면 원과 삼각형을 직선으로 나눠야 한다.

원과 삼각형은 XOR 게이트의 출력을 나타낸다.

위 그림에서 원과 삼각형을 직선 하나로 나누기란 불가능하다.

 

2. 선형과 비선형

XOR 게이트의 출력을 나타낸 그림에서 원과 삼각형을 직선으로 나눌 수는 없지만 곡선으로는 가능하다.

곡선으로 원과 삼각형을 나눌 수 있다.

곡선으로 XOR 게이트의 출력 값을 나눌 수는 있지만 퍼셉트론은 직선 하나로 나눈 영역만 표현할 수 있다는 한계가 있다. 이처럼 곡선의 영역을 비선형 영역이라고 하고, 직선의 영역을 선형 영역이라고 한다.

'Deep Learning 1 > 퍼셉트론' 카테고리의 다른 글

5. 다층 퍼셉트론  (0) 2020.02.11
3. 퍼셉트론 구현하기  (0) 2020.02.05
2. 단순한 논리 회로  (0) 2020.02.04
1. 퍼셉트론이란?  (0) 2020.02.03

 

1. 간단한 구현

x1 과 x2 를 인수로 받는 AND 함수

def AND(x1, x2):
    w1, w2, theta = 0.5, 0.5, 0.7
    tmp = x1*w1 + x2*w2
    if tmp <= theta:
        return 0
    elif tmp > theta:
        return 1
print(AND(0,0))
print(AND(1,0))
print(AND(0,1))
print(AND(1,1))
[실행 결과]
0
0
0
1

매개변수 w1, w2, theta 는 함수 안에서 초기화하고, 가중치를 곱한 입력의 총합이 임계값(theta)을 넘으면 1을 반환하고 그 외에는 0을 반환한다.

 

2. 가중치와 편향 도입

기존의 입력이 2개인 퍼셉트론의 수식에서 $\theta$ 를 $-b$ 로 치환하면 아래와 같은 수식이 나온다.

치환한 퍼셉트론 수식

위 수식에서 $b$ 를 편향(bias) 이라고 하고, $w_1$ 과 $w_2$ 는 그대로 가중치이다. 위 수식을 해석해보자면 퍼셉트론은 입력 신호에 가중치를 곱한 값과 편향을 합하여, 그 값이 0을 넘으면 1을 출력하고 그렇지 않으면 0을 출력한다.

import numpy as np
x = np.array([0,1]) #입력
w = np.array([0.5, 0.5]) #가중치
b = -0.7 #편향
print(w*x)
print(np.sum(w*x))
print(np.sum(w*x)+b)
[실행 결과]
[0.  0.5]
0.5
-0.19999999999999996 #대략 -0.2(부동소수점에 의한 연산 오차)

넘파이 배열끼리의 곱셈은 두 배열의 원소 수가 같다면 같은 인덱스의 원소끼리 곱한다. np.sum() 메소드는 곱한 값이 담긴 배열의 모든 원소의 총합을 계산한다. 그리고 이 값(가중치, 입력이 0, 1이기 때문에 가중치의 값이 얼마가 됐든 w*x 의 합은 w의 가중치 값과 같게 나온다)에 편향을 더하게 된다.

 

3. 가중치와 편향 구현하기

가중치와 편향을 도입한 AND 게이트의 구현

def AND(x1, x2):
    x = np.array([x1, x2])
    w = np.array([0.5, 0.5])
    b = -0.7
    tmp = np.sum(w*x) + b
    if tmp <= 0:
        return 0
    else:
        return 1
print(AND(0,0))
print(AND(1,0))
print(AND(0,1))
print(AND(1,1))    
[실행 결과]
0
0
0
1

앞서 구현한 x1 과 x2 를 인수로 받는 AND 함수에서의 theta 가 $-b$ 가 되었다. 편향은 가중치 $w_1$, $w_2$ 와 기능이 다르다. $w_1$, $w_2$ 는 각 입력 신호가 결과에 주는 영향력(중요도)을 조절하는 매개변수이고, 편향은 뉴련이 얼마나 쉽게 활성화(결과로 1을 출력)하느냐를 조정하는 매개변수이다.

예를 들어 $b$ 가 -0.1 이면 각 입력 신호에 가중치를 곱한 값들의 합이 0.1을 초과할 때만 뉴런이 활성화되고, 그렇지 않으면 활성화되지 않는다. 

이처럼 편향의 값은 뉴런이 얼마나 쉽게 활성화되는지를 결정한다.

편향의 의미는 '한쪽으로 치우쳐 균형을 깬다' 는 것이다. 실제로 위에서 $\theta$ 를 $-b$ 로 치환한 수식을 보면 두 입력이 모두 0이어도 결과로 (0이 아닌) 편향 값을 출력한다.

 

NAND 게이트와 OR 게이트 구현

def NAND(x1, x2):
    x = np.array([x1, x2])
    w = np.array([-0.5, -0.5]) #AND와는 가중치(w와 b)만 다르다.
    b = 0.7
    tmp = np.sum(w*x) + b
    if tmp <= 0:
        return 0
    else:
        return 1
def OR(x1, x2):
    x = np.array([x1, x2])
    w = np.array([0.5, 0.5]) #AND와는 가중치(w와 b)만 다르다.
    b = -0.2
    tmp = np.sum(w*x) + b
    if tmp <= 0:
        return 0
    else:
        return 1
print(NAND(0,0))
print(NAND(1,0))
print(NAND(0,1))
print(NAND(1,1))
print(OR(0,0))
print(OR(1,0))
print(OR(0,1))
print(OR(1,1))
[실행 결과]
1
1
1
0
0
1
1
1

AND, NAND, OR 는 모두 같은 구조의 퍼셉트론이고, 차이는 가중치 매개변수의 값 뿐이다. 코드에서도 가중치와 편향 값을 설정하는 부분 뿐이다.

'Deep Learning 1 > 퍼셉트론' 카테고리의 다른 글

5. 다층 퍼셉트론  (0) 2020.02.11
4. 퍼셉트론의 한계  (0) 2020.02.06
2. 단순한 논리 회로  (0) 2020.02.04
1. 퍼셉트론이란?  (0) 2020.02.03

 

1. AND 게이트

AND 게이트는 입력이 둘이고 출력은 하나이다. AND 게이트의 진리표를 보면, 두 입력이 모두 1일 때만 1을 출력하고, 그 외에는 0을 출력한다.

AND 게이트의 진리표

AND 게이트를 퍼셉트론으로 표현할 때 매개변수인 $w_1$, $w_2$, $\theta$ 의 조합은 무한히 많다. 조건을 충족하는 매개변수를 설정하면 $x_1$ 과 $x_2$ 모두가 1일 때만 가중 신호의 총합이 주어진 임계값을 웃돌게 된다.

 

2. NAND 게이트와 OR 게이트

NAND 는 Not AND 를 의미하며, AND 게이트의 출력을 뒤집은 것과 같다. 진리표를 보면, $x_1$ 과 $x_2$ 가 모두 1일 때만 0을 출력하고, 그 외에는 1을 출력한다.

NAND 게이트의 진리표

AND 게이트를 구현하는 매개변수의 부호를 모두 반전시키면 NAND 게이트가 된다.

 

OR 게이트는 입력 신호 중 하나 이상이 1이면 출력이 1이 되는 논리 회로이다.

OR 게이트의 진리표

매개변수는 사람이 직접 진리표라는 학습 데이터를 보면서 정한다. 기계 학습은 컴퓨터가 자동으로 적절한 매개변수를 정하는 작업이며, 사람은 퍼셉트론의 구조(모델)를 만들고 컴퓨터에게 학습할 데이터를 준다.

 

퍼셉트론의 구조는 AND, NAND, OR 게이트에서 모두 똑같다. 다른 것은 매개변수(가중치와 임계값)의 값이다. 똑같은 구조의 퍼셉트론이 매개변수의 값을 적절히 조정하여 각기 다른 게이트로 변하는 것이다.

'Deep Learning 1 > 퍼셉트론' 카테고리의 다른 글

5. 다층 퍼셉트론  (0) 2020.02.11
4. 퍼셉트론의 한계  (0) 2020.02.06
3. 퍼셉트론 구현하기  (0) 2020.02.05
1. 퍼셉트론이란?  (0) 2020.02.03

퍼셉트론은 신경망(딥러닝)의 기원이 되는 알고리즘이다.

 

퍼셉트론은 다수의 신호를 입력으로 받아 하나의 신호를 출력한다. 여기서 신호는 흐름이 있는 것으로 생각한다. 퍼셉트론 신호는 흐름을 만들고 정보를 앞으로 전달한다. 또한, 퍼셉트론 신호는 흐른다(1), 흐르지 않는다(0) 의 두 가지 값을 가진다.

입력이 2개인 퍼셉트론

$x_1$ 과 $x_2$ 는 입력 신호, $y$ 는 출력 신호, $w_1$ 과 $w_2$ 는 가중치를 뜻한다. 그림의 원을 뉴런 혹은 노드라고 부른다. 입력 신호가 뉴런에 보내질 때는 각각 고유한 가중치가 곱해진다. ($w_1x_1$, $w_2x_2$) 뉴런에서 보내온 신호의 총합이 정해진 한계를 넘어설 때만 1을 출력한다. 이를 '뉴런이 활성화한다' 라고 표현한다. 그 한계를 임계값이라고 하며, $\Theta$ 로 나타낸다.

입력이 2개인 퍼셉트론의 수식

퍼셉트론은 복수의 입력 신호 각각에 고유한 가중치를 부여한다. 가중치는 각 신호가 결과에 주는 영향력을 조절하는 요소로 작용한다. 즉, 가중치가 클수록 해당 신호가 더 중요하다는 것을 의미한다.

 

가중치는 전류에서의 저항과 비슷하다. 퍼셉트론의 가중치는 그 값이 클수록 강한 신호를 흘려보낸다. 저항과 퍼셉트론이 작용하는 방향은 반대지만, 신호가 얼마나 잘 흐르는가를 통제한다는 점에서 같은 기능을 한다.

'Deep Learning 1 > 퍼셉트론' 카테고리의 다른 글

5. 다층 퍼셉트론  (0) 2020.02.11
4. 퍼셉트론의 한계  (0) 2020.02.06
3. 퍼셉트론 구현하기  (0) 2020.02.05
2. 단순한 논리 회로  (0) 2020.02.04

+ Recent posts