在深度学习过程中经常会听到**优化 算法云云,优化算法即通过迭代的方法计算目标函数的最优解,为什么要用到优化算法呢?
1、如果是凸优化问题,如果数据量特别大,那么计算梯度非常耗时,因此会选择使用迭代的方法求解,迭代每一步计算量小,且比较容易实现
2、对于非凸问题,只能通过迭代的方法求解,每次迭代目标函数值不断变小,不断逼近最优解
因此优化问题的重点是使用何种迭代方法进行迭代,即求迭代公式。下面简单介绍几种优化算法 :梯度下降法,牛顿法,拟牛顿法,BFGS
梯度下降法:
梯度下降法是求解无约最优化问题的一种最常用的方法,设f(x)具有一阶连续偏导数的函数,要求解的无约束最优化问题是:
min f(x)
X*表示目标函数的的极小点。
主要核心思想: 负梯度方向是使函数值下降最快的方向,在迭代的每一步以负梯度方向更新x的值,从而达到减少函数值的目的。
f(x)的一阶泰勒展开:
即函数在x处的值可以通过,Xk处的函数值与Xk处的梯度方向来表示,那么Xk+1可以由Xk与gk来表示,即
, Pk为搜索方向,取负梯度方向,为搜索步长,由一维搜索确定,即使得:
当目标函数是凸函数时,梯度下降法的解是全局最优解。
由于使用梯度下降法时,每一步都需要计算在当前迭代值xk处的梯度值,而计算梯度需要使得全部样本进行计算, 这样计算量将非常大,因此为了降低计算量,有人提出了随机梯度下降法,即每次随机选择一个样本计算梯度,大大提高了
计算速度。
牛顿法:
考虑约束问题
min f(x)
其中x*为目标函数的极小点。
f(x)的二阶泰勒展开:
这里gk是f(x)在梯度向量在点xk处的值,H(xk)是f(x)的海森矩阵在点xk处的值。函数有极值的条件的必要条件是在极值点处一阶导数为0,即梯度向量为0。
牛顿法利用极小点的必要条件:
每次迭代从点Xk开始,求目标函数的极小点,作为第k+1次迭代值x(k+1),假设,由式(1-1)有
式(1-3)即为牛顿法的迭代公式
拟牛顿法:
在牛顿法的迭代中,需要计算海赛矩阵的逆矩阵H-1这一计算比较复杂,考虑用一个n阶矩阵来近似代替H-1,这就是拟牛顿法的基本思路。
DFP(Davidon-Fletcher-Powell)使用一个n阶矩阵Gk+1来近似H-1
BFGS(Broyden-Fletcher-Goldfarb-Shanno)使用一个n阶矩阵Bk来逼近H
L-BFGS(Limited -BFGS ):由于上述两种拟牛顿法都要保存一个n阶矩阵,对于内存消耗非常大,因此在此基础上提出了一种节约内存的方法L-BFGS
由于牛顿法的迭代公式有考虑目标函数的具体分布,因此相对于梯度下降算法收敛速度更快,在实际应用中经常使用LBFGS方法。
关于Conjugate Gradient方法,请参考博文http://www.cnblogs.com/dupuleng/articles/4165092.html