• 各种优化器对比--BGD/SGD/MBGD/MSGD/NAG/Adagrad/Adam


    指数加权平均 (exponentially weighted averges)

    先说一下指数加权平均, 公式如下:

    [v_{t}=eta v_{t-1}+(1-eta) heta_{t} ]

    • ( heta_t) 是第t天的观测值
    • (v_t) 是用来替代( heta_t)的估计值,也就是加权平均值
    • (eta) 超参数

    (eta = 0.9) , 那么公式可以化简为:

    [v_{100} = 0.1 * heta_t + 0.1 * 0.9 * heta_{99} + 0.1 * 0.9^{2} heta_{98}+ldots+0.1 * 0.9^{99} heta_{1} ]

    它考虑到了之前所有观测值,但是事件越靠近的观测值权重越大,时间越久远的观测值权重就很小了。

    (eta = 0.9)时,很多资料认为(0.9^{10} approx 0.35 approx 1 / e), 把这个数当成一个分界点,权重降低到这个分界点之下就可以忽略不计,而 (eta^{frac{1}{1-eta}} approx 1 / e) , 所以把上面两个公式合到一起就可以认为指数加权平均就是最近 (N=frac{1}{1-eta})天的加权平均值

    所以

    • (eta) 越小, 加权平均的数据越少,就容易出现震荡
    • (eta) 越大, 加权平均考虑的数据就越多,当出现震荡的时候会由于历史数据的权重导致震荡的幅度减小

    Batch Gradient Descent (BGD)

    BGD使用整个数据集来计算梯度,这里的损失函数是所有输入的样本数据的loss的和,单个样本的loss可以用交叉熵或者均方误差来计算。

    [ heta= heta-eta cdot abla_{ heta} J( heta) ]

    缺点是每次更新数据都需要计算整个数据集,速度很慢,不能实时的投入数据更新模型。对于凸函数可以收敛到全局最小值,对于非凸函数只能收敛到局部最小值。这是最朴素的优化器了

    Stochastic Gradient Descent(SGD)

    由于BGD计算梯度太过费时,SGD每次只计算一个样本的loss,然后更新参数。计算时可以先打乱数据,然后一条一条的将数据输入到模型中

    [ heta= heta-eta cdot abla_{ heta} Jleft( heta ; x^{(i)} ; y^{(i)} ight) ]

    他的缺点是更新比较频繁,会有严重的震荡。

    当我们稍微减小learning rate, SGD和BGD的收敛性是一样的

    Mini-Batch Gradient Descent (MBGD)

    每次接收batch个样本,然后计算它们的loss的和。

    [ heta= heta-eta cdot abla_{ heta} Jleft( heta ; x^{(i: i+n)} ; y^{(i: i+n)} ight) ]

    对于鞍点, BGD会在鞍点附近停止更新,而MSGD会在鞍点周围来回震荡。

    Monentum SGD

    加入了v的概念,起到一个类似惯性的作用。在更新梯度的时候会照顾到之前已有的梯度。这里的(v_t)就是梯度的加权平均

    [egin{array}{l} v_{t}=gamma v_{t-1}+eta abla_{ heta} J( heta) \ heta= heta-v_{t} end{array} ]

    它可以在梯度方向不变的维度上使速度变快,在梯度方向有所改变的维度上更新速度更慢,可以抵消某些维度的摆动,加快收敛并减小震荡。(gamma)一般取值为0.9

    Nesterov Accelerated Gradient

    它用 ( heta-gamma v_{t-1})来近似估计下一步 ( heta)会到达的位置

    [egin{array}{l} v_{t}=gamma v_{t-1}+eta abla_{ heta} Jleft( heta-gamma v_{t-1} ight) \ heta= heta-v_{t} end{array} ]

    能够让算法提前看到前方的地形梯度,如果前面的梯度比当前位置的梯度大,那我就可以把步子迈得比原来大一些,如果前面的梯度比现在的梯度小,那我就可以把步子迈得小一些

    这个算法的公式竟然可以转化为下面的等价的公式:

    [egin{array}{l} d_{i}=eta d_{i-1}+gleft( heta_{i-1} ight)+etaleft[gleft( heta_{i-1} ight)-gleft( heta_{i-2} ight) ight] \ heta_{i}= heta_{i-1}-alpha d_{i} end{array} ]

    后面的梯度相减可以认为是梯度的导数,也就是loss的二阶导数。也就是用二阶导数判断了一下曲线的趋势。其中 (gamma)一般取值为0.9

    Adagrad (Adaptive gradient algorithm)

    可以对低频的参数做较大的更新,对高频的参数做较小的更新。

    [ heta_{t+1, i}= heta_{t, i}-frac{eta}{sqrt{G_{t, i i}+epsilon}} cdot g_{t, i} ]

    这个算法很有意思,G是在某个维度上,t从0开始到现在的所有梯度的平方和。所以对于经常更新的参数,学习率会越来越小,而对于不怎么更新的参数,他的学习率会变得相对更高。

    ( heta)一般设置为0.01,他的缺点是分母会不断累计,最终学习率会变得非常小。如果初始梯度很大,会导致学习率变得很小。它适合用于稀疏数据。

    Adadelta

    对Adagrad的改进,对某个维度的历史维度进行平方、相加、开方

    [Eleft[g^{2} ight]_{t}= ho * Eleft[g^{2} ight]_{t-1}+(1- ho) * g_{t}^{2} ]

    [x_{t+1}=x_{t}-frac{eta}{sqrt{Eleft[g^{2} ight]_{t}+epsilon}} * g_{t} ]

    [R M Sleft(g_{t} ight)=sqrt{Eleft[g^{2} ight]_{t}+epsilon} ]

    解决了历史梯度一直累加导致的学习率下降问题, (epsilon) 是为了方式分母为0加上的极小值, (rho)一般取值为0.9

    Adaptive Moment Estimation (Adam)

    同时考虑了梯度的平方和梯度的指数衰减。建议(eta_1)=0.9, (eta_2)=0.999, (eta)=10e-8

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

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

    [egin{array}{l} hat{m}{t}=frac{m{t}}{1-eta_{1}^{t}}, hat{v}{t}=frac{v{t}}{1-eta_{2}^{t}} end{array} ]

    [ heta_{t+1}= heta_{t}-frac{eta}{sqrt{hat{v}_{t}}+epsilon} hat{m}_{t} ]

    Adam取得了比其他方法更好的效果

    总结

    如果数据是稀疏的,就用自适用方法,即 Adagrad, Adadelta, RMSprop, Adam。

    参考资料:
    https://www.cnblogs.com/guoyaohua/p/8542554.html
    https://arxiv.org/pdf/1609.04747.pdf

  • 相关阅读:
    第15.14节 PyQt(Python+Qt)入门学习:Designer的Buttons按钮详解
    PyQt(Python+Qt)学习随笔:Designer中的QDialogButtonBox的orientation和centerButtons属性
    PyQt(Python+Qt)学习随笔:Designer中的QDialogButtonBox的按钮改变缺省文字的方法
    PyQt(Python+Qt)学习随笔:Designer中的QDialogButtonBox增加自定义按钮的方法
    PyQt(Python+Qt)学习随笔:Designer中QDialogButtonBox确认clicked信号是哪个按钮发送的方法
    织梦更新列表页提示Fatal error: Call to a member function GetInnerText() on a non-object 解决方法
    怎么调取dede三级栏目名及栏目下的内容列表
    DEDE [field:global name=autoindex/] 按序列号递增
    在cms以及kindeditor中插入百度动态地图的方法
    DEDE文章列表加上序号效果
  • 原文地址:https://www.cnblogs.com/twilight0402/p/13384505.html
Copyright © 2020-2023  润新知