Datawhale学习打卡LeeML-Task03(梯度下降)

参考:LeeML-Chapter6

回顾梯度下降

我们需要解决如下优化问题:
θ ∗ = arg ⁡ min ⁡ θ L ( θ )  L: loss function  θ :  parameters  \theta^{*}=\arg \min _{\theta} L(\theta) \quad \text { L: loss function } \theta: \text { parameters } θ=argθminL(θ) L: loss function θ: parameters 
假设t θ \theta θ 有两个变量 { θ 1 , θ 2 } \left\{\theta_{1}, \theta_{2}\right\} {θ1,θ2}
 随机初始化  θ 0 = [ θ 1 0 θ 2 0 ] [ θ 1 1 θ 2 1 ] = [ θ 1 0 θ 2 0 ] − η [ ∂ L ( θ 1 0 ) / ∂ θ 1 ∂ L ( θ 2 0 ) / ∂ θ 2 ] → θ 1 = θ 0 − η ∇ L ( θ 0 ) [ θ 1 2 θ 2 2 ] = [ θ 1 1 θ 2 1 ] − η [ ∂ L ( θ 1 1 ) / ∂ θ 1 ∂ L ( θ 2 1 ) / ∂ θ 2 ] → θ 2 = θ 1 − η ∇ L ( θ 1 ) \begin{aligned} &\text { 随机初始化 } \theta^{0}=\left[\begin{array}{l} \theta_{1}^{0} \\ \theta_{2}^{0} \end{array}\right] \\ &{\left[\begin{array}{l} \theta_{1}^{1} \\ \theta_{2}^{1} \end{array}\right]=\left[\begin{array}{l} \theta_{1}^{0} \\ \theta_{2}^{0} \end{array}\right]-\eta\left[\begin{array}{l} \partial L\left(\theta_{1}^{0}\right) / \partial \theta_{1} \\ \partial L\left(\theta_{2}^{0}\right) / \partial \theta_{2} \end{array}\right] \rightarrow \theta^{1}=\theta^{0}-\eta \nabla L\left(\theta^{0}\right)} \\ &{\left[\begin{array}{l} \theta_{1}^{2} \\ \theta_{2}^{2} \end{array}\right]=\left[\begin{array}{l} \theta_{1}^{1} \\ \theta_{2}^{1} \end{array}\right]-\eta\left[\begin{array}{l} \partial L\left(\theta_{1}^{1}\right) / \partial \theta_{1} \\ \partial L\left(\theta_{2}^{1}\right) / \partial \theta_{2} \end{array}\right] \rightarrow \theta^{2}=\theta^{1}-\eta \nabla L\left(\theta^{1}\right)} \end{aligned}  随机初始化 θ0=[θ10θ20][θ11θ21]=[θ10θ20]η[L(θ10)/θ1L(θ20)/θ2]θ1=θ0ηL(θ0)[θ12θ22]=[θ11θ21]η[L(θ11)/θ1L(θ21)/θ2]θ2=θ1ηL(θ1)
其中梯度可以简写为: ∇ L ( θ ) = [ ∂ L ( θ 1 ) / ∂ θ 1 ∂ L ( θ 2 ) / ∂ θ 2 ] \nabla L(\theta)=\left[\begin{array}{l} \partial L\left(\theta_{1}\right) / \partial \theta_{1} \\ \partial L\left(\theta_{2}\right) / \partial \theta_{2} \end{array}\right] L(θ)=[L(θ1)/θ1L(θ2)/θ2]
梯度下降法的计算过程进行可视化:
在这里插入图片描述

Some Tips

Tip1:小心设置学习率

在这里插入图片描述
虽然这样的可视化可以很直观观察,但可视化也只是能在参数是一维或者二维的时候进行,更高维的情况已经无法可视化了。

解决方法就是上图右边的方案,将参数改变对损失函数的影响进行可视化。比如学习率太小(蓝色的线),损失函数下降的非常慢;学习率太大(绿色的线),损失函数下降很快,但马上就卡住不下降了;学习率特别大(黄色的线),损失函数就飞出去了;红色的就是差不多刚好,可以得到一个好的结果。

自适应学习率

随着次数的增加,通过一些因子来减少学习率

  • 通常刚开始,初始点会距离最低点比较远,所以使用大一点的学习率
  • 在一些 epochs后,比较靠近最低点,减少学习率 η t = η / t + 1 \eta^{t}=\eta / \sqrt{t+1} ηt=η/t+1 t t t是次数。随着次数的增加, η t \eta^t ηt减小
  • 对于不同参数,要设置不同学习率

