随机梯度下降(动量)公式实现C ++

时间:2018-02-04 13:22:34

标签: algorithm optimization machine-learning neural-network backpropagation

所以我在Youtube上有一个神经网络的实现。该人使用SGD(Momentum)作为优化算法,使用双曲正切作为激活函数。我已经将传递函数更改为Leaky ReLU(用于隐藏层)和Sigmoid(用于输出层)。

但现在我决定将优化算法更改为Adam。我最终在维基百科上搜索S​​GD(Momentum)以更深入地了解它是如何工作的,我注意到了一些关闭的东西。该人在剪辑中使用的公式与维基百科上的公式不同。而且我不确定这是否是一个错误,或者不是......剪辑是一小时,但我并没有要求你观看整个视频,但是我很感兴趣通过54m37s标记和维基百科公式,就在这里:

https://youtu.be/KkwX7FkLfug?t=54m37s https://en.wikipedia.org/wiki/Stochastic_gradient_descent#Momentum

因此,如果您查看该人的实现,然后在维基百科链接中查看SGD(Momentum)公式,基本上唯一的区别在于delta权重的计算。

维基百科声明你减去动量乘以旧的增量权重,学习率乘以梯度和神经元的输出值。而在教程中,而不是减去那个人加在一起。但是,新重量的公式是正确的。它只是将增量权重添加到旧权重。

所以我的问题是,教程中的人是否犯了错误,或者我缺少什么?因为某种程度上,我训练了一个神经网络并且它的行为相应,所以我无法真正告诉这里的问题。提前谢谢。

1 个答案:

答案 0 :(得分:1)

我看到动力以不同的方式实施。就个人而言,我最后也遵循了这个指南:http://ruder.io/optimizing-gradient-descent 在那里,动量和重量分别更新,我认为这更清楚。

我不知道视频中的变量,所以我不确定,但维基百科版本是正确的。

在视频中,渐变* learning_rate会被添加而不是减去,如果你相应地计算和传播你的错误就没问题。

此外,在视频中的哪个位置显示“neuron_getOutputVal()* m_gradient”,如果它是我认为的那样,整个事物被认为是渐变。我的意思是你必须将你传播的时间乘以神经元的输出以获得实际的梯度。

对于没有动量的梯度下降,一旦你得到了实际的渐变,你就将它与学习率相乘,然后从你的权重中减去(或添加,取决于你如何计算和传播误差,但通常是减去它)。

有了动力,你可以像在维基百科中所说的那样,使用最后一次“改变你的权重”或“增量权重”作为公式的一部分。