Have some function J(θ0, θ1), generally J(θ0, θ1,θ2, θ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, θ1,θ2, θ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。