Почему простая нейронная сеть AND gate не будет работать без BIAS? - PullRequest
1 голос
/ 06 января 2020

Простой нейронный net из 2 входов и одного выхода без смещения, как это - похоже, не работает.

|input1||weight1 weight2| = Z
|input2|

output = sigmoid (Z)

Принимая во внимание, что он отлично работает при добавлении BIAS, почему он работает и что за ним стоит?

|input1||weight1 weight2| = Z
|input2|

выход = сигмоид (Z - BIAS)

Вот код для рабочей версии с BIAS:

import numpy as np
import random as r
import sys

def sigmoid(ip, derivate=False):
    if derivate:
        return ip*(1-ip)
    return 1.0/(1+np.exp(-1*ip))

class NeuralNet:
    global sigmoid 

    def __init__(self):
        self.inputLayers = 2
        self.outputLayer = 1
        self.bias = r.random()

    def setup(self):
        self.i = np.array([r.random(), r.random()], dtype=float).reshape(2,)
        self.w = np.array([r.random(), r.random()], dtype=float).reshape(2,)

    def forward_propogate(self):
        self.z = self.w*self.i
        self.o = sigmoid(sum(self.z)-self.bias)

    def optimize_cost(self, desired):
        i=0
        current_cost = pow(desired - self.o, 2)
        for weight in self.w:
            dpdw =  -1*(desired-self.o) * (sigmoid(self.o, derivate=True)) * self.i[i]
            self.w[i] = self.w[i] - 2*dpdw
            i+=1
        #calculate dp/dB
        dpdB = -1*(desired-self.o) * (sigmoid(self.o, derivate=True)) * -1
        self.bias = self.bias - 2*dpdB
        self.forward_propogate()

    def train(self, ip, op):
        self.i = np.array(ip).reshape(2,)
        self.forward_propogate()
        self.optimize_cost(op[0])

n = NeuralNet()
n.setup()
# while sys.stdin.read(1):
success_rate = 0
trial=0
done = False
while not done:
    a = [0.1,1,0.1,1]
    b = [0.1,0.1,1,1]
    c = [0,0,0,1]
    for i in range(len(a)):
        trial +=1
        n.train([a[i],b[i]],[c[i]])
        if c[i] - n.o < 0.01:
            success_rate +=1
            print(100*success_rate/trial, "%")
        if 100*success_rate/trial > 99 and trial > 4:
            print(100*success_rate/trial, "%")
            print("Network trained, took: {} trials".format(trial))
            print("Network weights:{}, bias:{}".format(n.w, n.bias))
            done = True
            break

1 Ответ

1 голос
/ 07 января 2020

Смещение - это просто смещение перехвата. NN, который вы настроили в этом примере, выглядит как однослойная нейронная сеть без скрытых слоев, которая фактически является регрессией logisti c, которая является просто линейной моделью.

Когда вы этого не делаете Изучить значение перехвата, по умолчанию перехват 0, поэтому он всегда проходит через начало координат, а вы просто изучаете наклон линии. Чтобы правильно классифицировать AND ваших данных, то есть верхний правый угол в (1,1), но не в других точках, вам нужно ненулевой перехват, потому что нет линии, проходящей через начало координат, которое будет иметь только верхний правый угол на одной стороне, а остальные три точки на другой стороне.

...