[딥러닝 Express] Chapter 05. 퍼셉트론

배규리·2024년 1월 7일

AI 기초

목록 보기
8/32
post-thumbnail

1. 신경망이란?

인공 신경망 (ANN : Artificial Neural Network)

  • 생물학적인 신경망에서 영감을 받아서 만들어진 컴퓨팅 구조
  • 유닛(unit) 또는 노드(node)라고 하는 소자들을 모아서 만든다.
  • 아주 간단한 CPU들을 많이 연결하여서, 복잡한 작업을 하려는 시도
  • "신경망"

장점

  1. 학습이 가능하다
  2. 몇 개의 소자가 오작동하더라도 전체적으로는 큰 문제가 발생하지 않는다.

2. 퍼셉트론

퍼셉트론: 1957년에 로젠블라트가 고안한 인공신경망(ANN)

현대의 신경망들은 많은 수의 유닛(뉴런)들을 사용하지만, 퍼셉트론은 하나의 유닛만을 사용하는 모델이다. 여러 개의 입력을 받아서 하나의 신호를 출력하는 장치이다.

위와 같이 여러 개의 입력값(x1, x2, x3, ...)들에 대해 가중치(w1, w2, w3, ...)들이 존재한다. 즉 이 가중치에 따라 입력값(신호)의 강도가 정해진다.

따라서 각 입력값의 중요도가 클 수록 그에 매칭되는 가중치의 값도 커질 것이다!👍👍

이렇게 각각의 입력값에 해당하는 가중치를 곱하여 합해주는 함수를 활성화 함수(Activation Function)이라고 한다.

활성화 함수 - 파이썬

퍼셉트론에서 활성화 함수는 아래와 같은 계단함수이다.

간단하게 파이썬으로 구현해보면 아래와 같다.

epsilon = 0.00000001

def perceptron(x1, x2):
    w1, w2, b = 1.0, 1.0, -1.5
    total = x1*w1 + x2*w2 + b
    if total>epsilon:
        return 1
    else:
        return 0

print(perceptron(0,0))
print(perceptron(1,0))
print(perceptron(0,1))
print(perceptron(1,1))

가중치(weight)는 입력 신호가 출력에 미치는 중요도를 조절하는 역할이다.
바이어스(bias)는 뉴런이 얼마나 쉽게 활성화되느냐를 결정하는 변수이다.

활성화 함수 - 넘파이

근데 만약에 입력 값의 개수가 엄첨나게 많다고 가정해보자!
그럼 우린 저 곱해지고 더해지는 과정을 전부 하나하나 적어줘야 하는 걸까...?
놉! numpy에 내장 함수 np.dot()가 존재한다!
아래의 코드에서 살펴보자 :)

import numpy as np 
epsilon = 0.00000001

def perceptron(x1, x2):
    X = np.array([x1, x2])
    W = np.array([1.0, 1.0])
    B  = -1.5
    
    total = np.dot(X, W) + B
    if total>epsilon:
        return 1
    else:
        return 0

print(perceptron(0,0))
print(perceptron(1,0))
print(perceptron(0,1))
print(perceptron(1,1))


3. 퍼셉트론 학습 알고리즘

아래의 이미지를 살펴보자~!
먼저 모델을 학습시킬 학습 데이터(Train Data)가 필요하다.
학습 데이터는 (x1, d1), (x2, d2), (x3, d3), ...와 같은 꼴일 것이다.
여기서 x는 입력값, d는 라벨값, w는 가중치일 것이다.

그럼 AND 문제를 퍼셉트론 학습 알고리즘으로 구현해보자!

import numpy as np
epsilon = 0.00000001
# 계단함수 구현 - 임계값보다 크면 1, 작으면 0 반환
def step_func(t):
    if t>epsilon:
        return 1
    else:
        return 0

# 입력값
X = np.array([
    [0,0,1],
    [1,0,1],
    [0,1,1],
    [1,1,1]])

