데이터/딥러닝

[모두의 딥러닝] Chapter 3 | 신경망의 이해 - MLP

만서다 2023. 2. 4. 16:14

8. 다층 퍼셉트론(MLP)


8.1 다층 퍼셉트론의 등장 

  • XOR 문제를 극복하기 위해 퍼셉트론 두 개를 각각 처리하는 은닉층(hidden layer)을 만드는 기발한 아이디어 착안
  • 은닉층을 도입함으로써 구하고자 하는 출력값을 얻을 수 있게 됨

 

  1. x1, x2를 두 연산으로 각각 전달
  2. 첫 번째 연산에서는 NAND 처리 
  3. 두 번째 연산에서는 OR 처리 
  4. 2,3을 통해 구한 결괏값으로 AND 처리

8.2 다층 퍼셉트론의 설계

 

  • 점선으로 표시한 부분이 은닉층
  • x1, x2에 가중치(w)를 곱하고 바이어스(b)의 합한 결과 값이 모이는 곳이 노드(node)
  • 은닉층에 취합된 값은 활성화 함수(ex. 시그모이드)를 통해 다음 노드로 전달됨

  • 두 식의 결괏값이 출력층 방향으로 보내지고, 마찬가지로 활성화 함수를 사용해 y 예측 값을 정하게 됨

  • 가중치(w)와 바이어스(b) 값은 2차원 배열로 다음과 같이 표현 가능 


8.3 XOR 문제의 해결 

  • 각 변수의 값을 정하고 x1, x2 값을 입력하면 원하는 y값이 도출되는 것을 확인


8.4 코딩으로 XOR 문제 해결하기

import numpy as np

# 가중치와 바이어스
w11 = np.array([-2, -2])
w12 = np.array([2, 2])
w2 = np.array([1, 1])
b1 = 3
b2 = -1
b3 = -1

# 퍼셉트론
def MLP(x, w, b):
    y = np.sum(w * x) + b
    if y <= 0:
        return 0
    else:
        return 1

# NAND 게이트
def NAND(x1,x2):
    return MLP(np.array([x1, x2]), w11, b1)

# OR 게이트
def OR(x1,x2):
    return MLP(np.array([x1, x2]), w12, b2)

# AND 게이트
def AND(x1,x2):
    return MLP(np.array([x1, x2]), w2, b3)

# XOR 게이트
def XOR(x1,x2):
    return AND(NAND(x1, x2),OR(x1,x2))


# x1, x2 값을 번갈아 대입해 가며 최종 값 출력
for x in [(0, 0), (1, 0), (0, 1), (1, 1)]:
    y = XOR(x[0], x[1])
    print("입력 값: " + str(x) + " 출력 값: " + str(y))
    
[output]
입력 값: (0, 0) 출력 값: 0
입력 값: (1, 0) 출력 값: 1
입력 값: (0, 1) 출력 값: 1
입력 값: (1, 1) 출력 값: 0