最优化方法matlab代码(二) 大规模优化问题

matlab代码链接

大规模优化问题matlab代码-LBFGS/FR/PRP/BB.zip-专业指导文档类资源-CSDN文库https://download.csdn.net/download/benchuspx/73414465大规模优化问题的变量数量n很大(几千几万),普通拟牛顿类方法每步都需要用大n^2量级的hessen矩阵,因此需要很大的内存并且极大降低了计算速度。因此衍生出了一些解决大规模优化问题的方法:

1、L-BFGS方法

全称limited-memory BFGS法,是在拟牛顿方法BFGS法(一种对称秩2方法)的基础上,改用前m步的梯度和变量位置来计算拟hessen矩阵的方法。由于前m步的梯度和变量都只是向量而非矩阵,因此L-BFGS方法不需要存储前一步的hessen矩阵,极大减小了内存,因此得名。计算速度上会比BFGS快很多,但效果并没有差太多。m取5、10、15等,效果也都差不多。

和BFGS方法分为求Bk(Quasi Gk)和Hk(Quasi inv(Gk)一样,L-BFGS也分求Bk类型的和Hk类型的。本文代码给出的是Hk类型的。

L-BFGS方法可能是目前最常用的大规模优化问题求解方法。

2、共轭梯度方法

为了求第k步迭代方向dk,共轭梯度方法和拟牛顿方法走的是两条路线。拟牛顿法是用dk=-inv(Gk)*gk,关键是求inv(Gk)(第k步hessen矩阵的逆)。但是共轭梯度法绕开了求hessen矩阵,直接根据前一步的迭代方向d(k-1)和梯度g(k-1)来求第k步的迭代方向dk,并要求每步的迭代方向dk在G意义下是正交的(di‘*G*dj=0),这就是共轭的含义。根据目标函数类型,有两种共轭梯度方法公式:

dk=-gk+beta(k-1)*d(k-1)

(1)FR方法

针对目标函数是正定二次函数,此时gk'*g(k-1)=0

beta(k-1)=gk'*gk/(g(k-1)'*g(k-1))

(2)PRP方法

针对一般目标函数。

beta(k-1)=gk'*(g(k)-g(k-1))/(g(k-1)'g(k-1))

还有PRP+方法,就是在PRP方法基础上限制每一步beta是正的,避免前后两次迭代方向相反。

共轭梯度法算起来也很快,但是优化效果感觉不如L-BFGS,针对某些一般的非线性目标函数都无法收敛。

3、BB方法

Barzilai-Borwein法。该法目前理论尚不成熟,但是效果很好,因此引起了很多注意和研究。

BB方法重拾一度被冷落的最速下降法(SD法),dk=-alpha(k)*gk。在SD方法的基础上,不再用精确先搜索求步长alpha(k),而是将alpha(k)看成alpha(k)*I单位阵,这样相当于拟牛顿方法把拟hessen矩阵逆Hk视作alpha(k)*I。然后借鉴拟牛顿法的拟牛顿公式s(k-1)=Hk*y(k-1),此时Hk=alpha(k)*I显然无法满足s(k-1)=Hk*y(k-1),那么就求一个优化问题使得

 由此求出来alpha(k)步长。迭代方向dk仍然是SD法中的-gk。

具体alpha(k)公式不写了,针对一般优化问题有改进的GBB方法。

代码

大规模优化问题matlab代码-LBFGS/FR/PRP/BB.zip-专业指导文档类资源-CSDN文库https://download.csdn.net/download/benchuspx/73414465

最优化方法matlab代码(二) 大规模优化问题_第1张图片

 最优化方法matlab代码(二) 大规模优化问题_第2张图片

最优化方法matlab代码(二) 大规模优化问题_第3张图片

编程心得
1)在最优化方法matlab代码(一) 牛顿类方法_benchuspx的博客-CSDN博客中,我使用了代数符号 x 来定义目标函数,并使用 subs 来求解函数值,这样运行效率和运行速度都很慢。本次函数的定义和求值已经全部改用数值计算,运行速度大幅提升。
2)本程序加入了自动生成优化过程图、自动加图题和自动存图功能。优化的结果图会自动保存在 figure 文件夹对应目录下

你可能感兴趣的:(学习,matlab,深度学习,matlab,算法,优化)