Python 动量梯度下降

Python 动量梯度下降,python,numpy,machine-learning,deep-learning,neural-network,Python,Numpy,Machine Learning,Deep Learning,Neural Network,我目前正在从头制作一个神经网络,我已经让它与mnist数据集一起工作,在测试图像上获得大约80%的准确度。到达那个点需要一段时间,所以我尝试用动量实现梯度下降。目前的代码是: def backProp(self, inputs, correct_output): self.outputLayerErrors = np.subtract(self.outputNeurons, correct_output) self.hiddenLayerErrors = np.multiply(

我目前正在从头制作一个神经网络,我已经让它与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相比,其准确性和速度更差。我的代码或数学有什么问题吗?

要增加动量,您可以记录每个权重和偏差的所有梯度,然后将它们添加到下一次更新中。如果你在工作中增加动力的方式,似乎过去的更新都是平等地添加到当前的,那么第一个梯度仍然会对1000次迭代训练后的更新产生轻微影响。
self.weights-=self.learningRate*(currentGradient+sum([grad*(self.beta**t)表示t,grad表示枚举(反向(self.pastGradients)))

这就是动量通常看起来的样子,其中t代表时间。你将beta提高到t的幂,所以旧的梯度改变更新的次数少于最近的梯度