Perceptron (퍼셉트론)

3단 분석법

순서
분석
단어
내용
1
정의
퍼셉트론
ANN의 기본 단위로, 입력값을 weight(가중치)와 함께 처리하여 단일 출력을 생성하는 선형 이진 분류기
2
알아야하는 이유
퍼셉트론
단순한 구조와 학습 규칙을 통해 이진 분류 문제를 해결하고, 더 복잡한 Neural Network(신경망)의 기초를 제공하기 위해서
3
사용 방법
퍼셉트론
입력 데이터를 받아 weight(가중치)를 곱한 후 합산하고, 활성화 함수를 통해 출력값을 결정하며, 학습 과정을 통해 weight(가중치)를 조정

정의

퍼셉트론
ANN의 기본 단위로, 입력값을 weight(가중치)와 함께 처리하여 단일 출력을 생성하는 선형 이진 분류기
퍼셉트론(Perceptron)은 ANN(Artificial Neural Network)의 기본 단위로, 입력값을 weight(가중치)와 함께 처리하여 단일 출력을 생성하는 선형 이진 분류기입니다.
쉽게 말하자면 ANN에서 ‘함수 내부에 조건문이 있는 함수’ 이라고 설명할 수 있겠습니다.
퍼셉트론은 인간의 뇌의 뉴런이라고 생각하면 됩니다.
뉴런은 dendrites로 모든 신호를 받고, cell body에서 신호를 모아 axon으로 신호가 잘 이동할 수 있도록 하고, axon terminals를 통해 다음 뉴런으로 신호를 전달하는 구조를 가지고 있습니다.
퍼셉트론은 바로 이 뉴런에서 일어나는 과정을 인공적으로 모델링한 인공 뉴런입니다.
dendrites, cell body, axon, axon terminals 같은 것들은 모르셔도 됩니다! 그냥 “이런 느낌이구나”정도로 이해하고 넘어가시면 됩니다.
퍼셉트론은 weighted sum(가중합)과 activation function(활성화 함수)로 구성되어 있습니다.
가중합을 계산하기 위해선 Input(입력값), weight(가중치), bias(편향)이 필요합니다.
입력값과 weight의 곱을 합산한 후, bias을 더 하고, 이 합을 activation function에 통과시켜 최종 출력값을 생성합니다.
이 출력은 활성화 함수에 의해 특정 범위 내의 값으로 표현됩니다. 이진 분류 문제의 경우, 출력값은 주로 0 또는 1과 같은 이진값으로 해석됩니다.
단일 퍼셉트론에서는 주로 이진값을 출력하지만, 다층 퍼셉트론(MLP)에서는 활성화 함수에 따라 연속적인 값을 출력할 수도 있습니다.
퍼셉트론은 가중합(시그마, Σ)과 활성화 함수로 이루어져있고, 이 퍼셉트론이 여러 층으로 모여있는 것을 다층 퍼셉트론(MLP)이라고 합니다.
가중합이 뭔가요?
가중합은 입력 값과 해당 가중치를 곱한 후 그 결과값들을 모두 더한 것입니다.
*중요* 단층 퍼셉트론에도 활성화함수가 있는데, 그러면 비선형 그래프로 그려주는 거 아닌가요?
단층 퍼셉트론과 다층 퍼셉트론에서 사용되는 활성화 함수의 종류는 다를 수 있습니다.
단층 퍼셉트론에서는 일반적으로 계단 함수(Step Function)를 사용합니다. 계단 함수는 출력이 특정 임계값을 넘으면 1, 그렇지 않으면 0을 반환합니다. 즉, 선형 결정 경계를 그리게 됩니다.
다층 퍼셉트론에서는 시그모이드(Sigmoid), ReLU, 하이퍼볼릭 탄젠트(Tanh) 등 다양한 활성화 함수를 사용합니다. 이 활성화 함수들은 비선형성을 도입하여 비선형 결정 경계를 형성할 수 있게 하므로, 비선형 활성화 함수라고 부릅니다.
이진분류문제와 선형 결정 경계가 무엇인가요?
‘이진 분류 문제’라는 것은 주어진 데이터 포인트들을 두 개의 클래스로 나누는 문제를 의미합니다. 아래 그림에서 보신 것처럼, 각 사분면에서의 데이터 포인트들을 선으로 나누는 것은 이진 분류 문제의 일환입니다. 이진 분류 문제에서는 두 클래스가 선형 또는 비선형 방식으로 분리될 수 있습니다. 선형 결정 경계는 선형으로된 0과 1을 구분하는 경계(선)입니다.
AND 게이트 (노란색은 0의 영역, 핑크색은 1의 영역)
그러면 다층 퍼셉트론에서도 2진 분류가 되나요?
2진 분류가 되고, 특히 다중 클래스 분류도 됩니다. 아래 그림과 같이 선으로 3개의 클래스를 구분할 수 있습니다.

