0. 개요

2장에서는 퍼셉트론 알고리즘을 설명한다.

프랑크 로젠블라트가 1957년에 고안한 알고리즘이다.

 

상당히 오래된 알고리즘은 딥러닝의 기원이 되는 알고리즘이기 때문에 짚고 넘어가야 할 필요성이 있다.

 

1. 퍼셉트론이란?

퍼셉트론

위의 사진은 입력이 2개인 퍼셉트론의 구조를 보여주는 사진이다.

  • x : 입력
  • w : 가중치
  • y : 출력

퍼셉트론의 동작을 살펴보면 다음과 같다.

 

 1. 입력 x1, x2가 가중치 w1, w2와 곱해져서 더해진다.

 2. 1번에서 구한 값이 임계값 세타보다 크면 1, 같거나 작으면 0을 출력한다.

 

뇌구조에서 뉴런이 전기신호를 전달하는 방식을 아는가?

그 방법과 동일한 원리로 구현된다고 보면 된다.

 

이를 식으로 표현하면 다음과 같다.

 

y =  0 ( w1x1 + w2x2 <= 임계값 )

      1 (w1x1 + w2x2 > 임계값 )

 

 

용어를 정리하자면,

  • 뉴런(노드) : x1, x2, y1 즉, 각 동그라미를 의미
  • 가중치 : 값의 전달과 관련된 매개변수
  • 임계값(세타) : 뉴런의 활성화를 판가름하는 수치
  • 퍼셉트론 : 다수의 입력을 받아 하나의 출력을 만들어 내는 것

 

2. 단순한 논리 회로

퍼셉트론 알고리즘을 배웠으니 이를 활용해서 단순한 논리회로를 설계할 것이다.

 

논리회로는 여러개의 입력에 대한 하나의 출력을 나타내는 회로로써 입력값과 출력값은 0과 1로 이루어진다.

 

우리가 설계할 회로는 다음과 같다.

 

* AND                 

A B Y
0 0 0
0 1 0
1 0 0
1 1 1

프로그래밍 논리 조건에서 자주 볼 수 있는 && 연산자와 동일한 기능을 한다.

입력 AB에 대하여 둘다 1값을 가져야 출력이 1이 된다.



* NAND

A B Y
0 0 1
0 1 1
1 0 1
1 1 0

위에서 설명한 AND 회로의 결과값을 뒤집어 놓은 것과 동일하다.

따라서 11을 제외한 모든 조합은 1을 출력한다.

 

* OR

A B Y
0 0 0
0 1 1
1 0 1
1 1 1

프로그래밍에서 사용하는 || 조건과 동일하다.

입력중 하나만 1이 있어도 1을 출력한다.

 

3. 논리회로의 구현

이제 AND, NAND, OR에 대한 기본적인 동작을 살펴봤으니 어떻게 구현을 할 것인가에 대해서 생각해 보자.

 

퍼셉트론의 구조

먼저 퍼셉트론의 구조를 살펴보자.

퍼셉트론에서 구성요소는 다음과 같다.

  • 입력값 X
  • 가중치 W
  • 출력값 Y
  • 임계값 세타

각 요소들을 분석해본다면, 

  • 입력값 X : 함수의 입력에 해당한다.
  • 출력값 Y : 함수의 출력에 해당한다.
  • 가중치, 임계값 : 프로그래밍으로 마음대로 설정할 수 있다.

따라서, 우리는 가중치와 임계값을 활용하여 AND, NAND, OR을 구현해야한다.

그렇다면 어떻게 구현할까?

 

먼저, AND는 다음과 같은 조건을 가져야 할 것이다.

 

->두개의 입력이 모두 1이 되어야 1을 출력한다.

 

즉, 위에서 표현한 수식을 참고한다면,

-> w1+w2 > theta

-> w1, w2 <= theta

와 같은 방식으로 프로그래밍 하면 될것이다.

 

그렇다면 OR는 입력이 하나만 1이어도 활성화 상태가 되는 것이므로,

-> w1, w2 > theta

와 같은 방식이 되겠다.

 

# AND
def AND(x1, x2):
    w1, w2, theta = 0.5, 0.5, 0.7
    result = x1 * w1 + w2 * x2
    if result < theta:
        print(0)
    else:
        print(1)


print('result AND')
AND(0, 0)
AND(0, 1)
AND(1, 0)
AND(1, 1)


# OR
def OR(x1, x2):
    w1, w2, theta = 0.7, 0.7, 0.4
    result = x1 * w1 + w2 * x2
    if result < theta:
        print(0)
    else:
        print(1)


print('result OR')
OR(0, 0)
OR(0, 1)
OR(1, 0)
OR(1, 1)

위의 내용을 그대로 적용하여 AND와 OR 을 구현해보았다.

 

 

 

그렇다면 NAND는 어떨까?

 

NAND는 AND의 출력에 ! 연산자를 붙이는 것과 같다. 즉 출력값을 뒤집는 것이다.

 

그렇다면 우리는 식의 부호를 전부 뒤집어서 구현하면 해결할 수 있을것이라 생각할 수있다.

 

따라서 다음과 같은 코드가 완성된다.

 

# NAND
def NAND(x1, x2):
    w1, w2, theta = -0.5, -0.5, -0.7
    result = x1 * w1 + w2 * x2
    if result < theta:
        print(0)
    else:
        print(1)


print('result NAND')
NAND(0, 0)
NAND(0, 1)
NAND(1, 0)
NAND(1, 1)

 

가중치와 임계값의 부호를 뒤집어 버리니 반대의 결과가 나왔다. NAND까지 구현에 성공한 것이다.

 

4. XOR 게이트

XOR 게이트는 배타적 논리합이라고 불리는 함수이다.

* XOR

A B Y
0 0 0
0 1 1
1 0 1
1 1 0

입력값이 서로 다를때 1을 출력한다.

1의 갯수가 홀수일 때 1을 출력한다고 해서 홀수함수라고 부르기도 한다.

 

이러한 XOR 함수를 퍼셉트론으로 구하려면 가중치와 임계값을 어떻게 설정해야할까를 고민해보자.

 

OR, XOR의 차이

위의 사진을 살펴보자.

OR과 XOR를 좌표평면에 올려 그려보았다.

 

빨간점은 0을 출력하는 X값의 좌표이고 파란점은 1을 출력하는 X값의 좌표이다.

 

OR의 경우 직선으로 표현이 가능하나, XOR의 경우 곡선을 사용해야만 경계를 나눌 수 있다.

 

이를 선형, 비선형으로 구분한다.

 

 

아쉽게도 퍼셉트론으로만 XOR을 구현하기 힘들다.

따라서 우리는 다른 방법을 찾아볼 것이다.

'old > (old)밑바닥부터 시작하는 딥러닝' 카테고리의 다른 글

3-1. 활성화 함수  (0) 2021.01.08
3. 신경망(1)  (0) 2021.01.07
2. 퍼셉트론(2)  (0) 2021.01.07
1. 헬로 파이썬  (0) 2021.01.01

+ Recent posts