文档维护:Arvin
网页部署:Arvin
▶
写在前面:本文内容是作者在深蓝学院机器人中的数值优化学习时的笔记,作者按照自己的理解进行了记录,如果有错误的地方还请执政。如涉侵权,请联系删除。
凸优化基础
最优化问题概括
最优化问题一般可以描述为:
mins.t.f(x)g(x)≤0h(x)=0
凸集合与凸函数
凸集
对于Rn中的两个点x1=x2,形如y=θx1+(1−θ)x2的点形成了过点x1和x2的直线。当0≤θ≤1,这样的点形成了连接点的x1和x2的线段。
定义:如果过集合C中任意两点的直线都在C内,则成C为放射集,即
θx1,x2∈C⟹θx1+(1−θ)x2∈C,∀θ∈R
线性方程组Ax=b的解集是仿射集。反之,任何仿射集都可以表示成一个线性方程组的解。
定义:如果连接集合C中任意两点的线段都在C内,则称C为凸集,即
x1,x2∈C⟹θx1+(1−θ)x2∈C,∀0⩽θ⩽1
从凸集可以引出凸组合和凸包等概念,形如
x=θ1x1+θ2x2+⋯+θkxk1=θ1+θ2+⋯+θk,θi⩾0,i=1,2,⋯,k
的点称为x1,x2,…,xk的凸组合。集合S中点所有可能的凸组合构成的集合称为S的凸包,记作conv S是包含S的最小凸集。如下图所示,左边为离散点集的凸包,右边为扇形的凸包:
若在凸组合的定义中去掉θi≥0的限制,可以得到仿射包的概念。
如下图所示,展示了$ \mathbb{R}^{3}$中圆盘S的仿射包,其为一个平面:
定义:(仿射包)设S为R的子集,称如下集合为S的仿射包:{x∣x=θ1x1+θ2x2+⋯+θkxk,x1,x2,⋯,xk∈S,θ1+θ2+⋯+θk=1},记为affine S。
形如x=θ1x1+θ2x2,θ1>0,θ2>0的点称为点x1,x2的锥组合,若集合S中任意点的锥组合都在S中,则称S为凸锥,如下图所示:
高阶函数
f(x)=f(x1,x2,x3)
∇f(x)=∂1f(x)∂2f(x)∂3f(x)
Letf(x):Rn→RLet f(x):Rn→R,梯度向量包含所有一阶偏导数:
∇f(x)=dxdf=∂x1∂f∂x2∂f⋮∂xn∂f
该矢量指示最陡上升的方向。因此,向量 −∇f(x) 表示该点的函数最速下降的方向。
∇2f(x)=∂12f(x)∂2∂1f(x)∂3∂1f(x)∂1∂2f(x)∂22f(x)∂3∂2f(x)∂1∂3f(x)∂2∂3f(x)∂32f(x)
Let f(x):Rn→R,海森矩阵包含所有二阶偏导数:
f′′(x)=dxTd(∇f)=dxd(∇fT)=∂x1∂x1∂2f∂x2∂x1∂2f⋮∂xn∂x1∂2f∂x1∂x2∂2f∂x2∂x2∂2f⋮∂xn∂x2∂2f⋯⋯⋱⋯∂x1∂xn∂2f∂x2∂xn∂2f⋮∂xn∂xn∂2f
但实际上,Hessian 可以是这样的张量: (f(x):Rn→Rm) 只是 3d 张量,每个切片只是对应的 hessian标量函数(H(f1(x)),H(f2(x)),…,H(fm(x)))。
多维梯度的推广:f(x):Rn→Rm
f′(x)=dxTdf=∂x1∂f1∂x1∂f2⋮∂x1∂fm∂x2∂f1∂x2∂f2⋮∂x2∂fm⋯⋯⋱⋯∂xn∂f1∂xn∂f2⋮∂xn∂fm
f(x)=f(0)+xT∇f(0)+21xT∇2f(0)x+O(∥x−x0∥3)
事实上,我们可以将海森矩阵看作梯度的雅可比。
凸函数
定义:(凸函数)设函数f为适当函数,如果dom f是凸集,且
f(θx+(1−θ)y)⩽θf(x)+(1−θ)f(y)
对所有x,y∈domf,0⩽θ⩽1,则称f为凸函数。
直观地来看,连接凸函数的图像上任意两点的线段都在函数图像上方。
梯度下降法
原理
梯度下降法其原理可用公式进行表示:
xk+1=xk+τdd=−∇f(xk)
这是一个迭代公式:其中τ表示搜索步长,d表示搜索方向即负梯度方向。步长的设定通常会采用如下几种方法:
-
恒定步长(Constant step size):
τ=c
-
递减步长(Diminishing step size):
τ=c/k
-
步长的精确搜索(Exact line search):
τ=argαminf(xk+αd)
-
步长的非精确搜索(Inexact line search):
τ∈{α∣f(xk)−f(xk+αd)≥−c⋅αdT∇f(xk)}
主要讲述一下步长的精确搜索和不精确搜索。
步长的精确搜索
若我们已经知道了一个下降方向dk,就只需要求参数α使其满足一维优化问题minf(xk+αd)的解,令ϕ(α)=f(xk+αdk),则ϕ′(α)=∇f(xk+αdk)Tdk=0,求解该线性方程组即可。对于简单的方程,精确搜索是非常快速有效的。但是当目标函数比较复杂或维度比较高时,每次求解步长将会非常耗时。因此我们往往采用非精确搜索的方法。
步长的非精确搜索
步长的非精确搜索一般按照Armijo搜索条件去搜索。Armijo条件(充分减少条件):
τ∈{α∣f(xk)−f(xk+αd)≥−c⋅αdT∇f(xk)}
利用步长的非精确搜索方法,其伪代码如下:
- 给定最初点x1,给定初始步长τ,设置允许误差θ>0,迭代次数k=1
- 计算梯度作为搜索方向:dk=−∇f(xk)
- 根据Armijo条件更新步长:如果f(xk+τd)>f(xk)+c⋅τdT∇f(xk),则τ←τ/2直到满足Armijo条件为止。
- 进行迭代:xk+1=xk+τd
- 若精度达到误差要求迭代结束,否则转到步骤2
修正阻尼牛顿法
通过二阶泰勒展开:
f(x)≈f^(x)≜f(xk)+∇f(xk)T(x−xk)+21(x−xk)T∇2f(xk)(x−xk)
最小化二次近似:
∇f^(x)=∇2f(xk)(x−xk)+∇f(xk)=0⟹x=xk−[∇2f(xk)]−1∇f(xk)
规定:
∇2f(xk)≻O
牛顿步长:
xk+1=xk−[∇2f(xk)]−1∇f(xk)
其伪代码如下:
initialization x←x0∈Rn
while ∥∇f(x)∥>δ do
d←−M−1∇f(x)
t← backtracking line search
x←x+td
end while
return
作业
要求
使用 Armijo condition 实现线搜索最陡梯度下降。
目标函数为Rosebrock函数:
f(x)=f(x1,x2,…,xN)=i=1∑N/2[100(x2i−12−x2i)2+(x2i−1−1)2]
结果
具体代码见:https://github.com/arvinzyj/Optimization-in-Robotic/tree/main/chapter01
2维
- 首先设置维度和初始点:2, [2, 2]
- 然后运行
最后结果:
迭代次数:33997
位置:[1.00111873349992 1.00224319227457]
2n维
- 首先设置维度和初始点:4, [2, 2, 2, 2]
- 然后运行
最后结果:
迭代次数:35737
位置:[1.00079076283692 1.00158531378990 1.00079076283692 1.00158531378990]