[밑딥] 2장. 퍼셉트론 (Perceptron)

Speedwell🍀·2022년 4월 7일
0


퍼셉트론은 신경망(딥러닝)의 기원이 되는 알고리즘
➡️ 퍼셉트론의 구조를 배우는 것은 신경망과 딥러닝으로 나아가는 데 중요한 아이디어를 배우는 것!


1. 퍼셉트론

: 다수의 신호를 입력으로 받아 하나의 신호를 출력

전류가 전선을 타고 흐르는 전자를 내보내듯, 퍼셉트론 신호도 흐름을 만들고 정보를 앞으로 전달
1: 신호가 흐름, 0: 신호가 흐르지 않음

x₁ x₂: 입력 신호
y: 출력 신호
w₁ w₂: 가중치
: 뉴런, 노드

  • 입력 신호가 뉴런에 보내질 때는 각각 고유한 가중치가 곱해진다. (w₁x₁, w₂x₂)
  • 뉴런에서 보내온 신호의 총합이 임계값 (θ) 를 넘어설 때만 1을 출력한다. (뉴런이 활성화)

이를 수식으로 나타내면 아래와 같다.


퍼셉트론은 복수의 입력 신호 각각에 고유한 가중치를 부여한다.
가중치는 각 신호가 결과에 주는 영향력을 조절하는 요소로 작용한다.
➡️ 가중치가 클수록 해당 신호가 중요!


2. 단순한 논리 회로

진리표: 입력 신호와 출력 신호의 대응 표

아래와 같은 표를 진리표라고 한다.

AND 게이트

  • 입력 두 개, 출력 하나

🙄 퍼셉트론으로 AND 게이트를 어떻게 표현할까?
➡️ 진리표대로 작동하도록 하는 w₁, w₂, θ 값을 정하면 된다!

예를 들어 (w₁, w₂, θ)가 (0.5, 0.5, 0.7), (0.5, 0.5, 0.8), (1.0, 1.0, 1.0)일 때 모두 AND 게이트의 조건을 만족한다.
매개변수를 이렇게 설정하면 x₁, x₂ 모두가 1일 때만 가중 신호의 총합이 주어진 임계값을 웃돌게 된다!


NAND 게이트

NAND 게이트는 AND 게이트를 구현하는 파라미터의 부호를 모두 반전하면 된다!
예를 들어 (w₁, w₂, θ) = (-0.5, -0.5, -0.7)


📌 퍼셉트론의 구조는 AND, NAND, OR 게이트 모두에서 똑같다!!
세 게이트의 차이점은 매개변수(가중치와 임계값) 뿐!
➡️ 똑같은 구조의 퍼셉트론이 매개변수의 값만 적절히 조정하여 AND, NAND, OR를 표현할 수 있다.

기계학습 문제는 기존에 사람이 직접 매개변수의 값을 정했던 작업을 컴퓨터가 자동으로 하도록 한다.
학습: 적절한 매개변수 값을 정하는 작업. 사람은 퍼셉트론의 구조(모델)를 고민하고 컴퓨터에 학습할 데이터를 주는 역할.


3. 퍼셉트론 구현하기

간단한 구현

아래는 x1과 x2를 인수로 받는 AND 함수

def AND(x1, x2):
	w1, w2, theta = 0.5, 0.5, 0.7
    tmp = x1*w1 + x2*w2
    if tmp <= theta:
    	return 0
    elif tmp > theta:
    	return 1

AND(0, 0) # 0을 출력
AND(1, 0) # 0을 출력
AND(0, 1) # 0을 출력
AND(1, 1) # 1을 출력

가중치를 곱한 입력의 총합이 임계값을 넘으면 1을 반환하고 그 외에는 0을 반환한다.

이 구현을 가중치와 편향을 도입해서 수정해보자!


가중치와 편향을 도입해 구현

아래는 위에서 보여줬던 퍼셉트론의 수식에서 θ를 -b로 치환한 식이다. 여기서 b는 편향(bias)이다.

📌 주의) 편향은 가중치와 다른 기능을 한다!

  • 가중치 w₁과 w₂는 각 입력 신호가 결과에 주는 영향력(중요도)을 조절하는 매개변수
  • 편향은 뉴런이 얼마나 쉽게 활성화(결과로 1을 출력)하느냐를 조정하는 매개변수
    • 예를 들어 b가 -0.1일 때보다 -20.0일 때 더 활성화되기 어렵다.

넘파이를 사용해서 위의 식대로 구현해보자!

앞에서 말했듯이 AND, NAND, OR는 모두 같은 구조의 퍼셉트론이고, 차이는 가중치 매개변수의 값뿐이다.
➡️ 코드에서 다른 부분은 가중치와 편향 값을 걸정하는 부분뿐!

AND 게이트

def AND(x1, x2):
	x = np.array([x1, x2])
    w = np.array([0.5, 0.5])
    b = -0.7
    tmp = np.sum(w*x) + b
    if tmp <= 0:
    	return 0
    else:
    	return 1

NAND 게이트

def NAND(x1, x2):
	x = np.array([x1, x2])
    # AND와는 가중치(w와 b)만 다르다!
    w = np.array([-0.5, -0.5]) 
    b = 0.7
    tmp = np.sum(w*x) + b
    if tmp <= 0:
    	return 0
    else:
    	return 1

OR 게이트

def OR(x1, x2):
	x = np.array([x1, x2])
    # AND와는 가중치(w와 b)만 다르다!
    w = np.array([0.5, 0.5]) 
    b = -0.2
    tmp = np.sum(w*x) + b
    if tmp <= 0:
    	return 0
    else:
    	return 1

