梯度下降

Have some function J(θ0, θ1), generally J(θ0, θ12, θ3,..., θn)

Want: [mathop {min }limits_{{ heta _0},{ heta _1}} Jleft( {{ heta _0},{ heta _1}} ight)]

generally: [mathop {min }limits_{{ heta _0},{ heta _1},...{ heta _n}} Jleft( {{ heta _0},{ heta _1},...{ heta _n}} ight)]

Outline:

  • Start with some θ0, θ1
  • Keep changing θ0, θ1 to reduce J(θ0, θ1) until we hopefully end up at a minimum

有函数J(θ0, θ1),一般情况下表示为J(θ0, θ12, θ3,..., θn)

目标:[mathop {min }limits_{{ heta _0},{ heta _1}} Jleft( {{ heta _0},{ heta _1}} ight)]

一般情况下: [mathop {min }limits_{{ heta _0},{ heta _1},...{ heta _n}} Jleft( {{ heta _0},{ heta _1},...{ heta _n}} ight)]


梯度下降

图示

当梯度下降选择第一个图的点为初始点时,可能会沿着第一个图的路径达到局部最小;

当梯度下降选择第二个图的点为初始点时,可能会沿着第二个图的路径达到局部最小。

 梯度下降算法

符号

  := 赋值运算符

  α: 学习率(learning rate)(总是正数)。它的作用时控制算法的下降步长

算法定义

repeat until convergence {

[{ heta _j}: = { heta _j} - alpha frac{partial }{{partial { heta _j}}}Jleft( {{ heta _0},{ heta _1}} ight)left( {for{ m{ j  =  0 and j  =  1}}} ight)]

}

重复直到收敛 {

[{ heta _j}: = { heta _j} - alpha frac{partial }{{partial { heta _j}}}Jleft( {{ heta _0},{ heta _1}} ight)left( {for{ m{ j  =  0 and j  =  1}}} ight)]

}

Correct: Simultaneous update (正确的更新顺序:同步更新)

[temp0 = { heta _0} - alpha frac{partial }{{partial { heta _0}}}Jleft( {{ heta _0},{ heta _1}} ight)]

[temp1 = { heta _1} - alpha frac{partial }{{partial { heta _1}}}Jleft( {{ heta _0},{ heta _1}} ight)]

[egin{array}{l}
{ heta _0} = temp0\
{ heta _1} = temp1
end{array}]

Incorrect(不正确的更新顺序):

[temp0 = { heta _0} - alpha frac{partial }{{partial { heta _0}}}Jleft( {{ heta _0},{ heta _1}} ight)]

[{ heta _0} = temp0]

[temp1 = { heta _1} - alpha frac{partial }{{partial { heta _1}}}Jleft( {{ heta _0},{ heta _1}} ight)]

[{ heta _1} = temp1]


为什么用这个公式更新θ?

[{ heta _j}: = { heta _j} - alpha frac{partial }{{partial { heta _j}}}Jleft( {{ heta _0},{ heta _1}} ight)left( {for{ m{ j  =  0 and j  =  1}}} ight)]

首先,简化J(θ0, θ1)为J( θ1),则我们的目标是 

[mathop {min }limits_{{ heta _1}} Jleft( {{ heta _1}} ight)]

更新公式是 [{ heta _1}: = { heta _1} - alpha frac{d}{{d{ heta _1}}}Jleft( {{ heta _1}} ight)]

当变量只有一个的时候用"求导"(d),多个变量用“偏导”(∂)

 

首先关注 [frac{d}{{d{ heta _1}}}Jleft( {{ heta _1}} ight)]

当 θ1取 θ1_2时,更新公式中的 [frac{d}{{d{ heta _1}}}Jleft( {{ heta _1}} ight)]

的结果就是:过J(θ1_2)做函数的切线的斜率值。此时这个值是正值,而α永远是正值,因此更新后的θ1会减小。

同理,当θ1取θ1_1时,更新后的会增大。

最终它们会向着局部最小的θ1_min靠近,这就会使得J( θ1)达到局部最小。

然后关注 α

当α很小的时候,会有如下情况

if α is too small, gradient descent can be slow

如果α很小,梯度下降会很慢

当α很大的时候,会有如下情况

if α is too large, gradient descent can overshoot the minimum. It may fail to converge, or even diverge

如果α太大,梯度下降可能会超过最小值。 它可能无法收敛,甚至分歧

解释:为什么α固定的时候梯度下降算法仍然可以到达局部最小?

对于公式中的 [alpha frac{d}{{d{ heta _1}}}Jleft( {{ heta _1}} ight)]

随着J(θ1)越来越靠近局部最小,公式中的 [frac{d}{{d{ heta _1}}}Jleft( {{ heta _1}} ight)]

(也就是斜率)会越来越小,所以总的下降速度会越来越小。

As we approach a local minimum, gradient descent will automatically take smaller steps. So, no need to decrease α over time.

当我们接近局部最小值时,梯度下降将自动采取较小的步长。 所以,不需要随着时间的推移减少α。

问题:如果θ1已经位于局部最小,θ1会怎么更新?

答案是θ1保持不变,因为求导后的结果为0,也就是 [frac{d}{{d{ heta _1}}}Jleft( {{ heta _1}} ight)]

为0。

原文地址:https://www.cnblogs.com/qkloveslife/p/9826017.html