带动量的梯度下降

问题描述

我目前正在从头开始构建神经网络,并且已经将其与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
β设置为0.9,学习率为0.1。我的常规gd以0.0001的学习率运行,但具有动量的gd仅以0.1的学习率运行,并且与reg gd相比,其准确性和速度也更差。我的代码或数学有什么问题吗?

解决方法

要添加动量,您可以记录每个权重和偏差的所有梯度,然后将其添加到下一个更新中。如果您在工作中增加动量的方式看起来仍然像是将过去的更新都均等地添加到当前的更新中,那么经过1000次迭代训练后,第一个渐变仍然会稍微影响更新。
self.weights -= self.learningRate*(currentGradient+sum([grad*(self.beta**t) for t,grad in enumerate(reversed(self.pastGradients))])
这就是动量通常的样子,其中t代表时间。您将 beta 提高到 t 的功效,因此旧的渐变对更新的更改小于最近的渐变。