Binary Classification(이진 분류 : 0 or 1)을 위한 simple model (simplest neural network)
Logistic Regression에서는 Loss function으로 Binary Cross Entropy를 이용한다! 위 식에 y가 1인 경우, 0인 경우를 직접 대입해보면 빠르게 이해 될 것이라 생각한다.
다음은 Gradient Descent를 위해 model parameter에 따른 미분값을 구하는 과정이다. 이전에 Linear Regression 때와 마찬가지로 Chain Rule을 이용하였다. 다른 점은 sigmoid 함수의 미분 정도이다! (앞에 있으니 참고!)
이제 공부한 내용을 이용하여 AND Operator를 구현해보자! (AND, OR 등은 구현 가능하지만, XOR은 불가능하다. 선형 분리가 불가능하기 때문!)
우선 데이터를 준비한다.
import numpy as np
import matplotlib.pyplot as plt
import random
from math import exp, log
X = [(0,0), (1,0), (0,1), (1,1)]
Y = [0,0,0,1]
train_loss_list = []
다음은 Logistic Regression 모델이다.
class AND_operator():
def __init__(self):
self.w = np.random.random(size=2)
self.b = np.random.random(size=1)
def sigmoid(self, z):
return 1/(1+exp(-z))
def predict(self, x):
z = np.inner(self.w, x)+self.b
a = self.sigmoid(z)
return a
데이터와 모델을 이용하여 학습을 진행하는 code이다.
def train(X, Y, model, lr=0.1):
dw0 = 0.0
dw1 = 0.0
db = 0.0
m = len(X)
cost = 0.0
for x,y in zip(X, Y):
a = model.predict(x)
if y==1:
cost-=log(a)
else:
cost-=log(1-a)
dw0+=(a-y)*x[0]
dw1+=(a-y)*x[1]
db+=(a-y)
cost/=m
train_loss_list.append(cost)
model.w[0]-=lr*dw0/m
model.w[1]-=lr*dw1/m
model.b-=lr*db/m
return cost
학습을 진행하고, Loss의 변화를 그래프로 그려보는 부분이다.
for epoch in range(10000):
cost = train(X, Y, model, 0.01)
if epoch%100==0:
print(epoch, cost)
plt.figure()
plt.title("train loss")
x1 = np.arange(0, len(train_loss_list))
plt.plot(x1, train_loss_list)
Loss가 떨어지며 학습이 잘 진행된 것을 확인할 수 있다 !