아무것도 모르는 공대생의 지식 탐험기
모두의 딥러닝 6일차 (Ch 08) 본문
다층 퍼셉트론
1. 다층 퍼셉트론의 등장
단층 퍼셉트론은 선형적으로 분리 가능한 문제를 해결할 수 있지만, XOR 문제와 같은 비선형 문제는 해결할 수 없다. XOR 문제를 해결하기 위해서는 좌표 평면 자체를 변형하거나, 추가적인 연산을 수행하는 구조가 필요하다. 이를 해결하기 위해 다층 퍼셉트론(Multi-layer Perceptron, MLP)이 등장했다.
다층 퍼셉트론이 필요한 이유
- 단층 퍼셉트론은 직선 하나로 데이터를 구분하는 선형 분류만 가능하다.
- XOR 문제는 하나의 직선으로 데이터를 나눌 수 없는 비선형 문제이다.
- 다층 퍼셉트론은 은닉층(Hidden Layer)을 추가하여 데이터를 변형하고, 기존의 좌표 평면을 새로운 공간으로 매핑하여 문제를 해결한다.
2. 다층 퍼셉트론의 설계
다층 퍼셉트론의 핵심은 입력층(Input Layer)과 출력층(Output Layer) 사이에 은닉층(Hidden Layer)을 추가하는 것이다. 이를 통해 입력 데이터를 가공하여 비선형적인 문제도 해결할 수 있다.
다층 퍼셉트론의 구조
- 입력층(Input Layer): 입력 데이터를 받는 층
- 은닉층(Hidden Layer): 입력 데이터를 조합하여 새로운 특징(feature)을 만드는 층
- 출력층(Output Layer): 최종적으로 분류된 데이터를 출력하는 층
은닉층은 단순한 계산을 넘어 입력 데이터를 변형하고 가공하는 역할을 한다. XOR 문제에서는 이 은닉층이 좌표 공간을 변형해 기존에는 하나의 직선으로 나눌 수 없던 데이터를 분리 가능하게 만든다.
XOR 문제 해결을 위한 다층 퍼셉트론
XOR 문제를 해결하기 위해서는 두 개의 퍼셉트론이 동시에 작동해야 한다. 각각의 퍼셉트론이 입력값을 가공하여 새로운 특징을 생성하고, 이 결과를 결합해 최종 출력을 만들어낸다.
- 첫 번째 퍼셉트론(NAND 게이트 역할): 입력값을 가공하여 하나의 중간 결과를 생성
- 두 번째 퍼셉트론(OR 게이트 역할): 입력값을 다시 가공하여 새로운 중간 결과를 생성
- 최종 퍼셉트론(AND 게이트 역할): 두 개의 중간 결과를 결합하여 최종 XOR 값을 도출
이 과정에서 비선형 활성화 함수(Sigmoid, ReLU 등)을 사용하면 더욱 복잡한 문제를 해결할 수 있다.
3. XOR 문제의 해결
XOR 문제를 해결하기 위해 다층 퍼셉트론을 적용하면, 기존의 단층 퍼셉트론으로는 해결할 수 없었던 문제를 해결할 수 있다. XOR 문제를 다층 퍼셉트론을 이용해 해결하는 과정은 다음과 같다.
XOR 문제 해결을 위한 논리 게이트 구성
XOR 문제를 해결하기 위해 NAND, OR, AND 게이트를 결합하여 최종적인 XOR 연산을 수행한다.
x1 | x2 | and | nand | or | xor |
0 | 0 | 0 | 1 | 0 | 0 |
0 | 1 | 0 | 1 | 1 | 1 |
1 | 0 | 0 | 1 | 1 | 1 |
1 | 1 | 1 | 0 | 1 | 0 |
이제 이 논리를 코드로 구현하여 XOR 문제를 해결할 수 있다.
4. 코딩으로 XOR 문제 해결하기
XOR 문제를 해결하기 위해 다층 퍼셉트론의 개념을 적용한 코드를 작성한다.
1. 가중치와 바이어스 선언
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
2. 퍼셉트론 함수
# 퍼셉트론 함수
def MLP(x, w, b):
y = np.sum(w * x) + b
return 1 if y > 0 else 0
3. 논리 게이트 함수 정의
# 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))
4. 결과 출력
# x1, x2 값을 번갈아 대입하며 최종 값 출력
for x in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y = XOR(x[0], x[1])
print("입력 값:", x, "출력 값:", y)
✅ 실행 결과
입력 값: (0, 0) 출력 값: 0
입력 값: (1, 0) 출력 값: 1
입력 값: (0, 1) 출력 값: 1
입력 값: (1, 1) 출력 값: 0
5. 결론
다층 퍼셉트론은 입력층과 출력층 사이에 은닉층을 추가하여 XOR과 같은 비선형 문제를 해결할 수 있도록 설계된 신경망 모델이다. 기존 단층 퍼셉트론이 해결하지 못했던 XOR 문제를 은닉층을 추가하여 논리 게이트의 조합으로 해결할 수 있음을 확인했다.
이러한 다층 퍼셉트론의 개념은 이후 인공 신경망과 딥러닝의 핵심 구조로 발전하였으며, 복잡한 데이터 패턴을 학습하고 예측하는 데 중요한 역할을 한다.