训练神经网络的过程有四步组成,重复这四个步骤就可以得到完整的训练流程
在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种方式:
,t是迭代次数
是超参数,t是迭代次数。
# 假设有梯度和参数向量x
cache += dx**2
x += - learning_rate * dx / (np.sqrt(cache) + eps)
cache = decay_rate * cache + (1 - decay_rate) * dx**2
x += - learning_rate * dx / (np.sqrt(cache) + eps)
m = beta1*m + (1-beta1)*dx
v = beta2*v + (1-beta2)*(dx**2)
x += - learning_rate * m / (np.sqrt(v) + eps)