回顾
训练神经网络的过程有四步组成,重复这四个步骤就可以得到完整的训练流程
- 需要有一个完整的数据集图像和标签,从数据集中取出一小批样本
- 通过网络做前向传播得到损失,考察分类效果
- 然后通过反向传播来得到每一个权重的梯度
- 这个梯度告诉我们如何去调整每一个权重,最终得到更好的分类结果
参数更新
SGD
在SGD(Stochastic gradient descent)中经常会遇到一个问题,就是梯度在某个方向非常小,在另一个方向有一个很大的速率,这样就会在一个方向进展很小,在另一个方向有很大变化,解决方法是动量更新(Momentum update)
#gradient descent update
x+= -learing_rate*dx
#momentum update
v = mu*v - learing_rate*dx#mu是一个系数[0,1],0.5,0.9
x+=v
学习率退火
在训练深度网络的时候,让学习率随着时间退火通常是有帮助的。可以这样理解:如果学习率很高,系统的动能就过大,参数向量就会无规律地跳动,不能够稳定到损失函数更深更窄的部分去。知道什么时候开始衰减学习率是有技巧的:慢慢减小它,可能在很长时间内只能是浪费计算资源地看着它混沌地跳动,实际进展很少。但如果快速地减少它,系统可能过快地失去能量,不能到达原本可以到达的最好位置。通常,实现学习率退火有3种方式:
随步数衰减:每进行几个周期就根据一些因素降低学习率。典型的值是每过5个周期就将学习率减少一半,或者每20个周期减少到之前的0.1。这些数值的设定是严重依赖具体问题和模型的选择的。在实践中可能看见这么一种经验做法:使用一个固定的学习率来进行训练的同时观察验证集错误率,每当验证集错误率停止下降,就乘以一个常数(比如0.5)来降低学习率。
指数衰减。公式为,t是迭代次数
1/t衰减的数学公式是
是超参数,t是迭代次数。
Adagrad
# 假设有梯度和参数向量x
cache += dx**2
x += - learning_rate * dx / (np.sqrt(cache) + eps)
RMSprop
cache = decay_rate * cache + (1 - decay_rate) * dx**2
x += - learning_rate * dx / (np.sqrt(cache) + eps)
Adam
m = beta1*m + (1-beta1)*dx
v = beta2*v + (1-beta2)*(dx**2)
x += - learning_rate * m / (np.sqrt(v) + eps)