深度学习最全梯度下降优化算法

前言

什么是梯度?方向导数是一个值而梯度是一个向量。方向导数是函数在各个方向的斜率,而梯度是斜率最大的方向,梯度的值是方向导数最大的值。

\frac{\partial f}{\partial \imath }|_{(x_{0},y_{0})}=f(x_{0},y_{0})_{x}cos\alpha +f(x_{0},y_{0})_{y}cos\beta=grad f(x_{0},y_{0})\cdot e_{\iota }=|grad f(x_{0},y_{0})|cos\theta

            当 Θ = 0 时,e 与梯度方向相同时,方向导数最大,函数增加最快

           当 Θ = pi 时,e 与梯度方向相反时,方向导数最小,函数减少最快

           当 Θ = pi/2 时,e 与梯度方向垂直时,方向导数为0, 函数变化率为零

反向传播通过梯度下降的方式来更新参数,以使得loss最小。公式如下:

                                       \omega =\omega -\eta \cdot \frac{\partial Loss}{\partial \omega }        

\eta代表学习率,作为参数控制梯度下降的步长。

1.SGD

随机梯度下降(Stochastic Gradient Descent, SGD)每次从训练样本中随机抽取一个样本计算loss和梯度并对参数进行更新;但这种优化算法比较弱,容易走偏,有时可用于在线学习(Online Learning)系统,可使系统快速学到新变化。

批量梯度下降(Batch Gradient Descent,BGD)算法每次使用整个训练集合计算梯度,这样计算的梯度比较稳定,相比随机梯度下降不那么容易震荡;单非常慢且无法放到内存中计算,更无法应用于在线学习系统。

介于随机梯度下降和批量梯度下降之间的是小批量梯度下降(Mini-Batch Gradient Descent),即每次随机抽取m个样本,以它们的梯度均值作为梯度的近似估计。它可以降低参数更新时的方差,收敛更稳定,另一方面可以充分地利用深度学习库中高度优化的矩阵操作来进行更有效的梯度计算。

在深度学习中常说的随机梯度下降通常是指小批量梯度下降。所以本博客中的SGD没有特别指出,都为小批量梯度下降。随机梯度下降的具体训练步骤如下所示,其中f(x^{^{(i)}})表示第i个样本的预测值,L(f(x^{(i)}),y)表示第i个样本的损失函数, \frac{1}{m}\sum_{i=1}^{m}L(f(x^{(i)}),y^{(i)})为m条数据的平均损失。


参数:学习率\eta

初始化\theta

 while 停止条件未满足do

              从训练数据中抽取m条数据{ {x^{(1)},x^{(2)},......,x^{(m)}}}及对应的标签{ {y^{(1)},y^{(2)},......,y^{(m)}}}

              计算梯度:g(\theta )=\frac{\partial (\frac{1}{m}\sum_{i=1}^{m}L(f(x^{(i)}),y^{(i)}))}{\partial \theta }

              更新参数:\theta =\theta -\eta \ast g(\theta )

end while


为了使随机梯度下降获得较好的性能,学习率\eta需要取值合理并根据训练过程动态调整。如果学习率过大,模型就会收敛过快,最终离最优值较远;如果学习率过小,迭代次数就会很多,导致模型长时间不能收敛。

2.Momentum

动量(Momentum)是来自物理力学中的一个概念,是力的时间积累效应的度量。动量的方法在随机梯度下降的基础上,加上了上一步的梯度:

m_{t}=\gamma m_{t-1}+g(\theta )

\theta =\theta -\eta m_{t}

其中\gamma是动量参数且\gamma \in [0,1]。动量的优化方法也可以写为如下形式:

\nu _{t}=\gamma \nu _{t-1}+\eta \ast g(\theta )

\theta =\theta -\nu _{t}

区别在于学习率\eta的位置。如果对公式进行展开,不难发现两者是完全等价的。

相比随机梯度下降,动量会使相同方向的梯度不断累加,而不同方向的梯度则相互抵消,因而可以在一定程度上克服Z字形的震荡,更快到达最优点。具体算法细节如下所示:


参数:学习率\eta,动量\mu

初始化\theta

 while 停止条件未满足do

从训练数据中抽取m条数据{ {x^{(1)},x^{(2)},......,x^{(m)}}}及对应的标签{ {y^{(1)},y^{(2)},......,y^{(m)}}}

              计算梯度:g(\theta )=\frac{\partial (\frac{1}{m}\sum_{i=1}^{m}L(f(x^{(i)}),y^{(i)}))}{\partial \theta }

              更新参数:

                  m_{t}=\gamma m_{t-1}+g(\theta )

                 \theta_{t+1} =\theta_{t} -\eta m_{t}

end while


3.NAG

Nesterov加速梯度(Nesterov Accelerated Gradient, NAG)与动量类似,也是考虑最近的梯度情况,但是NAG相对超前一点,它先使用动量m_{t}计算参数\theta下一个位置的近似值\theta +\eta m_{t},然后再近似位置上计算梯度:

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值