퍼셉트론과 가설공간: 결정경계·XOR·수렴을 기하학으로 이해하기
w·x+b가 만드는 초평면, perceptron update와 LMS의 차이, 선형 분리 수렴 조건, XOR가 은닉층을 요구하는 이유를 코드와 도식으로 정리합니다.
이 글은 공개 1차 문헌을 바탕으로 문장·수식·코드·도식을 새로 작성한 독립 학습 자료입니다. 특정 비공개 자료의 문장이나 그림은 사용하지 않았습니다.
먼저 결론
퍼셉트론은 단순하지만 신경망을 이해하는 데 필요한 핵심 질문을 거의 모두 품고 있습니다.
- 파라미터 w와 b 하나가 입력 공간에 어떤 결정경계를 만드는가?
- 학습은 가능한 경계들의 집합, 즉 가설공간에서 어떤 후보를 고르는가?
- 오분류 하나가 가중치를 어느 방향으로 움직이는가?
- 어떤 조건에서 수렴을 보장하고, 언제 끝없이 흔들리는가?
- XOR처럼 직선 하나로 풀 수 없는 문제는 무엇을 추가해야 하는가?
정답을 “가장 오래된 신경망”이라고 외우는 대신, 선형 score와 geometry, loss와 update, 표현력과 일반화를 연결하는 것이 목표입니다.
1. w·x+b는 숫자이자 기하학이다
d차원 입력 x에 대해 퍼셉트론 score를 다음처럼 둡니다.
s(x) = w · x + b
prediction = +1 if s(x) >= 0
-1 otherwise
s(x)=0인 점들의 집합은 d차원 공간의 (d-1)차원 초평면입니다. 2차원에서는 직선, 3차원에서는 평면입니다. w는 경계에 수직인 normal vector이고, b는 원점에서 경계가 얼마나 이동했는지를 결정합니다.
그림 1. 하나의 w,b가 하나의 선형 decision boundary를 정합니다. 양의 상수로 w,b를 함께 확대해도 경계와 분류 결과는 같으므로 파라미터 표현은 유일하지 않습니다.
편향을 입력에 흡수하면 표기가 간단해집니다.
x_tilde = [x_1, x_2, ..., x_d, 1]
w_tilde = [w_1, w_2, ..., w_d, b]
s(x) = w_tilde · x_tilde
경계까지의 거리와 margin
w가 0이 아닐 때 점 x에서 경계까지의 signed distance는 다음과 같습니다.
distance(x) = (w · x + b) / ||w||
분류 결과는 score의 부호만 보지만, score의 절댓값을 ||w||로 정규화하면 경계에서 얼마나 떨어져 있는지 알 수 있습니다. 학습 데이터가 경계에서 멀리 떨어질수록 작은 perturbation에 덜 민감할 가능성이 큽니다. 이 관점은 maximum-margin classifier인 SVM으로 자연스럽게 이어집니다.
2. 가설공간은 가능한 경계의 집합이다
모델 family가 선형 classifier라면 가설공간 H는 가능한 모든 w,b가 만드는 분류 함수의 집합입니다.
H = { h_(w,b)(x) = sign(w · x + b) | w in R^d, b in R }
학습 알고리즘은 H를 바꾸지 않습니다. Perceptron rule, logistic loss, hinge loss를 쓰더라도 입력 feature가 같고 score가 w·x+b라면 표현 가능한 경계는 여전히 선형입니다. 달라지는 것은 어떤 목적과 경로로 H 안의 후보를 선택하는가입니다.
반대로 feature map phi(x)를 추가하면 가설공간이 바뀝니다.
h(x) = sign(w · phi(x) + b)
원래 공간에서는 곡선인 경계도 확장된 feature 공간에서는 초평면이 될 수 있습니다. 다층 신경망은 phi 자체를 데이터에서 학습하는 방식으로 볼 수 있습니다.
3. AND와 OR는 되고 XOR는 안 되는 이유
0과 1 두 입력의 truth table을 생각해봅니다.
| x1 | x2 | AND | OR | XOR |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 | 1 |
| 1 | 0 | 0 | 1 | 1 |
| 1 | 1 | 1 | 1 | 0 |
AND의 양성 점 (1,1)은 나머지 세 점에서 직선 하나로 떼어낼 수 있습니다. OR의 음성 점 (0,0)도 마찬가지입니다. XOR는 대각선의 두 점이 같은 class이므로 어떤 직선 하나도 두 class를 완전히 분리하지 못합니다.
그림 2. XOR의 한 해법을 논리 조합으로 표현한 개념도입니다. 실제 다층 신경망은 hidden unit의 가중치와 activation을 학습해 유사한 중간 표현을 만듭니다.
중요한 결론은 “퍼셉트론이 약하다”가 아니라 입력 표현과 가설공간이 문제의 구조에 맞아야 한다는 것입니다. 은닉층과 비선형 activation을 넣으면 여러 선형 경계를 조합해 비선형 영역을 표현할 수 있습니다. 비선형 activation 없이 선형층만 여러 개 쌓으면 전체도 다시 하나의 선형변환이므로 XOR를 해결하지 못합니다.
4. Perceptron update는 왜 그 방향인가
라벨을 y_i ∈ {-1,+1}로 두고, y_i(w·x_i+b) <= 0이면 오분류로 판단합니다. 갱신은 다음과 같습니다.
w <- w + eta y_i x_i
b <- b + eta y_i
양성 샘플을 음성으로 잘못 분류했다면 y_i=+1이므로 w를 x_i 방향으로 이동시켜 그 샘플의 score를 높입니다. 음성 샘플을 양성으로 잘못 분류했다면 y_i=-1이므로 반대 방향으로 이동시켜 score를 낮춥니다.
갱신 뒤 해당 샘플의 signed score 변화는 다음과 같습니다.
y_i [(w + eta y_i x_i) · x_i + (b + eta y_i)]
= y_i(w · x_i + b) + eta (||x_i||^2 + 1)
eta가 양수라면 오분류 샘플의 올바른 방향 score를 반드시 증가시킵니다. 다만 한 샘플을 고친 갱신이 다른 샘플을 다시 틀리게 할 수 있으므로 데이터 전체를 여러 epoch 순회합니다.
그림 3. Perceptron은 오분류된 샘플에서만 갱신합니다. 비분리 데이터에서는 오류 0에 도달하지 않을 수 있으므로 최대 epoch와 best-so-far 기준이 필요합니다.
5. 수렴정리가 말하는 것과 말하지 않는 것
학습 샘플의 norm이 R 이하이고, 어떤 단위벡터 w*가 모든 샘플을 margin gamma 이상으로 올바르게 분리한다고 합시다.
||x_i|| <= R
y_i (w* · x_i) >= gamma > 0
편향을 증강 벡터에 포함한 표기에서 perceptron은 최대 대략 (R/gamma)^2번의 오분류 갱신 안에 separator를 찾습니다. 증명의 직관은 두 부등식입니다.
- 오분류 갱신마다 현재 w가 정답 방향 w*로 투영된 값은 적어도 gamma만큼 증가합니다.
- w의 norm 제곱은 각 갱신에서 최대 R^2 정도만 증가합니다.
투영은 갱신 수 M에 비례해 증가하지만 norm은 sqrt(M) 비율로만 커질 수 있으므로, M이 무한히 커질 수 없습니다.
이 정리는 다음을 보장하지 않습니다.
- 데이터가 선형 분리되지 않을 때의 수렴
- 유일한 경계 또는 최대 margin 경계
- 확률로 해석되는 confidence
- test 데이터에서의 일반화 성능
- feature scaling과 순서에 무관한 동일한 결과
비분리 데이터에서는 max epoch, validation 기준, pocket algorithm처럼 지금까지 가장 오류가 적은 파라미터를 저장하는 장치가 필요합니다. 또는 logistic regression이나 soft-margin SVM처럼 모든 샘플에 대해 정의되는 objective를 선택합니다.
6. Perceptron, LMS, logistic regression, SVM 비교
| 방법 | 출력·손실 | 갱신 특성 | 얻는 것 |
|---|---|---|---|
| Perceptron | 오분류 여부 중심 | 오분류에서만 update | 선형 separator |
| LMS/Adaline | 선형 출력의 squared error | 정분류 샘플도 잔차에 따라 update | least-squares 해 |
| Logistic regression | log loss | 모든 샘플이 확률적 손실 기여 | 조건부 확률 모델과 calibration 가능성 |
| Linear SVM | hinge loss + regularization | margin 안쪽 샘플이 기여 | margin을 명시한 선형 경계 |
LMS의 delta rule을 perceptron rule과 같은 것으로 부르면 안 됩니다. LMS는 threshold를 통과한 class 결과가 아니라 threshold 이전의 연속 선형 출력과 target 사이의 제곱오차를 줄입니다. 선형 모델의 squared loss는 convex이지만, 안정적인 step size와 feature scaling은 여전히 중요합니다.
7. 처음부터 구현해 보기
다음 코드는 교육용으로 작성한 작은 구현입니다. label은 -1과 +1을 사용하고, 재현성을 위해 shuffle seed를 고정하며, 비분리 데이터에 대비해 best-so-far 파라미터를 저장합니다.
from dataclasses import dataclass
import numpy as np
@dataclass
class PerceptronResult:
weights: np.ndarray
bias: float
mistakes_by_epoch: list[int]
def fit_perceptron(
x: np.ndarray,
y: np.ndarray,
learning_rate: float = 1.0,
max_epochs: int = 100,
seed: int = 7,
) -> PerceptronResult:
if set(np.unique(y)) - {-1, 1}:
raise ValueError("labels must be -1 or +1")
rng = np.random.default_rng(seed)
w = np.zeros(x.shape[1], dtype=float)
b = 0.0
best_w, best_b = w.copy(), b
best_mistakes = len(y) + 1
history: list[int] = []
for _ in range(max_epochs):
mistakes = 0
for i in rng.permutation(len(x)):
signed_score = y[i] * (x[i] @ w + b)
if signed_score <= 0:
w += learning_rate * y[i] * x[i]
b += learning_rate * y[i]
mistakes += 1
predictions = np.where(x @ w + b >= 0, 1, -1)
epoch_errors = int(np.sum(predictions != y))
history.append(epoch_errors)
if epoch_errors < best_mistakes:
best_mistakes = epoch_errors
best_w, best_b = w.copy(), b
if mistakes == 0:
break
return PerceptronResult(best_w, best_b, history)
이 코드로 실험할 때는 다음을 바꿔봅니다.
- AND, OR, XOR 데이터의 epoch별 오류 수
- feature를 표준화하기 전후의 갱신 수
- 샘플 순서와 seed에 따른 최종 경계
- label noise 한 점을 넣었을 때의 oscillation
- polynomial feature x1*x2를 추가한 XOR 결과
8. 가설공간과 일반화를 연결하기
학습 오류 0은 끝이 아닙니다. 가능한 경계가 여러 개면 알고리즘의 초기값, 샘플 순서, feature scale이 어느 경계를 고르는지에 영향을 줍니다. 다음 질문이 필요합니다.
- 경계가 training point에 지나치게 가까운가?
- 중요한 slice에서 false positive와 false negative 비용이 다른가?
- 입력 범위가 운영에서 벗어나면 score가 어떻게 변하는가?
- 같은 entity가 train/test에 섞여 leakage가 생기지 않았는가?
- threshold를 바꿀 수 있는 확률 또는 calibrated score가 필요한가?
퍼셉트론은 binary decision은 주지만 확률을 주지 않습니다. score가 크다고 확률 0.99라고 해석할 수 없습니다. 확률·비용·threshold 운영이 필요하면 목적함수와 평가 설계를 함께 바꿔야 합니다.
9. 실전에서 단순 선형 모델이 중요한 이유
최신 deep model이 있어도 선형 baseline은 여전히 가치가 큽니다.
- 데이터 sanity check: 간단한 모델도 못 배우면 label·feature·split 오류를 먼저 의심할 수 있습니다.
- 해석 가능한 기준선: feature 기여와 decision boundary를 비교적 직접 확인할 수 있습니다.
- latency와 비용: 매우 작은 memory와 계산량으로 높은 throughput을 냅니다.
- fallback: 복잡한 모델이 timeout·drift·의존성 장애를 겪을 때 제한된 규칙이나 선형 모델로 degrade할 수 있습니다.
- 표현 학습 검증: pretrained embedding 위에 linear probe를 학습해 표현에 정보가 얼마나 선형적으로 드러나는지 측정할 수 있습니다.
단순하다는 것은 자동으로 안전하다는 뜻은 아닙니다. 편향된 label, proxy feature, train-serving skew, 잘못된 threshold는 선형 모델에서도 그대로 문제입니다.
10. 학습 문제
- AND와 OR를 분리하는 w,b를 손으로 하나씩 찾고 모든 점의 signed score를 계산합니다.
- XOR의 네 점을 직선 하나로 분리할 수 없음을 기하학적으로 설명합니다.
- feature phi(x)=[x1,x2,x1*x2]를 만들고 XOR가 선형 분리되는지 확인합니다.
- perceptron과 LMS를 같은 데이터에 학습해 objective와 update trajectory를 그립니다.
- outlier 한 점을 추가해 perceptron, logistic regression, soft-margin SVM의 경계를 비교합니다.
- train error, validation error, margin, calibration이 서로 다른 질문이라는 것을 한 문장씩 정의합니다.
마무리
퍼셉트론의 진짜 학습 포인트는 update 식 하나가 아닙니다. 모델 family가 가설공간을 정하고, 학습 규칙이 그 안에서 후보를 선택하며, 데이터의 분리 가능성과 margin이 수렴을 좌우한다는 구조입니다.
XOR는 단순한 함정 문제가 아니라 표현의 중요성을 보여줍니다. 원래 feature에서 직선 하나로 풀리지 않는다면 더 나은 feature, kernel, 은닉층과 비선형성이 필요합니다. 이 관점은 작은 선형 classifier에서 deep representation learning까지 그대로 이어집니다.