4. 퍼셉트론의 한계

XOR 게이트

퍼셉트론으로는 XOR 게이트를 구현할 수 없다.
구현할 수 없는 이유를 알아보자!

우선 OR 게이트를 생각해보자.
OR 게이트는 예를 들어 (b, w1, w2) = (-0.5, 1.0, 1.0)일 때 진리표를 만족한다. 이때의 퍼셉트론 식은 아래와 같다.

위의 식의 퍼셉트론은 아래와 같이 직선으로 나뉜 두 영역을 만든다. 직선으로 나뉜 한쪽 영역은 1을 출력하고 다른 한쪽은 0을 출력한다.


XOR 게이트는 OR 게이트처럼 직선 하나로 0과 1을 나누는 영역을 만들 수 없다!
하지만 '직선'이라는 제약을 없애면 나누는 영역을 만들 수 있다!


선형과 비선형

퍼셉트론은 직선 하나로 나눈 영역만 표현할 수 있다는 한계가 있다. ➡️ 곡선은 표현 불가능!

  • 비선형 영역: 곡선의 영역
  • 선형 영역: 직선의 영역

📌 기계학습에서 선형, 비선형이라는 용어 자주 쓰임!


5. 다층 퍼셉트론 (multi-layer perceptron)

퍼셉트론으로 XOR 게이트를 나타낼 수 없었지만 퍼셉트론의 층을 하나 더 쌓은 다층 퍼셉트론으로는 표현할 수 있다!!

다층 퍼셉트론: 층이 여러 개인 퍼셉트론
➡️ 퍼셉트론은 층을 쌓아 (깊게 하여) 다양한 것을 표현 가능!

기존 게이트의 조합

XOR 게이트는 앞서 만든 AND, NAND, OR 게이트를 조합해서 만들 수 있다.

위의 게이트를 조합해보자! x₁, x₂는 NAND와 OR 게이트의 입력이 되고, NAND와 OR의 출력이 AND 게이트의 입력으로 이어진다.

NAND 출력을 s₁, OR의 출력을 s₂로 해서 진리표를 만들면 아래와 같다.


XOR 게이트 구현

def XOR(x1, x2):
	s1 = NAND(x1, x2)
    s2 = OR(x1, x2)
    y = AND(s1, s2)
    return y

XOR를 뉴런을 이용한 퍼셉트론으로 표현하면 위와 같다. 그림을 보면 XOR는 다층 구조의 네트워크인 것을 알 수 있다. 왼쪽부터 0층, 1층, 2층이라고 해보자.

위의 그림에서 퍼셉트론은 3층으로 구성되어 있지만, 가중치를 갖는 층은 2개 (0층/1층 사이, 1층/2층 사이)
➡️ '이 책에선 2층 퍼셉트론'이라고 부른다. 문헌에 따라서는 '3층 퍼셉트론'으로 표현하는 경우도 있다.

2층 퍼셉트론의 동작

  1. 0층의 두 뉴런이 입력 신호를 받아 1층의 뉴런으로 신호를 보낸다.
  2. 1층의 뉴런이 2층의 뉴런으로 신호를 보내고, 2층의 뉴런은 이 입력 신호를 바탕으로 y를 출력한다.

6. NAND에서 컴퓨터까지

다층 퍼셉트론은 복잡한 회로를 만들 수 있다.

예시)

  • 덧셈을 처리하는 가산기
  • 2진수를 10진수로 변환하는 인코더
  • 어떤 조건을 만족하면 1을 출력하는 회로 (패리티 검사 회로)

퍼셉트론을 이용하면 컴퓨터도 표현 가능!

  • 컴퓨터는 정보를 처리하는 기계
    ➡️ 컴퓨터에 무언가를 입력하면 정해진 방법으로 처리하고 그 결과를 출력
    ➡️ 정해진 방법으로 처리한다는 건 컴퓨터도 퍼셉트론처럼 입력과 출력으로 구성된 특정 규칙대로 계산을 수행한다는 뜻

NAND 게이트의 조합만으로 컴퓨터가 수행하는 일을 재현할 수 있다.
➡️ NAND 게이트는 퍼셉트론으로 만들 수 있기 때문에, 퍼셉트론으로도 컴퓨터를 표현할 수 있다.


이론상 2층 퍼셉트론이면 컴퓨터를 만들 수 있다. 정확히는 비선형인 시그모이드 함수를 활성화 함수로 이용하면 임의의 함수로 표현할 수 있다!
(하지만 2층 퍼셉트론 구조에서 가중치를 적절히 설정하여 컴퓨터를 만들기는 너무 어렵다.)


📌 퍼셉트론이 층을 거듭 쌓으면 비선형적인 표현이 가능하고, 이론상 컴퓨터가 수행하는 처리도 모두 표현할 수 있다는 것 기억하기!


7. 정리

📌 퍼셉트론은 신경망의 기초!

  • 퍼셉트론은 입출력을 갖춘 알고리즘이다. 입력을 주면 정해진 규칙에 따른 값을 출력한다.

  • 퍼셉트론에서 '가중치'와 '편향'을 매개변수로 설정한다.

  • 퍼셉트론으로 AND, OR 게이트 등의 논리 회로를 표현할 수 있다.

  • XOR 게이트는 단층 퍼셉트론으로는 표현할 수 없다.

    • 2층 퍼셉트론을 이용하면 가능!
  • 단층 퍼셉트론으로는 직선형 영역만 표현할 수 있고, 다층 퍼셉트론은 비선형 영역도 표현할 수 있다.

  • 단층 퍼셉트론은 (이론상) 컴퓨터를 표현할 수 있다.

0개의 댓글