Deep Learning: Logistic Regression


Logistic Regression



バイナリ分類(バイナリ分類:0または1)の単純モデル(単純ニューラルネットワーク)

Sigmoid関数



前述のLinear Regressionとの最大の違いは、sigmoid関数が0と1の間の値を返すことです.△したがって、バイナリ分類の問題に適している.非
  • 線形関数、緩S字型Sigmoid関数を用いることで、異常値問題を解決し、連続値を伝達することができる.
  • 以降に使用されるsigmoid関数の微分は以下の通りである.
  • Cost function



    Logistic Regressionでは、Loss関数で2元CrossEnropy!上記の式でyが1であれば,直接0を代入する場合,すぐに理解できる.

    Gradient Descent


    次は、Gradient Depentのモデルパラメータの微分値を求めるプロセスです.以前のLinear Regressionの場合と同様にChainルールを使用します.違いは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 
    データとモデルを用いて学習するコード.
    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 
    これは学習を行い,失われた変化の部分をグラフで描く.
    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)
    成績が落ちて、よく勉強しているのが見えます.