[DL] 퍼셉트론이 뭐예요? (밑바닥부터 시작하는 딥러닝_1)

What’s a perceptron?

밑바닥부터 시작하는 딥러닝 1권의 스터디를 진행한 후 정리한 글입니다.

퍼셉트론이란

신경망(딥러닝)의 기원이 되는 알고리즘으로 중요

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

입력이 2개인 퍼셉트론

fig 2-1.png

  • 그림의 원을 뉴런 혹은 노드라고 부름
  • 그림의 왼쪽에 보이는 x1, x2를 입력 신호,
  • 그림의 오른쪽에 보이는 y를 출력 신호,
  • w1, w2를 가중치라고 표현

퍼셉트론은 입력 신호에 각각 고유한 가중치(w1, w2)를 부여함

입력 신호와 가중치가 곱해진 값(w1x1, w2x2)의 총합이 정해진 한계(임계값)를 넘어선 경우에만 y를 출력

  • 이를 뉴런이 활성화 됐다. 라고 표현

즉, 가중치는 각각의 입력 신호 결과에 영향을 미치게 되고, 가중치가 클수록 해당 신호의 중요도가 높다는 것을 의미

위의 그림을 아래와 같은 수식으로 표현할 수 있음 (단, y=1인 경우가 활성화된 상태)

e 2.1.png

단순한 논리 회로를 퍼셉트론으로 구현

모든 입력 값은 0과 1로 정해져 있으므로 각 게이트 별 가중치(w1, w2)와 임계값(θ)을 설정

AND 게이트

두 입력이 모두 1일 때만 1을 출력

fig 2-2.png

AND 게이트의 퍼셉트론을 만족하는 매개변수 조합

  • (0.5, 0.5, 0.8) → 입력 값 x1과 x2가 모두 1일 때만 w1x1 + w2x2 값이 임계값 0.8 이상으로 조건에 만족
  • (1.0, 1.0, 1.0) … 무한히 많음

NAND 게이트

AND 게이트의 출력을 반대로 한 것으로, 두 입력 값이 모두 1일 때만 0을 출력하고 다른 경우는 모두 1을 출력

fig 2-3.png

NAND 게이트의 퍼셉트론을 만족하는 매개변수 조합

AND 게이트의 매개변수 부호를 반전하면 NAND 게이트의 매개변수가 됨

  • (-0.5, -0.5, -0.8) → 입력 값 x1, x2가 모두 1일 때만 w1x1 + w2x2 값이 임계값 -0.8 이하로 조건에 만족
  • … 무한히 많음

OR 게이트

두 개의 입력 중 하나 이상이 1이면 1을 출력

fig 2-4.png

OR 게이트의 퍼셉트론을 만족하는 매개변수 조합

  • (0.5, 0.5, 0.4) → 입력 값 x1, x2 중 하나 이상 1일 때 w1x1 + w2x2 값이 임계값 0.4 이상으로 조건에 만족
  • … 무한히 많음

AND, NAND, OR 게이트 모두 동일한 구조의 퍼셉트론

fig 2-1.png

정리해 보면, 3개의 게이트 모두

  • 2개의 입력을 받고,
  • 각 입력 값에는 가중치가 있으며,
  • 최종적으로 하나의 출력 값을 가지는 퍼셉트론

으로 정리할 수 있음

매개변수의 값을 결정하는 주체

지금까지는 인간이 직접 각 진리표를 보며 매개변수의 값을 결정

기계학습이란 이런 작업(매개변수를 정하는 작업)을 컴퓨터가 자동으로 하게 만드는 것

즉, 학습이란 적절한 매개변수 값을 정하는 작업이라고 볼 수 있으며 인간은 퍼셉트론의 구조(모델)를 고민하고 컴퓨터에게 학습할 데이터를 제공

가중치와 편향

위의 수식에서 임계값을 -b로 치환하여 다음과 같이 수정

e 2.2.png

  • b는 편향을 나타냄

각 입력 신호 별로 가중치를 곱한 모든 값에 편향을 합한 값이 0 이상이면 1, 그렇지 않으면 0을 출력

파이썬으로 구현

매개변수 값을 변경하면 AND, NAMD, OR 게이트를 모두 구현할 수 있으나 예시를 위해 AND로 명명

기존의 수식

def AND(x1, x2):
	w1, w2, theta = 0.5, 0.5, 0.8 # 매개변수 값
	tmp = x1 * w1 + x2 * w2
	if tmp <= theta:
		return 0
	elif tmp > theta:
		return 1

