【问题标题】:Gradient descent with momentum具有动量的梯度下降
【发布时间】:2020-11-30 15:25:23
【问题描述】:

我目前正在从头开始制作一个神经网络,我已经让它与 mnist 数据集一起工作,以在测试图像上获得大约 80% 的准确度。达到这一点需要一段时间,所以我试图用动量实现梯度下降。当前代码是:

def backProp(self, inputs, correct_output):
    self.outputLayerErrors = np.subtract(self.outputNeurons, correct_output)
    self.hiddenLayerErrors = np.multiply(np.dot(self.secondLayerWeights.T, 

    self.secondLayerBiasesSummations = self.beta*self.secondLayerBiasesSummations + (1-self.beta)*self.outputLayerErrors
    self.secondLayerWeightsSummations = self.beta*self.secondLayerWeightsSummations + (1-self.beta)*np.outer(self.outputLayerErrors, self.secondLayerNeurons)

    self.firstLayerBiasesSummations = self.beta*self.firstLayerBiasesSummations + (1-self.beta)*self.hiddenLayerErrors
    self.firstLayerWeightsSummations = self.beta*self.firstLayerWeightsSummations + (1-self.beta)*np.outer(self.hiddenLayerErrors, inputs)

def change(self):
    self.secondLayerBiases -= self.learningRate * self.secondLayerBiasesSummations
    self.secondLayerWeights -= self.learningRate * self.secondLayerWeightsSummations
    self.firstLayerBiases -= self.learningRate * self.firstLayerBiasesSummations
    self.firstLayerWeights -= self.learningRate * self.firstLayerWeightsSummations

beta 设置为 0.9,学习率为 0.1。我的常规 gd 以 0.0001 的学习率运行,但具有动量的 gd 仅适用于 0.1 的学习率,并且与 reg gd 相比,在准确性和速度方面也更差。我的代码或数学有什么问题吗?

【问题讨论】:

    标签: python numpy machine-learning deep-learning neural-network


    【解决方案1】:

    要添加动量,您可以记录每个权重和偏差的所有梯度,然后将它们添加到下一次更新。如果您在工作中添加动量的方式,过去的更新似乎仍然与当前的更新相同,第一个梯度在 1000 次训练迭代后仍会对更新产生轻微影响。
    self.weights -= self.learningRate*(currentGradient+sum([grad*(self.beta**t) for t, grad in enumerate(reversed(self.pastGradients))])
    这就是动量通常的样子,其中 t 代表时间。您将 beta 提高到 t 的幂,因此旧渐变更改更新的次数少于最近的渐变。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-17
      • 1970-01-01
      • 2016-06-13
      • 1970-01-01
      • 1970-01-01
      • 2014-01-11
      相关资源
      最近更新 更多