深度学习基本知识点-梯度下降

目录

BGD

SGD

Mini-batch GD

Momentum

Adagrad

Adadelta

Adam


梯度:梯度是函数对参数的偏微分,这里由于参数比较多,对于每个参数都有一个偏微分,所以梯度是一个向量。
如果损失函数f = x^{2} + y^{2}, 此时参数为xy,目标是最小化损失函数,即损失值最小的时候xy的取值,这里对xy做偏微分:

        \frac{\partial f}{\partial x} =2x

        \frac{\partial f}{\partial y} =2y

对于训练数据集,每一个数据都可以调整xy参数的数值,但最开始需要给他们一个初始值(这涉及到初始化算法,这里暂时不提) x^{0}y^{0},那么接下来就可以迭代了:

        x^{1} = x^{0} - \alpha \cdot \frac{\partial f}{\partial x}

        y^{1} = y^{0} - \alpha \cdot \frac{\partial f}{\partial y}

\alpha就是学习率,经过多次迭代,直到损失函数f的值达到最小(什么时候最小,这个就涉及到early stopping了)。

BGD

批量梯度下降

GD是对于每个样本都进行参数更新,这个速度太慢了,BGD是对一个批量的数据计算得到下降总均值,然后来更新参数:

\theta _{t+1} = \theta _{t} - \alpha \cdot\frac{1}{n} \cdot \sum_{i=1}^{n} \bigtriangledown_{\theta _{t} } J_{i}(\theta _{t}, x _{i}, y _{i})

SGD

BGD虽然每批次更新一次梯度,但是需要计算批量里的每个样本的梯度值,随机梯度下降就是在一个批次中只更新一次梯度,这个和BGD一致,但是每次只随机抽取批量里的一个样本来计算梯度进行更新。这样计算效率提高很多,当然也有自己的弊端,那就是不够准确,随机选取的数据如果算得的梯度值过大,波动就会很大,那么很容易从一个局部最优直接跳转到另一个局部最优。

Mini-batch GD

那不能保证又快又好,那就只能折中,就是既不是计算批次里所有数据,也不是只随机选取一个,那就从中选取m个,m小于批数量。目前的SGD默认就是Mini-batch GD。

Momentum

动量梯度下降,增加一个参数m_{t} (一阶动量)

        m_{t+1} = \beta m_{t} + (1-\beta )\frac{\partial f}{\partial x} 

        \theta _{t+1} = \theta _{t} - \alpha \cdot m_{t+1}

 一阶动量约等于最近\frac{1}{1-^{\beta _{1}}}个时刻梯度向量和的平均值(说实话,文字我理解了,但是这公式没看懂,\beta m_{t}表示上一时刻的一阶动量,\frac{\partial f}{\partial x}也是上一时刻的梯度啊,除非公式写错了,应该是这一时刻的梯度才对),\beta值一般取0.9,那就是最近十次梯度的平均值。这是为了避免当前批次更新过于震荡,方向走错,所以采用近10次的平均值。在梯度方向改变时,momentum能够降低参数更新速度,从而减少震荡,在梯度方向相同时,momentum可以加速参数更新, 从而加速收敛。

动量主要解决SGD的两个问题(抄来的原文):

  • 随机梯度的方法(引入的噪声)

  • Hessian矩阵病态问题(可以理解为SGD在收敛过程中和正确梯度相比来回摆动比较大的问题)。

以上都是使用固定学习率进行梯度下降,学习率大了容易震荡,从一个局部最优跳到另一个局部最优,小了又收敛太慢。所以下面介绍自适应学习率

Adagrad

二阶动量:是迄今为止所有梯度值的平方和

        V_{t} = \sum_{i=1}^{t} g_{t}^{2}

学习率为:

\alpha = \frac{\eta }{\sqrt{V_{t}+\varepsilon }}

所以如果某个参数经常更新,那么其梯度就会很多,学习率就比较小,更新幅度小,如果某个参数较少更新,那么学习率就会大,更新幅度大。

细心的小伙伴应该会发现Adagrad还是存在一个很明显的缺点:

  • 仍需要手工设置一个全局学习率 \eta, 如果  \eta设置过大的话,会使regularizer过于敏感,对梯度的调节太大 

  • 中后期,分母上梯度累加的平方和会越来越大,使得参数更新量趋近于0,使得训练提前结束,无法学习

Adadelta

Adagrad调整学习率变化过于激进,公式推导不看了,简单来说只用部分梯度值,且只是求平均(这里赶紧结合了Adagrad和Momentum),并且去掉了\eta,Adadelta有如下特点:

  • 训练初中期,加速效果不错,很快

  • 训练后期,反复在局部最小值附近抖动

Adam

结合了一阶动量和二阶动量。 

没写完,有点累,后面有空在接着写,原文

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值