在神经网络的学习阶段反向传播后会发生什么?
What happens after backpropagation in the learning phase within Neural Network?
在学习阶段的神经网络中,有两种机制正在发生。前馈和反向传播。以异或运算为例
A B Q
0 0 0
0 1 1
1 0 1
1 1 0
对于第一个 pass(0,0->0) 前馈发生,然后反向传播 happens.After 这一步所有的权重都被重新计算。
现在发生了什么?
问题 1:再次使用新计算的权重(在反向传播期间)对相同的输入 0,0 进行前馈,然后反向传播直到错误变为零?如果是,如果错误永远不会为空会发生什么?这让我想到下一个问题。
问题2:下一次pass(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();
还是我完全错了,上面的 none 个场景是真的?
Forward-backward pass是训练的一个步骤,通过近似方法(SGD、RMSProp、Adam等)计算梯度,稍后用于调整权重。
您描述的是学习一次输入一个,即为(0,0->0)
完成一个前向-后向传递,然后为(0,1->1)
等等。每一步都使用上一步计算的权重,它不知道之前的数据是什么。
然而,在实践中,训练通常在 批次 中完成,即网络对批次 [(0,0->0), (0,1->1)]
采取一个步骤,然后对下一个批次进行,依此类推在。顺序是随机的,因此可以形成不同的批次。在某些模型中,每个下一批次都是随机获取的,因此相同的输入可能会连续多次输入网络,但可能性很小。但通常的方法是这样的:洗牌所有训练数据(在你的例子中有 4 个例子)并分批迭代所有这些数据。然后重复。
在极少数情况下,batch 包含所有训练数据,这基本上意味着它是普通的梯度下降(不是 stochastic)。在这种情况下,每个步骤将一遍又一遍地采用相同的输入。
总而言之:您可以自由地以任何您想要的顺序向网络提供内容,但通常人们会以随机顺序进行。此外,错误永远不会完全变为空,因此您只需在一些迭代后停止。
1) 是的,backprop 步骤会不断更新权重,直到前馈步骤出现 0 错误。无论它是否达到 0 错误,您都必须定义一个停止条件来告诉它何时停止。最简单的就是设置固定的迭代次数来训练。这是一个很好的、简单的入门方法。实际问题将使用更复杂的方法,例如在单独的验证步骤中定期检查准确性,并在准确性停止提高时停止。但是,对于 XOR 问题,只需使用固定次数的迭代。由您决定并告诉它停止条件是什么。
2)你不想在一个实例(比如0,0->0)上重复训练,然后切换到不同的实例。如果您一次训练一个实例,则通过第一个实例一次(前向和反向传播步骤),然后是下一个实例,依此类推直到训练数据结束。然后从头开始,再次检查每个实例。通过这种方式,它为训练数据中表示的每个案例交错训练。正如@Maxim 所说,批量训练更为常见。在一个批次中,它将同时进行所有前向传递并收集网络对答案的所有猜测。然后它将计算批处理的每个实例的误差,并反向传播一次以纠正批处理中所有实例的平均误差。因此,它正在学习如何同时处理批次中的所有案例。这比一次处理一个实例要快,但网络应该能够以任何一种方式学习问题。这里的重点是它同时学习训练数据中的所有案例,而不是一个一个地学习。
3) 是的,一旦你执行了反向传播步骤,它就会将更新应用于权重,而下一个训练步骤将使用新的权重。
在学习阶段的神经网络中,有两种机制正在发生。前馈和反向传播。以异或运算为例
A B Q
0 0 0
0 1 1
1 0 1
1 1 0
对于第一个 pass(0,0->0) 前馈发生,然后反向传播 happens.After 这一步所有的权重都被重新计算。
现在发生了什么?
问题 1:再次使用新计算的权重(在反向传播期间)对相同的输入 0,0 进行前馈,然后反向传播直到错误变为零?如果是,如果错误永远不会为空会发生什么?这让我想到下一个问题。
问题2:下一次pass(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();
还是我完全错了,上面的 none 个场景是真的?
Forward-backward pass是训练的一个步骤,通过近似方法(SGD、RMSProp、Adam等)计算梯度,稍后用于调整权重。
您描述的是学习一次输入一个,即为(0,0->0)
完成一个前向-后向传递,然后为(0,1->1)
等等。每一步都使用上一步计算的权重,它不知道之前的数据是什么。
然而,在实践中,训练通常在 批次 中完成,即网络对批次 [(0,0->0), (0,1->1)]
采取一个步骤,然后对下一个批次进行,依此类推在。顺序是随机的,因此可以形成不同的批次。在某些模型中,每个下一批次都是随机获取的,因此相同的输入可能会连续多次输入网络,但可能性很小。但通常的方法是这样的:洗牌所有训练数据(在你的例子中有 4 个例子)并分批迭代所有这些数据。然后重复。
在极少数情况下,batch 包含所有训练数据,这基本上意味着它是普通的梯度下降(不是 stochastic)。在这种情况下,每个步骤将一遍又一遍地采用相同的输入。
总而言之:您可以自由地以任何您想要的顺序向网络提供内容,但通常人们会以随机顺序进行。此外,错误永远不会完全变为空,因此您只需在一些迭代后停止。
1) 是的,backprop 步骤会不断更新权重,直到前馈步骤出现 0 错误。无论它是否达到 0 错误,您都必须定义一个停止条件来告诉它何时停止。最简单的就是设置固定的迭代次数来训练。这是一个很好的、简单的入门方法。实际问题将使用更复杂的方法,例如在单独的验证步骤中定期检查准确性,并在准确性停止提高时停止。但是,对于 XOR 问题,只需使用固定次数的迭代。由您决定并告诉它停止条件是什么。
2)你不想在一个实例(比如0,0->0)上重复训练,然后切换到不同的实例。如果您一次训练一个实例,则通过第一个实例一次(前向和反向传播步骤),然后是下一个实例,依此类推直到训练数据结束。然后从头开始,再次检查每个实例。通过这种方式,它为训练数据中表示的每个案例交错训练。正如@Maxim 所说,批量训练更为常见。在一个批次中,它将同时进行所有前向传递并收集网络对答案的所有猜测。然后它将计算批处理的每个实例的误差,并反向传播一次以纠正批处理中所有实例的平均误差。因此,它正在学习如何同时处理批次中的所有案例。这比一次处理一个实例要快,但网络应该能够以任何一种方式学习问题。这里的重点是它同时学习训练数据中的所有案例,而不是一个一个地学习。
3) 是的,一旦你执行了反向传播步骤,它就会将更新应用于权重,而下一个训练步骤将使用新的权重。