zoukankan      html  css  js  c++  java
  • 常见优化函数

    1 梯度下降法

    以线性回归为例:

    [h_0 = sum_{j=0}^{n} heta_j * x_j ]

    损失函数为:

    [J( heta) = frac{1}{2m}sum_{i=1}^{m}(y^{(i)}-h_{ heta}(x^{(i)}))*x_{j}^{i} ]

    1.1 批量梯度下降法(原始的梯度下降法)

    [ heta_j = heta_j-alpha*frac{partial J( heta)}{partial heta_{j}} ]

    对于所有数据点,上述损失函数的偏导数为:

    [frac{partial J( heta)}{partial heta_j} = -frac{1}{m}sum_{i=1}^{m}(y^{(i)}-h_{ heta}(x^{(i)}))*x_{j}^i ]

    缺点:每一次参数更新都用到了所有的训练数据,如果训练数据非常多,则很耗时。
    每次更新的伪代码:
    repeat:
      ( heta_{j}^{'} = heta_{j} + alpha * frac{1}{m}sum_{i=1}^{m}(y^{(i)}-h_{ heta}(x^{(i)}))*x_{j}^i)  (j=0,1,2,..n)

    1.2 随机梯度下降法(SGD)

    利用每个样本的损失函数对( heta)求偏导得到对应的梯度来更新(theta)

    [ heta_{j}^{'} = heta_{j} + (y^{(i)} - alpha * h_{ heta}(x^{(i)})*x_{j}^{i} ]

    更新过程如下:

    1. random shuffle dataset
    2. repeat:
          for i = 1...m
              ( heta_{j}^{'} = heta_{j} + alpha * (y^{(i)} - h_{ heta}(x^{(i)})*x_{j}^{i})  (j=0,1,...n)  这里的j代表的是( heta的每一个分量)
      缺点:SGD伴随的一个问题是噪音多,是的SGD并不是每一次迭代都是朝着整体最优方向。

    1.3 小批量梯度下降法

    假设每次更新参数的样本数为10个,更新的伪代码为:
    repeat:
        for i = 1,11,21,31,...
            ( heta_{j}^{'} = heta_{j} + alpha * frac{1}{10} * sum_{k=i}^{i+9}(y^{(k)}-h_{ heta}(x^{(k)}))*x_{j}^k)  (j=0,1,...n)

    2 动量优化

    2.1 Momentum

    [m_{t+1} = u*m_{t}+alpha * frac{partial J( heta)}{partial heta} ]

    [ heta_{t+1} = heta_{t}-m_{t+1} ]

    u表示动量因子,通常取值为0.9或近似值,在梯度方向改变时,momentum可以加速更新,从而加速收敛。即,momentum能够加速SGD收敛,抑制振荡

    2.2 NAG

    momentum保留了上一时刻的梯度,对其没有任何改变,NAG是momentum的改进,在梯度更新时做一个矫正,具体的做法是在当前梯度上添加上一时刻的动量(u*m_{t}),梯度改变为(frac{partial J( heta - u*m_{t})}{partial heta})

    [m_{t+1} = u*m_{t} + alpha * frac{partial J( heta - u*m_{t})}{partial heta} ]

    [ heta_{t+1} = heta_{t}-m_{t+1} ]

    3 自适应学习率优化算法

    3.1 Adagrad

    [g_{t} = frac{partial J( heta)}{partial heta} ]

    [r_{t} = r_{t-1} + g_{t}^2 ]

    [Delta heta = frac{alpha}{sqrt {r_{t}+epsilon}}*g_{t} ]

    [ heta_{t} = heta_{t-1}-Delta heta ]

    对于每一个( heta_{j})在计算的过程中(g_{t,j})不同,即每个变量在更新的时候学习率是不同的。
    训练前期,梯度较小,使得Regularizer(上式中的r_t)项很大,放大梯度。[激励阶段]
    训练后期,梯度较大,使得Regularizer项很小,缩小梯度。[惩罚阶段]
    缺点:
    仍需要手工设置一个全局学习率(alpha),如果设置过大,会使regularizer过于敏感,对梯度调节太大,中后期,分母梯度累加的平方和越来越大,使更新量趋于零,使训练提前结束,无法学习。

    3.2 RMSProp

    修改了AdaGrad的梯度平方和累加为指数加权的移动平均

    [g_{t} = frac{partial J( heta)}{partial heta} ]

    [r_{t} = ho *r_{t-1} + (1- ho)*g_{t}^2 ]

    [Delta heta = frac{alpha}{sqrt {r_{t}+epsilon}}*g_{t} ]

    [ heta_{t} = heta_{t-1}-Delta heta ]

    自变量每个元素的学习率在迭代过程中就不再一直降低(或不变)。

    3.3 Adadelta

    AdaDelta算法也像RMSProp算法一样,使用了指数加权移动平均变量。在时间步0,它的所有元素被初始化为0。与RMSProp算法不同的是,AdaDelta算法还维护一个额外的状态变量 Δxt ,其元素同样在时间步0时被初始化为0。我们使用 Δxt−1 来计算自变量的变化量:

    [g_{t} = frac{partial J( heta)}{partial heta} ]

    [r_{t} = ho *r_{t-1} + (1- ho)*g_{t}^2 ]

    [g_{t'} = frac{sqrt{Delta X_{t-1}+epsilon}}{sqrt{r_t+epsilon}}*g_{t} ]

    [ heta_{t} = heta_{t-1}-g_{t'} ]

    [Delta x_{t} = ho *Delta x_{t-1} + (1- ho)*g_{t}^2 ]

    3.4 Adam

    Adam算法在RMSProp算法的基础上对小批量随机梯度也做了指数加权移动平均。
    Adam算法使用了偏差修正。也有人说Adam算法是RMSProp法和动量法的结合

    [g_{t} = frac{partial J( heta)}{partial heta} ]

    [m_{t} = eta_{1} *m_{t-1} + (1-eta_{1})*g_{t} ]

    [v_{t} = eta_{2} *v_{t-1} + (1-eta_{2})*g_{t}^2 ]

    [widehat{m_{t}} = frac{m_{t}}{1-eta_{1}^t} ]

    [widehat{v_{t}} = frac{v_{t}}{1-eta_{2}^t} ]

    [ heta_{t} = heta_{t-1}-frac{alpha}{sqrt{widehat{v_{t}}}+epsilon}*widehat{m_{t}} ]

  • 相关阅读:
    查看服务器被动手脚
    cordova安卓sdk
    Nginx 启动报错 “/var/run/nginx/nginx.pid" failed”
    家庭里如何搭建一个互联网可访问的服务器
    Mysql5.7基于事务转为基于日志
    021 基本数据类型小结
    018 字符串类型及操作
    022 程序的控制结构
    020 实例4-文本进度条
    017 示例3-天天向上的力量
  • 原文地址:https://www.cnblogs.com/zhou-lin/p/15234510.html
Copyright © 2011-2022 走看看