我试图将反向传播算法实现到我自己的网络中。我理解backprop agl的想法,但是,我对数学并不强。我正在研究backprop alg的前半部分,计算输出层(不用担心隐藏层中的偏导数)。
我在搜索时发现了以下代码,并且我正在寻找对其中一部分的解释。
int i = 0;
for (Neuron n : outputLayer) {
ArrayList<Connection> connections = n.getAllInConnections();
for (Connection con : connections) {
double output = n.getOutput();
double ai = con.leftNeuron.getOutput();
double desiredOutput = expectedOutput[i];
double errorDerivative = (output * (1-output) *(desiredOutput - output));
double deltaWeight = learningRate * errorDerivative * ai;
double newWeight = con.getWeight() + deltaWeight;
con.setDeltaWeight(deltaWeight);
con.setWeight(newWeight);
}
i++;
那么,ai = con.leftNeuron.getOutput()是将ai设置为前一层的输出?如果是这样,这究竟是什么意思?从过去的层传递给特定神经元的权重总和的总和?
答案 0 :(得分:1)
你几乎走在正确的轨道上,是的。计算反向传播的输出层部分分两步完成:
首先,你计算误差导数,在非数学的措辞中是“你想要什么,减去输出神经元给你的东西”。如果我们调用神经元“输出”的输出,以及我们实际想要获得“desiredOutput”的内容,我们最终会得到代码示例中的公式:
double errorDerivative = (output * (1-output) *(desiredOutput - output));
既然我们有输出神经元的衍生物,我们想用它来更新输出神经元和它的输入神经元之间的所有权重,所以我们循环它们。对于每个权重,我们只需添加导数,乘以学习速率,乘以神经元发送信息到输出神经元的激活。这就是不太恰当地命名的ai
变量意味着什么 - 只是神经元发送给输出神经元的任何东西。
对于非常好的视觉指南,我建议https://www4.rgu.ac.uk/files/chapter3%20-%20bp.pdf - 第3-4页(18-19)。
答案 1 :(得分:1)
AI被设置为上一个连接的leftNeuron的输出值(无论连接到当前连接的节点是什么)。
反向传播算法的工作方式是遍历ANN中的每一层,以及其中的每个节点,然后对该层中的所有权重求和(每个节点都有自己的权重),然后加入阈值,并计算此数字是否激活下一个节点(如果数字&gt; x - &gt;下一个节点被激活)。
你的代码正在做的是从输出层获取所有神经元,获得所有连接,获得给定的神经元输出,从前面的层中获取离开神经元的权重,做一些数学运算,以及根据我的理解,设置从前一层神经元到当前神经元的连接权重。
这是理解人工神经网络工作基础知识的一个很好的链接,http://www.ai-junkie.com/ann/evolved/nnt1.html