AND(0, 0) # 0
AND(1, 0) # 0
AND(1, 1) # 1

편향을 추가하여 수정한 수식 (numpy)

import numpy as np
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

AND(0, 0) # 0
AND(0, 1) # 0
AND(1, 1) # 1

가중치와 편향의 차이

가중치(w1, w2)와 편향(b)의 기능은 다름

  • 가중치의 경우 각 입력 신호가 결과에 주는 영향력(중요도)을 조절하는 매개변수
    • x1과 x2의 입력 값은 1로 동일하고 w1은 0.5, w2는 10일 때 w1x1 값은 0.5가 되고 w2x2의 값은 10이 됨
    • w2의 가중치를 갖는 입력 신호가 결과 값에 더 크게 기여하기 때문에 더 높은 중요도를 갖는다고 볼 수 있음
  • 편향의 경우 뉴런이 얼마나 쉽게 활성화(결과로 1을 출력)되는지를 조정하는 매개변수
    • 편향의 값이 매우 낮으면(ex. -1000.0), 각 입력 신호에 가중치를 곱해 합한 값이 1000 이상이어야 하므로 뉴런이 활성화 되기 어려움
    • 반대의 경우(편향의 값이 -1인 경우), 상대적으로 뉴런이 활성화 되기 쉬움
    • 입력 값이 0이더라도 편향 값에 따라 뉴런이 활성화 될 수도 있음

퍼셉트론의 한계

XOR 게이트

XOR 게이트는 배타적 논리합이라는 논리 회로를 뜻하며, 두 개의 입력 값 중 하나만 1일 때 1을 출력

그러나 위에서 다뤘던 퍼셉트론으로는 XOR 게이트를 구현할 수 없음

OR 게이트 퍼셉트론의 시각화

XOR 게이트와 다른 게이트들의 차이점을 알아보기 위해 먼저 OR 게이트를 예시로 들어 위에서 다뤘던 퍼셉트론의 동작을 시각화 함

가중치 매개변수(b, w1, w2) 값이 (-0.5, 1.0, 1.0)일 때의 퍼셉트론 수식은 다음과 같음

e 2.3.png

OR 게이트는 (0, 0)일 때 0을 출력하고, (0, 1), (1, 0), (1, 1)일 때는 1을 출력하기에 해당 수식은 OR 게이트의 성질을 만족

수식을 그래프로 그려보면 직선의 형태로 나타나고, 직선을 기준으로 회색 영역(0)과 흰색 영역(1)으로 나뉨

fig 2-6.png

선형과 비선형

위의 그래프를 참고해 생각해 보면 OR 게이트는 직선 하나로 0과 1의 영역을 나눌 수 있지만 XOR 게이트는 직선으로 해당 영역을 나눌 수 없음

fig 2-7.png

  • (0, 0)과 (1, 1)은 XOR 게이트에서 출력 값이 0으로 나타나고,
  • (1, 0)과 (0, 1)은 XOR 게이트에서 출력 값이 1로 나타나기에

원은 원끼리, 세모는 세모끼리 같은 영역에 있어야 하는데 직선으로 해당 영역의 경계를 나누는 게 불가능

하지만 기준이 되는 선이 곡선의 형태라면 XOR 게이트도 그래프로 나타내는 게 가능

fig 2-8.png

따라서 OR 게이트는 선형 영역, XOR 게이트는 비선형 영역이라고 볼 수 있음

다층 퍼셉트론

단층 퍼셉트론의 한계

앞서 말했던 퍼셉트론의 한계는 단층 퍼셉트론의 한계를 뜻하며, 단층 퍼셉트론만으로는 XOR 게이트를 구현할 수 없기에 나온 말

  • XOR 게이트의 경우 다층 퍼셉트론으로는 구현이 가능함

즉, 단층 퍼셉트론으로는 비선형 영역을 분리할 수 없다는 것을 의미

XOR 게이트 구현

다층 퍼셉트론으로 XOR 게이트를 구현하기 전에, 먼저 기존 게이트를 조합하여 XOR 게이트를 기호로 구현

XOR 게이트를 구현하는 방법에는 여러가지가 있지만 앞서 다룬 AND, NAND, OR 게이트를 이용해 구현하는 방법을 사용

fig 2-9.png

