딥러닝 노트

‘밑바닥부터 시작하는 딥러닝’을 공부하며 정리한 내용입니다.

한 개의 퍼셉트론으로 AND, OR, NAND의 연산은 가능하나, XOR은 불가능하다.

1. AND 게이트

AND 게이트의 진리표

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

위의 AND 게이트를 퍼셉트론으로 표현하면 아래와 같습니다. 여기서는 입력값 x1, x2에 각각 가중치 w1, w2를 곱한 값의 합이 theta보다 크면 1을 리턴하도록 되어있습니다.

1
2
3
4
5
6
7
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

w1, w2, theta를 각각 0.5, 0.5, 0.7로 설정하면 위의 진리표와 동일한 입력 및 출력을 확인할 수 있습니다.

1
2
3
4
print(AND(0,0))
print(AND(1,0))
print(AND(0,1))
print(AND(1,1))

0
0
0
1

입력값과 가중치의 곱을 편리하게 하기 위해 데이터 타입을 넘파이 어레이로 바꿉니다. 또한 theta를 -b로 바꿈으로써 바이어스의 의미가 더욱 명확해지도록 합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
# 위의 퍼셉트론에서 배열로 된 가중치, 바이어스 추가
# 밑 위의 식에서 theta를 -b 로 바꿈
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

2. NAND, OR 게이트

위의 AND 게이트와 같은 방식으로 NAND 게이트와, OR 게이트도 만들 수 있습니다.

NAND 게이트의 진리표

x1 x2 y
0 0 1
1 0 1
0 1 1
1 1 0
1
2
3
4
5
6
7
8
9
10
11
def NAND(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

OR 게이트의 진리표

x1 x2 y
0 0 0
1 0 1
0 1 1
1 1 1
1
2
3
4
5
6
7
8
9
10
11
def OR(x1, x2):
    x = np.array([x1, x2])
    w = np.array([0.5, 0.5])
    b = -0.2

    tmp = np.sum(w*x) + b

    if tmp <= 0:
        return 0
    else:
        return 1

3. XOR 게이트

XOR 게이트의 진리표

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

한 개의 퍼셉트론으로는 XOR 게이트를 표현하는 것이 불가능합니다. 하지만 다층 퍼셉트론을 이용하면 XOR을 표현할 수 있습니다.

입력 값(x1, x2)을 NAND와 XOR게이트에 넣고, 두 게이트의 출력 값(s1, s2)을 AND 게이트의 입력 값으로 넣으면 아래의 진리표와 같이 XOR 게이트를 표현할 수 있습니다.

x1 x2 s1 s2 y
0 0 1 0 0
1 0 1 1 1
0 1 1 1 1
1 1 0 1 0

파이썬으로 구현하면 아래와 같습니다.

1
2
3
4
5
6
# AND, NAND, OR 게이트 조합하여 XOR Gate 구하기
def XOR(x1, x2):
    s1 = NAND(x1, x2)
    s2 = OR(x1, x2)
    y = AND(s1, s2)
    return y

1
2
3
4
print(XOR(0,0))
print(XOR(1,0))
print(XOR(0,1))
print(XOR(1,1))

0
1
1
0