퍼셉트론으로 AND·OR 게이트 만들고 Python으로 구현하기

가중치와 편향 값을 직접 대입해 AND·OR 게이트를 계산하고, XOR이 왜 막히는지, Python 구현 코드까지 손으로 따라가며 퍼셉트론을 정리한다.

2026-08-13 · 최초 발행 2025-05-23

1957년 프랭크 로젠블랫이 만든 퍼셉트론은 생물학적 뉴런의 동작을 단순화한 모델이다. 입력에 가중치를 곱해 더하고 편향을 얹은 뒤 활성화 함수를 통과시키는 것이 전부지만, 이 단순한 규칙만으로 AND·OR 같은 논리 게이트를 그대로 재현할 수 있다.

w₁w₂wₙx₁Σx₂xₙbias활성화 함수출력

입력 데이터(x₁, x₂, ..., xₙ)를 각각의 가중치(w₁, w₂, ..., wₙ)와 곱한 뒤 편향을 더해 z = w₁x₁ + w₂x₂ + ... + wₙxₙ + b를 계산하고, 활성화 함수를 통해 최종 출력 y = f(z)를 결정한다. 초기 퍼셉트론은 단순 계단 함수(Step Function)를 활성화 함수로 썼다 — f(z) = 1 (z ≥ 0일 때), f(z) = 0 (z < 0일 때).

AND 게이트를 손으로 계산해보면

두 입력이 모두 1일 때만 1을 출력하는 AND 게이트는 가중치 w₁=1, w₂=1, 편향 b=-1.5로 구현된다. 출력은 y = f(w₁x₁ + w₂x₂ + b)다.

  • x₁=0, x₂=0일 때: 0×1 + 0×1 - 1.5 = -1.5 < 0 → 출력 0
  • x₁=1, x₂=0일 때: 1×1 + 0×1 - 1.5 = -0.5 < 0 → 출력 0
  • x₁=0, x₂=1일 때: 0×1 + 1×1 - 1.5 = -0.5 < 0 → 출력 0
  • x₁=1, x₂=1일 때: 1×1 + 1×1 - 1.5 = 0.5 > 0 → 출력 1

OR 게이트는 편향 하나만 바뀐다

두 입력 중 하나라도 1이면 1을 출력하는 OR 게이트는 가중치는 그대로(w₁=1, w₂=1) 두고 편향만 b=-0.5로 바꾼다.

  • x₁=0, x₂=0일 때: 0×1 + 0×1 - 0.5 = -0.5 < 0 → 출력 0
  • x₁=1, x₂=0일 때: 1×1 + 0×1 - 0.5 = 0.5 > 0 → 출력 1
  • x₁=0, x₂=1일 때: 0×1 + 1×1 - 0.5 = 0.5 > 0 → 출력 1
  • x₁=1, x₂=1일 때: 1×1 + 1×1 - 0.5 = 1.5 > 0 → 출력 1

XOR에서 막히는 이유

두 입력이 서로 다를 때만 1을 출력하는 XOR(배타적 논리합) 게이트는 다음 진리표를 갖는다.

x₁=0, x₂=0 → 출력 0
x₁=1, x₂=0 → 출력 1
x₁=0, x₂=1 → 출력 1
x₁=1, x₂=1 → 출력 0

이 문제는 단일 퍼셉트론으로는 해결할 수 없는데, 입력값을 하나의 직선으로 분리할 수 없기 때문이다.

XOR 문제의 시각화0,0: 출력 01,0: 출력 11,1: 출력 00,1: 출력 1

다층 퍼셉트론이 여는 길

XOR 문제의 한계를 극복하기 위해 다층 퍼셉트론(Multi-Layer Perceptron, MLP)이 등장했다. 여러 층의 퍼셉트론을 쌓아 비선형 문제를 해결할 수 있다.

출력층은닉층입력층x₁x₂은닉 뉴런 1은닉 뉴런 2출력

이렇게 다층 구조로 구성하면 XOR 같은 비선형 문제도 해결할 수 있다. 다층 퍼셉트론에서는 일반적으로 시그모이드(Sigmoid)나 ReLU와 같은 비선형 활성화 함수를 쓴다.

가중치는 이렇게 갱신된다

퍼셉트론은 다음 알고리즘으로 가중치를 갱신하며 학습한다. 먼저 가중치(w)와 편향(b)을 초기화한다. 각 학습 데이터 (x, d)에 대해 퍼셉트론의 출력 y = f(w·x + b)를 계산하고, 가중치를 w ← w + α(d - y)x로, 편향을 b ← b + α(d - y)로 업데이트한다. 오류가 충분히 작아지거나 최대 반복 횟수에 도달할 때까지 이 과정을 반복한다. 여기서 α는 학습률(learning rate)이며, d는 원하는 출력값(target)이다.

Python으로 직접 구현하기

import numpy as np

class Perceptron:
    def __init__(self, learning_rate=0.01, n_iterations=1000):
        self.learning_rate = learning_rate
        self.n_iterations = n_iterations
        self.weights = None
        self.bias = None

    def fit(self, X, y):
        n_samples, n_features = X.shape
        self.weights = np.zeros(n_features)
        self.bias = 0

        for _ in range(self.n_iterations):
            for idx, x_i in enumerate(X):
                linear_output = np.dot(x_i, self.weights) + self.bias
                y_pred = 1 if linear_output >= 0 else 0

                # 가중치 업데이트
                update = self.learning_rate * (y[idx] - y_pred)
                self.weights += update * x_i
                self.bias += update

    def predict(self, X):
        linear_output = np.dot(X, self.weights) + self.bias
        return np.where(linear_output >= 0, 1, 0)

# AND 게이트 학습 예시
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([0, 0, 0, 1])  # AND 게이트 출력

perceptron = Perceptron()
perceptron.fit(X, y)

print("가중치:", perceptron.weights)
print("편향:", perceptron.bias)
print("예측 결과:", perceptron.predict(X))

MNIST 픽셀부터 대출 승인까지

단순 퍼셉트론은 기초적인 이미지 분류 작업에도 쓸 수 있다. 28×28 픽셀의 MNIST 손글씨 숫자 데이터셋에서는 각 픽셀이 하나의 입력으로 작용해 입력 특성이 784개(28×28 픽셀)가 되고, 출력은 0~9 숫자 분류가 된다. 더 복잡한 이미지 분류는 다층 퍼셉트론이나 CNN(Convolutional Neural Network)을 쓴다.

신용 승인 여부, 이메일 스팸 필터링 등 기본적인 이진 분류 문제에도 퍼셉트론을 활용할 수 있다. 예를 들어 주택 대출 승인 시스템은 소득, 신용 점수, 부채, 고용 기간 등을 입력으로 받아 승인(1) 또는 거부(0)를 출력한다.

지금 쓰이는 신경망들의 출발점

퍼셉트론은 현대 딥러닝의 기초가 됐다. 단일 퍼셉트론에서 다층 퍼셉트론(MLP)으로, 역전파(Backpropagation) 알고리즘의 발명을 거쳐 컨볼루션 신경망(CNN)·순환 신경망(RNN) 같은 특수 구조로, 다시 트랜스포머(Transformer)와 대규모 언어 모델(LLM)로 이어졌다. 오늘날의 복잡한 신경망 구조도 기본적으로는 이 퍼셉트론의 개념을 확장한 것이다.

퍼셉트론논리게이트XOR문제다층퍼셉트론Python구현