一:参数更新
1.普通更新
最简单的更新方法就是将参数沿着负梯度的方向更新。由于要将损失值降到最小,所以沿下降最快的负梯度进行下降。假设有一个变量x和它的梯度dx,那么普通更新为
x += - learning_rate * dx
learning_rate为学习率,是一个固定常量/超参数,作用于全局数据,总会使损失值减小。
2.动量更新
这种方法是模拟物理。将损失值看作是一座山,而优化的过程就是一质点在山顶往下滚动的过程。在普通更新中是梯度直接影响位置,而动量更新是梯度影响速度,速度再影响位置。这个方法总能得到更好的结果
# 动量更新
v = mu * v - learning_rate * dx # 与速度融合
x += v # 与位置融合
这里引入了初始值为0的一个变量v和一个超参数mu,这个mu是抑制速度,以便系统到达山底(最优),其一般设[0.5,0.9,0.95,0.99]中的一个,可以先设为0.5,然后在后面慢慢升为0.99
3.Nesterov更新
在实践中我们可能会有这种情况,在某个位置x的未来的位置为x+mu*v,这让我们计算时就使用未来的位置而不是现在的。
既然我们知道动量将会把我们带到绿色箭头指向的点,我们就不要在原点(红色点)那里计算梯度了。
x_ahead = x + mu * v
# 计算dx_ahead(在x_ahead处的梯度,而不是在x处的梯度)
v = mu * v - learning_rate * dx_ahead
x += v
二:学习率退火
在训练数据时,学习率的选择很重要,如果只是选择很大的值,就可能导致越过全局最优点,或者损失函数无法收敛到更深更窄的地方,如果过小就会导致收敛进展过慢。
1.随步数衰减:每进行几个周期就根据一些因素降低学习率。
2.指数衰减。数学公式是\alpha=\alpha_0e^{-kt},其中\alpha_0,k是超参数,t是迭代次数(也可以使用周期作为单位)。
3.1/t衰减的数学公式是\alpha=\alpha_0/(1+kt),其中\alpha_0,k是超参数,t是迭代次数。
在实践中,我们发现随步数衰减的随机失活(dropout)更受欢迎,因为它使用的超参数(衰减系数和以周期为时间单位的步数)比k更有解释性。
三:逐参数适应学习率方法
1.Adagrad算法:
# 假设有梯度和参数向量x
cache += dx**2
x += - learning_rate * dx / (np.sqrt(cache) + eps)
接收到高梯度值的权重更新的效果被减弱,而接收到低梯度值的权重的更新效果将会增强。
eps参数是防止除0(一般设为1e-4到1e-8之间)
Adagrad算法的缺点是学习率变化得过于激进且过早停止
2.RMSprop算法
改算法是对Adagrad算法的升级,改变了cache,使学习率单调下降,不会过于激进
cache = decay_rate * cache + (1 - decay_rate) * dx**2
x += - learning_rate * dx / (np.sqrt(cache) + eps)
decay_rate是一个超参数,常用的值是[0.9,0.99,0.999]
3.Adam算法
m = beta1*m + (1-beta1)*dx
v = beta2*v + (1-beta2)*(dx**2)
x += - learning_rate * m / (np.sqrt(v) + eps)
其中推荐的参数值eps=1e-8, beta1=0.9, beta2=0.999。在实际操作中,我们推荐Adam作为默认的算法,一般而言跑起来比RMSProp要好一点。Adam类似于RMSprop的动量版
此文章仅为小生笔记精简借鉴,原文在下方食用
点击打开链接