weight

순서
분석
단어
내용
1
일반 명사
Weight
무게, 체중
2
고유 명사
Weight
입력 값이 결과에 얼마나 영향을 미치는지 조절하는 값
3
사용 이유
Weight
입력 값이 결과에 얼마나 영향을 미치는지 조절하는 값입니다. 가중치는 모델이 각 입력의 중요도를 파악하여, 더 적절한 예측을 할 수 있도록 도와줍니다.
4
사용 방법
Weight
각 입력과 해당 가중치를 곱한 후, 모든 곱셈 결과를 합산합니다. 이 값에 편향을 더한 후, 활성화 함수를 적용하여 최종 출력을 생성합니다.

Bias

순서
분석
단어
내용
1
일반 명사
Bias
편견, 편향
2
고유 명사
Bias
가중치와는 별개로 결과에 추가적으로 영향을 줄 수 있는 값입니다. 예를 들어, 기본 값을 설정하는 역할을 합니다.
3
사용 이유
Bias
가중치와는 별개로 결과에 추가적인 조정을 할 수 있는 값입니다. 편향은 모든 입력 값이 0일 때도 모델이 올바른 출력을 할 수 있게 도와줍니다.
4
사용 방법
Bias
가중치로 조절된 결과에 추가로 더해지는 값입니다.
bias(편향)이 꼭 필요한가요?
과거에는 컴퓨팅 파워가 좋지 않아 학습 시간이 너무 오래 걸렸기 때문에, 바이어스 값이 통해 좀 더 빠르게 억지로 학습이 되도록 값을 조정하였습니다.
하지만, 컴퓨팅 파워가 좋아지고, 발전한 기술들을 통해 충분한 학습이 가능하기 때문에 요즘엔 bias를 임의로 조정하는 경우가 많이 줄었습니다.

알아야하는 이유

퍼셉트론
단순한 구조와 학습 규칙을 통해 이진 분류 문제를 해결하고, 더 복잡한 Neural Network(신경망)의 기초를 제공하기 위해서
이유
설명
단순한 구조
퍼셉트론은 매우 간단한 구조를 가지고 있어 이해하기 쉽고 구현하기 용이합니다. 이는 Neural Network의 기본 개념을 배우는 데 중요한 역할을 합니다.
이진 분류 문제 해결
퍼셉트론은 이진 분류 문제를 해결하는 데 효과적입니다. 예를 들어, 스팸 이메일 분류, 고양이와 개 이미지 분류 등 두 개의 클래스 중 하나로 데이터를 분류하는 문제에 사용될 수 있습니다.
더 복잡한 신경망의 기초 제공
퍼셉트론은 다층 퍼셉트론(MLP)이나 심층 신경망(DNN)과 같은 더 복잡한 Neural Network 구조의 기본 단위로 사용됩니다. 이러한 복잡한 구조는 퍼셉트론의 기본 원리를 확장하여 더 복잡한 문제를 해결할 수 있습니다.

사용 방법

퍼셉트론
입력 데이터를 받아 weight(가중치)를 곱한 후 합산하고, 활성화 함수를 통해 출력값을 결정하며, 학습 과정을 통해 weight(가중치)를 조정

AND 연산

AND 연산자는 퍼셉트론이 어떻게 입력값을 받아서 출력값을 결정하는지 보여주는 좋은 예이기에 AND 연산자로 퍼셉트론으로 설명해보도록 하겠습니다.
입력1
입력2
출력
0
0
0
0
1
0
1
0
0
1
1
1

1. 입력 데이터와 출력 데이터 정의

import numpy as np inputs = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) outputs = np.array([0, 0, 0, 1])
Python
복사
inputs는 AND 게이트의 입력 데이터입니다. AND 게이트의 특성상 두 입력 모두 1일 때만 출력이 1이 됩니다.
outputs는 각 입력에 대한 AND 게이트의 출력 결과를 나타냅니다.

2. 가중치와 편향 초기화

