利用雅可比方法求线性方程组C语言_优化方法(一)

1. 梯度下降法(Gradient Descent)

针对无约束最优化问题,梯度下降法是常用的最优化方法之一,其法实现简单,当目标函数是凸函数时,梯度下降法的解是全局解。

梯度下降法的优化思想是用当前位置负梯度方向作为搜索方向,因为该方向为当前位置的最快下降方向,所以也被称为是”最速下降法“。最速下降法越接近目标值,步长越小,前进越慢。

目标函数:

根据上式,我们更新第k+1次的值

梯度下降法的搜索迭代示意图如下图所示:

利用雅可比方法求线性方程组C语言_优化方法(一)_第1张图片
梯度下降法的缺点 - 靠近极小值时收敛速度减慢,如下图所示   - 直线搜索时可能会产生一些问题 - 可能会“之字形”地下降

利用雅可比方法求线性方程组C语言_优化方法(一)_第2张图片

从上图可以看出,梯度下降法在接近最优解的区域收敛速度明显变慢,利用梯度下降法求解需要很多次的迭代。 在机器学习中,基于基本的梯度下降法发展了两种梯度下降方法,分别为随机梯度下降法和批量梯度下降法

1.1 SGB/BGD

比如对一个线性回归(Linear Logistics)模型,假设下面的h(x)是要拟合的函数,

为损失函数,theta是参数,要迭代求解的值,theta求解出来了那最终要拟合的函数
就出来了。其中m是训练集的样本个数,n是特征的个数

批量梯度下降法(Batch Gradient Descent,BGD)

(1)每个

的更新:

(2)从上面公式可以注意到,每迭代一步,就要用到m中所有数据,如果m很大,那么可想而知这种方法的迭代速度会相当的慢。所以,这就引入了另外一种方法——随机梯度下降。

随机梯度下降法

(1)每个

的更新变成如下形式:

随机梯度下降是通过每个样本来迭代更新一次,如果样本量很大的情况,那么可能只用其中几万条或者几千条的样本,就已经将theta迭代到最优解了,对比上面的批量梯度下降,迭代一次需要用到十几万训练样本,一次迭代不可能最优,如果迭代10次的话就需要遍历训练样本10次。但是,SGD伴随的一个问题是噪音较BGD要多,使得SGD并不是每次迭代都向着整体最优化方向。

总结

批量梯度下降---最小化batch训练样本的损失函数,即求解的参数是使得风险函数最小,解较优,但是对于大规模样本问题效率低下。

随机梯度下降---最小化每条样本的损失函数,虽然不是每次迭代得到的损失函数都向着全局最优方向, 但是大的整体的方向是向全局最优解的,最终的结果往往是在全局最优解附近,适用于大规模训练样本情况。

改进方法

1.2 Momentum

在梯度下降的基础上, 增加了动量(Momentum)的技术,就是为了加快学习过程,特别是对于高曲率、小但一致的梯度,或者噪声比较大的梯度能够很好的加快学习过程。其主要思想是积累了之前梯度指数级衰减的移动平均(前面的指数加权平均),下面用一个图来对比下,SGD和动量的区别:

利用雅可比方法求线性方程组C语言_优化方法(一)_第3张图片

1.3 Nesterov Momentum

Nesterov Momentum是对Momentum的改进,区别在于计算更新梯度的时候,Momentum是点

梯度
)与该点
梯度指数加权平均
的和
作为该点新梯度的方向;

而Nesterov Momentum是

先按上次梯度
平移后的新点
的梯度
与该点(依然是
)的
梯度指数加权平均
的和作为原点
的更新方向;
具体算法差异:
输入:学习率
,动量参数
,初始参数值
, 初始动量

输出:最终值参数

while stopping criterion not met:
Sample a batch of m examples
,correspongding label

Apply interim update:

Compute gradient(at interm point):

Computer velocity update:

Apply update:

注意: Nesterov Momentum同Momentum相比多个"apply interim update:

"这一步

1.4 AdaGrad

通常,我们在每一次更新参数时,对于所有的参数使用相同的学习率。而AdaGrad算法的思想是:每一次更新参数时(一次迭代),不同的参数使用不同的学习率。AdaGrad 的公式为

其中

