Deep Learning: Logistic Regression

danbibibi·2022년 3월 30일
0

Logistic Regression

Binary Classification(이진 분류 : 0 or 1)을 위한 simple model (simplest neural network)

Sigmoid 함수

  • 앞서 살펴본 Linear Regression과의 가장 큰 차이로, sigmoid 함수는 0과 1 사이의 값을 반환한다. (따라서 binary classification 문제에 적합하다.)
  • 선형 함수가 아닌, 완만한 S자형인 sigmoid 함수를 사용함으로써 이상치 문제를 해결하고 연속된 값을 전달할 수 있다.
  • 나중에 이용하게될 sigmoid 함수의 미분은 아래와 같다.

Cost function

Logistic Regression에서는 Loss function으로 Binary Cross Entropy를 이용한다! 위 식에 y가 1인 경우, 0인 경우를 직접 대입해보면 빠르게 이해 될 것이라 생각한다.

Gradient Descent

다음은 Gradient Descent를 위해 model parameter에 따른 미분값을 구하는 과정이다. 이전에 Linear Regression 때와 마찬가지로 Chain Rule을 이용하였다. 다른 점은 sigmoid 함수의 미분 정도이다! (앞에 있으니 참고!)

Implement

이제 공부한 내용을 이용하여 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가 떨어지며 학습이 잘 진행된 것을 확인할 수 있다 !

profile
블로그 이전) https://danbibibi.tistory.com

0개의 댓글