weights = np.random.rand(2) bias = np.random.rand(1)
Python
복사
weights는 두 개의 가중치를 랜덤으로 초기화한 것입니다.
bias는 하나의 편향 값을 랜덤으로 초기화한 것입니다.
설명

3. 학습률과 에포크 설정

learning_rate = 0.1 epochs = 20
Python
복사
learning_rate는 학습률을 나타내며, 가중치와 편향을 얼마나 크게 업데이트할지 결정합니다.
epochs는 학습을 몇 번 반복할지를 나타냅니다.
1. 학습률은 무엇인가요? 2. 또한 왜 10%로 해놨나요? 3. 일반적으로는 학습률을 얼마나 해놓나요?
1. 학습률은 머신러닝 알고리즘에서 가중치와 편향을 업데이트할 때 사용하는 크기를 결정하는 하이퍼파라미터입니다. 구체적으로는, 각 학습 단계에서 오차(에러)로부터 가중치와 편향을 얼마나 변경할지를 결정합니다.
2.
또한 학습률(learning rate)을 0.1(10%)로 설정한 이유는 학습 과정에서 가중치와 편향을 업데이트할 때, 한 번의 학습에서 변화의 크기를 조절하기 위해서입니다.
0.1이라는 학습률은 다음과 같은 장점을 제공합니다:
안정적 학습: 학습률이 너무 높으면 가중치와 편향이 급격하게 변화하여 모델이 수렴하지 못할 수 있습니다. 반대로 학습률이 너무 낮으면 학습 속도가 느려질 수 있습니다. 0.1은 비교적 보수적인 값으로, 모델이 안정적으로 학습하도록 도와줍니다.
3.
학습률은 문제의 복잡도, 데이터셋의 특성, 모델의 구조 등에 따라 다를 수 있지만, 일반적으로 다음과 같은 범위에서 설정됩니다:
작은 학습률: 0.0001 ~ 0.01
중간 학습률: 0.01 ~ 0.1
큰 학습률: 0.1 이상
작은 학습률은 학습이 더 안정적이지만 시간이 오래 걸리고, 큰 학습률은 학습이 빠르지만 불안정할 수 있습니다. 따라서 적절한 학습률을 찾기 위해 실험과 조정이 필요합니다.
1. 에포크는 무엇인가요? 2. 에포크는 일반적으로 몇 번 해놓나요?
1. 에포크(epoch)는 전체 데이터셋을 한 번 학습하는 단위를 말합니다. 2. 일반적으로 에포크의 수는 다음과 같은 범위에서 설정됩니다:
작은 에포크 수: 10 ~ 50
중간 에포크 수: 50 ~ 200
큰 에포크 수: 200 이상
에포크 수는 데이터셋의 크기, 모델의 복잡도, 학습률 등에 따라 다릅니다. 에포크 수가 너무 적으면 모델이 충분히 학습하지 못할 수 있고, 너무 많으면 과적합(overfitting)의 위험이 있습니다. 따라서, 적절한 에포크 수를 찾기 위해 모델의 성능을 평가하면서 조정해야 합니다.

4. 활성화 함수 정의

def step_function(x): return 1 if x >= 0 else 0
Python
복사
step_function은 퍼셉트론의 활성화 함수로, 총 입력이 0 이상이면 1을, 그렇지 않으면 0을 반환합니다.
활성화함수란 무엇인가요?
인공 신경망에서 뉴런=의 출력값을 결정하는 함수로, 입력 신호의 총합을 받아 특정 기준에 따라 출력 신호를 생성합니다. 활성화 함수는 신경망에 비선형성을 추가하여 단순한 선형 모델로는 해결할 수 없는 복잡한 패턴을 학습할 수 있게 합니다.
단층 퍼셉트론의 활성화 함수 예시
비선형 예시

5. 퍼셉트론 학습