一般默认取
,学习率一般取值0.01
优点: 对于梯度较大的参数,
相对较大,则
较小。而相对于梯度较小的参数,则效果相反。这样就可以使得参数在平缓的地方下降的稍微快些,不至于在原位徘徊。

缺点: 由于是累加梯度的平方,到后面
的值会比较大,导致梯度
,导致梯度消失

1.5 Adadelta

为了克服Adagrad的缺点进行的改进 - 将累积梯度改为衰减梯度和,对历史梯度信息乘以衰减项

  • 解决需要人工设置学习的问题,这里借鉴牛顿法的思想,即
    , 我们构造
    的近似,来模拟得到
    的方法

  • 的更新公式

  • 对x得到更新为

1.6 RMSprop

其也是为了解决Adagrad中梯度消失的问题,与Adadelta相比,仅仅采用了对

采样指数衰减平均进行更新

1.7 Adam( Adaptive Moment Estimation)

Adam实际上是把momentum和RMSprop结合起来的一种算法,分为一阶和二阶动量

具体更新算法:
while
not converged:
(first moment estimate)
(second moment estimate)
(更新参数)

return

1.8 各方法效果图对比

利用雅可比方法求线性方程组C语言_优化方法(一)_第4张图片

利用雅可比方法求线性方程组C语言_优化方法(一)_第5张图片

总的来说,RMSprop是Adagrad的扩展形式,用于处理在Adagrad中急速递减的学习率。RMSprop与Adadelta相同,所不同的是Adadelta在更新规则中使用参数的均方根进行更新。

最后,Adam是将偏差校正和动量加入到RMSprop中。在这样的情况下,RMSprop、Adadelta和Adam是很相似的算法并且在相似的环境中性能都不错。Kingma等人[9]指出在优化后期由于梯度变得越来越稀疏,偏差校正能够帮助Adam微弱地胜过RMSprop。综合看来,Adam可能是最佳的选择

1.9 其他提升方法

  • shuffling 对数据集的洗牌
  • curriculum learning 按照某个有意义的顺序排列会提高模型的性能和SGD的收敛性
  • batch normalization 为了便于学习,我们通常用0均值和单位方差初始化我们的参数的初始值来归一化
  • early stopping
  • Gradient noise 在每个梯度更新中增加满足高斯分布
    的噪音:
    ,高斯分布的方差进行 退火
    ,该方法增加了噪音,使得网络对不好的初始化更加鲁棒,同时对深层的和复杂的网络的训练特别有益。他们猜测增加的噪音使得模型更优机会逃离当前的局部最优点,以发现新的局部最优点,这在更深层的模型中更加常见。

2.牛顿法和拟牛顿法

