我创建了一个非常简单的神经网络来帮助我理解。它有一个神经元,一个输入和一个重量。这个想法很简单:给出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之间成功。
我的理解显然有一点点缺陷。欢呼任何建议。
答案 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,那么您将更接近您想要的。
您需要找到一种更好的方法来生成随机数或为此创建自己的算法。