过去两周,我一直在研究神经网络。我的激活函数是标准的Sigmoid函数,但在网上阅读时发现关于偏置的不同解释方式。
目前,我是将所有输入值与其权重相乘后再加上偏置(即负阈值)。这些方法都来自于http://neuralnetworksanddeeplearning.com/chap1#sigmoid_neurons,对我来说效果很好。但后来我发现了这个页面:http://www.nnwj.de/backpropagation.html
在前向传播部分,完全没有使用偏置,我认为应该使用它。请告诉我,是我太笨了没看懂他们做了什么,还是哪个页面错了?
for(int v = 0; v < outputs[i].X; v++){ outputs[i].set(v, biases[i].get(v)); for(int k = 0; k < outputs[i-1].X; k++){ outputs[i].increase(v, weights[i].get(v,k) * outputs[i-1].get(k)); } outputs[i].set(v, sigmoid( outputs[i].get(v)));System.out.println("Layer :" + i + " Neuron :" + v + " bias :" + biases[i].get(v) + " value :" + outputs[i].get(v)); }
这是我计算代码的部分,但单个神经元的计算在这一部分完成:
outputs[i].set(v, biases[i].get(v));for(int k = 0; k < outputs[i-1].X; k++){ outputs[i].increase(v, weights[i].get(v,k) * outputs[i-1].get(k));}outputs[i].set(v, sigmoid( outputs[i].get(v)));
你可能无法完全理解我在这里做了什么,但i代表我的层,k代表所有输入神经元,我遍历这些输入神经元并将权重与它们的输出相加。在此之前,我将起始值设为偏置。
如果你能帮助我解决这个问题,我将非常感激,同时也为我的英语道歉 🙂
回答:
一般来说,偏置项应该在前向和后向传递中都包括在内。
我认为你在第二页提到的前向传播部分为了简化而省略了偏置项,而在反向传播部分才解释了为什么我们需要这个额外的偏置项。
第一页看起来比第二页更具思考性的教程。