2.1 牛顿法(Newton's method)

  • 牛顿法也是求解无约束最优化问题的常用方法,有收敛速度快的优点。它是一种迭代算法,每一步都需要求解目标函数的海塞矩阵的逆矩阵,计算比较复杂。

目标函数:

其中

要想取得上式子最小值,将其导数为0,即

牛顿法也可用于方程求解,具体讲函数一阶展开:

令其为0

该方法严格称为:Guass-Newton method(高斯牛顿法)
牛顿法的优缺点总结: - 优点:二阶收敛,收敛速度快; - 缺点:牛顿法是一种迭代算法,每一步都需要求解目标函数的Hessian矩阵的逆矩阵,计算比较复杂。   

2.2 拟牛顿法(Quasi-Newton Methods)

  • 牛顿法的迭代中,海塞矩阵的逆矩阵求解比较复杂,使用正定矩阵来近似Hessian矩阵的逆,从而简化了运算的复杂度,即用一个迭代的矩阵
    来不断地 近似代替 海塞矩阵的逆矩阵
    ,这里直接给出结果,有两种近似算法,分别是DFP和BFGS算法。
DFP算法
先初始化一个正定对称矩阵
,可以证明,迭代过程中每个矩阵
都是正定的

利用公式
更新

一维搜索:求
使得

更新

计算
,若
,则停止计算,得到近似解
;否则,继续更新
迭代
  • 另一种是BFGS算法,其实最流行的逆牛顿法,DFP采用的是
    逼近海塞矩阵的逆矩阵
    ,BFGS采用的是
    逼近海塞矩阵
    ,
BFGS算法
初始化正定对称矩阵
, 可以证明,迭代过程中每个矩阵
都是正定的

利用公式

一维搜索:求
使得

更新

计算
,若
,则停止计算,得到近似解
;否则,继续更新
迭代

注意: 上面计算

并不需要直接求逆: 利用Sherman-Morrison 公式: 对于任意非奇异方阵A,
, 若
,则:

该公式描述了在矩阵A发生某种变化时,如何利用之前求好的逆,求新的逆。对迭代公式引入两次 Sherman-Morrison 公式就能得到:

通过测量梯度的变化,构造一个目标函数的模型使之足以产生超线性收敛性。这类方法大大优于最速下降法,尤其对于困难的问题。另外,因为拟牛顿法不需要二阶导数的信息,所以有时比牛顿法更为有效。

3. 共轭梯度法(Conjugate Gradient)

共轭梯度法是介于最速下降法与牛顿法之间的一个方法,它仅需利用一阶导数信息,但克服了最速下降法收敛慢的缺点,又避免了牛顿法需要存储和计算Hesse矩阵并求逆的缺点,共轭梯度法不仅是解决大型线性方程组最有用的方法之一,也是解大型非线性最优化最有效的算法之一。

虽然梯度下降法的每一步都是朝着局部最优的方向的,但它在不同的迭代轮数中会选择非常近似的方向,说明这个方向的误差并没通过一次更新方向和步长更新完,在这个方向上还存在误差,因此参数更新的轨迹是锯齿状。

共轭梯度法是共轭方向法的一种,它在最速下降法的基础上对它进行了改良,初始点的下降方向仍是负梯度方向,但后面的迭代方向不再是该点的负梯度方向了,后面的迭代方向是该点的负梯度方向和前一次迭代方向形成的凸锥中的一个方向,这样有效地避免了“锯齿”现象。

由于每次将一个方向优化到了极小,后面的优化过程将不再影响之前优化方向上的极小值,所以理论上对N维问题求极小只用对N个方向都求出极小就行了。

下图为共轭梯度法和梯度下降法搜索最优解的路径对比示意图:

利用雅可比方法求线性方程组C语言_优化方法(一)_第6张图片

注:绿色为梯度下降法,红色代表共轭梯度法

算法过程

由上我们知道,共轭梯度同梯度下降一样,也是只利用一阶导数信息,只是后续迭代中 优化的方向和步长有所不同 典型的共轭梯度下降是为了解决为解二次规划和线性方程组问题设计的。即待优化问题定义为

其中x为待求解,A为半正定矩阵,b为已知变量。

  • 对于优化方向

第一次优化方向为初始梯度方向

每一次优化方向与之前的优化方向正交,采样Gram-Schmidt方法进行向量正交化,更新优化梯度方向:

  • 对于优化步长

求导并令其导数为0,可得

  • 伪代码

  • 缺点 共轭梯度法不仅没有随机性,而且它因为每一每一步必须要做line search保证单调性,这使得它几乎必然只会收敛到离初始点最近的局部解甚至是鞍点

4. 其他

4.1 Lasso (L1)正则化求解

其正则项目是绝对值,需要使用到subgradient,本质也是使用梯度下降法求解,但分区间操作:

令偏导数为0得到

其中,

代表除去第j个变量外,实际值与预测值直接的差,如果这个值很少,代表变量j能够通过设置一个较小的值从等式中移除

4.2 Ridge (L2)正则化求解

可直接通过求导得到即:

看出第二部分和简单的线性回归类似。ridge回归可等价于首先以一个因子

减少权重,然后再应用简单的回归更新规则。

Ref:

1. https://www.cnblogs.com/shixiangwan/p/7532830.html

2. https://blog.csdn.net/songbinxu/article/details/79677948

3. https://blog.csdn.net/weixin_37895339/article/details/84640137

4. https://blog.csdn.net/u012328159/article/details/80311892

5. https://ruder.io/optimizing-gradient-descent/index.html

6. https://blog.csdn.net/google19890102/article/details/69942970

7. https://www.analyticsvidhya.com/blog/2016/01/complete-tutorial-ridge-lasso-regression-python/

欢迎关注公众号:

利用雅可比方法求线性方程组C语言_优化方法(一)_第7张图片

你可能感兴趣的:(利用雅可比方法求线性方程组C语言_优化方法(一))