文档维护:Arvin
网页部署:Arvin
▶
写在前面:本文内容是作者在深蓝学院机器人中的数值优化学习时的笔记,作者按照自己的理解进行了记录,如果有错误的地方还请执政。如涉侵权,请联系删除。
无约束优化
拟牛顿法
为什么要用拟牛顿法?
一般情况下,当函数为曲线平滑的凸函数时,我们使用牛顿法。牛顿法如下:
通过二阶泰勒展开:
f(x)≈f^(x)≜f(xk)+∇f(xk)T(x−xk)+21(x−xk)T∇2f(xk)(x−xk)(1)
最小化二次近似:
∇f^(x)=∇2f(xk)(x−xk)+∇f(xk)=0⟹x=xk−[∇2f(xk)]−1∇f(xk)(2)
规定:
∇2f(xk)≻O(3)
牛顿步长:
xk+1=xk−[∇2f(xk)]−1∇f(xk)(4)
即:
xk+1=xk−Ht−1gt(5)
牛顿法的一些问题:
- 当当前点距离极小点距离较远时,使用牛顿法需要计算二阶海森矩阵,造成计算力浪费。
- 海森矩阵需要满足很多条件,当当前点在线性函数上时,海森矩阵值为零,则步长就会变为无穷大。
- 当函数为非凸函数,牛顿法可能会向更高点迭代。
牛顿法近似,海森矩阵需要正定可逆:
f(x)−f(xk)≈(x−xk)Tg+21(x−xk)TH(x−xk)(6)
Solve Hkdk=−gk
因为迭代需要沿着梯度下降的方向,所以在几何上搜索方向要与负梯度成锐角:
⟨−g,−H−1g⟩=⟨g,H−1g⟩=gTH−1g>0(8)
因此只有海森矩阵正定可逆时,使用牛顿法才不会出现上述的问题(向更高点迭代,步长变为无穷大)。
如何构造拟牛顿法?
拟牛顿法近似
f(x)−f(xk)≈(x−xk)Tgk+21(x−xk)TMk(x−xk)(9)
Solve Mkdk=−gk
拟牛顿法的目的就是为了避免上述问题,同时避免求逆节约计算资源,加快运算速度。我们构造一个矩阵来逼近海森矩阵或者他的逆。
为了方便推导,我们假设f(x)是二次函数,此时海森矩阵H是常数矩阵,任意两点xk与xk+1处的梯度之差是:
▽f(xk+1)−▽f(xk)=H⋅(xk+1−xk)(10)
即:
xk+1−xk=H−1⋅[▽f(xk+1)−▽f(xk)](11)
对于非二次型的情况,也近似满足上式关系。
因为:
ΔxΔg=xk+1−xk=∇f(xk+1)−∇f(xk)(12)
我们可得:
Δg≈Mk+1Δx
or:
Δx≈Bk+1Δg(13)
其中,Mk+1Bk+1=I
以上就是拟牛顿条件,不同的拟牛顿法,区别就在于如何逼近不同的矩阵。
DFP法逼近的是H−1。
BFGS法逼近的是H。
DFP法
DFP是用Dk来近似海森矩阵的逆矩阵Hk−1
推导
现在已知拟牛顿条件:
Δxk=Dk+1⋅Δgk(14)
假设已知Dk,希望用叠加的方式求Dk+1,即Dk+1=Dk+ΔDk,代入得到:
ΔDkΔgk=Δxk−DkΔgk(15)
假设满足这个等式的ΔDk是这样的形式(我也不知道为什么要这么假设,可能是为了保证正定可逆):
ΔDk=Δxk⋅qkT−DkΔgk⋅wkT(16)
对照可以得到:
qkT⋅Δgk=wkT⋅Δgk=In(17)
要保证ΔDk是对称的,参照其表达式,最简单的就是令:
qk=αkΔxkwk=βkDkΔgk(18)
可得:
αk=ΔxkTΔgk1βk=ΔgkTDkΔgk1(19)
然后带入式16可得:
ΔDk=ΔxkTΔgkΔxkΔxkT−ΔgkTDkΔgkDkΔgkΔgkTDk(20)
虽然式子看起来很复杂但是并不涉及求逆,第一项仅涉及向量乘法,第二项仅涉及矩阵乘法。
DFP算法步骤
(1) 给定初始点x0,精度ϵ,令D0=I
(2) 计算搜索方向
dk=−Dk∇f(xk)
(3) 从当前点出发,沿着搜索方向做一维搜索,获得最优步长并更新参数:
λk=argλminf(xk+λ⋅dk)
xk+1=xk+λk⋅dk
(4)判断精度,若∣gk+1∣<ϵ则停止迭代,否则转 (5)
(5) 计算 Δg=gk+1−gk, Δx=xk+1−xk,更新 D
Dk+1=Dk+ΔxkTΔgkΔxkΔxkT−ΔgkTDkΔgkDkΔgkΔgkTDk
(6)k=k+1,转(2)
BFGS法
BFGS是最流行的拟牛顿算法。与DFP算法相比,性能更佳。它是构建一个矩阵来逼近海森矩阵Hk。
推导
Δgt=Mk+1⋅Δxk(21)
和DFP类似,我们可以得到
ΔMk=ΔgkTΔxkΔgkΔgkT−ΔxkTMkΔxkMkΔxkΔxkTMk(22)
下面的推导需要用到Sherman-Morrison公式:
假设A是n阶可逆矩阵,t是常量,u,v是n维向量,且A+uvT也是可逆矩阵,则
(A+tuvT)−1=A−1−t+vTA−1uA−1uvTA−1(22)
应用两次上述公式可以得到:
Mk+1−1=(I−ΔgTΔxΔxΔgT)Mk−1(I−ΔgTΔxΔgΔxT)+ΔgTΔxΔxΔxT
且:BK=Mk−1,则有
Bk+1=(I−ΔgTΔxΔxΔgT)Bk(I−ΔgTΔxΔgΔxT)+ΔgTΔxΔxΔxT
BFGS算法步骤
严格凸函数
对于严格凸函数(strictly convex),伪代码如下:
不严格凸函数
Wolfe条件
其中,0<c1<c2<1,通常c1=10−4, c2=0.9。
cautious update
仅仅是wolfe条件无法保证收敛,BFGS算法还需要cautious update
Bk+1=⎩⎨⎧(I−ΔgTΔxΔxΔgT)Bk(I−ΔgTΔxΔgΔxT)+ΔgTΔxΔxΔxTBk if ΔgTΔx>ϵ∣∣gk∣∣ΔxTΔx, otherwiseϵ=10−6
具体步骤:
LBFGS法
BFGS公式:
Bk+1=(I−ΔgTΔxΔxΔgT)Bk(I−ΔgTΔxΔgΔxT)+ΔgTΔxΔxΔxT
我们使用BFGS算法来利用单位矩阵逐步逼近H矩阵,但是每次计算都要储存B矩阵,如果维度特别大,就会占用许多内存。我们可以用时间换空间的方法,我们不储存B矩阵,而是储存Δx和Δg。比如数据集有10000个维度,由储存10000×10000的矩阵变为了储存是个1×10000的10个向量,有效储存了空间。
并且有时候需要迭代许多轮,我们规定只存储m个回合的的数据。
- Lewis & Overton line search:
weak Wolfe conditions
S(α):f(xk)−f(xk+αd)≥−c1⋅αdT∇f(xk)C(α):dT∇f(xk+αd)≥c2⋅dT∇f(xk)
综上对于非凸非光滑函数:
共轭梯度法
作业
BFGS
环境
运行
1 2 3 4 5 6 7
| mkdir catkin_ws cd catkin_ws mkdir src cp gcopter /catkin_ws/src catkin_make source ./devel/set.bash roslaunch gcopter curve_gen.launch
|
结果
说明
-
三次样条(Cubic Spline):
参考链接:三次样条
ρ(s)ρ(s)′ρ(s)′′=ai+bisi+cisi2+disi3, si∈(0,1)=bi+2cisi+3disi2,=2ci+6disi
and natural spline is: ρ(s0)′′=ρ(sN)′′=0.
-
目标函数:
costwhere,xiaibicidiand, here:=Energy(x1,...,xN−1)+Potential(x1,...,xN−1)=i=0∑N(4ci2+12cidi+12di2) + 1000i=1∑N−1j=1∑M(max(rj−∥xi−oi∥,0))=[xˉi,yˉi]1×2=xi=Di=−3(xi−xi+1)−2Di−Di+1=2(xi−xi+1)+Di+Di+1D1D2...DN−1(N−1)×2=4114...1...1...4114(N−1)×(N−1)−13(x2−x0)3(x2−x0)...3(xN−xN−2)(N−1)×2
-
计算梯度:
∂x∂E∣x1,..,xN−1where,∂x∂ci∣x1,..,xN−1∂x∂di∣x1,..,xN−1∂x∂x0−x1x1−x2...xN−xN−1=i=0∑N−1[(8ci+12di)∂x∂ci+(12ci+24di)∂x∂di]=−3∂x∂(xi−xi+1)−2∂x∂Di−∂x∂Di+1=2∂x∂(xi−xi+1)+∂x∂Di+∂x∂Di+1=−11−1......1−11−1(N−1)×(N−1)∂x∂Di=4114...1...1...4114(N−1)×(N−1)−10−330...3...−3...0−330(N−1)×(N−1)
- Potential Gradient
∂xˉ∂P∣xˉ1,..,xˉN−1∂yˉ∂P∣yˉ1,..,yˉN−1=−1000j=1∑M(xˉi−aj)2+(yˉi−bj)2xˉi−aj=−1000j=1∑M(xˉi−aj)2+(yˉi−bj)2yˉi−aj
- Lewis & Overton line search
参考链接:
拟牛顿法(DFP、BFGS、L-BFGS
牛顿法和拟牛顿法
BFGS算法的迭代公式推导