해당 게이트들을 적절히 조합하면 아래와 같이 XOR 게이트를 구현할 수 있음

fig 2-11.png

  • 입력 값 x1, x2는 NAND 게이트와 OR 게이트의 입력 값이 되고,
  • NAND 게이트와 OR 게이트의 출력 값이 AND 게이트의 입력으로 이어지며
  • 최종적으로 AND 게이트의 출력 값이 XOR 게이트의 출력 값이 됨

XOR 게이트의 진리표와 비교해서 구현한 내용이 맞는지 확인

fig 2-12.png

파이썬으로 XOR 게이트를 구현

앞서 구현했던 AND 함수를 활용하면 NAND와 OR 함수도 구현할 수 있으므로 해당 내용을 대입해 보면 아래와 같은 파이썬 코드가 나옴

  • AND 함수의 가중치, 편향 값만 NAND와 OR 게이트에 맞게 수정하면 됨
def XOR(x1, x2):
	s1 = NAND(x1, x2)
	s2 = OR(x1, x2)
	y = AND(s1, s2)
	return y

XOR(0, 0) # 0
XOR(0, 1) # 1
XOR(1, 0) # 1
XOR(1, 1) # 0

XOR 게이트의 다층 퍼셉트론 구조

fig 2-13.png

  • 왼쪽부터 차례대로 0층, 1층, 2층으로 구분

따라서, XOR 게이트는 2층 퍼셉트론이라고 볼 수 있음

  • 가중치를 갖는 층(화살표)으로 나누면 2층 퍼셉트론으로 표현하고,
  • 구성 층(뉴런)으로 나누면 3층 퍼셉트론으로 표현할 수도 있음

다층 퍼셉트론의 동작

  • 0층의 두 뉴런이 입력 신호를 받아 1층의 뉴런으로 신호를 보내면
  • 1층의 뉴런이 2층의 뉴런으로 신호를 보내는 구조이며
  • 최종적으로 2층의 뉴런은 y를 출력

단층 퍼셉트론으로 표현할 수 없던 것을 퍼셉트론의 층을 하나씩 늘려가는 방법으로 구현할 수 있음

  • 앞서 나왔던 AND, NAND, OR 게이트의 퍼셉트론은 단층이므로 XOR 게이트를 표현할 수 없었음
  • 퍼셉트론은 층을 쌓아(깊게 하여) 더 다양한 것을 표현하는 게 가능

NAND에서 컴퓨터까지

다중 퍼셉트론은 생각보다 더 복잡한 회로를 만들 수 있음

  • 덧셈을 처리하는 가산기
  • 2진수를 10진수로 변환하는 인코더
  • 패리티 검사 회로(조건을 충족하면 1을 출력하는 회로)
  • 심지어 컴퓨터를 표현하는 것도 가능
    • 컴퓨터도 정보를 처리하는 기계이므로 입력받은 내용을 정해진 방법으로 처리하고 출력한다는 구조가 퍼셉트론과 동일
    • NAND 게이트의 조합만으로 컴퓨터가 수행하는 일을 재현할 수 있음 (The Elements of Computing Systems: Building a Modern Computer from First Principies)
    • 이론상 2층 퍼셉트론이면 가능(비선형인 시그모이드 함수를 활성화 함수로 이용한다면 임의의 함수를 표현할 수 있음)하지만 가중치를 적절히 설정하는 게 매우 어려운 문제

퍼셉트론의 층을 거듭 쌓으면 비선형적인 표현도 가능

정리

  • 퍼셉트론은 입출력을 가진 알고리즘이며, 입력을 주면 정해진 규칙에 따른 값을 출력
  • 퍼셉트론에서는 가중치와 편향을 매개변수로 설정
  • 퍼셉트론으로 AND, OR 게이트 등의 논리 회로를 표현할 수 있음
  • XOR 게이트는 단층 퍼셉트론만으로 표현할 수 없음
  • 2층 퍼셉트론을 이용하면 XOR 게이트를 표현할 수 있음
  • 단층 퍼셉트론은 직선형 영역만 표현할 수 있고, 다층 퍼셉트론은 비선형 영역도 표현할 수 있음
  • 다층 퍼셉트론은 (이론상) 컴퓨터를 표현할 수 있음

출처 및 참고

  • 밑바닥부터 시작하는 딥러닝

이 글의 저작권은 Attribution-NonCommercial 4.0 International 라이센스를 따릅니다. Attribution-NonCommercial 4.0 International