티스토리 뷰
이 카테고리에 있는 모든 글들은 밑바닥부터 시작하는 딥러닝을 읽고 정리한 글입니다.
퍼셉트론
퍼셉트론이란?
위 그림은 입력으로 2개의 신호를 받은 퍼셉트론의 예이다. x1과 x2는 입력을, w1과 w2는 가중치를, 원은 뉴런을 모방한 노드를 뜻한다.
동작원리는 입력 신호가 노드에 보내질 때는 각각 고유한 가중치가 곱해진다. 여기서 가중치는 각 신호가 결과에 주는 영향력을 조절하는 요소로 작용한하고, 가중치는 클수록 해당 신호가 더 중요하다는 것을 의미한다. 그리고 노드에서 보내온 신호의 총합이 정해진 한계를 넘어설 때만 1을 출력한다. 이것을 '노드를 활성화시킨다' 라고 표현한다.(임계값이라고도 부름) 아래는 수식으로 나타낸 것이다.
단순한 논리 회로
1, AND 게이트
이 AND 게이트를 퍼셉트론으로 표현하고 싶다면 위 진리표대로 작동하도록 w1, w2, theta의 값을 정하는 것이다.
2. NAND 게이트와 OR 게이트
퍼셉트론의 구현
1. AND 게이트의 구현
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | def AND(x1, x2): #w1, w2, theta 초기화 w1, w2, theta= 0.5, 0.5, 0.7 tmp=x1*w1+x2*w2 #가중치를 곱한 입력의 총합이 #임계값이 넘으면 1, 아니면 0 if tmp<=theta: return 0 elif tmp>theta: return 1 print(AND(0,0)) #0 print(AND(1,1)) #1 print(AND(1,0)) #0 print(AND(0,1)) #0 | cs |
2. 가중치 편향 도입
위 식을 설명해보면 임력신호에 가중치를 곱한 값과 편향을 합하여, 그 값이 0을 넘으면 1을 출력하고 못 넘으면 0을 출력하는 식이다.
3. 가중치와 편향 구현하기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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 elif tmp>0: return 1 print(AND(0,1)) print(AND(0,0)) print(AND(1,0)) print(AND(1,1)) | cs |
다시 정리해보면 -theta를 b로 치환하고, 편향은 노드가 얼마나 쉽게 활성화(결과로 1을 출력) 되느냐를 조정하는 매개변수이다.
ex)b=-0.1 -> 입력과 가중치를 곱한 값들의 합이 0.1을 넘으면 1출력(활성화)
아래는 NAND와 OR을 구현한 코드입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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(x*w)+b if tmp<=0: return 0 elif tmp>0: return 1 print(NAND(1,1)) print(NAND(0,1)) print(NAND(1,0)) print(NAND(0,0)) | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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 elif tmp>0: return 1 print(OR(1,1)) print(OR(0,1)) print(OR(1,0)) print(OR(0,0)) | cs |
퍼셉트론의 한계
1. xor 게이트
퍼셉트론의 한계는 xor에서 나온다. 왜인지는 그림으로 확인하겠다.
위 그림처럼 or과 and는 선 하나로 구분이 되지만 xor같은 경우는 선 하나로 구분이 불가능하다.
하지만 xor을 구분하기 위해서는 선형이 아닌 비선형을 사용하여 구분한다면 가능하다.
저렇게 비선형으로 만들기 위해서는 and, or처럼 단층 퍼셉트론으로는 구현이 불가능 하지만, 여러 개의 층을 쌓아 다층 퍼셉트론을 만들면 가능해진다.
어떻게 조합하여 연결하면 가능한지 알아보겠다.
위 그림처럼 and와 or 그리고 nand를 조합하면 가능해진다.
2. XOR 게이트 구현하기
1234567891011 def XOR(x1,x2): s1=NAND(x1,x2) s2=OR(x1,x2) y=AND(s1,s2) return y print(XOR(1,1))print(XOR(0,1))print(XOR(1,0))print(XOR(0,0)) cs
1 2 3 4 5 6 7 8 9 10 11 | def XOR(x1,x2): s1=NAND(x1,x2) s2=OR(x1,x2) y=AND(s1,s2) return y print(XOR(1,1)) print(XOR(0,1)) print(XOR(1,0)) print(XOR(0,0)) | cs |
이렇게 하면 xor을 풀 수 있게 된다.
이 그림은 xor을 그림으로 표현한 것이다. 그림에 대해 자세히 설명해 보면 0층의 두 뉴런이 입력 신호를 받아 1층의 뉴런으로 신호를 보내고, 1층의 뉴런이 2층의 뉴런으로 신호를 보내고, 2층의 뉴런은 이 입력 신호를 바탕으로 y를 출력한다.
여기서 중요한 핵심은 단층 퍼셉트론으로는 표현하지 못하면 층을 하나 더 추가하고 2개로도 안되면 3개.. 이런식으로 점점 늘려나가면 더 다양한 것을 표현할 수 있다는 점이다.(실제 이론상으로는 컴퓨터도 표현 가능)