如何解决带动量的梯度下降
我目前正在从头开始构建神经网络,并且已经将其与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 的功效,因此旧的渐变对更新的更改小于最近的渐变。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。