机器人中的数值优化(二)
文档维护:Arvin
网页部署:Arvin
▶
写在前面:本文内容是作者在深蓝学院机器人中的数值优化学习时的笔记,作者按照自己的理解进行了记录,如果有错误的地方还请执政。如涉侵权,请联系删除。
无约束优化
拟牛顿法
为什么要用拟牛顿法?
一般情况下,当函数为曲线平滑的凸函数时,我们使用牛顿法。牛顿法如下:
通过二阶泰勒展开:
最小化二次近似:
规定:
牛顿步长:
即:
牛顿法的一些问题:
- 当当前点距离极小点距离较远时,使用牛顿法需要计算二阶海森矩阵,造成计算力浪费。
- 海森矩阵需要满足很多条件,当当前点在线性函数上时,海森矩阵值为零,则步长就会变为无穷大。
- 当函数为非凸函数,牛顿法可能会向更高点迭代。
牛顿法近似,海森矩阵需要正定可逆:
因为迭代需要沿着梯度下降的方向,所以在几何上搜索方向要与负梯度成锐角:
因此只有海森矩阵正定可逆时,使用牛顿法才不会出现上述的问题(向更高点迭代,步长变为无穷大)。
如何构造拟牛顿法?
拟牛顿法近似
拟牛顿法的目的就是为了避免上述问题,同时避免求逆节约计算资源,加快运算速度。我们构造一个矩阵来逼近海森矩阵或者他的逆。
为了方便推导,我们假设$f(x)$是二次函数,此时海森矩阵$H$是常数矩阵,任意两点$x_k$与$x_{k+1}$处的梯度之差是:
即:
对于非二次型的情况,也近似满足上式关系。
因为:
我们可得:
or:
其中,$M_{k+1}B_{k+1}=I$
以上就是拟牛顿条件,不同的拟牛顿法,区别就在于如何逼近不同的矩阵。
DFP法逼近的是$H^{-1}$。
BFGS法逼近的是$H$。
DFP法
DFP是用$D_k$来近似海森矩阵的逆矩阵$H_{k}^{-1}$
推导
现在已知拟牛顿条件:
假设已知$D_k$,希望用叠加的方式求$D_{k+1}$,即$D_{k+1}=D_k+\Delta D_k$,代入得到:
假设满足这个等式的$\Delta D_k$是这样的形式(我也不知道为什么要这么假设,可能是为了保证正定可逆):
对照可以得到:
要保证$\Delta D_k$是对称的,参照其表达式,最简单的就是令:
可得:
然后带入式16可得:
虽然式子看起来很复杂但是并不涉及求逆,第一项仅涉及向量乘法,第二项仅涉及矩阵乘法。
DFP算法步骤
(1) 给定初始点$x_0$,精度$\epsilon$,令$D_0=I$
(2) 计算搜索方向
(3) 从当前点出发,沿着搜索方向做一维搜索,获得最优步长并更新参数:
(4)判断精度,若$|g_{k+1}|<\epsilon$则停止迭代,否则转 (5)
(5) 计算 $\Delta g=g_{k+1}-g_k$, $\Delta x=x_{k+1}-x_{k}$,更新 $D$
(6)$\quad k=k+1$,转(2)
BFGS法
BFGS是最流行的拟牛顿算法。与DFP算法相比,性能更佳。它是构建一个矩阵来逼近海森矩阵$H_k$。
推导
和DFP类似,我们可以得到
下面的推导需要用到Sherman-Morrison公式:
假设$A$是$n$阶可逆矩阵,$t$是常量,$u, v$是$n$维向量,且$A+uv^T$也是可逆矩阵,则
应用两次上述公式可以得到:
且:$B_K = M_k^{-1}$,则有
BFGS算法步骤
严格凸函数
对于严格凸函数(strictly convex),伪代码如下:
不严格凸函数
Wolfe条件
- weak Wolfe conditions
其中,$0<c_1<c_2<1$,通常$c_1=10^{-4},~c_2=0.9$。
- strong Wolfe conditions其中,$0<c_1<c_2<1$,通常$c_1=10^{-4},\mathrm{~}c_2=0.9$
cautious update
仅仅是wolfe条件无法保证收敛,BFGS算法还需要cautious update
具体步骤:
LBFGS法
BFGS公式:
我们使用BFGS算法来利用单位矩阵逐步逼近H矩阵,但是每次计算都要储存B矩阵,如果维度特别大,就会占用许多内存。我们可以用时间换空间的方法,我们不储存B矩阵,而是储存$\Delta x$和$\Delta g$。比如数据集有10000个维度,由储存10000×10000的矩阵变为了储存是个1×10000的10个向量,有效储存了空间。
并且有时候需要迭代许多轮,我们规定只存储m个回合的的数据。
- Lewis & Overton line search:
weak Wolfe conditions
综上对于非凸非光滑函数:
共轭梯度法
作业
BFGS
环境
1 | ROS-Melodic |
运行
1 | mkdir catkin_ws |
结果
说明
三次样条(Cubic Spline):
参考链接:三次样条
and natural spline is: $\rho(s_0)^{‘’} = \rho(s_N)^{‘’} = 0$.
目标函数:
计算梯度:
- Energy Gradient
- Potential Gradient
- Lewis & Overton line search
参考链接: