zoukankan      html  css  js  c++  java
  • 无约束最优化的常用方法

    11/22/2017 12:40:56 PM

    优化问题在很多领域有着重要的应用。为了日后查阅方便,本文列举常见的无约束优化方法的计算公式。

    需要说明的是,本文的大部分内容选自图书《算法笔记》。

    一、梯度下降法

    梯度下降法(Gradient Descent Method)也叫做最速下降法(Steepest Descent Method),因为负梯度是函数局部下降最快的方向。

    梯度下降

    梯度下降法的迭代格式为

    [x_{k+1}=x_{k}-alpha_k abla f(x_k) ]

    梯度下降法非常简单,只需要知道如何计算目标函数的梯度就可以写出迭代格式。因此,尽管在不少情况下梯度下降法的收敛速度都很慢,也依然不影响它在工业界的广泛应用。梯度下降法应用到一些具体模型上有时也会被视作一类特定的算法,例如神经网络中的后向传导算法(Back Propagation Algorithm)。

    随机梯度下降

    在机器学习中经常有(f(x)=sum_{i=1}^m ell_i(x)),其中(ell_i(x))是第(i)个训练样本的损失函数。这时我们可以使用随机梯度下降法(Stochastic Gradient Descent Method)。其迭代格式为

    [x_{k+1}=x_{k}-alpha_k abla ell_r(x_k) ]

    其中(rin \{1,2,cdots,m\})为随机数。这种做法可以理解为随机选择一个训练样本,进行一次梯度下降的训练。在机器学习的问题中,我们通常不需要真的求得最优值,这样不精确的迭代,使得算法不容易过拟合。由于随机梯度下降法的普及,与此相对的梯度下降法有时被称为批量梯度下降法(Batch Gradient Descent Method),因为它同时考虑所有训练样本。介于批量梯度下降法和随机梯度下降法之间,还有小批量梯度下降法(Min-Batch Gradient Descent Method),也就是每次迭代选择若干个训练样本。

    步长(alpha_k)的选取

    梯度下降法可采用BB步长(Barzilai Borwein)。BB步长有两个计算公式,选择其一即可。

    egin{aligned}
    alpha_k&=frac{( abla f(x_k)- abla f(x_{k-1}))^T(x_k-x_{k-1})}{( abla f(x_k)- abla f(x_{k-1}))^T( abla f(x_k)- abla f(x_{k-1}))} ewline
    alpha_k&=frac{(x_k-x_{k-1})T(x_k-x_{k-1})}{(x_k-x_{k-1})T( abla f(x_k)- abla f(x_{k-1}))}
    end{aligned}

    BB步长适合我们在对步长选择缺乏经验的时候,它经常会有不错的效果。

    二、共轭梯度法

    由于每次都是沿着当前的负梯度方向逼近极小值,梯度下降法往往不能很快地收敛到极小值点。改进的方法是,在上一次梯度方向的共轭方向上进行迭代。

    在这里,不对原理和公式推导进行过多介绍。下面直接给出迭代的公式。

    [x_{k+1}=x_k+alpha_k d_k ]

    其中,(d_k)为迭代方向,它由下面的式子确定

    [d_k=- abla f(x_k)+eta_k d_{k-1} ]

    这里使用系数(eta_k)借助上一次的迭代方向(d_{k-1}),对迭代方向(d_k)进行一个修正。(eta_k)的表达式不止一种,常用的式子如下

    [eta_k=frac{( abla f(x_k))^T( abla f(x_k)- abla f(x_{k-1}))}{( abla f(x_{k-1}))^T d_{k-1}} ]

    三、牛顿法

    牛顿方向和梯度方向最大的差别是考虑了Hessian矩阵(我们记(x_k)处的Hessian矩阵为( abla^2 f(x_k)))。

    牛顿法的迭代格式为

    [x_{k+1}=x_k-alpha_k( abla^2 f(x_k))^{-1} abla f(x_k) ]

    这里的步长(alpha_k)有多种取法。但与梯度下降法不同的是,这里步长取(1)的效果通常不错。值得注意的是,虽然我们写作(d_k=-( abla^2 f(x_k))^{-1} abla f(x_k)),但在计算(d_k)时,并不真正求逆,而是去求解线性方程组(( abla^2 f(x_k))d_k=- abla f(x_k))

    假设(f(x))是一元函数,那么上式将变为

    [x_{k+1}=x_k-alphafrac{f(x_k)}{f'(x_k)} ]

    牛顿法的局限

    牛顿法在计算上有一下局限性

    • 计算矩阵( abla^2 f(x_k))可能要花费很长时间。
    • 可能没有足够的内存去存储矩阵( abla^2 f(x_k))
    • ( abla^2 f(x_k))不一定可逆,也就是(( abla^2 f(x_k))^{-1})也就不一定存在。

    因此一般只有当问题规模比较小,而且(f(x_k))是严格凸函数的时候,我们才会考虑牛顿法。在其他情形下使用牛顿法,都需要设法进行一些修正。

    四、拟牛顿法

    牛顿法的局限性基本源于( abla^2 f(x_k))。在拟牛顿法中,我们不直接使用( abla^2 f(x_k)),而是使用(H_k)近似代替。

    在第一次迭代的时候,我们没有任何有效信息可以用于选取(H_0),因此一般直接取(H_0=I)。对于(H_{k+1})的确定方法,下面给出两种方法,分别为BFGS(Brotden-Fletcher Goldfard Shanno)和DFP(Davidon Fletcher Powell)公式。为了书写方便,我们令(s_k=x_{k+1}-x_k)(y_k= abla f(x_{k+1})- abla f(x_k))

    BFGS公式:

    [H_{k+1}=(I-frac{s_k y_k^T}{y_k^T s_k})H_{k}(I-frac{y_k s_k^T}{y_k^T s_k})+frac{s_k y_k^T}{y_k^T s_k} ]

    DFP公式:

    [H_{k+1}=H_k+frac{s_k s_k^T}{s_k^T y_k}-frac{H_k y_k y_k^T H_k^T}{y_k^T H_k^T y_k} ]

    于是拟牛顿法的迭代公式变为

    [x_{k+1}=x_k+alpha_k H_k abla f(x_k) ]

    这里的步长(alpha_k)可以使用某种线搜索方法进行确定。(关于线搜索,有时间写一篇博文)

    拟牛顿法很好地解决了Hessian矩阵的计算问题,但是仍然没有解决存储问题。一个很好的解决办法是有限内存BFGS方法。这里不做进一步的介绍。

    参考文献

    [1] 刁瑞,谢研. 电子工业出版社. 2016年. 算法笔记.

    本文链接:www.superzhang.site/blog/common-method-of-unconstrained-optimization

  • 相关阅读:
    everything is nothing
    基础算法
    OC 优化目录
    iOS 更改启动视图
    单例--iOS
    OC-Objection 学习笔记之一:简单的开始
    iOS 类库列表
    IOS 上线问题
    OC强弱引用的使用规则
    设置桌面图标
  • 原文地址:https://www.cnblogs.com/super-zhang-828/p/7991630.html
Copyright © 2011-2022 走看看