Python 在神经网络的学习阶段,反向传播后会发生什么?

Python 在神经网络的学习阶段,反向传播后会发生什么?,python,neural-network,deep-learning,artificial-intelligence,backpropagation,Python,Neural Network,Deep Learning,Artificial Intelligence,Backpropagation,在学习阶段的神经网络中,有两种机制发生。前馈和反向传播。以异或运算为例 A B Q 0 0 0 0 1 1 1 0 1 1 1 0 对于第一次传递(0,0->0),进行前馈,然后进行反向传播。在这一步之后,重新计算所有权重。 现在发生了什么? 问题1:同样,相同的输入0,0与新计算的权重(在反向传播期间)进行前馈,然后进行反向编程,直到误差变为零?如果是,如果错误从不为零,会发生什么?这就引出了下一个问题。 问题2:下一关(0,1->1)的学习将在何时进

在学习阶段的神经网络中,有两种机制发生。前馈和反向传播。以异或运算为例

A   B   Q
0   0   0
0   1   1
1   0   1
1   1   0
对于第一次传递(0,0->0),进行前馈,然后进行反向传播。在这一步之后,重新计算所有权重。
现在发生了什么?

问题1:同样,相同的输入0,0与新计算的权重(在反向传播期间)进行前馈,然后进行反向编程,直到误差变为零?如果是,如果错误从不为零,会发生什么?这就引出了下一个问题。

问题2:下一关(0,1->1)的学习将在何时进行?

问题3:假设第一次传递的结论权重为10.3,-2.3,5.5。第二次传递(0,1->1)使用第一次传递的结论权重开始前馈


如果我必须通过代码来描述,以下哪种代码是正确的

以下选项的通用代码

averageErrorUntilLearn = 0.002;
inputs = [
[0, 0],
[0, 1],
[1, 0],
[1, 1]
];
outputs = [0, 1, 1, 0];
inputNeurons = 2;
hiddenLayers = 1;
outputNeurons = 1;

//initialize the Neural Net
neuralNetObj = NeuralNet();
neuralNetObj.createTopology(inputNeurons, hiddenLayers, outputNeurons);
weightsForTheNetwork = randomWeights();

问题3情景- 每个过程中计算的权重将发送到下一个过程

//learn 
while (averageError > averageErrorUntilLearn):
    for i in range(0,len(input)):
        console.log("Current Pass-" + i);
        neuralNetObj.learningParams(inputs[i], outputs[i]);
        neuralNetObj.initializeWeights(weightsForTheNetwork);
        neuralNetObj.feedforward();
        neuralNetObj.backPropagate();
        weightsForTheNetwork=neuralNetObj.getNewWeights();
        averageError = neuralNetObj.getAverageError();
问题1场景-每个过程使用其自身的权重进行计算,直到达到所需的学习,然后权重被发送到新过程

//learn 
for i in range(0,len(input)):
    while (averageError > averageErrorUntilLearn):
        console.log("Current Pass-" + i);
        neuralNetObj.learningParams(inputs[i], outputs[i]);
        neuralNetObj.initializeWeights(weightsForTheNetwork);
        neuralNetObj.feedforward();
        neuralNetObj.backPropagate();
        weightsForTheNetwork = neuralNetObj.getNewWeights();
        averageError = neuralNetObj.getAverageError();


或者我在这里完全错了,上面的场景都不正确吗?

向前向后传球是训练的一个步骤,它计算梯度,然后用近似方法(SGD、RMSProp、Adam等)调整权重

您所描述的是一次学习一个输入,即对
(0,0->0)
进行向前向后传递,然后对
(0,1->1)
进行向前向后传递,依此类推。每一步都使用上一步计算的权重,但它不知道之前的数据是什么

然而,在实践中,培训通常是分批进行的,即网络对批
[(0,0->0),(0,1->1)]
采取一个步骤,然后对下一批进行,依此类推。顺序是随机化的,因此批次可以以不同的方式形成。在某些模型中,下一批数据都是随机抽取的,因此有可能同一输入数据连续几次输入到网络中,尽管可能性不大。但通常的方法是:洗牌所有的训练数据(在您的案例中有4个示例),并成批迭代所有训练数据。然后重复

在极少数情况下,批次包含所有训练数据,这基本上意味着这是一个普通的梯度下降(不是随机的)。在这种情况下,每个步骤都会一次又一次地采用相同的输入

总而言之:你可以自由地按你想要的任何顺序向网络提供信息,但通常人们是按随机顺序提供信息的。此外,错误永远不会完全变为空,因此您只需在若干次迭代后停止。

1)是的,backprop步骤将继续更新权重,直到前馈步骤出现0错误。无论它是否达到0错误,都必须定义停止条件来告诉它何时停止。最简单的方法是设置一个固定的迭代次数进行训练。这是一个好的、简单的开始方法。真正的问题将使用更复杂的方法,例如定期检查单独验证步骤的准确性,并在准确性停止提高时停止。但是,对于XOR问题,只需使用固定的迭代次数。由您决定并告诉它停止标准是什么

2) 您不希望在一个实例上重复训练(例如0,0->0),然后切换到另一个实例。如果您一次只训练一个实例,请执行第一个实例一次(前进和后退步骤),然后是下一个实例,依此类推,直到训练数据结束。然后从头开始,并再次检查每个实例。以这种方式,它为训练数据中表示的每个案例交错训练。正如@Maxim所说,分批训练更为常见。在一批中,它将同时进行所有正向传递,并收集网络对答案的所有猜测。然后,它将计算批处理的每个实例的错误,并反向传播一次,以更正批处理中所有实例的平均错误。因此,它正在学习如何同时处理批次中的所有案例。这比一次只做一个实例要快,但是网络应该能够以任何一种方式了解问题。这里重要的一点是,它可以同时了解培训数据中的所有案例,而不是一个接一个地了解


3) 是的,一旦您执行backprop步骤,它将对权重应用更新,下一个训练步骤将使用新的权重

因此,对于一个批次[(0,0->0),(0,1->1)],会发生向前-向后传递。然后对于下一个批次[(1,0->1),(1,1->0)],会发生另一个向前-向后传递。我仍在努力理解这是如何工作的。我只有两个输入,这意味着在这种情况下,每个过程仍然必须发生在单个特征值(0,0)上,即使我成批发送数据。我可以看出,成批学习让你感到困惑,但这很重要。在一个矩阵中,两个或多个输入同时进入网络。你能用一个输入做的每件事,都能用一个矩阵来做。由于并行化,它的执行速度比一个接一个快,而且对于渐变效果更好。1)Backprop不会在“错误为0”时停止,而是在渐变为0时“停止”,错误可以是任意的。2) 实际上是另一种方法——使用“全批量”是训练神经网络的正确方法,而小批量或一次一个实例是随机近似,这主要是为了提高计算效率,但它们仍然学习“任意一种方法”这一事实是一个非常重要的数学问题(一次学习整个训练集在数学上证明是微不足道的)。