迭代优化算法
来源:互联网 发布:农村淘宝 编辑:程序博客网 时间:2024/03/28 17:59
版权声明:欢迎转载,原文地址http://blog.csdn.net/aws3217150
目录(?)[+]
如果学习机器学习算法,你会发现,其实机器学习的过程大概就是定义一个模型的目标函数
梯度(Gradient)
什么是梯度,记忆中好像和高数里面的微积分有关。好,只要您也有这么一点印象就好办了,我们知道微积分的鼻祖是牛顿,人家是经典力学的奠基人,那么我们先来看看一道简单的物理问题:
一个小球在一个平面运动,沿着x轴的位移随时间的变化为:
Sx=20−t2 ,沿着y轴的位移随时间的变化为:Sy=10+2t2 ,现在求在t0 时刻小球的速度v ?
大家都是为高考奋战过的人,这样的小题应该是送分题吧。牛老师告诉我们,只要通过求各个方向的分速度,然后再合成就可以求解得出。好,现在我们知道各个方向的位移关于时间的变化规律,我们来求各个方向的速度。如何求速度呢,牛老师说位移的变化率就是速度,那么我们来求在
梯度下降法
做机器学习(监督学习)的时候,一般情况是这样的,有
- 随机初始化
θ - 对于每一个
θi 选择合适的Δθi ,使得J(θ+Δθ)−J(θ)<0 ,如果找不到这样的Δθ ,则结束算法 - 对于每一个
θi 进行更新:θi=θi+Δθi ,回到第2步。
想法挺好的,那么如何找到所谓合适的
- 随机初始化
θ - 求取
θ 的梯度∇θ ,也就是对于每个θi 求取其偏导数∂J(θ)∂θi ,并更新θi=θi−η∗∂J(θ)∂θi(η>0并足够小) - 判断
∇θ 是否为0或者足够小,是就输出此时的θ ,否则返回第2步
上述算法的第二步中多了一个未曾介绍的
共轭梯度法
上一节中,我们介绍了一般的梯度下降法,这是很多开源软件包里面都会提供的一种算法。现在我们来看看另外一种软件包也经常见到算法——共轭梯度法(Conjugate Gradient Method),Jonathan在94年的时候写过《An Introduction to the Conjugate Gradient Method Without the Agonizing Pain》详细而直观地介绍了CG,确实文如其名。这里我只是简要介绍CG到底是一个什么样的东西,具体还需阅读原文,强烈推荐啊!
最陡下降法(Steepest Descent)
上一节中,我们介绍了如何反复利用
我们可以发现,每一次走的步伐和上一次都是垂直的(事实上是可以证明的,在前面我推荐的文中有详细的证明:-)),这样必然有很多步伐是平行的,造成同一个方向要走好几次。研究最优化的人野心就来了,既然同一个方向要走好几次,能不能有什么办法,使得同一个方向只走一次就可以了呢?
共轭梯度法
Cornelius,Magnus和Eduard经过研究之后,便设计了这样的方法——共轭梯度法。
具体详细的原理还是强烈推荐《An Introduction to the Conjugate Gradient Method Without the Agonizing Pain》一文,这里我只是利用文章中的思路进行简要介绍。
何谓共轭(Conjugate)
查看维基的介绍,共轭梯度法(CG)最早的提出是为了解决大规模线性方程求解,比如下面形式:
我们已经了解梯度为何物,现在就差修饰词共轭(Conjugate)了,那么何为共轭(conjugate)呢?对于两个非零向量
共轭梯度法求解线性方程组
那么求解上面线性方程组的时候,假如我们已经找到
上一小节中利用Steepest Method的优化问题如果利用CG就变成了如下:
二维的情况下,可以保证只走两步就达到收敛(严格的证明请参靠推荐的论文)!
非线性共轭梯度法
机器学习算法中,我们碰到的大部分问题都是非线性的,上面我们只是讲解了线性共轭梯度法,那么它可以解决非线性优化问题吗?很遗憾,不行,但是经过修改,可以利用共轭梯度法求取局部最优解,下面展示非线性共轭梯度法的大致轮廓,对于一个非线性目标函数
- 随机初始化
θ0 ,并令r0=d(0)=−J′(θ0) - 对于k = 0,1,2….
- 利用line search找出使得
J(θk+αid(k)) 足够小的αk θk+1=θk+αkd(k) rk+1=−J′(θk+1) d(k+1)=rk+1+βk+1d(k)
- 利用line search找出使得
这里又出现了
需要注意的是,非线性共轭梯度法并不能像解决线性系统那样,保证
像CG这样高效的方法,一般都有现成的工具库可以使用,只要我们提供目标函数的一次导函数和初始值,CG就能帮我们找到我们想要的了!再次推荐《An Introduction to the Conjugate Gradient Method Without the Agonizing Pain》一文。
近似牛顿法(Quasi-Newton)
上一节中介绍开源软件包常见的方法Conjugate Gradient Method,这一节我们来介绍另一个常见的方法——Quasi-Newton Method。
牛顿法(Newton Method)
我们高中的时候数学课本上介绍过牛顿求根法,具体的做法是:对于一个连续可导的函数
如图所示,我们首先随机初始化
- While
J′(θ) 没有足够小:θ=θ−J′(θ)J′′(θ)
其中
L-BFGS算法
上一小节中,我们介绍了牛顿法,并且指出它一个严重的缺陷,就是计算Hession矩阵和求逆有时候内存和时间都不允许。那么有什么办法可以近似利用牛顿法呢,也就是有没有Quasi-Newton Method呢?答案是有的,BFGS算法就是一个比较著名的近似牛顿法,对于BFGS的介绍,另外有一篇博客有很好的介绍,具体参阅《Numerical Optimization: Understanding L-BFGS》,也是非常直观简洁的介绍,还附有Java和Scala源码,非常值得学习。
BFGS算法核心在于他利用迭代的方式(具体方式请参考上面推荐的博文,文章不长,可读性很强)近似求解Hession矩阵的逆,使得求解Hession矩阵的逆变得不再是神话。而迭代的过程步骤是无限制的,这也会导致内存不足问题,所以工程上利用有限步骤来近似BFGS求解Hession的逆,就成了Limit-BFGS算法。与很多算法一样,这个算法名字是取4位发明者的名字首字母命名的,所以单看名字是没有意义的:-)。
以上是几位大佬的尊荣。利用Quasi-Newton法,在处理数据规模不大的算法模型,比如Logistic Regression,可以很快收敛,是所有优化算法包不可或缺的利器。
参考引用
- Neural networks and deeplearning
- An Introduction to the Conjugate Gradient Method Without the Agonizing Pain
- Numerical Optimization: Understanding L-BFGS
- An overview of gradient descent optimization algorithms
- Conjugate gradient method
- Newton’s method
- 顶
- 2
- 踩
- 迭代优化算法
- #并行优化# 混沌迭代算法 (Chaotic)
- 凸优化中的Bregman迭代算法
- 浅谈凸优化问题中的Bregman迭代算法
- 凸优化问题中的Bregman迭代算法
- 凸优化问题中的Bregman迭代算法
- 浅谈凸优化问题中的Bregman迭代算法
- 浅谈凸优化问题中的Bregman迭代算法
- 浅谈凸优化问题中的Bregman迭代算法
- 基于梯度的权重更新优化迭代算法
- 牛顿迭代优化
- 递归算法-----递归算法优化------非递归算法(递推,迭代)----运行时间
- 迭代算法 JAVA
- 迭代算法 JAVA
- jacobi迭代算法
- 信道容量迭代算法
- 举例说明迭代算法
- 迭代算法
- kotlin基础
- pip使用国内镜像
- Ubuntu下boot分区剩余空间不足解决
- 【SDOI 2009】学校食堂Dining 状压动规
- JSON标准格式
- 迭代优化算法
- jQuery上传图片显示预览
- ping 超时原因总结
- 集合中的对象排序
- 如何把安卓官网的1.7G的Android Studio安装包下载并安装到国内的计算机上
- 一块神奇的树莓派电子板竟让我学会了Linux系统
- java输入联想,支持汉字自动匹配
- play framework系列教程之安装play framework
- 戏说 Windows GDI (3)