文档维护:Arvin
网页部署:Arvin
▶
写在前面:本文内容是作者在深蓝学院机器人中的数值优化学习时的笔记,作者按照自己的理解进行了记录,如果有错误的地方还请执政。如涉侵权,请联系删除。
附录(笔记)
函数的光滑技巧
Inf convolution卷积
Inf convolution 卷积操作适应于凸函数,Inf convolution 卷积操作的目标是把不光滑的凸函数进行光滑近似,并使得光滑近似后的函数于原函数尽量吻合。
对于两个凸函数f1,f2,它们之间的Inf convolution 卷积操作记为f1□f2,即找一个u1和u2,满足u1+u2=x的条件下,使得f1(u1)+f2(u2)最大或最小,如下面的第一个表达式所示,由于满足u1+u2=x,因此可消去一个u进行简化,简化后的表达式如下面第二个式子所示:
(f1□f2)(x)(f1□f2)(x)=(u1,u2)∈Rd×Rdinf{f1(u1)+f2(u2):u1+u2=x}=u∈Rdinf{f1(u)+f2(x−u)}
Inf convolution卷积具有对称性,即f1□f2=f2□f1
Inf convolution卷积操作的几何解释如下图所示,其原理就是拿光滑凸函数的轮廓去把不光滑的地方利用包络将其变成光滑的。
Moreau包络
Moreau envelope是Inf convolution卷积操作的一个特例,即将被卷积函数更改为一个二次函数或者说范数的平方,如下式所示:
γf:=f□(2γ1∥⋅∥2)
其具体表达式如下式所示:
γf(x):=u∈Rdinf{f(u)+2γ1∥x−u∥2}
当一个函数时封闭的凸函数时,inf一定可以取到最小值,γ具有平滑参数的作用,γ越小,平滑后的函数与原函数越接近。
Pinball case
Pinball loss定义为:
ℓs1,s2(x)={s1xs2xifx≤0ifx≥0
其中s1≤0≤s2,Pinball函数的Moreau包络函数如下所示:
γf(x)=(f□g)(x)==⎩⎨⎧s1x−γ2s12,2γ1x2,s2x−γ2s22,ifx<s1ifx∈[γs1,γs2]ifx>s2
一个经典的例子是Huber函数ℓ−1,1,即s1取-1,s2取1
当我们不断地把γ值减小,平滑后的函数与原函数也更加接近,包络的下边缘也会越来越尖,如下图所示:
Moreau 包络具有一个良好的性质,即一个函数与它的Moreau 包络函数的最小值相同,即
∀γ>0,xinf((γf)(x))=xinff(x)
证明如下:
xinf((γf)(x))=xinfyinf{f(y)+2γ1∥x−y∥2}=yinfxinf{f(y)+2γ1∥x−y∥2}=yinff(y)
总结一下,用Inf convolution 卷积操作可以对一个不光滑的凸函数进行平滑,平滑后的函数与原函数具有同样的最小值,给一个光滑因子γ用来调节光滑程度,我们把不光滑的凸函数f的光滑近似记作ωγf,ω是我们用来光滑f的被卷积的函数,ω取21∥⋅∥2时,就是Moreau 包络。
Mollifier-Conv
Mollifier卷积是比Inf-conv卷积更一般化的卷积,举一个例子,对于如式所示的函数,它是通过e1−x2−1变化而来的,除以其自身的积分相当于进行了缩放操作,这样一个凸起的或者说隆起的函数就称为Mollifier。
φ(x)=⎩⎨⎧∫−11e−1/(1−s2)dse−1/(1−x2)0 if ∣x∣<1 if ∣x∣≥1
更一般的,取φϵ(x):=ϵ1φ(ϵx),将该函数与下面右图中红色曲线所示的函数进行卷积fϵ(x):=∫−∞+∞f(x+z)φϵ(z)dz,得到了下面右图中的蓝色曲线,其中ϵ用于调节光滑效果,ϵ越小光滑效果越差,越接近于原函数。
下图中给出了一个二维的例子,在一维的基础上进行了推广
φ(x)=⎩⎨⎧∫Rne−1/(1−∥s∥2)dse−1/(1−∥x∥2)0if∥x∥<1if∥x∥≥1
$$
\begin{gathered}\varphi_\epsilon(x):=\frac1{\epsilon^n}\varphi{\left(\frac x\epsilon\right)}\\\\f_\epsilon(x):=\int_{-\infty}^{+\infty}f(x+z)\varphi_\epsilon(z)dz\end{gathered}
$$
![7](./306-2024-03-02-Math-Optimization/7.png)
Mollifier的具体定义如下:
∫Rnφ(x)dx=1ϵ→0limφϵ(x)=ϵ→0limϵ−nφ(x/ϵ)=δ(x)
φ(x)满足在$\mathbb{R}^n 上积分为1,且当\epsilon趋向于0时,\varphi(x)趋于冲激函数\delta(x)$,满足这两个条件即可称为Mollifier。
为何使用Mollifier函数对原函数进行卷积操作会使其变得光滑?下面使推导:
dxdfϵ(x)=dxd∫f(x+z)φϵ(z)dz=dxd∫f(y)φϵ(y−x)dy=∫f(y)(dxdφϵ(y−x))dy
若Mollifier函数是处处连续可微的,则对某个函数进行卷积操作后得到的函数也是处处连续的。
举个例子
伴随灵敏度分析
伴随灵敏度分析可以避免冗余信息的计算,在下面的例子中,我们想要求解Ax=b1、Ax=b2…Ax=bm等一系列方程组,第一种求解思路是将A矩阵进行LU分解,A=LU ,求逆后可得到 A−1=U−1L−1 ,然后依次将b1∼bm代入下式即可得到这一系列方程组的解。
xi=U−1L−1bi
但如果我们事先知道需要使用那些数据,那么我们能不能仅把需要使用的变量求出来?比如我们的目标是求每个xi的平均值ai,比如所有x1的平均值a1,那么我们是不是不需要求出每个Xi的具体值,而仅仅需要他们的平均值ai。
ai=cTxi=cTA−1bi=biTA−Tc
之前需要先算A−1bi部分,再算cTA−1bi,现在可以先算cTA−1bi,再算A−Tc,我们不需要对每个bi求一个线性方程组了,仅需要求一个方程组q≡A−Tc,求出q之后,再与bi做一个点积即可,ai=biTq。
伴随灵敏度分析的思想是在计算矩阵相乘的时候考虑那个先乘,那个后乘。线性方程组有一个伴随线性方程组,伴随灵敏度分析允许优化一小部分设计参数,而不是全部参数。
假设X是一个线性方程组的解,它的维度很大,它是一个完备的参数,从X可以获得所有我们想要的信息,但我们不能直接处理这么大维度的优化,我们需要设一组设计参数p=(p1,p2,...,pM),我们要算的是一些目标函数g(p,x)关于参数p1,p2,…,pM的梯度。
dpjdg=∂pj∂g+i=1∑N∂xi∂g∂pj∂xidpdg=gp+gxxp
一般来讲∂pj∂g和∂Xj∂g是容易获得的,∂pj∂Xi是不知道的。
Apjx+Axpj=bpj⇒xpj=A−1[bpj−Apjx]
我们使用矩阵相乘交换顺序的思想,把解m次N2复杂度的方程组,转换为解一次就可以了。
线性方程组求解器的分类和特点
线性方程组求解器可分为两大类或三小类,两大类即直接求解和迭代求解,直接求解可以得到Ax=b的精确解,迭代求解随着迭代次数的增多,所得到的近似解与精确解的误差也逐渐减小。三小类是因为有的求解器会利用矩阵的稀疏结构,而有的求解器不利用,因此,直接法又分为稠密法和稀疏直接法。
-
稠密法
具有简单数据结构,不需要索引数据结构等特殊的数据结构,采用矩阵的直接表示,主要是O(N3)分解算法
-
稀疏直接法
当矩阵中有很多0元素时,我们可以仅储存非0元素的位置和具体的值,使其占较少的内存。因子分解成本取决于问题结构(1D低成本;2D可接受成本;3D高成本;不容易给出一般规则,NP−Hard以排序以获得最佳稀疏性)
-
迭代法
迭代求取近似解,仅需要知道y=Ax (maybe y=ATx),良好的收敛性取决于预条件。
作业
作业一:凸多面体障碍物下的路径平滑
- 设置凸多面体
凸多面体由多个半平面组成,在三维空间里可以表示为
aix+biy+ciz+di≤0
可以将其参数化保存到.config
文件里。
- 求最短距离
求解点到凸多面体的最短距离,可以转换成SDQP
X∈Rnmin21XTMQX+cQTXs.t. AQX≤bQ
求解可以用课程中提供的求解器:GitHub - ZJU-FAST-Lab/SDQP: Small-Dimensional Quadratic Programming in Linear Time
下面是转换过程:
令X=Xr−Xo,其中X是曲线插值点,即智能体问题。Xo是凸多面体上离Xr最近的点。
Xo是凸多面体上的点,则约束为(这里只是半平面的表示方法是根据代码框架中代码确定的bQ符号):
AQXo+bQ≤0
另MQ=2I,cQT=0。
则
X∈RnminXTXs.t. AQ(Xr−X)+bQ≤0
则
X∈RnminXTXs.t. −AQX≤−(AQ+bQ)
令Anew=−AQ、bnew=−(AQ+bQ)
X∈RnminXTXs.t. AnewX≤bnew
即可利用求解器求解出来。
- 构造势能函数
根据人工势场函数:
Urep(q)=⎩⎨⎧21η(D(q)1−Q∗1)2,0,D(q)≤Q∗D(q)>Q∗
其中,D(q)是距离最近障碍物的距离;η是斥力增益常量;Q∗是障碍物的作用阈值范围,在该阈值范围之内,障碍物才会产生斥力,超出此范围则不产生斥力影响
稍加修改:
Potential(x)=⎩⎨⎧P(D+11−Q∗+11)2,0,D≤Q∗D>Q∗
其中根据求解器可以求出最短距离
D=∥X∥2=∥Xr−Xo∥2
可以求出梯度
∇Potential(x)=⎩⎨⎧2P(Q∗+11−D+11)(D+11)2∥X−Xo∥2+0.01X−Xo,0,D≤Q∗D>Q∗
能量函数根据之前的即可。
结果:
运行:
1 2 3 4
| cd catkin_ws catkin_make source ./devel/set.bash roslaunch gcopter curve_gen.launch
|