for epoch in range(epochs): for i in range(len(inputs)): # 총 입력 계산 total_input = np.dot(inputs[i], weights) + bias # 예측 출력 계산 prediction = step_function(total_input) # 오차 계산 error = outputs[i] - prediction # 가중치와 편향 업데이트 weights += learning_rate * error * inputs[i] bias += learning_rate * error
Python
복사
epoch 루프는 전체 학습 과정을 설정된 횟수만큼 반복합니다.
inputs의 각 입력에 대해 다음을 수행합니다:
total_input은 입력과 가중치의 내적(dot product)과 편향의 합으로 계산됩니다.
prediction은 활성화 함수를 사용하여 총 입력으로부터 계산된 예측 값입니다.
error는 실제 출력(outputs[i])과 예측 값(prediction)의 차이입니다.
weightsbias는 오차에 비례하여 업데이트됩니다. 이는 퍼셉트론 학습 알고리즘의 핵심입니다.
np.dot()은 어떤 함수인가요?
np.dot() 함수는 점곱(dot product)을 계산하는 함수입니다. 두 벡터 또는 행렬의 점곱을 계산하여 스칼라 값을 반환합니다. 퍼셉트론에서는 입력 벡터와 가중치 벡터의 점곱을 계산하여 총 입력값을 구하는 데 사용됩니다.

점곱 (Dot Product)이란?

점곱(dot product)은 두 벡터의 각 요소를 곱한 후, 그 곱셈 결과를 모두 더한 값을 의미합니다. 예를 들어, 두 개의 벡터가 있을 때 각 요소를 곱하고 그 결과를 모두 더합니다.

예제

벡터 A와 벡터 B가 있다고 가정해봅시다:
벡터 A: [a1, a2]
벡터 B: [b1, b2]
점곱은 다음과 같이 계산됩니다:

점곱=a1×b1+a2×b2

이 점곱의 결과는 하나의 숫자(스칼라 값)입니다.

스칼라 값이란?

스칼라 값(scalar)은 단순한 하나의 숫자를 의미합니다. 벡터나 행렬과 달리 크기만 있는 값입니다. 벡터는 여러 개의 숫자로 이루어진 배열이고, 행렬은 숫자들이 2차원 배열로 구성된 것입니다.

정리하자면,

점곱: 점곱을 웹 개발에서 배열의 각 요소를 곱한 후, 그 결과를 모두 더하는 연산이라고 생각할 수 있습니다.
스칼라 값: 결과로 얻어진 단순한 숫자 하나를 의미합니다.

코드 예제

Python 예제

위와 동일한 작업을 파이썬에서 np.dot() 함수를 사용해 처리한 것입니다:
import numpy as np A = np.array([1, 2]) B = np.array([3, 4]) dot_product = np.dot(A, B) print(dot_product) # 출력: 11 (1*3 + 2*4)
Python
복사
np.dot() 함수는 벡터 A와 B의 점곱을 계산해 줍니다. 결과는 단순한 숫자 11입니다.

정리

점곱: 두 벡터의 각 요소를 곱한 후, 그 결과를 모두 더한 값입니다.
스칼라 값: 점곱의 결과로 얻어진 하나의 숫자입니다.
이해를 돕기 위해, 점곱을 배열의 요소를 곱한 후 그 합을 구하는 것으로, 스칼라 값을 하나의 단순한 숫자로 생각하면 됩니다.

6. 학습 결과 출력

print("학습된 가중치:", weights) print("학습된 편향:", bias)
Python
복사
학습이 완료된 후 최종 가중치와 편향 값을 출력합니다.

7. 예측 함수 정의 및 예측 결과 확인

def predict(input_data): total_input = np.dot(input_data, weights) + bias return step_function(total_input) for input_data in inputs: print(f"입력: {input_data}, 예측 출력: {predict(input_data)}")
Python
복사
predict 함수는 새로운 입력 데이터에 대한 예측 출력을 계산합니다.
각 입력에 대해 predict 함수를 호출하여 예측 출력을 출력합니다.

Google Colab

결과 (예시)

학습된 가중치: [0.30630478, 0.19290328]
학습된 편향: [-0.34171886]

예측 출력

입력: [0, 0], 예측 출력: 0
입력: [0, 1], 예측 출력: 0
입력: [1, 0], 예측 출력: 0
입력: [1, 1], 예측 출력: 1

결과 설명

퍼셉트론이 AND 게이트 문제를 성공적으로 학습했습니다.
AND 게이트의 진리표에 따르면, 두 입력이 모두 1인 경우에만 출력이 1이 됩니다.
다른 모든 경우에는 출력이 0이 되어야 합니다.
퍼셉트론은 학습 과정을 통해 가중치와 편향을 조정하여 정확한 출력을 예측할 수 있게 되었습니다.
이 경우, 입력 데이터와 가중치의 선형 결합이 활성화 함수(단위 계단 함수)에 의해 적절히 처리되어 올바른 이진 출력을 제공합니다.

