while (1): study();

Ch2. 퍼셉트론 본문

독서

Ch2. 퍼셉트론

전국민실업화 2021. 7. 18. 01:43
728x90

* 책 내용 요약이 아니니 유의하시기 바랍니다.

Perceptron

 퍼셉트론은 딥러닝의 근간을 이루고 있는 중요한 아키텍처입니다. 마치 저항이 전류의 흐름을 조절하듯이, 각 노드의 가중치는 신호의 강도를 조절합니다. 이 신호가 임계치(Threshold)를 넘냐 마냐에 따라 퍼셉트론은 0 혹은 1의 값을 출력합니다. 이를 수식으로 표현하면 다음과 같습니다.

Perceptron

 퍼셉트론 구조를 통해 주요한 논리연산자 중 AND, NAND, OR 관계를 표현할 수 있습니다.

1. AND 게이트

x1 x2 y
0 0 0
1 0 0
0 1 0
1 1 1

 위 진리표를 조건으로 바꾸어보면 다음과 같습니다. 즉 다음 조건을 만족하는 모든 파라미터는 AND 게이트를 구성할 수 있습니다.

AND gate

2. NAND 게이트

 같은 방식으로 진리표를 조건식으로 치환하면 다음과 같이 표현됩니다.

NAND gate - 1

 다만 실제 구현을 할 때에는 단순히 AND의 판별식에 -1을 곱해주는 식으로 계산되기 때문에, 한 가지 더 조건이 추가되어야 시스템의 정합성을 보장할 수 있습니다.

NAND gate - 2

3. OR 게이트

OR gate

4. XOR 게이트

 단층 퍼셉트론은 AND, NAND, OR와 같은 선형적 관계에 대해 충분히 표현할 수 있지만, XOR과 같은 비선형 관계에 대해서는 표현할 수가 없습니다. 따라서 여러 개의 단층 퍼셉트론을 겹친 형태인 다층 퍼셉트론이 등장합니다. 다층 퍼셉트론은 단층 퍼셉트론의 출력층에 존재하는 비선형 함수를 여러번 중첩시켜 어떤 비선형 형태의 분포라도 표현할 수 있게 됩니다(Global Approximation Theorem). XOR 게이트는 다음과 같이 구현할 수 있습니다.

XOR gate

 

이를 바탕으로 퍼셉트론을 하나의 객체로 구현해 보겠습니다.

import sys
import numpy as np


def print_result(model):
    print('=' * 10, 'AND', '=' * 10)
    for i in range(2) :
        for j in range(2) :
            print(model.AND(i, j))

    print('=' * 10, 'NAND', '=' * 10)
    for i in range(2) :
        for j in range(2) :
            print(model.AND(i, j, True))

    print('=' * 10, 'OR', '=' * 10)
    for i in range(2) :
        for j in range(2) :
            print(model.OR(i, j))

    print('=' * 10, 'XOR', '=' * 10)
    for i in range(2) :
        for j in range(2) :
            print(model.XOR(i, j))

class Perceptron:
    def __init__(self, threshold=-0.7):
        assert threshold <= 0
        self.b = threshold

    def AND(self, x1, x2, negative=False):
        x = np.array([x1, x2])
        w = np.array([.5, .5])

        alpha = -1 if negative else 1
        return 1 if alpha * (np.sum(w * x) + self.b) > 0 else 0


    def OR(self, x1, x2):
        x = np.array([x1, x2])
        w = np.array([1., 1.])
        return 1 if np.sum(w * x) + self.b > 0 else 0

    def XOR(self, x1, x2):
        return self.AND(self.AND(x1, x2, negative=True), self.OR(x1, x2))


if __name__ == '__main__':
    try:
        threshold = -float(sys.argv[1])
    except:
        threshold = -float(.7)


    model = Perceptron(threshold)
    print_result(model)

 print_result 함수를 통해 앞서 언급한 4가지 연산의 결과를 바로바로 확인할 수 있습니다. 만약 임계치가 가중치와 같아지면 AND와 NAND의 결과가 어떻게 변하는지가 주요 포인트인 듯 합니다.

728x90

'독서' 카테고리의 다른 글

Ch7. 합성곱 신경망  (0) 2021.07.22
Ch6. 학습 관련 기술들  (0) 2021.07.21
Ch5. 오차역전파법  (0) 2021.07.19
Ch4. 신경망 학습  (0) 2021.07.18
Ch3. 신경망  (0) 2021.07.18
Comments