Java 反向传播算法的编程

Java 反向传播算法的编程,java,machine-learning,neural-network,Java,Machine Learning,Neural Network,我正在尝试将反向传播算法应用到我自己的网络中。我理解backprop agl的概念,但是,我的数学能力不强。我正在处理backprop alg的前半部分,计算输出层(还不担心隐藏层中的偏导数) 我在搜索时发现了以下代码,我正在寻找对其中一部分的解释 inti=0; 用于(神经元n:输出层){ ArrayList connections=n.getAllInConnections(); 用于(连接con:connections){ 双输出=n.getOutput(); double ai=con.

我正在尝试将反向传播算法应用到我自己的网络中。我理解backprop agl的概念,但是,我的数学能力不强。我正在处理backprop alg的前半部分,计算输出层(还不担心隐藏层中的偏导数)

我在搜索时发现了以下代码,我正在寻找对其中一部分的解释

inti=0;
用于(神经元n:输出层){
ArrayList connections=n.getAllInConnections();
用于(连接con:connections){
双输出=n.getOutput();
double ai=con.leftNeuron.getOutput();
双期望输出=期望输出[i];
双误差导数=(输出*(1-输出)*(期望输出-输出));
双三角权重=学习率*误差导数*ai;
double newWeight=con.getWeight()+deltaWeight;
con.设置三角重量(三角重量);
con.设定重量(新重量);
}
i++;

因此,ai=con.leftNeuron.getOutput()是否将ai设置为上一层的输出?如果是,这到底意味着什么?从上一层传递给特定神经元的权重总和?

您的思路基本正确,是的。计算反向传播的输出层部分分两步完成:

首先,你计算误差导数,用非数学术语来说,它是“你想要什么,减去输出神经元给你什么”。如果我们把神经元的输出称为“输出”,而我们实际想要得到的是“期望输出”,那么我们就得到了你在代码示例中的公式:

double errorDerivative = (output * (1-output) *(desiredOutput - output));
现在我们有了输出神经元的导数,我们想用它来更新输出神经元和它的输入神经元之间的所有权重,所以我们对它们进行循环。我们只需在每个权重上加上导数,乘以学习速率,乘以神经元向输出神经元发送信息的激活度。这是不太合适的命名
ai
变量的意思是-神经元发送给输出神经元的任何信息


对于一个非常好的视觉指南,我推荐-第3-4页(18-19页)。

AI被设置为前一个连接的leftNeuron(连接到当前连接的任何节点)的输出值

反向传播算法的工作方式是通过遍历ANN中的每一层和其中的每一个节点,然后将该层中的所有权重相加(每个节点都有自己的权重),然后加入阈值,并计算该数字是否激活下一个节点(如果数>x-->下一个节点被激活)

您的代码所做的是从输出层获取所有神经元,获取它们的所有连接,获取给定的神经元输出,获取前一层左侧神经元的权重,进行一些数学运算,并根据我的理解设置前一层神经元到当前层神经元的连接权重


这里有一个很好的链接,可以帮助您了解ANN的基本工作原理。

谢谢!太棒了,所以我遇到的直观问题是,我的其他代码有一个输入[][]数组,并且每次数据通过一层传播时,输入数组都会被每个神经元的新总和覆盖。基本上,我需要为每次传播保存每个神经元的总和(而不仅仅是每个神经元连接的权重[我显然是这么做的]).对吗?是的,因为你需要一直计算偏导数,所以你肯定要保存输出和导数。通常在你计算了所有的权重更新之后才更新权重,所以一次更新不会影响下一次的偏导数。是的,我得到了向前的propagation(通过网络推送数据)可以很好地工作。但是,我认为我需要添加一个额外的数据结构来保存输入到每个神经元的权重的中间总和(因为我每次都覆盖我的输入[][],哈哈……也就是说,我只保存输入到输出神经元的总和。)至少,我认为你是这么说的。谢谢!不客气,如果你需要更多关于安的资源,请告诉我我已经和他们做了一些工作!也别忘了投票并核对你问题的答案!谢谢!我真的很感激
double errorDerivative = (output * (1-output) *(desiredOutput - output));