2

在学习阶段的神经网络中,有两种机制发生。前馈和后向传播。以异或操作为例。神经网络学习阶段的反向传播后会发生什么?

A B Q 
0 0 0 
0 1 1 
1 0 1 
1 1 0 

对于第一遍(0,0-> 0)的前馈发生时,然后反向传播happens.After此步骤被重新计算所有的权重。
现在会发生什么?

问题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个scenario- 权重通过发送到下一个通道

问题1 scenario-每个过程都与它自己的权重计算,直至达到理想的学习,然后在权重发下来的新通

//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(); 


还是我完成什么错在这里并没有以上情况是真正?

回答

0

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

2)您不想在一个实例(例如0,0-> 0)上反复训练,然后切换到另一个实例。如果您一次只训练一个实例,则先执行一次(前进和后退步骤),然后再执行下一个实例,直到训练数据结束。然后再重新开始并再次通过每个实例。以这种方式,它对训练数据中表示的每种情况的训练进行交错。正如@Maxim所说,分批培训更为常见。在一个批次中,它将同时完成所有前向传球,并收集有关答案的所有网络猜测。然后,它将计算批处理的每个实例的错误,并反向传播一次,以纠正批处理中所有实例的平均错误。因此它正在学习如何同时处理批次中的所有情况。这比一次执行一个实例要快,但网络应该能够以任何方式学习问题。这里重要的一点是,它正在同时学习培训数据中的所有案例,而不是一个接一个。

3)是的,一旦你做了backprop步骤,它会将更新应用到权重,下一个训练步骤将使用新的权重。

+0

1)Backprop不会在“错误为0时停止”,当梯度为0时它会“停止”,错误可以是任意的。 2)实际上相反 - 使用“全批”是训练神经网络的正确方式,而小批量或单个实例一次是随机逼近,其主要用于计算效率,但事实上他们仍然学习“任何一种方式”是一个不平凡的数学问题(尽管一次学习整个训练集是微不足道的数学证明)。 – lejlot

1

前进 - 后退传递是训练的一个步骤,它计算稍后用于通过近似方法(SGD,RMSProp,Adam等)调整权重的梯度。

你的描述是学习一个输入同时什么,这是一个前后通是为(0,0->0)完成,然后向前向后的通行证(0,1->1)等。每个步骤都使用前一步计算的权重,它不知道之前的数据是什么。

然而,实际上,培训通常在完成,也就是说,网络采取批量[(0,0->0), (0,1->1)]一步,然后为下一批等等。订单是随机的,所以批次可以不同形式。在某些模型中,每个下一个批次都是随机抽取的,因此可能相同的输入会连续多次输入到网络中,尽管不太可能。但通常的方法是:洗牌所有训练数据(在你的案例中有4个例子),并批量迭代所有数据。然后重复。

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

总结:您可以按照自己想要的任何顺序自由提供网络,但通常人们会按随机顺序进行操作。此外,该错误永远不会完全为空,所以您只需经过若干次迭代即可停止。

+0

因此,对于一批[(0,0-> 0),(0,1-> 1)],发生前后传递。然后,对于下一批次[(1,0-> 1), ,1-> 0)]另一个前进传球发生。我仍然在努力理解这是如何工作的。我只有两个输入,这意味着即使我批量发送数据,在这种情况下每个通道仍然必须在单个特征值(0,0)上发生。 –

+0

我可以看到批量学习让你感到困惑,但这很重要。两个或多个输入同时进入网络,在一个矩阵中。您可以使用单个输入完成的任何操作都可以通过矩阵完成。由于并行化,它的执行速度比逐个更快,对梯度更好。 – Maxim