numpy实现神经网络系列
工程地址:https://github.com/yizt/numpy_neuron_network
基础知识
0_2_1-卷积层的反向传播-单通道、无padding、步长1
0_2_2-卷积层的反向传播-多通道、无padding、步长1
0_2_3-卷积层的反向传播-多通道、无padding、步长不为1
0_2_4-卷积层的反向传播-多通道、有padding、步长不为1
0_2_5-池化层的反向传播-MaxPooling、AveragePooling、GlobalAveragePooling、GlobalMaxPooling
0_3-激活函数的反向传播-ReLU、LeakyReLU、PReLU、ELU、SELU
0_4-优化方法-SGD、AdaGrad、RMSProp、Adadelta、Adam
DNN练习
CNN练习
本文目录
SGD
随机梯度下降,注意这里的随机梯度下降是mini-batch gradient descent。一般深度学习中就用sgd代表。
a) 权重参数 , 权重梯度
b) 学习率 , 学习率衰减 (一般设置很小)
c) 动量大小 (一般设置为0.9) , t次迭代时累积的动量为
则学习率的更新公式为:
累积动量和权重的更新公式如下:
AdaGrad
这一节我们介绍 Adagrad 算法,它根据自变量在每个维度的梯度值的大小来调整各个维度上的学习率,从而避免统一的学习率难以适应所有维度的问题。
Adagrad 的算法会使用一个小批量随机梯度按元素平方的累加变量每次迭代中,首先将梯度
按元素平方后累加到变量
梯度的更新公式为:
是为了维持数值稳定性(避免除零)而添加的常数,例如 ; 可以是常数,也可以像公式(1)样为衰减学习率。
需要强调的是,梯度按元素平方的累加变量 出现在学习率的分母项中。因此,如果目标函数有关自变量中某个元素的偏导数一直都较大,那么就让该元素的学习率下降快一点;反之,如果目标函数有关自变量中某个元素的偏导数一直都较小,那么就让该元素的学习率下降慢一点。然而,由于 一直在累加按元素平方的梯度,自变量中每个元素的学习率在迭代过程中一直在降低(或不变)。所以,当学习率在迭代早期降得较快且当前解依然不佳时,Adagrad 在迭代后期由于学习率过小,可能较难找到一个有用的解。
特点
- Adagrad 在迭代过程中不断调整学习率,并让目标函数自变量中每个元素都分别拥有自己的学习率。
- 使用 Adagrad 时,自变量中每个元素的学习率在迭代过程中一直在降低(或不变)。
RMSProp
当学习率在迭代早期降得较快且当前解依然不佳时,Adagrad 在迭代后期由于学习率过小,可能较难找到一个有用的解。为了应对这一问题,RMSProp 算法对 Adagrad 做了一点小小的修改。
不同于 Adagrad 里状态变量
是到目前时间步里所有梯度按元素平方和,RMSProp 将过去时间步里梯度按元素平方做指数加权移动平均。公式如下:
权重更新公式仍然如AdaGrad
未完待续… …
参考
a) An overview of gradient descent optimization
b) 优化算法