我刚开始使用神经网络并使用Synaptic开始(我知道,我知道,JavaScript中的神经网络,喘气!)。
这是用于创建用于学习XOR函数的神经网络的示例代码given in this section:
var myPerceptron = new Architect.Perceptron(2, 3, 1);
var myTrainer = new Trainer(myPerceptron);
myTrainer.XOR();
console.log(myPerceptron.activate([0, 0])); // 0.0268581547421616
console.log(myPerceptron.activate([1, 0])); // 0.9829673642853368
console.log(myPerceptron.activate([0, 1])); // 0.9831714267395621
console.log(myPerceptron.activate([1, 1])); // 0.02128894618097928
我正在尝试添加更多图层并查看会发生什么。添加一个额外的隐藏层不会产生太大影响,但添加2层会使输出相同,无论输入如何。
var myPerceptron = new Architect.Perceptron(2, 3, 3, 3, 1);
var myTrainer = new Trainer(myPerceptron);
myTrainer.XOR();
console.log(myPerceptron.activate([0, 0])); // 0.521076904986927
console.log(myPerceptron.activate([1, 0])); // 0.5210769149857782
console.log(myPerceptron.activate([0, 1])); // 0.5210769118775331
console.log(myPerceptron.activate([1, 1])); // 0.5210769209325651
为什么会这样?这仅仅是因为更复杂的网络需要更多的培训,还是因为这种网络本质上不适合这种问题?
答案 0 :(得分:3)
我对Synaptic不太熟悉(但看起来确实很酷),但这里有一些你可以研究的一般性问题:
重量初始化非常重要。适当的权重初始化允许我们的梯度通过我们的网络反向传播并学习发生。是否可以选择初始化网络中的权重?常见的初始化方案是Understanding the difficulty of training deep feedforward neural networks和最近Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification中给出的Xavier Glorot初始化。
你的步长又是学习率太大了吗?您的网络似乎正在输出常量值。如果使用饱和非线性(即有限激活函数,如sigmoid或tanh),则大量学习可能会导致非线性饱和并有效地停止学习,这可能导致输出常数值。
与前一点相关:您在隐藏图层中使用了哪种类型的非线性?同样,如果它是一个饱和的非线性,这可能会阻碍你的训练。您可以尝试修正形式为$ f(x)= \ max(0,x)$的线性单位(ReLU)。它们是无界的,所以它们不会饱和,当$ x>时,它们的梯度等于1。 0 $。他们对'#34;激活"的解释当输入大于0时。在这种情况下,它们就像一个开关,并允许渐变传播通过。
可能还有其他问题,希望其他人也可以评论。这些是我立刻想到的3。
我不熟悉Synaptic所以我不确定控制程度或默认设置或参数是多少。
希望这有帮助!