反向传播算法编程
Programming the Back Propagation Algorithm
我正在尝试将反向传播算法应用到我自己的网络中。我了解 backprop agl 的概念,但是,我的数学并不强。我只是在研究反向传播算法的前半部分,计算输出层(还不用担心隐藏层中的偏导数)。
我在搜索时发现了以下代码,我正在寻找其中一部分的解释。
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设置为上一层的输出?如果是这样,这到底是什么意思?从上一层传递给特定神经元的权重总和?
你的方向基本正确,是的。计算反向传播的输出层部分分两步完成:
首先,计算误差导数,用非数学术语来说就是 "what you want, minus what the output neuron gives you"。如果我们调用神经元的输出 "output",以及我们实际想要得到的 "desiredOutput",我们最终会得到代码示例中的公式:
double errorDerivative = (output * (1-output) *(desiredOutput - output));
现在我们有了输出神经元的导数,我们想用它来更新输出神经元和它的输入神经元之间的所有权重,所以我们循环它们。对于每个权重,我们只需添加导数,乘以学习率, 乘以神经元向输出神经元发送信息的激活 。这就是命名不太恰当的 ai
变量的意思——无论神经元发送到输出神经元。
对于非常好的视觉指南,我推荐 https://www4.rgu.ac.uk/files/chapter3%20-%20bp.pdf - 第 3-4 (18-19) 页。
AI 被设置为前一个连接的 leftNeuron 的输出值(任何连接到当前节点的节点)。
反向传播算法的工作方式是遍历 ANN 中的每一层及其中的每个节点,然后将该层中的所有权重相加(每个节点都有自己的权重),然后添加阈值,并计算此数字是否激活下一个节点(如果数字 > x --> 下一个节点被激活)。
你的代码正在做的是从输出层获取所有神经元,获取它们的所有连接,获取给定的神经元输出,从前一层左神经元中获取权重,做一些数学运算, 并根据我的理解设置从上一层神经元到当前层神经元的连接权重。
这里有一个很棒的 link 用于了解 ANN 工作原理的基础知识,http://www.ai-junkie.com/ann/evolved/nnt1.html
我正在尝试将反向传播算法应用到我自己的网络中。我了解 backprop agl 的概念,但是,我的数学并不强。我只是在研究反向传播算法的前半部分,计算输出层(还不用担心隐藏层中的偏导数)。
我在搜索时发现了以下代码,我正在寻找其中一部分的解释。
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设置为上一层的输出?如果是这样,这到底是什么意思?从上一层传递给特定神经元的权重总和?
你的方向基本正确,是的。计算反向传播的输出层部分分两步完成:
首先,计算误差导数,用非数学术语来说就是 "what you want, minus what the output neuron gives you"。如果我们调用神经元的输出 "output",以及我们实际想要得到的 "desiredOutput",我们最终会得到代码示例中的公式:
double errorDerivative = (output * (1-output) *(desiredOutput - output));
现在我们有了输出神经元的导数,我们想用它来更新输出神经元和它的输入神经元之间的所有权重,所以我们循环它们。对于每个权重,我们只需添加导数,乘以学习率, 乘以神经元向输出神经元发送信息的激活 。这就是命名不太恰当的 ai
变量的意思——无论神经元发送到输出神经元。
对于非常好的视觉指南,我推荐 https://www4.rgu.ac.uk/files/chapter3%20-%20bp.pdf - 第 3-4 (18-19) 页。
AI 被设置为前一个连接的 leftNeuron 的输出值(任何连接到当前节点的节点)。
反向传播算法的工作方式是遍历 ANN 中的每一层及其中的每个节点,然后将该层中的所有权重相加(每个节点都有自己的权重),然后添加阈值,并计算此数字是否激活下一个节点(如果数字 > x --> 下一个节点被激活)。
你的代码正在做的是从输出层获取所有神经元,获取它们的所有连接,获取给定的神经元输出,从前一层左神经元中获取权重,做一些数学运算, 并根据我的理解设置从上一层神经元到当前层神经元的连接权重。
这里有一个很棒的 link 用于了解 ANN 工作原理的基础知识,http://www.ai-junkie.com/ann/evolved/nnt1.html