퍼셉트론

·2023년 7월 1일
0

영상처리 딥러닝

목록 보기
1/7
post-thumbnail

🔎 퍼셉트론이란?


퍼셉트론(perceptron)이란 딥러닝의 근간이 되는 알고리즘이다.

퍼셉트론은 다수의 신호를 받아 하나의 신호를 출력한다.

  • x1x2는 입력 신호, y는 출력 신호, w1w2는 가중치(weight)를 의미한다.
  • 원을 뉴런 또는 노드라고 부른다.
  • 입력 신호가 뉴런에 보내질 때는 각각 고유한 가중치가 곱해진다.
  • 뉴런에서 전달받은 신호의 총합이 임계값(θ)을 넘을 때만 1을 출력한다.

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

가중치와 편향 도입

위의 식에서 θ-b로 치환하면 다음과 같다.

위의 식에서 b를 편향(bias)이라 한다.

위의 식에서 두 입력 (x1, x2)이 모두 0이어도 결과로 편향 값을 출력한다.



🔎 논리회로


AND 게이트


AND 게이트는 두 개의 입력이 모두 1이어야 1을 반환하는 게이트다.
위와 같은 진리표의 AND 게이트를 퍼셉트론으로 표현해보자.

이를 위해서는 w1, w2, θ의 값을 적절하게 정해야 한다.

예를 들어,

일 때 AND 게이트의 조건을 만족한다.

NAND 게이트


NAND 게이트는 AND 게이트의 출력을 반대로 한 것과 같다.

NAND 게이트에서는 w1, w2, θ의 값을 위와 같이 정해주면 된다.

OR 게이트


OR 게이트는 둘 중 하나의 값만 1이어도 1을 반환하는 게이트다.

OR 게이트에서는 w1, w2, θ의 값을 위와 같이 정해주면 된다.



🔎 퍼셉트론 구현하기


AND 게이트

import numpy as np

def AND_basic(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
       
inputs = [(0, 0), (1, 0), (0, 1), (1, 1)]

for x1, x2 in inputs:
   y = AND_basic(x1, x2)
   print('({x1}, {x2}) -> {y}'.format(x1=x1, x2=x2, y=y))

🔮 출력

>> (0, 0) -> 0
>> (1, 0) -> 0
>> (0, 1) -> 0
>> (1, 1) -> 1

가중치와 편향을 도입한 AND 게이트

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
       
inputs = [(0, 0), (1, 0), (0, 1), (1, 1)]

for x1, x2 in inputs:
   y = AND(x1, x2)
   print('({x1}, {x2}) -> {y}'.format(x1=x1, x2=x2, y=y))

🔮 출력

>> (0, 0) -> 0
>> (1, 0) -> 0
>> (0, 1) -> 0
>> (1, 1) -> 1

NAND 게이트

import numpy as np

def NAND(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
       
for x1, x2 in inputs:
   y = NAND(x1, x2)
   print('({x1}, {x2}) -> {y}'.format(x1=x1, x2=x2, y=y))

🔮 출력

>> (0, 0) -> 1
>> (1, 0) -> 1
>> (0, 1) -> 1
>> (1, 1) -> 0

OR 게이트

import numpy as np

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

for x1, x2 in inputs:
   y = OR(x1, x2)
   print('({x1}, {x2}) -> {y}'.format(x1=x1, x2=x2, y=y))

출력

>> (0, 0) -> 0
>> (1, 0) -> 1
>> (0, 1) -> 1
>> (1, 1) -> 1


🔎 퍼셉트론의 한계


XOR 게이트


XOR 게이트는 배타적 논리합이라는 논리 회로다.
두 입력 중 하나의 값만 1일 때 1을 반환한다.

단층 퍼셉트론은 아래와 같이 직선으로 나뉜 두 영역을 만든다.
하지만 XOR은 직선으로 두 영역을 나눌 수 없기 때문에,
단층 퍼셉트론으로는 XOR 게이트를 구현할 수 없다.

선형과 비선형

만약 직선, 즉 선형이라는 제약을 없앤 비선형이라면 아래와 같이 영역을 나눌 수 있다.



🔎 다층 퍼셉트론 (MLP)


단층 퍼셉트론으로는 XOR을 구현할 수 없지만, 다층 퍼셉트론 (MLP, Multi-Layer Perceptron)으로 XOR을 구현할 수 있다.
먼저, 아래의 그림처럼 x1, x2를 각각 NANDOR 게이트에 보낸 다음, 그 결과 값들을 AND 게이트에 보내면 XOR 게이트를 구현할 수 있다.

XOR 게이트 구현

def XOR(x1, x2):
   s1 = NAND(x1, x2)
   s2 = OR(x1, x2)
   y = AND(s1, s2)
   return y
   
for x1, x2 in inputs:
   y = XOR(x1, x2)
   print('({x1}, {x2}) -> {y}'.format(x1=x1, x2=x2, y=y))

🔮 출력

>> (0, 0) -> 0
>> (1, 0) -> 1
>> (0, 1) -> 1
>> (1, 1) -> 0

은닉 층


XOR을 해결한 MLP의 중간 층처럼,
입력층과 출력층 사이의 층을 은닉 층 (hidden layer)이라고 한다.
은닉 층이 깊을수록 더욱 복잡한 연산도 수행할 수 있다.

하지만 은닉층이 깊어짐에 따라 학습시켜야 할 파라미터 또한 증가했고, 수많은 파라미터들을 모두 적절히 학습시키는 것은 매우 어려운 일이었다.

이를 위해 역전파(Backpropagation)라는 기술이 등장했다.



🔎 퍼셉트론의 활용


퍼셉트론은 데이터를 선형적으로 분류할 때 적합한 알고리즘이다.
아래와 같이 학습이 진행됨에 따라 매개변수(가중치, 편향)를 조정해가며 적절한 값을 찾아낸다.



📑 참조

https://excelsior-cjh.tistory.com/169

0개의 댓글