【问题标题】:Stochastic Gradient Descent (Momentum) Formula Implementation C++随机梯度下降(动量)公式实现 C++
【发布时间】:2018-07-14 11:28:57
【问题描述】:

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

但现在我决定我也应该将优化算法更改为 Adam。最后,我在 Wikipedia 上搜索了 SGD(Momentum),以更深入地了解它的工作原理,我发现有些不对劲。这家伙在剪辑中使用的公式与维基百科上的不同。而且我不确定这是否是一个错误……该剪辑长达一小时,但我并不是要您观看整个视频,但是我对 54m37s 标记和维基百科公式很感兴趣,就在这里:

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

因此,如果您查看该人的实现,然后查看 SGD(动量)公式的 Wikipedia 链接,基本上唯一的区别在于增量权重的计算。

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

所以我的问题是,教程中的人是否犯了错误,或者我缺少什么?因为不知何故,我训练了一个神经网络,它的行为也相应地发生了变化,所以我无法真正说出问题所在。提前致谢。

【问题讨论】:

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


    【解决方案1】:

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

    我不太了解视频中的变量,所以我不确定,但维基百科版本绝对正确。

    在视频中,gradient*learning_rate 被添加而不是被减去,如果您相应地计算和传播您的错误,这很好。

    另外,在视频中说“neuron_getOutputVal()*m_gradient”的地方,如果我认为是这样,那么整个事情都被认为是渐变。我的意思是,您必须将传播的内容乘以神经元的输出才能得到实际的梯度。

    对于没有动量的梯度下降,一旦得到实际梯度,就将其乘以学习率,然后从权重中减去(或添加,取决于您计算和传播误差的方式,但通常是减去)。

    使用动量,您可以按照维基百科中的说明进行操作,使用最后的“更改权重”或“增量权重”作为公式的一部分。

    【讨论】:

    • 感谢您的回答,现在我对如何将其适应 Adam 优化器有了一个想法,因为在没有询问同一主题的情况下,您回答了我的一个与梯度相关的问题。我将查看该链接,并最终在我的网络上运行更多测试,如果遇到其他问题,我会回来。
    • 感谢网站,解释得很好!
    猜你喜欢
    • 2021-02-20
    • 2016-09-25
    • 2011-07-04
    • 1970-01-01
    • 2017-02-12
    • 2016-06-13
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    相关资源
    最近更新 更多