机器学习之梯度下降法
1.什么是梯度下降
- 解决的问题:找到一组参数 θ,让损失函数 L ( θ ) L(\theta) L(θ)越小越好
- θ ∗ = arg min θ L ( θ ) (1) \theta^∗= \underset{ \theta }{\operatorname{arg\ min}} L(\theta) \tag1 θ∗=θarg minL(θ)(1)
- 解决方法:随机选取参数初始值
θ
0
\theta^0
θ0,计算初始值处各参数对
L
L
L的偏微分,然后
θ
0
\theta^0
θ0减去η 乘上偏微分的值,得到一组新的参数,同理反复进行这样的计算。
▽
L
(
θ
)
\triangledown L(\theta)
▽L(θ) 即为梯度。
2.梯度下降的理论基础
梯度下降需要解决的问题可以转变为,例如在初始值
θ
0
\theta^0
θ0处的一个小范围圆圈内找到让损失函数更小的
θ
1
\theta^1
θ1,再在
θ
1
\theta^1
θ1处寻找更小的,如此循环往复直到找到最小的。这样问题就可以再简化为:如何在小圆圈内快速的找到最小值?
基于泰勒展开式,在 (a,b)点的红色圆圈范围内,可以将损失函数用泰勒展开式进行简化:
不考虑s的话,可以看出剩下的部分就是两个向量
(
△
θ
1
,
△
θ
2
)
(\triangle \theta1,\triangle \theta2)
(△θ1,△θ2) 和
(
u
,
v
)
(u,v)
(u,v) 的内积,当向量
(
△
θ
1
,
△
θ
2
)
(\triangle \theta1,\triangle \theta2)
(△θ1,△θ2) 和向量
(
u
,
v
)
(u,v)
(u,v) 方向相反时,内积最小。
将u、v代入:
最后得到的式子即梯度下降的式子,当红色圆圈足够小(学习率足够小)才能使用。实际应用中,如果学习率没有设好,会导致做梯度下降的时候,损失函数没有越来越小。
3.梯度下降的限制
- 极易陷入局部极值
- 可能卡在不是极值,但微分值是0的地方(鞍点)
- 可能实际中只是当微分值小于某一个数值就停下来了,但这里只是比较平缓,并不是极值点
4.梯度下降的关键问题
4.1 调整学习率
- 若学习率调整得太小,会导致走的太慢,虽然这种情况给足够多的时间也可以找到最低点,实际情况可能会等不及出结果。
- 若学习率调整得太大,会出现震荡,永远无法达到最低点,当学习率非常非常大时,甚至可能出现直接就飞出去了,更新参数的时候只会发现损失函数越更新越大。
- 解决方案:将参数改变对损失函数的影响进行可视化。
4.2 自适应学习率
基本思想:随着次数的增加,通过一些因子来减少学习率
注意点:
- 通常刚开始,初始点会距离最低点比较远,所以使用大一点的学习率
- update好几次参数之后呢,比较靠近最低点了,此时减少学习率
- 比如 η t = η t t + 1 \eta^t =\frac{\eta^t}{\sqrt{t+1}} ηt=t+1ηt, t t t 是次数。随着次数的增加, η t \eta^t ηt 减小
- 学习率不能是一个值通用所有特征,不同的参数需要不同的学习率
4.3 Adagrad 算法
基本思想:每个参数的学习率都把它除上之前微分的均方根
-
对比
普通的梯度下降:
w t + 1 ← w t − η t g t (3) w^{t+1} \leftarrow w^t -η^tg^t \tag3 wt+1←wt−ηtgt(3) η t = η t t + 1 (4) \eta^t =\frac{\eta^t}{\sqrt{t+1}} \tag4 ηt=t+1ηt(4)
w w w 是一个参数Adagrad:
w t + 1 ← w t − η t σ t g t (5) w^{t+1} \leftarrow w^t -\frac{η^t}{\sigma^t}g^t \tag5 wt+1←wt−σtηtgt(5) g t = ∂ L ( θ t ) ∂ w (6) g^t =\frac{\partial L(\theta^t)}{\partial w} \tag6 gt=∂w∂L(θt)(6)
σ t \sigma^t σt :之前 参数的所有微分的均方根,对于每个参数都是不一样的Adagrad举例:
进行简化:
∑ i = 0 t ( g i ) 2 \sqrt{\sum_{i=0}^t(g^i)^2} ∑i=0t(gi)2 就是在尽可能不增加过多运算的情况下模拟二次微分(如果计算二次微分,在实际情况中可能会增加很多的时间消耗)
-
为什么要引入二次微分呢?
可以看出 ∣ 2 a x 0 + b ∣ |2ax_0+b| ∣2ax0+b∣ 就是方程绝对值在 x 0 x_0 x0 这一点的微分,所以可以得出:如果算出来的微分越大,则距离最低点越远。但是!!!以上结论在多参数下并不成立
上图左边是两个参数的损失函数,颜色代表损失函数的值。如果只考虑参数 w 1 w1 w1,就像图中蓝色的线,得到右边上图结果;如果只考虑参数 w 2 w2 w2, 就像图中绿色的线,得到右边下图的结果。确实对于 a a a 和 b b b,上述结论是成立的,同理 c c c 和 b b b 也成立。但是如果对比 a a a 和 c c c,就不成立 了, c c c 比 a a a 大,但 c c c 距离最低点是比较近的。
之前说到的最佳距离 ∣ 2 a x 0 + b 2 a ∣ \left | \frac{2ax_0+b}{2a} \right | ∣∣2a2ax0+b∣∣,还有个分母 2 a 2a 2a 。对function进行二次微分刚好可以得到: ∂ 2 y ∂ x 2 = 2 a (7) \frac{\partial ^2y}{\partial x^2} = 2a \tag7 ∂x2∂2y=2a(7) 所以最好的步伐应该是: 一 次 微 分 二 次 微 分 \frac{一次微分}{二次微分} 二次微分一次微分 即不止和一次微分成正比,还和二次微分成反比。最好的step应该考虑到 二次微分,而Adagrad简化后得到的 ∑ i = 0 t ( g i ) 2 \sqrt{\sum_{i=0}^t(g^i)^2} ∑i=0t(gi)2恰好近似等于二次微分的结果。
4.4 随机梯度下降法
- 普通梯度下降:
L = ∑ n ( y ^ n − ( b + ∑ w i x i n ) ) 2 (8) L=\sum^n(\hat y^n-(b+\sum w_ix_i^n))^2 \tag8 L=∑n(y^n−(b+∑wixin))2(8) θ i = θ i − 1 − η ▽ L ( θ i − 1 ) (9) \theta^i =\theta^{i-1}- \eta\triangledown L(\theta^{i-1}) \tag9 θi=θi−1−η▽L(θi−1)(9) - 随机梯度下降:
L = ( y ^ n − ( b + ∑ w i x i n ) ) 2 (10) L=(\hat y^n-(b+\sum wixi^n))^2 \tag{10} L=(y^n−(b+∑wixin))2(10) θ i = θ i − 1 − η ▽ L n ( θ i − 1 ) (11) \theta^i =\theta^{i-1}- \eta\triangledown L^n(\theta^{i-1}) \tag{11} θi=θi−1−η▽Ln(θi−1)(11)
随机梯度下降相较于普通梯度下降法更快,普通梯度下降法走一步需要处理所有例子,而随机梯度下降法没处理一个例子就更新,所以更快。
4.5 特征缩放
- 目的:解决多参数且尺度相差较大时,各个参数对损失函数影响不一致的问题
- 解决方案:归一化
上图每一列都是一个例子,里面都有一组特征。对每一个维度 i i i(绿色框)都计算平均数,记做 m i m_i mi;还要计算标准差,记做 σ i \sigma _i σi。然后用第 r r r 个例子中的第 i i i 个输入,减掉平均数 m i m_i mi,然后除以标准差 σ i \sigma _i σi,得到的结果是所有的维数都是 0 0 0,所有的方差都是 1 1 1