뉴런은 이전 뉴런으로부터 입력신호를 받아 또 다른 신호를 발생시킴
입력에 비례해서 출력을 내는 형태 (y=WX)가 아니라, 입력 값들의 모든 합이 어느 임계점(threshold)에 도달해야만 출력 신호를 발생시킴
입력신호를 받아 특정 값의 임계점을 넘어서는 경우에 출력을 생성해주는 함수를 활성화 함수(activation function)이라고 함 ex) sigmoid, ReLU, tanh
신경세포인 뉴런 동작원리를 머신러닝에 적용하여 multi-variable Logistic Regression 시스템 구축
→ 1) 입력 신호와 가중치를 곱하고 적당한 바이어스를 더한 후(Linear Regression)
→ 2) 그 값을 활성화 함수 입력으로 전달(Classification)해서 sigmoid 함수 임계점 0.5를 넘으면 1을, 그렇지 않으면 0을 다음의 뉴런으로 전달
딥러닝
feed forward
딥러닝에서는 1개 이상의 은닉층을 만들 수 있고, 각 은닉층에 존재하는 노드 수 또한 임의로 만들 수 있음, 그러나 은닉층과 노드 수가 많아지면 학습 속도가 느려지므로 적절하게 설정해야 함
딥러닝으로 XOR 문제 풀기
전체 구조
코드 구현
import numpy as np
def sigmoid(z):
return 1 / (1+np.exp(-z))
def derivative(f,x):
delta_x = 1e-4
grad = np.zeros_like(x)
it = np.nditer(x, flags=['multi_index'], op_flags=['readwrite'])
while not it.finished:
idx = it.multi_index
tmp_val = x[idx]
x[idx] = float(tmp_val) + delta_x
fx1 = f(x)
x[idx] = tmp_val - delta_x
fx2 = f(x)
grad[idx] = (fx1 - fx2) / (2*delta_x)
x[idx] = tmp_val
it.iternext()
return grad
class LogicGate:
def __init__(self, gate_name, xdata, tdata):
self.name = gate_name
self.xdata = xdata.reshape(4,2)
self.tdata = tdata.reshape(4,1)
self.W2 = np.random.rand(2,6)
self.b2 = np.random.rand(6)
self.W3 = np.random.rand(6,1)
self.b3 = np.random.rand(1)
self.learning_rate = 1e-2
def feed_forward(self):
delta = 1e-7
z2 = np.dot(self.xdata, self.W2) + self.b2
a2 = sigmoid(z2)
z3 = np.dot(a2, self.W3) + self.b3
y = a3 = sigmoid(z3)
return -np.sum(self.tdata*np.log(y+delta)+(1-self.tdata)*np.log((1-y)+delta))
def loss_val(self):
delta = 1e-7
z2 = np.dot(self.xdata, self.W2) + self.b2
a2 = sigmoid(z2)
z3 = np.dot(a2, self.W3) + self.b3
y = a3 = sigmoid(z3)
return -np.sum(self.tdata*np.log(y+delta)+(1-self.tdata)*np.log((1-y)+delta))
def train(self):
f = lambda x: self.feed_forward()
print("Initial loss value = ", self.loss_val())
for step in range(20001):
self.W2 -= self.learning_rate * derivative(f, self.W2)
self.b2 -= self.learning_rate * derivative(f, self.b2)
self.W3 -= self.learning_rate * derivative(f, self.W3)
self.b3 -= self.learning_rate * derivative(f, self.b3)
if (step % 1000 == 0):
print("step = ", step, "loss value =", self.loss_val())
def predict(self, xdata):
z2 = np.dot(xdata, self.W2) + self.b2
a2 = sigmoid(z2)
z3 = np.dot(a2, self.W3) + self.b3
y = a3 = sigmoid(z3)
if y > 0.5:
result = 1
else:
result = 0
return y, result
xdata = np.array([ [0,0],[0,1],[1,0],[1,1] ])
tdata = np.array([0,1,1,0])
xor_obj = LogicGate("XOR", xdata, tdata)
xor_obj.train()
test_data = np.array([ [0,0],[0,1],[1,0],[1,1] ])
for data in test_data:
(sigmoid_val, logical_val) = xor_obj.predict(data)
print(data,"",logical_val)