我编写了一个人工神经网络,它可以处理简单的任务,但当我尝试更复杂的任务时[在我的案例中是检测28×28像素的手写体图像],权重会出现随机变化[不规则的增加和减少,跳跃幅度很大:例如,一个输出神经元的值是1,经过下一次训练后变为0.1,再经过一次训练后变为0.9]。我的ANN计算的值在0到1之间。
我的计算方式如下:
float value = 0;foreach (Connection c in connections){ value += c.GetValue();}value = MathA.Sigmoid(value);this.value = value;
我目前计算新权重的方式如下:
float newWeight = currentWeight * lernRate * entrieNeuronValue * (answer - expectedAnswer);
有没有人知道更好的计算权重的方法?
回答:
我认为问题出在(answer - expectedAnswer)
这部分。根据answer
的值,(answer - expectedAnswer)
的结果可能是正的也可能是负的。这个计算结果为负数会导致权重为负数。负权重会给下一次答案和/或权重的计算带来混乱。权重必须在0到1之间。