Adagrad 算法

每个参数的学习率都把它除上之前微分的均方根
普通的梯度下降为:
w t + 1 ← w t − η t g t η t = η t t + 1 \begin{gathered} w^{t+1} \leftarrow w^{t}-\eta^{t} g^{t} \\ \eta^{t}=\frac{\eta^{t}}{\sqrt{t+1}} \end{gathered} wt+1wtηtgtηt=t+1 ηt

  • w \mathrm{w} w 是一个参数
    Adagrad 可以做的更好:
    w t + 1 ← w t − η t σ t g t g t = ∂ L ( θ t ) ∂ w \begin{aligned} \mathrm{w}^{\mathrm{t}+1} & \leftarrow \mathrm{w}^{\mathrm{t}}-\frac{\eta^{\mathrm{t}}}{\sigma^{\mathrm{t}}} \mathrm{g}^{\mathrm{t}} \\ \mathrm{g}^{\mathrm{t}} &=\frac{\partial \mathrm{L}\left(\theta^{\mathrm{t}}\right)}{\partial \mathrm{w}} \end{aligned} wt+1gtwtσtηtgt=wL(θt)
  • σ t \sigma^{t} σt :之前参数的所有微分的均方根, 对于每个参数都是不一样的。
    举例:
    w 1 ← w 0 − η 0 σ 0 g 0 σ 0 = ( g 0 ) 2 w 2 ← w 1 − η 1 σ 1 g 1 σ 1 = 1 2 [ ( g 0 ) 2 + ( g 1 ) 2 ] w 3 ← w 2 − η 2 σ 2 g 2 σ 2 = 1 3 [ ( g 0 ) 2 + ( g 1 ) 2 + ( g 2 ) 2 ] ⋮ w t + 1 ← w t − η t σ t g t σ t = 1 t + 1 ∑ i = 0 t ( g i ) 2 \begin{aligned} w^{1} \leftarrow w^{0}-\frac{\eta^{0}}{\sigma^{0}} g^{0} \quad & \sigma^{0}=\sqrt{\left(g^{0}\right)^{2}} \\ w^{2} \leftarrow w^{1}-\frac{\eta^{1}}{\sigma^{1}} g^{1} \quad & \sigma^{1}=\sqrt{\frac{1}{2}\left[\left(g^{0}\right)^{2}+\left(g^{1}\right)^{2}\right]} \\ w^{3} \leftarrow w^{2}-\frac{\eta^{2}}{\sigma^{2}} g^{2} \quad & \sigma^{2}=\sqrt{\frac{1}{3}\left[\left(g^{0}\right)^{2}+\left(g^{1}\right)^{2}+\left(g^{2}\right)^{2}\right]} \\ \vdots & \\ w^{t+1} \leftarrow w^{t}-\frac{\eta^{t}}{\sigma^{t}} g^{t} \quad & \sigma^{t}=\sqrt{\frac{1}{t+1} \sum_{i=0}^{t}\left(g^{i}\right)^{2}} \end{aligned} w1w0σ0η0g0w2w1σ1η1g1w3w2σ2η2g2wt+1wtσtηtgtσ0=(g0)2 σ1=21[(g0)2+(g1)2] σ2=31[(g0)2+(g1)2+(g2)2] σt=t+11i=0t(gi)2
    将式子化简:
    在这里插入图片描述
    问题:在 Adagrad 中,当梯度越大的时候,步伐应该越大,但下面分母又导致当梯度越大的时候,步伐会越小。
    在这里插入图片描述
    解释:详细可以参考:LeeML-Chapter6
    所以最好的步伐应该是:  最好的步伐是:  ∣  一次微分  ∣  二次微分  \text { 最好的步伐是: } \frac{\mid \text { 一次微分 } \mid}{\text { 二次微分 }}  最好的步伐是:  二次微分  一次微分 
    即不止和一次微分成正比,还和二次微分成反比。最好的step应该考虑到二次微分:
    在这里插入图片描述

对于 ∑ i = 0 t ( g i ) 2 \sqrt{\sum_{i=0}^{t}\left(g^{i}\right)^{2}} i=0t(gi)2 就是希望再尽可能不增加过多运算的情况下模拟二次微分。(如果计算二次微分,在实际情况中可能会增加很多的时间消耗)

