为什么我非常简单的神经网络做得不好?

时间:2016-09-24 13:47:43

标签: python machine-learning neural-network

我创建了一个非常简单的神经网络来帮助我理解。它有一个神经元,一个输入和一个重量。这个想法很简单:给出0,200之间的许多随机数,知道超过100的任何东西是正确的,而100以下是正确的(而不仅仅是被告知)。

import random

weight = random.uniform(-1,1)


def train(g,c,i):
    global weight
    weight = weight + (i*(c-g)) #change weight by error change 
    if(g==c):
        return True
    else:
        return False


def trial(i):
    global weight
    sum = i*weight 
    if(sum>0):
        return 1
    else:
        return -1


def feedData():
    suc = 0
    for x in range(0,10000):
        d = random.randint(0,200)
        if(d>100): #tell what is correct and not (this is like the dataset)
            correct = 1
        else:
            correct = -1

        g = trial(d)
        if(train(g,correct, d)==True):
             suc += 1


    print(suc)


feedData();

万分之一,我预计至少8000是正确的。但是,它总是在4990到5100之间成功。

我的理解显然有一点点缺陷。欢呼任何建议。

2 个答案:

答案 0 :(得分:2)

我认为你的问题在于你缺乏偏见。您构建的网络将正整数(d)乘以权重值,然后比较结果以查看其是正数还是负数。在理想的宇宙中,weight的价值应该是多少?如果weight为正,则网络将获得约50%的输入;如果它是否定的,那么大约50%的时间也是正确的。

您会看到网络无法解决此问题,直到您引入第二个"权重"作为偏见词。如果您有sum = i * weight + bias,并且还在bias中更新了train,那么您应该能够正确地对所有输入进行分类。我会以与bias相同的方式初始化weight,然后将更新更新为:

bias = bias + (c-g)

偏见术语通常用于机器学习系统中以解释偏差"或"倾斜"在输入数据中(例如,在垃圾邮件分类器中,我们获得的80-95%的电子邮件可能不是垃圾邮件,因此系统应该偏向于将某些内容标记为垃圾邮件)。在这种情况下,偏差将允许网络了解它应该产生一些负输出,但所有输入都是正值。

换句话说,让我们想一想线性代数。您的输入类(即{x | x <100}和{x | x> 100})可线性分离。分离它们的函数类似于y = x - 100.这是2D图上的直线,其具有正斜率,并且在y = -100处与y轴相交,并且在x = 100处与x轴相交。这一行,你可以说x下100的所有值都映射到y的负值(即不正确),而100以上的所有值都映射到y的正值(即正确)。

您的代码存在的困难是您只能表达通过原点的行(因为您缺少偏见词)。

答案 1 :(得分:-1)

这主要是因为这一行

d = random.randint(0,200)

根据问题本身,您有50%的机会获得正确的数字(> 100)。如果您将最大值从200增加到500,那么您将更接近您想要的。

您需要找到一种更好的方法来生成随机数或为此创建自己的算法。