y = np.array([0,0,0,1]) # 정답
w = np.zeros(len(X[0])) # 가중치

def perceptron_fit(X, y, epochs = 10):
    global w
    eta = 0.2 # 학습률
    for t in range(epochs):
        print("epoch = ", t,"====================")
        for i in range(len(X)):
            predict = step_func(np.dot(X[i], w)) # 계산값이 활성화함수를 걸쳐 예측값 도출
            error = y[i] - predict # 오차
            w += eta * error * X[i] # 가중치 업데이트
            print("현재 처리 입력 =",X[i],"정답=",y[i],"출력=",predict,"변경된 가중치=",w)
        print("================================")

# 최종적으로 도출된 가중치로 계산 결과 출력
def perceptron_predict(X, Y):
    global w
    for x in X:
        print(x[0], x[1], "->", step_func(np.dot(x,w)))

perceptron_fit(X, y, 6)
perceptron_predict(X, y)  


우왕~ ~ ~ 🥹🥹🥹❤️
6번의 epochs만에 모델 생성 완료-!
정답이 제대로 도출되는 것을 확인할 수 있다!

근데 sklearn으로도 퍼셉트론 개발이 되는 가보다.

from sklearn.linear_model import Perceptron

X = [[0,0],[0,1],[1,0],[1,1]]
y = [0,0,0,1]
# 퍼셉트론 생성
clf = Perceptron(tol = 1e-3, random_state = 0)

#학습 수행
clf.fit(X, y)

#테스트 수행
print(clf.predict(X))


ㅎㅎ...이렇게 쉽게 끝나는걸 저렇게 길게 적은거라니 ㅎ_ㅎ~

Perceptron()내의 tol은 종료 조건, random_state는 난수의 시드이다.


4. 퍼셉트론의 한계점

그러나 퍼셉트론 알고리즘에도 한계점이 존재한다!
예를 들어보자.
XOR 연산의 입력값과 결과값은 아래와 같다.

XOR은 두 입력값이 같으면 1, 다르면 0을 반환하는 연산

x1x2y
000
101
011
110

한번 epochs값을 100으로 하여 실행해보자!

from sklearn.linear_model import Perceptron

X = [[0,0],[0,1],[1,0],[1,1]]
y = [0,1,1,0]
# 퍼셉트론 생성
clf = Perceptron(random_state = 0, max_iter= 100)

#학습 수행
clf.fit(X, y)

#테스트 수행
print(clf.predict(X))


오답이다..ㅠ

이유가 뭘까?
패턴 인식 측면에서 보면 퍼셉트론은 직선을 이용하여 입력 패턴을 분류하는 선형 분류자(Linear Classifier)이다.

AND나 OR은 선형으로 분리가 가능한데,
(선형 분리 가능한 문제 - Linear Separable Problems)
XOR연산의 경우 선형 분리가 불가능한 문제에 속한다.

다층 퍼셉트론으로 XOR문제 해결하기

이러한 문제를 해결하기 위해서는 하나의 직선이 아니라 두 개의 직선을 이용해야 한다.
즉 하나의 유닛으로 처리가 불가능하다는 것이다!⭐

해결 방법은 아래와 같다.

  1. 두 개의 직선을 각각 구현한다.
  2. 각각의 직선에 대한 유닛에 대입되었을 때 결과값을 계산한다.
  3. 각각의 결과를 다시 연산하여 최종 결과값을 도출한다.

그림으로 쉽게 보면 아래와 같다.

레이어(층)을 여러 개를 만들면 단일 퍼셉트론으로 하지 못했던 다양한 작업을 할 수 있다.


이번장에 재밌는 Mini Project가 있다.
한번 해봐야겠다 ㅎㅎ
신경망 내용이 나오니까 진짜 딥러닝 공부를 시작하는 기분이 난다...
점점 어려워질 것같은데 그래도 아직(?) 재밌다😊😊😊
화이팅 화이팅 ~!~!

profile
백엔드 개발은 취미인 AI 개발자🥹

0개의 댓글