赞
踩
SGD是最基本的优化算法之一。它通过在每次迭代中计算损失函数关于权重的梯度(对一小批量训练样本),然后沿着梯度的反方向来最小化损失。
W t + 1 = W t − α ∇ J ( W t ; X i , y i ) W_{t+1} = W_t - \alpha\nabla J(W_t; X_i , y_i) Wt+1=Wt−α∇J(Wt;Xi,yi)
其中:
learning_rate = 0.01
optimizer = optim.SGD(model.parameters(), lr=learning_rate)
1、震荡和收敛速度慢:SGD在优化过程中容易受到梯度噪声的影响,导致SGD可能会产生不稳定的训练过程,因为它每次迭代只考虑当前梯度,容易在某些区域中卡住,导致收敛速度较慢。
2、需要手动设置学习率:SGD的性能高度依赖学习率的选择。学习率大了会导致训练不稳定,模型参数发散;小了会使训练收敛得非常慢。因此,需要仔细调整学习率,这需要大量试验。
3、容易陷入局部最小值:SGD只考虑了局部梯度信息,因此容易陷入局部最小值,而忽略全局最小值。
4、对初始只敏感:SGD对初始参数值非常敏感。不同的初始值可能导致不同的收敛结果,这使得模型初始化变得相当复杂。
为了克服SGD的这些不足,研究人员从梯度方向和学习率两方面入手,提出了Momentum、Adagrad、RMSProp、Adam等改进算法。
动量法在SGD的基础上引入了过去梯度的移动平均值。它积累了当前梯度和以前梯度的一部分。这有助于平滑优化过程中震荡,加速收敛。
v t + 1 = β v t + ( 1 − β ) ∇ J ( W t ; X i , y i ) W t + 1 = W t − α v t + 1 v_{t+1}=\beta v_t+(1-\beta)\nabla J(W_t;X_i,y_i)\\ W_{t+1}=W_t-\alpha v_{t+1} vt+1=βvt+(1−β)∇J(Wt;Xi,yi)Wt+1=Wt−αvt+1
其中: β \beta β是动量超参数,通常在0.8到0.99之间选择。
learning_rate = 0.01
momentum = 0.9 # 动量参数
optimizer = optim.SGD(model.parameters(), lr=learning_rate, momentum=momentum)
动量法是在SGD的基础上从梯度方向方面做了改进。在SGD中,每次都是减去当前小批次的梯度,如果当前批次的梯度方向严重偏离目标方向时,那么本次梯度更新也会导致模型参数发生较大的偏离。而在Momentum中,每次的更新操作中除了有当前小批次的梯度,还包含了以前的梯度的移动平均值(这里可以理解为梯度更新的整体趋势),那么即使本次梯度的方向严重偏离,也会被以前的累积梯度“纠正”一部分偏差。
以下是关于SGD和Momentum梯度下降的对比图。
从图中可以看出,当本次小批量的梯度方向偏离严重时,SGD就会按照这次的梯度方向进行更新,从而导致模型参数出现较大偏差;而Momentum会将本次的梯度与过去的累积梯度相结合,从而在一定程度上“纠正”本次梯度的偏差。
由此可见,相较于SGD,Momentum能够有效地缓解“震荡”,并加速收敛。
为什么Momentum结合了过去的累积梯度就好使?(或者说,为什么上述Momentum的公式奏效?)
这里可以参考一下吴恩达老师深度学习第63节关于指数加权平均的讲解:https://www.bilibili.com/video/BV1FT4y1E74V?p=63
Adagrad是在SGD的基础上从学习率方面做了改进,根据训练过程中每个参数的梯度自适应地调整学习率。它积累了每个参数的过去梯度平方,并使用这些信息来缩放学习率。具有较大梯度的参数接收较小的更新,而具有较小梯度的参数接收较大的更新。
G t + 1 = G t + ( ∇ J ( W t ; X i , y i ) ) 2 W t + 1 = W t − α G t + 1 + ϵ ∇ J ( W t ; X i , y i ) G_{t+1}=G_t+(\nabla J(W_t;X_i,y_i))^2 \\ W_{t+1}=W_t-\frac{\alpha}{\sqrt{G_{t+1}+\epsilon}}\nabla J(W_t;X_i,y_i) Gt+1=Gt+(∇J(Wt;Xi,yi))2Wt+1=Wt−Gt+1+ϵ α∇J(Wt;Xi,yi)
其中:
learning_rate = 0.01
optimizer = optim.Adagrad(model.parameters(), lr=learning_rate)
RMSProp相对于Adagrad添加了一个衰减系数,它降低了过去梯度平方和的权重。这意味着RMSProp能够在训练过程中逐渐减小学习率,但不会像Adagrad那样迅速降低到几乎为零,因此RMSProp使得学习率下降得更加平稳。
E [ G 2 ] t = β E [ G 2 ] t − 1 + ( 1 − β ) ( ∇ J ( W t ; X i , y i ) ) 2 W t + 1 = W t − α E [ G 2 ] t + ϵ ∇ J ( W t ; X i , y i ) E[G^2]_t=\beta E[G^2]_{t-1}+(1-\beta)(\nabla J(W_t;X_i,y_i))^2\\ W_{t+1}=W_t-\frac{\alpha}{\sqrt{E[G^2]_t+\epsilon}}\nabla J(W_t;X_i,y_i) E[G2]t=βE[G2]t−1+(1−β)(∇J(Wt;Xi,yi))2Wt+1=Wt−E[G2]t+ϵ α∇J(Wt;Xi,yi)
其中:E[G2]t是对过去梯度平方的指数移动平均,初始值通常为0。
learning_rate = 0.001
decay = 0.9 # 衰减参数(通常使用默认值0.9)
optimizer = optim.RMSprop(model.parameters(), lr=learning_rate, alpha=decay)
Adam从梯度方向和学习率两方面入手,结合了momentum和RMSProp的优点。它维护过去梯度的移动平均值(类似于动量)和过去梯度平方的移动平均值。这些移动平均值用于计算每个参数的自适应学习率。
Adam是深度学习中最常用的优化算法之一。它结合了动量和自适应学习率的优点,达到快速收敛、良好的泛化性能和对噪声梯度的鲁棒性。此外,它还具有内置的偏差校正,用于处理初始化问题。
m t + 1 = β 1 m t + ( 1 − β 1 ) ∇ J ( W t ; X i , i i ) v t + 1 = β 2 v t + ( 1 − β 2 ) ( ∇ J ( W t ; X i , y i ) ) 2 m ^ t + 1 = m t + 1 1 − β 1 t + 1 v ^ t + 1 = v t + 1 1 − β 2 t + 1 W t + 1 = W t − α v ^ t + 1 + ϵ m ^ t + 1 m_{t+1}=\beta_1 m_t+(1-\beta_1)\nabla J(W_t;X_i,i_i)\\ v_{t+1}=\beta_2 v_t+(1-\beta_2)(\nabla J(W_t;X_i,y_i))^2\\ \hat{m}_{t+1}=\frac{m_{t+1}}{1-\beta^{t+1}_1}\\ \hat{v}_{t+1}=\frac{v_{t+1}}{1-\beta^{t+1}_2}\\ W_{t+1}=W_t-\frac{\alpha}{\sqrt{\hat{v}_{t+1}+\epsilon}}\hat{m}_{t+1} mt+1=β1mt+(1−β1)∇J(Wt;Xi,ii)vt+1=β2vt+(1−β2)(∇J(Wt;Xi,yi))2m^t+1=1−β1t+1mt+1v^t+1=1−β2t+1vt+1Wt+1=Wt−v^t+1+ϵ αm^t+1
其中:
公式中第三行和第四行主要是为了校正初始偏差,详细的可参考吴恩达老师深度学习第65节相关内容https://www.bilibili.com/video/BV1FT4y1E74V?p=65
learning_rate = 0.001
optimizer = optim.Adam(model.parameters(), lr=learning_rate)
问:Momentum考虑了过去梯度的加权平均,请解释一下加权平均的意思和作用
动量(Momentum)算法中的“过去梯度的加权平均”指的是对过去几个梯度值进行加权平均的操作。这个加权平均的操作的作用是在优化过程中增加了动量,帮助优化算法更好地处理梯度的变化,从而改善训练的速度和稳定性。
这个动量项具有以下作用:
总的来说,加权平均的动量项使得优化算法在训练过程中具有一定的“惯性”,能够更好地应对梯度的变化,从而改善了训练的速度和稳定性。这是Momentum优化算法相对于标准的随机梯度下降算法的主要改进之一。
ps:由于本人学识有限,难免存在不足和错误之处,诚恳希望各位读者能够批评指正,共同学习进步
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。