我正在学习(今天开始)神经网络并且可以完成一个2x2x1网络(前向数据馈送和后向误差传播),可以学习一组输入的AND操作。它还使用随机参数躲避任何局部最小值。我的第一个来源是:http://www.codeproject.com/Articles/14342/Designing-And-Implementing-A-Neural-Network-Librar
问题是:它使用输入(0,0)学习0和0但是当我给(0,1)它忘记0和0然后学习0和1.这是一般的新手bug吗?
我尝试了什么:
loop for 10000 times
learn 0 and 0
end loop
loop for 10000 times
learn 0 and 1 (forgets 0 and 0)
end loop
loop for 10000 times
learn 1 and 0 (forgets 0 and 1)
end loop
loop for 10000 times
learn 1 and 1 (forgets 1 and 0)
end loop
only one set is learned
fail
试验2:
loop for 10000 times
learn 0 and 0
learn 0 and 1
learn 1 and 0
learn 1 and 1
end loop
gives same result for all input combinations.
fail.
每个神经元的激活函数:双曲正切
2x2结构:全对
2x1结构:全对
随机学习率:是的,小到足以远离爆炸式迭代(每次迭代)
每个神经元的随机偏倚:是,在-0.5和+0.5之间(刚开始时)
随机加权:是,介于-0.5和+0.5之间(刚开始时)
编辑:对所有隐藏和输出图层对进行偏差和重量更新。
编辑:所有神经元(隐藏+输出)都使用相同的激活功能。
答案 0 :(得分:2)
如果没有具体的代码,很难肯定地说,但我认为问题在于你只是给一个案例一次学习。你应该给它一个你不同学习例子的矩阵,带有一个预期的结果向量。然后,当您更新权重和偏差时,您将找到最小化所有案例的网络输出与所有案例的预期输出之间的误差的值。
对于AND
门,您的输入将是(在MATLAB代码中,不确定您使用的是哪种语言,但语法很容易理解):
input = [0, 0;
0, 1;
1, 0;
1, 1];
您的预期输出将是:
output = [0;
0;
0;
1];
我认为你现在正在做的事情基本上是找到权重和偏差,以便在一个输入案例中最小化网络输出和预期输出之间的误差,然后重新训练这些权重和偏差以最小化错误。第二种情况,然后第三种情况,然后第四种情况。如果将它们放在这样的数组中,它应该最小化所有情况下的整体错误。这只是我最好的猜测,但没有任何代码可以继续。