알아두면 좋은 정보

MLP, SVM, D-Tree

기술
설명
다층 퍼셉트론(MLP)
퍼셉트론의 단층 구조를 여러 층으로 확장하여 비선형 문제를 해결할 수 있습니다. MLP는 은닉층(hidden layer)을 추가하여 더 복잡한 데이터 패턴을 학습할 수 있습니다.
서포트 벡터 머신(SVM)
퍼셉트론과 달리, SVM은 초평면을 사용하여 데이터 포인트를 분류합니다. 또한 SVM은 커널 함수를 통해 비선형 문제를 해결할 수 있습니다.
결정 트리(Decision Tree)
퍼셉트론과 달리, 결정 트리는 데이터의 특성을 기준으로 분할하여 분류 작업을 수행합니다. 이는 직관적이며 해석 가능성이 높습니다.
이처럼, 퍼셉트론은 단순한 구조와 이진 분류 문제 해결에 효과적이지만, 더 복잡한 문제 해결을 위해서는 다층 퍼셉트론, SVM, 결정 트리 등 다른 기법들이 필요할 수 있습니다.

미니퀘스트

1번 미니퀘스트 - XOR 문제 해결

퍼셉트론을 사용하여 XOR 연산 문제를 해결할 수 있는지 확인합니다.
XOR(Exclusive OR) 문제는 두 입력값이 서로 다를 때 출력이 1, 입력값이 서로 같을 때 출력이 0이 되는 논리 연산 문제입니다.

데이터 예시

XOR 연산 데이터셋
입력1
입력2
출력
0
0
0
0
1
1
1
0
1
1
1
0
1번 미니퀘스트의 퍼셉트론 구현 코드를 수정하여 XOR 연산 문제를 해결해 보세요.
XOR 문제는 선형 분리가 불가능하므로, 단일 퍼셉트론으로는 해결할 수 없음을 확인하는 것이 목표입니다.

코드

import numpy as np # XOR 게이트에 대한 데이터셋 inputs = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) outputs = np.array([0, 1, 1, 0]) # 가중치와 편향 초기화 weights = np.random.rand(2) bias = np.random.rand(1) # 학습률과 에포크 설정 learning_rate = 0.1 epochs = 20 # 활성화 함수 def step_function(x): return 1 if x >= 0 else 0 # 퍼셉트론 학습 for epoch in range(epochs): for i in range(len(inputs)): # 총 입력 계산 total_input = np.dot(inputs[i], weights) + bias # 예측 출력 계산 prediction = step_function(total_input) # 오차 계산 error = outputs[i] - prediction # 가중치와 편향 업데이트 weights += learning_rate * error * inputs[i] bias += learning_rate * error # 학습 결과 출력 print("학습된 가중치:", weights) print("학습된 편향:", bias) # 예측 def predict(input_data): total_input = np.dot(input_data, weights) + bias return step_function(total_input) # 예측 결과 확인 for input_data in inputs: print(f"입력: {input_data}, 예측 출력: {predict(input_data)}")
Python
복사

결과 (예시)

학습된 가중치: [-0.04720413, 0.01667778]
학습된 편향: [0.0353741]

예측 출력

입력: [0, 0], 예측 출력: 1
입력: [0, 1], 예측 출력: 1
입력: [1, 0], 예측 출력: 0
입력: [1, 1], 예측 출력: 1

결과 설명

퍼셉트론이 XOR 게이트 문제를 해결하지 못했습니다.
XOR 게이트의 진리표에 따르면, 두 입력이 다를 때 출력이 1이 되고, 두 입력이 같을 때 출력이 0이 되어야 합니다.
퍼셉트론은 선형 분류기이기 때문에 선형적으로 분리되지 않는 문제(XOR 문제)를 해결할 수 없습니다.
XOR 문제는 비선형 문제로, 단일 퍼셉트론으로는 해결할 수 없습니다.
예측 출력이 진리표와 일치하지 않는 이유는 퍼셉트론의 구조적 한계 때문입니다.
이 문제를 해결하기 위해서는 다층 퍼셉트론(MLP)과 같은 비선형 모델이 필요합니다.
다층 퍼셉트론은 은닉층(hidden layer)을 추가하여 비선형성을 도입함으로써 XOR 문제를 해결할 수 있습니다.

코드 설명

미니퀘스트 답안지

ⓒ 2024 startupcode. 모든 권리 보유. 무단 복제 금지.