动量梯度下降

2024-10-01 02:19:01 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: 代码selfdefnp动量betainputsgd
1条回答
网友
1楼 · 发布于 2024-10-01 02:19:01

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

相关问题 更多 >