첫 신경망이 만들어 졌을때는 기대와 많이 달라 신경망처럼 만든다고 인간을 흉내낼 수 없다고 생각하여 실망감과 더불어 암흑기가 왔던 때가 있었음.
알렉스 넷이 나타나기 전에는 비슷한 수준에서 고만고만 하였으나 (그럼에도 혁신이긴 했다.)
알렉스 넷이 나타났을 때 인공지능 시장은 열망했다. 그만큼 혁신적인 알고리즘이다.
다수의 신호를 입력받아 하나의 신호로 출력
뉴런 또는 노드로 불리는 입력신호들이 뇌의 신경망 형태로 이루어진 것.
입력 영상에 가중치를 곱해서(중요한 것, 즉 예측에서 영향력이 큰 것이 가중치가 더 크다.) 결과를 예측해낸다.
and, nor, not, or 게이트를 통해서 출력하는 간단한 방식도 있다.
논리회로 게이트 예.
w를 가중치라 두고
x1 x2 로 y를 나타낼때
w1 x1 + w2 x2 > c(세타) 와
w1 x1 + w2 x2 <= c(세타)
의 식으로 true or false = 1 or 0이 나타난다.
이를 통해 나온 값을 통해 and, not 등의 논리 연산을 할 수 있다.
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
이렇게 나타낼 수도 있고
def AND_theta(x1, x2): #위와 같은 식
w1, w2, theta = 0.5, 0.5, 0.7
tmp = x1 * w1 + x2 * w2 - theta
if tmp <= 0:
return 0
elif tmp > 0:
return 1
세타값을 미리 빼주고 0과 비교할 수도 있다.
여기서 w1, w2는 가중치라 부르고
theta는 편향(bias)라고 부른다.
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
이런식으로 numpy를 이용해서 형태가 같은 여러 값들에 대해서 간단히 np.sum으로 계산할 수도 있다.
xor 게이트에서 원과 삼각형을 나누는 직선을 만드는 것이 불가능 0,0 과 1,1이 정답이고 1,0 과 0, 1이 정답이 아닐때 하나의 직선으로 나눌 수 없다.
선형이거나 2개 이상의 직선으로 나눠야 한다.
직선이 여러개라는 것은 가중치가 여러개라는 말이다.
단층 퍼셉트론이 아닌
단층 퍼셉트론의 한계였던 XOR연산에서 다층 퍼셉트론을 이용해서 비선형의 문제를 풀 수 있다..
XOR연산에서는
NAND연산과 or연산을 and를 통해 XOR연산을 구현할 수 있다.
def OR(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = -0.3
tmp = np.sum(w * x) + b
if tmp <= 0:
return 0
else:
return 1
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
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
y = AND(s1, s2)
return y
해당 코드를 통해 XOR을 구현할 수 있다. 3가지의 연산게이트(단층 퍼셉트론)를 이용해 만든다. = 다층 퍼셉트론