Python으로 퍼셉트론을 처음부터 만들기
퍼셉트론: 신경망의 기초
퍼셉트론은 가능한 가장 단순한 인공 뉴런으로, 모든 현대 신경망의 기본 구성 요소 역할을 합니다. 핵심적으로 퍼셉트론은 입력을 받아 가중치와 편향을 적용한 뒤, 결과가 특정 임계값을 초과하는지 여부에 따라 이진(예/아니오) 출력을 생성합니다.
퍼셉트론이 결정을 내리는 방식
퍼셉트론은 선형 분류기로 작동합니다. 입력들의 가중합을 계산하고 편향을 더해 출력을 결정합니다. 이 결정의 수학적 표현은 다음과 같습니다:
output = 1 if (weight * input + bias) > 0 else 0
가중치의 역할
가중치는 특정 입력의 중요성을 나타냅니다. 실제 상황에서 사람이 직업 제안을 받아들일지 결정할 때, "추가 급여"를 "통근 거리"보다 더 크게 고려할 수 있습니다. 퍼셉트론에서는 가중치가 입력 값을 곱해 최종 결정에 대한 영향을 증폭하거나 감소시킵니다.
편향의 역할
편향은 결정 경계가 원점(0)에서 벗어나 이동하도록 합니다. 편향이 없으면 결정 경계가 0에 고정되어, 머신은 자연스럽게 0 지점에서만 데이터를 분류할 수 있습니다.
예를 들어, 머신이 학생이 시험에 합격했는지 판단하도록 할 때(합격 점수가 50점이라고 가정), 편향이 없는 퍼셉트론은 경계를 50점으로 이동시킬 수 없기 때문에 실패합니다; 모든 학생을 합격 혹은 불합격으로 표시하게 됩니다. 편향은 경계를 좌우로 이동시켜, 임계값이 어디에 있든 퍼셉트론이 데이터를 맞출 수 있게 합니다.
학습 과정: 퍼셉트론 훈련
퍼셉트론은 훈련 중 발생한 오류를 기반으로 가중치와 편향을 반복적으로 조정함으로써 학습합니다. 이 과정은 세 가지 핵심 요소를 포함합니다:
1. 오류 계산
퍼셉트론이 실제 결과와 다른 예측을 할 때, 오류가 계산됩니다:
error = result - prediction
2. 가중치와 편향 업데이트
머신은 오류를 감소시키는 방향으로 가중치와 편향을 "조정"합니다:
weight += learning_rate * error * inputbias += learning_rate * error
3. 에포크와 학습률
- Epochs(에포크): 하나의 에포크는 전체 훈련 데이터셋을 한 번 완전히 통과하는 것을 의미합니다. 머신은 한 번의 통과만으로 완벽한 경계를 찾는 경우가 드물기 때문에 여러 에포크가 필요합니다.
- Learning Rate(학습률): 각 업데이트 시 조정 크기를 결정하는 스칼라값입니다. 학습률이 너무 높으면 모델이 최적 경계를 초과해버릴 수 있고, 너무 낮으면 훈련이 지나치게 느려집니다.
데이터 정규화
정규화는 입력 데이터를 작은 일관된 범위(예: 0~1)로 스케일링하는 과정입니다. 이는 두 가지 이유로 중요합니다:
- Stability(안정성): 큰 입력값은 가중치 업데이트에 큰 변동을 일으켜, 정확도가 "오르락내리락"하는 불안정한 훈련을 초래할 수 있습니다.
- Feature Parity(특징 균형): 서로 다른 스케일의 여러 입력(예: 수천 단위 급여와 위치를 나타내는 0/1 이진값)을 다룰 때, 정규화는 큰 숫자가 작은, 더 중요한 특징을 압도하지 않도록 보장합니다.
Python 구현
아래는 숫자가 양수인지 여부를 분류하도록 설계된 단일 입력 퍼셉트론의 완전한 구현 예시입니다.
import random
learning_rate = 0.1
EPOCHS = 100
weight = random.uniform(-1, 1)
bias = random.uniform(-1, 1)
# positive numbers are True, negative numbers are False
data = [(i * 0.1, True) for i in range(1, 501)]
data += [(i * 0.1, False) for i in range(-500, 0)]
random.shuffle(data)
for epoch in range(EPOCHS):
for value, result in data:
prediction = (weight * value + bias) > 0
if prediction != result:
error = result - prediction # +1 or -1
weight += learning_rate * error * value
bias += learning_rate * error
decision_boundary = -bias / weight
print(f"weight = {weight:.3f}")
print(f"bias = {bias:.3f}")
print(f"decision boundary = {decision_boundary:.3f}")
커뮤니티 인사이트 및 확장
단일 입력 퍼셉트론은 강력한 교육 도구이지만, 커뮤니티 논의에서는 이러한 개념을 확장하는 여러 방법을 강조합니다:
- Hardware Implementation(하드웨어 구현): 역사적으로 초기 머신러닝은 하드웨어로 구현되었습니다. 일부 사용자는 ADALINE과 같은 초기 네트워크가 물리적으로 구축되었다고 언급했으며, 오늘날에는 이러한 "작은 뇌"를 브레드보드에 op-amp를 사용해 만들 수 있습니다.
- Multi-Input Perceptrons(다중 입력 퍼셉트론): 단일 입력 퍼셉트론은 1차원 선에만 제한됩니다. 실제 응용에서는 여러 특징에 대해 가중합을 계산하는 다중 입력 퍼셉트론을 사용합니다:
weighted_sum = bias + sum(input[i] * weight[i]) - Scaling to Neural Networks(신경망으로 확장): 단일 퍼셉트론은 선형적으로 구분 가능한 문제만 해결할 수 있습니다(하나의 직선만 그릴 수 있음). 이러한 뉴런을 층으로 쌓을 때 딥러닝으로 전환되며, 네트워크는 복잡하고 비선형적인 형태와 패턴을 학습할 수 있게 됩니다.