Tip2:随机梯度下降(Stochastic Gradient Descent)

之前的梯度下降:
L = ∑ n ( y ^ n − ( b + ∑ w i x i n ) ) 2 θ i = θ i − 1 − η ∇ L ( θ i − 1 ) \begin{gathered} \mathrm{L}=\sum_{\mathrm{n}}\left(\hat{\mathrm{y}}^{\mathrm{n}}-\left(\mathrm{b}+\sum \mathrm{w}_{\mathrm{i}} \mathrm{x}_{\mathrm{i}}^{\mathrm{n}}\right)\right)^{2} \\ \theta^{\mathrm{i}}=\theta^{\mathrm{i}-1}-\eta \nabla \mathrm{L}\left(\theta^{\mathrm{i}-1}\right) \end{gathered} L=n(y^n(b+wixin))2θi=θi1ηL(θi1)
而随机梯度下降法**更快**:
损失函数不需要处理训练集所有的数据, 选取一个例子 x n \mathrm{x}^{\mathrm{n}} xn
L = ( y ^ n − ( b + ∑ w i x i n ) ) 2 θ i = θ i − 1 − η ∇ L n ( θ i − 1 ) \begin{gathered} \mathrm{L}=\left(\hat{\mathrm{y}}^{\mathrm{n}}-\left(\mathrm{b}+\sum \mathrm{w}_{\mathrm{i}} \mathrm{x}_{\mathrm{i}}^{\mathrm{n}}\right)\right)^{2} \\ \theta^{\mathrm{i}}=\theta^{\mathrm{i}-1}-\eta \nabla \mathrm{L}^{\mathrm{n}}\left(\theta^{\mathrm{i}-1}\right) \end{gathered} L=(y^n(b+wixin))2θi=θi1ηLn(θi1)
此时不需要像之前那样对所有的数据进行处理, 只需要计算某一个例子的损失函数 L n \mathrm{L_{n}} Ln, 就可以赶紧更新梯度。

对比:
在这里插入图片描述

Tip3:特征缩放

让不同的特征有相同的分布
在这里插入图片描述
为什么?
在这里插入图片描述
上图左边是 x 1 \mathrm{x}_{1} x1 的scale比 x 2 \mathrm{x}_{2} x2 要小很多, 所以当 w 1 \mathrm{w}_{1} w1 w 2 \mathrm{w}_{2} w2 做同样的变化时, w 1 \mathrm{w}_{1} w1 y \mathrm{y} y 的变化影响是比较小的, x 2 \mathrm{x}_{2} x2 y \mathrm{y} y 的变化影响是比较大的。

坐标系中是两个参数的error surface (现在考虑左边蓝色), 因为 w 1 \mathrm{w}_{1} w1 y \mathrm{y} y 的变化影响比较, 所以 w 1 \mathrm{w}_{1} w1 对损失函数的影响比较小, w 1 \mathrm{w}_{1} w1 对损失函数有比较小的微分, 所以 w 1 \mathrm{w}_{1} w1 方向上是比较平滑 的。同理 x 2 \mathrm{x}_{2} x2 y \mathrm{y} y 的影响比较大, 所以 x 2 \mathrm{x}_{2} x2 对损失函数的影响比较大, 所以在 x 2 \mathrm{x}_{2} x2 方向有比较尖的峡谷。

上图右边是两个参数scaling比较接近,右边的绿色图就比较接近圆形。

对于左边的情况,上面讲过这种狭长的情形不过不用Adagrad的话是比较难处理的,两个方向上需要不同的学习率,同一组学习率会搞不定它。而右边情形更新参数就会变得比较容易。左边的梯度下降并不是向着最低点方向走的,而是顺着等高线切线法线方向走的。但绿色就可以 向着圆心(最低点) 走,这样做参数更新也是比较有 效率

相关理论基础

详见参考:LeeML-Chapter6
不断更新参数,不断得到更新的Loss,一定是越来越小的? 不正确

理论上每次更新参数都想要损失函数减小的话,就需要学习率足够足够小才可以。

梯度下降的限制

容易陷入局部极值 还有可能卡在不是极值,但微分值是0的地方 还有可能实际中只是当微分值小于某一个数值就停下来了,但这里只是比较平缓,并不是极值点
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值