zoukankan      html  css  js  c++  java
  • 梯度下降

    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。

  • 相关阅读:
    会议室预订系统
    event chrome firefox 获取点击对象的 id 类
    微信支付 301 500 php 7 simplexml_load_string
    会议室预订
    ini_set('date.timezone','Asia/Shanghai');
    UnionID OpenID
    Location 接口表示其链接到的对象的位置
    confirm() event.target.getAttribute('id')
    php 代替 js实现自定义时间选择器
    前端页面 重复提交避免
  • 原文地址:https://www.cnblogs.com/qkloveslife/p/9826017.html
Copyright © 2011-2022 走看看