本文主要针对了解数值优化、但主要集中在调库,不理解算法原理的读者。(比如日常工作是定义一个带约束的优化问题进行求解,求解过程则全部交给优化器。)
本系列讲解了等式/不等式约束、罚函数、对数障碍,拉格朗日乘子法,约束最优性方程,KKT条件,对偶变量等概念,并以casadi和ipopt为例,讲解它如何把不等式约束转为等式约束并进行求解的过程。因此,如果想深入了解,可以阅读本文。
但是,读者需要能留出至少数个小时来阅读本文,否则心急的情况下确实是很难很快理解消化本文的内容。

本系列内容分为两章:
第一节就是本章:
约束优化基础:从简单问题到拉格朗日乘子与 KKT 条件
包含机器人案例引言及第 1—7 节:牛顿法回顾、消元、平方罚函数、对数障碍、乘子与互补条件。

第二节另开一章:
【机器人感知运控笔记四】理解 IPOPT:原始—对偶内点法与二阶信息
包含第 8—14 节:松弛变量、最优性方程、联合牛顿步骤、障碍参数更新、Hessian 接口与导数检查。

如果读完觉得不错,欢迎关注我的专栏:
机器人感知运控笔记-微鉴道长的专栏

引言:三个机器人优化问题

机器人执行任务时,往往有许多可以选择的关节姿态、运动轨迹或接触力。优化模型用目标函数评价这些选择,同时用约束表达关节限位、避障和力学平衡等要求。下面三个例子展示了这种写法。

末端定位:选择一个接近目标、满足避障要求的关节姿态。

设关节向量为 q q q,正运动学给出的末端位置为 p ( q ) p(q) p(q),期望位置为 p g o a l p_{\mathrm{goal}} pgoal​,参考关节姿态为 q r e f q_{\mathrm{ref}} qref​。一个只考虑末端位置的逆运动学模型可以写成:

min ⁡ q ∥ p ( q ) − p g o a l ∥ 2 + α ∥ q − q r e f ∥ 2 s.t. q min ⁡ ≤ q ≤ q max ⁡ , d j ( q ) ≥ d min ⁡ , j = 1 , … , m . \begin{aligned} \min_q\quad &\|p(q)-p_{\mathrm{goal}}\|^2 +\alpha\|q-q_{\mathrm{ref}}\|^2\\ \text{s.t.}\quad &q_{\min}\leq q\leq q_{\max},\\ &d_j(q)\geq d_{\min},\qquad j=1,\ldots,m. \end{aligned} qmin​s.t.​∥p(q)−pgoal​∥2+α∥q−qref​∥2qmin​≤q≤qmax​,dj​(q)≥dmin​,j=1,…,m.​

这里 ∥ ⋅ ∥ \|\cdot\| ∥⋅∥ 表示欧氏范数, α > 0 \alpha>0 α>0 调节保持参考姿态的权重; d j ( q ) d_j(q) dj​(q) 表示第 j j j 对几何体的间距, d min ⁡ d_{\min} dmin​ 是要求保留的安全距离。求解器在满足关节限位和距离约束的姿态中,权衡末端位置误差与参考姿态偏差。

离散轨迹优化:连接起终点,并减少相邻采样点的关节变化。

把轨迹表示为 N + 1 N+1 N+1 个关节向量 q 0 , … , q N q_0,\ldots,q_N q0​,…,qN​。固定起终点,优化中间采样点:

min ⁡ q 0 , … , q N ∑ k = 0 N − 1 ∥ q k + 1 − q k ∥ 2 s.t. q 0 = q s t a r t , q N = q g o a l , q min ⁡ ≤ q k ≤ q max ⁡ , k = 0 , … , N , d j ( q k ) ≥ d min ⁡ , j = 1 , … , m , k = 0 , … , N . \begin{aligned} \min_{q_0,\ldots,q_N}\quad &\sum_{k=0}^{N-1}\|q_{k+1}-q_k\|^2\\ \text{s.t.}\quad &q_0=q_{\mathrm{start}},\qquad q_N=q_{\mathrm{goal}},\\ &q_{\min}\leq q_k\leq q_{\max},\qquad k=0,\ldots,N,\\ &d_j(q_k)\geq d_{\min},\qquad j=1,\ldots,m,\quad k=0,\ldots,N. \end{aligned} q0​,…,qN​min​s.t.​k=0∑N−1​∥qk+1​−qk​∥2q0​=qstart​,qN​=qgoal​,qmin​≤qk​≤qmax​,k=0,…,N,dj​(qk​)≥dmin​,j=1,…,m,k=0,…,N.​

这个模型同时包含等式约束和不等式约束。目标函数把相邻采样点联系起来,距离约束要求每个采样姿态避开障碍;采样点之间的连续运动还需要结合插值方式检查碰撞。

接触力分配:在满足平衡与摩擦要求的条件下分配支撑力。

固定机器人姿态和接触位置,考虑水平地面上的 r r r 个接触点。第 i i i 个接触力为 f i = ( f i x , f i y , f i z ) f_i=(f_{ix},f_{iy},f_{iz}) fi​=(fix​,fiy​,fiz​),把它们堆叠为向量 F F F。矩阵 A A A 把接触力转换为机器人受到的合力与合力矩, w w w 表示平衡重力及其他外力所需的合力与合力矩:

min ⁡ F 1 2 ∑ i = 1 r ∥ f i ∥ 2 s.t. A F = w , f i z ≥ 0 , i = 1 , … , r , f i x 2 + f i y 2 ≤ η i f i z , i = 1 , … , r . \begin{aligned} \min_F\quad &\frac12\sum_{i=1}^{r}\|f_i\|^2\\ \text{s.t.}\quad &AF=w,\\ &f_{iz}\geq0,\qquad i=1,\ldots,r,\\ &\sqrt{f_{ix}^2+f_{iy}^2}\leq\eta_i f_{iz},\qquad i=1,\ldots,r. \end{aligned} Fmin​s.t.​21​i=1∑r​∥fi​∥2AF=w,fiz​≥0,i=1,…,r,fix2​+fiy2​ ​≤ηi​fiz​,i=1,…,r.​

η i \eta_i ηi​ 是第 i i i 个接触点的摩擦系数。等式保证整体力学平衡,不等式限制接触力的方向和摩擦范围,平方和目标从可行的力分配中选择一个解。

这些问题都要求求解器在改善目标的同时处理约束。只沿目标梯度下降,可能碰到障碍或破坏平衡;到达约束边界时,目标梯度也可能仍然指向可行域外。接下来从一个一维问题开始,逐步理解约束最优点应满足什么条件,以及求解器怎样利用这些条件计算结果。

1. 一个带边界的最小化问题

我们希望选择一个数,让它尽量接近 2,同时要求它不大于 1:

min ⁡ x f ( x ) = ( x − 2 ) 2 , x ≤ 1. \min_x f(x)=(x-2)^2,\qquad x\leq 1. xmin​f(x)=(x−2)2,x≤1.

这里有三个基本概念:

  • 决策变量:我们能够调整的量,本例为 x x x。
  • 目标函数:衡量结果优劣的量,本例为 ( x − 2 ) 2 (x-2)^2 (x−2)2,越小越好。
  • 可行域:满足全部约束的点构成的集合,本例为 ( − ∞ , 1 ] (-\infty,1] (−∞,1]。

暂时去掉约束,最优点是 x = 2 x=2 x=2,目标值为 0。加入约束后,最优点变为 x ∗ = 1 x^*=1 x∗=1,目标值为 1。我们可以画图直接得到这个答案;数值算法需要通过函数值、导数和约束值逐步寻找它。

在这里插入图片描述

这两个答案可以作为后续计算的参照:无约束时应得到 2,加入边界后应得到 1。约束决定可接受的范围,目标决定其中哪些点更好。后面出现的辅助变量和算法参数,都围绕这个原问题组织求解。

2. 无约束牛顿法的记号与后续连接

本节简要回顾已熟悉的无约束更新,统一后文的记号。需要保留的联系是:牛顿法可以通过线性化方程来计算修正量。第 9 节会把这个做法用于约束最优性方程。

2.1 斜率与梯度下降

对于 f ( x ) = ( x − 2 ) 2 f(x)=(x-2)^2 f(x)=(x−2)2,导数与梯度下降更新为:

f ′ ( x ) = 2 ( x − 2 ) , x k + 1 = x k − α k f ′ ( x k ) . f'(x)=2(x-2),\qquad x_{k+1}=x_k-\alpha_k f'(x_k). f′(x)=2(x−2),xk+1​=xk​−αk​f′(xk​).

k k k 是迭代编号, α k > 0 \alpha_k>0 αk​>0 是步长系数。例如从 x 0 = 0 x_0=0 x0​=0 出发,导数为 − 4 -4 −4;取 α k = 0.1 \alpha_k=0.1 αk​=0.1,第一次更新到 x 1 = 0.4 x_1=0.4 x1​=0.4。后文仍用 α \alpha α 表示一次迭代采用多大的步长。

2.2 局部二次近似与牛顿方向

牛顿法利用局部二次模型确定方向。设本次建议位移为 d d d,在当前位置展开:

f ( x k + d ) ≈ f ( x k ) + f ′ ( x k ) d + 1 2 f ′ ′ ( x k ) d 2 . f(x_k+d)\approx f(x_k)+f'(x_k)d+\frac12 f''(x_k)d^2. f(xk​+d)≈f(xk​)+f′(xk​)d+21​f′′(xk​)d2.

对右侧关于 d d d 求导,并令它等于零:

f ′ ( x k ) + f ′ ′ ( x k ) d = 0 , d = − f ′ ( x k ) f ′ ′ ( x k ) . f'(x_k)+f''(x_k)d=0, \qquad d=-\frac{f'(x_k)}{f''(x_k)}. f′(xk​)+f′′(xk​)d=0,d=−f′′(xk​)f′(xk​)​.

在本例中 f ′ ′ ( x ) = 2 f''(x)=2 f′′(x)=2,从 x 0 = 0 x_0=0 x0​=0 得到 d = 2 d=2 d=2,采用完整位移就到达 x 1 = 2 x_1=2 x1​=2。这个例子恰好是二次函数,局部模型与原函数完全一致。

从求解方程的角度看,这一步用 f ′ ( x k ) + f ′ ′ ( x k ) d f'(x_k)+f''(x_k)d f′(xk​)+f′′(xk​)d 近似新位置的导数,再选择 d d d 让这个近似值等于零。后面处理约束方程时,也会用到这种线性近似。

一般函数的局部模型只在附近准确。实际求解器还要选择步长,检查新点的改进情况。

2.3 从一维二阶导数到 Hessian 矩阵

实际问题往往需要同时调整多个变量。我们仍然可以构造局部二次模型,只是需要记录各变量的变化及其相互影响。当 x x x 是一个向量,一阶导数变成梯度,二阶导数组成 Hessian 矩阵:

∇ f ( x ) = [ ∂ f / ∂ x 1 ⋮ ∂ f / ∂ x n ] , H f ( x ) = [ ∂ 2 f ∂ x i ∂ x j ] i , j = 1 n . \nabla f(x)=\begin{bmatrix}\partial f/\partial x_1\\ \vdots\\ \partial f/\partial x_n\end{bmatrix}, \qquad H_f(x)=\left[\frac{\partial^2 f}{\partial x_i\partial x_j}\right]_{i,j=1}^n. ∇f(x)= ​∂f/∂x1​⋮∂f/∂xn​​ ​,Hf​(x)=[∂xi​∂xj​∂2f​]i,j=1n​.

对角项描述各方向的弯曲程度;非对角项描述不同变量之间的耦合。例如:

f ( x , y ) = x 2 + x y + 2 y 2 , H f = [ 2 1 1 4 ] . f(x,y)=x^2+xy+2y^2, \qquad H_f=\begin{bmatrix}2&1\\1&4\end{bmatrix}. f(x,y)=x2+xy+2y2,Hf​=[21​14​].

多变量牛顿方向通过一个线性方程组计算:

H f ( x k ) d = − ∇ f ( x k ) , x k + 1 = x k + α k d . H_f(x_k)d=-\nabla f(x_k),\qquad x_{k+1}=x_k+\alpha_k d. Hf​(xk​)d=−∇f(xk​),xk+1​=xk​+αk​d.

工程实现通常直接求解线性方程组。Hessian 不定、接近奇异时,算法还需要正则化或其他方向修正。后面引入约束以后,仍会计算牛顿方向,但参与方程的量还会包含约束及其乘子。

3. 用变量代换处理等式约束

前面的计算只考虑目标函数,得到的点可能违反约束。要继续使用无约束优化方法,一种做法是先利用约束改写变量,让改写后的变量天然满足它。下面用一个等式约束说明这个过程:

min ⁡ x , y ( x − 2 ) 2 + y 2 , x + y = 1. \min_{x,y}(x-2)^2+y^2, \qquad x+y=1. x,ymin​(x−2)2+y2,x+y=1.

等式给出了 y = 1 − x y=1-x y=1−x。代入目标函数,得到只含一个变量的无约束问题:

min ⁡ x ( x − 2 ) 2 + ( 1 − x ) 2 . \min_x (x-2)^2+(1-x)^2. xmin​(x−2)2+(1−x)2.

它的导数是 4 x − 6 4x-6 4x−6,因此 x ∗ = 1.5 x^*=1.5 x∗=1.5, y ∗ = − 0.5 y^*=-0.5 y∗=−0.5。约束已经通过变量表达式得到满足。

这说明:当约束能够方便地消元时,我们可以直接减少决策变量。 大型问题中的非线性等式往往难以显式求解,消元也可能破坏矩阵稀疏结构,所以通用求解器还需要其他处理方法。

4. 用越界代价构造罚函数

消元利用了变量之间能够显式表达的关系。处理约束时,还可以保留原有变量,把违反约束的程度计入目标。回到贯穿全篇的问题:

min ⁡ x ( x − 2 ) 2 , x ≤ 1. \min_x (x-2)^2,\qquad x\leq1. xmin​(x−2)2,x≤1.

超出边界的程度可以写为 max ⁡ ( 0 , x − 1 ) \max(0,x-1) max(0,x−1)。给它增加平方惩罚,得到定义在整个实数轴上的无约束问题:

min ⁡ x F ρ ( x ) = ( x − 2 ) 2 + ρ   [ max ⁡ ( 0 , x − 1 ) ] 2 , ρ > 0. \min_x F_\rho(x)=(x-2)^2+\rho\,[\max(0,x-1)]^2, \qquad \rho>0. xmin​Fρ​(x)=(x−2)2+ρ[max(0,x−1)]2,ρ>0.

ρ \rho ρ 是罚系数。它越大,越界的代价越高。对本例,最优点位于 x > 1 x>1 x>1 这一段,令导数为零:

2 ( x − 2 ) + 2 ρ ( x − 1 ) = 0 , x ρ = 1 + 1 1 + ρ . 2(x-2)+2\rho(x-1)=0, \qquad x_\rho=1+\frac{1}{1+\rho}. 2(x−2)+2ρ(x−1)=0,xρ​=1+1+ρ1​.

罚系数 ρ \rho ρ最优点 x ρ x_\rho xρ​越界量 x ρ − 1 x_\rho-1 xρ​−1
11.5000000.500000
101.0909090.090909
1001.0099010.009901
10001.0009990.000999

当 ρ → ∞ \rho\rightarrow\infty ρ→∞ 时,解从边界外侧逐渐接近 1。有限的平方罚系数通常会保留约束误差;不同方向的曲率尺度也可能随罚系数增大而相差悬殊,增加数值求解难度。

本例中的罚函数允许解落在边界外侧,再通过增大罚系数缩小越界量。接下来考虑另一种构造:把求解范围放在边界内部,让目标函数在靠近边界时迅速增大。

5. 用对数障碍从可行域内部逼近最优点

我们希望变换后的问题在 x < 1 x<1 x<1 内有最优点,同时能够通过调整一个参数,让这个点逐渐接近原问题的解 x = 1 x=1 x=1。为此,先从“到边界还有多少距离”构造一个附加目标项。

5.1 边界余量与对数代价

对于 x < 1 x<1 x<1,到边界的余量为 1 − x > 0 1-x>0 1−x>0。对数函数有一个适合这里的性质:正数趋于零时,它的对数趋于负无穷。取负号后,就得到一个靠近边界时不断增大的代价。用正系数 μ \mu μ 调节它的影响,得到:

min ⁡ x < 1 F μ ( x ) = ( x − 2 ) 2 − μ log ⁡ ( 1 − x ) , μ > 0. \min_{x<1}F_\mu(x)=(x-2)^2-\mu\log(1-x), \qquad \mu>0. x<1min​Fμ​(x)=(x−2)2−μlog(1−x),μ>0.

当 x → 1 − x\rightarrow1^- x→1− 时, log ⁡ ( 1 − x ) → − ∞ \log(1-x)\rightarrow-\infty log(1−x)→−∞,因此障碍项趋于正无穷。这个性质使固定 μ \mu μ 下的最优点留在可行域内部。

μ \mu μ 叫作障碍参数。较大的 μ \mu μ 让边界附近的代价影响更强;较小的 μ \mu μ 让最优点能够更接近原问题的边界解。

“转成无约束”在这里有一个具体含义:我们把不等式写进了目标函数,同时保留了 x < 1 x<1 x<1 的开放定义域。算法仍要选择合法步长,确保对数可以计算。

5.2 障碍参数与最优点的位置

固定一个 μ \mu μ,就确定了一个新的目标函数,也确定了一个障碍子问题。我们可以求出它的最优点,再比较不同 μ \mu μ 下的位置。先对目标求一阶导数:

F μ ′ ( x ) = 2 ( x − 2 ) + μ 1 − x . F_\mu'(x)=2(x-2)+\frac{\mu}{1-x}. Fμ′​(x)=2(x−2)+1−xμ​.

令它等于零,并选取满足 x < 1 x<1 x<1 的根:

x μ = 3 − 1 + 2 μ 2 . x_\mu=\frac{3-\sqrt{1+2\mu}}{2}. xμ​=23−1+2μ ​​.

障碍参数 μ \mu μ最优点 x μ x_\mu xμ​边界余量 1 − x μ 1-x_\mu 1−xμ​
10.6339750.366025
0.10.9522770.047723
0.010.9950250.004975
0.0010.9995000.000500

当 μ ↓ 0 \mu\downarrow0 μ↓0 时,解从边界内侧接近 x ∗ = 1 x^*=1 x∗=1。把这些子问题的最优点连起来,就得到这个例子的中心路径。它描述不同 μ \mu μ 对应的理想子问题解;实际迭代中的点通常还带有求解误差,可以偏离这条路径。

在这里插入图片描述

5.3 减小 μ 后,解的位置与附近斜率的变化

第 5.2 节已经说明:减小 μ \mu μ,可以让障碍子问题的解更接近原问题的边界解。本节补充一个与数值求解有关的现象: μ \mu μ 减小后,在各自的最优点附近,斜率随位置变化得更快。

这个变化与下一步的求解直接相关。牛顿法需要根据当前位置的斜率,估计移动多远才能使斜率接近零。如果斜率随位置变化得很快,一小段位移就可能使它明显改变;计算位移时就需要计入这种变化速度。二阶导数正是描述这个变化速度的量。

先直接比较两个障碍子问题。它们都来自同一个原问题,边界都是 x = 1 x=1 x=1,区别只有 μ \mu μ 的取值。下面的数值使用第 5.2 节的解析解计算:

障碍参数 μ \mu μ子问题的最优点 x μ x_\mu xμ​到边界的距离最优点处的二阶导数
0.010.995025约 0.004975约 406
0.0010.999500约 0.000500约 4006

表中的两列变化分别说明了两件事:

  • 到边界的距离约缩小了 10 倍,子问题的解更接近原问题的解。
  • 二阶导数约增大了 10 倍。在各自最优点附近,发生足够小的相同位移时,后一个问题的斜率变化约为前一个的 10 倍。

这两个最优点处的一阶导数都等于零。表中的二阶导数描述的是离开该点后,斜率变化得有多快。本节使用“曲率”来指这一局部变化特征。

表中的二阶导数由下面的公式计算:

F μ ′ ′ ( x μ ) = 2 + μ ( 1 − x μ ) 2 . F_\mu''(x_\mu)=2+\frac{\mu}{(1-x_\mu)^2}. Fμ′′​(xμ​)=2+(1−xμ​)2μ​.

每一行都代入该行的 μ \mu μ 和最优点 x μ x_\mu xμ​。随着 μ \mu μ 减小,分子变小,最优点到边界距离的平方也变小;在本例中,分母减小得更快,所以这个比值增大。

接下来的第 5.4 节把二阶导数代入牛顿公式,计算一次实际位移;第 5.5 节再介绍多个障碍子问题之间的求解安排。

5.4 二阶导数与牛顿位移

前面计算了曲线在最优点附近的形状。求解过程中,这些二阶信息会参与确定每次迭代的位移。回到第 2 节的一维牛顿公式,在当前点 x k x_k xk​ 求出一阶导数和二阶导数后,计算:

d k = − F μ ′ ( x k ) F μ ′ ′ ( x k ) , x k + 1 = x k + α k d k . d_k=-\frac{F_\mu'(x_k)}{F_\mu''(x_k)}, \qquad x_{k+1}=x_k+\alpha_k d_k. dk​=−Fμ′′​(xk​)Fμ′​(xk​)​,xk+1​=xk​+αk​dk​.

d k d_k dk​ 是局部二次模型给出的建议位移, α k \alpha_k αk​ 是随后选择的步长系数。在本例中,二阶导数始终为正。一阶导数的符号决定向左还是向右移动,二阶导数参与确定建议位移的大小。在相同一阶导数下,较大的正二阶导数会给出较小的建议位移。

例如,固定 μ = 0.01 \mu=0.01 μ=0.01,取一个尚未到达最优点的当前位置 x k = 0.995 x_k=0.995 xk​=0.995:

F μ ′ ( x k ) = 2 ( 0.995 − 2 ) + 0.01 1 − 0.995 = − 0.01 , F μ ′ ′ ( x k ) = 2 + 0.01 ( 1 − 0.995 ) 2 = 402. \begin{aligned} F_\mu'(x_k) &=2(0.995-2)+\frac{0.01}{1-0.995}=-0.01,\\ F_\mu''(x_k) &=2+\frac{0.01}{(1-0.995)^2}=402. \end{aligned} Fμ′​(xk​)Fμ′′​(xk​)​=2(0.995−2)+1−0.9950.01​=−0.01,=2+(1−0.995)20.01​=402.​

牛顿公式把这两个数用于计算位移:

d k = − − 0.01 402 ≈ 0.00002488. d_k=-\frac{-0.01}{402}\approx0.00002488. dk​=−402−0.01​≈0.00002488.

若取 α k = 1 \alpha_k=1 αk​=1,新位置为 x k + 1 ≈ 0.99502488 x_{k+1}\approx0.99502488 xk+1​≈0.99502488,已经很接近第 5.2 节算出的最优点 x μ ≈ 0.99502475 x_\mu\approx0.99502475 xμ​≈0.99502475。实际求解器还会检查新位置的定义域和改进情况,再决定是否接受这个步长。

前面的解析解帮助我们分析最优点附近的曲率。实际牛顿迭代在当前点 x k x_k xk​ 计算导数,计算位移时无需预先知道 x μ x_\mu xμ​。多变量问题沿用同样的思路,用 Hessian 矩阵参与计算各变量的修正量。

5.5 逐步求解一系列障碍子问题

现在可以同时看到减小 μ \mu μ 的两个影响:子问题的解更接近原问题的边界解,解附近的曲率也变得更大。实际多变量问题中,靠近边界和远离边界的方向可能具有很不相同的曲率尺度,局部数值计算会更加困难。

一种求解安排是先选择一个正的 μ \mu μ,求出当前子问题的近似解,再减小 μ \mu μ,用前一次的结果作为新子问题的初值。这样可以利用已经找到的位置,逐渐接近原问题的解。具体何时更新 μ \mu μ、更新到多大,将在第 10 节讨论。

这里需要区分两个量: μ \mu μ 控制障碍子问题,步长 α k \alpha_k αk​ 控制一次迭代移动多远。 后面的 mu_strategy 管理前者。

6. 多个等式与不等式的统一写法

前面的例子只包含一条约束。实际模型通常包含多个变量、多个等式和多个不等式。把同类约束收集成向量,就可以沿用刚才的处理方法。一般约束优化写为:

min ⁡ x f ( x ) , h ( x ) = 0 , g ( x ) ≤ 0. \min_x f(x),\qquad h(x)=0,\qquad g(x)\leq0. xmin​f(x),h(x)=0,g(x)≤0.

h h h 收集等式约束, g g g 收集不等式约束,各分量分别对应一条约束。前面比较了三种组织求解的方式,它们各自对应一种改写思路:

处理方式变换结果需要注意的条件
消元把等式代入目标,减少变量需要易于构造的变量表达式
平方罚函数把约束误差加入目标有限罚系数通常保留误差
对数障碍把不等式写入目标,保留开放定义域等式仍需另外处理

用平方罚函数同时处理两类约束,可以得到无约束问题:

min ⁡ x f ( x ) + ρ ∑ j h j ( x ) 2 + ρ ∑ i [ max ⁡ ( 0 , g i ( x ) ) ] 2 . \min_x f(x)+\rho\sum_j h_j(x)^2 +\rho\sum_i[\max(0,g_i(x))]^2. xmin​f(x)+ρj∑​hj​(x)2+ρi∑​[max(0,gi​(x))]2.

每个等式用其误差 h j ( x ) h_j(x) hj​(x) 的平方计罚,每个不等式只对正的越界部分计罚。

一般的障碍问题是:

min ⁡ x f ( x ) − μ ∑ i log ⁡ [ − g i ( x ) ] , h ( x ) = 0 , g i ( x ) < 0. \min_x f(x)-\mu\sum_i\log[-g_i(x)], \qquad h(x)=0,\quad g_i(x)<0. xmin​f(x)−μi∑​log[−gi​(x)],h(x)=0,gi​(x)<0.

这个障碍问题仍然保留等式约束 h ( x ) = 0 h(x)=0 h(x)=0。IPOPT 采用的内点法会继续处理这些等式,并组织变量与乘子的联合更新。

接下来先明确求解希望达到的状态:怎样用方程描述“目标在约束允许的范围内已经达到局部最优”。第 7 节讨论这些条件,第 8 节再把条件与障碍子问题联系起来。

7. 约束最优点与拉格朗日乘子

前面介绍了处理约束的方法。接下来要明确算法希望找到怎样的位置:一个点既要满足约束,也要满足目标函数在这些约束下的最优性要求。本章仍用已知答案的一维例子,从目标与约束的作用出发,逐步写出这些要求。

本章会引入一个辅助未知量 λ \lambda λ。它用来表达目标梯度与约束梯度的关系,求解器会把它与变量 x x x 一起求出。原目标函数决定结果的好坏,原约束决定哪些结果可以接受; λ \lambda λ 参与描述解应满足的最优性条件。

7.1 边界最优点与非零目标导数

回到贯穿全篇的问题:

min ⁡ x f ( x ) = ( x − 2 ) 2 , g ( x ) = x − 1 ≤ 0. \min_x f(x)=(x-2)^2, \qquad g(x)=x-1\leq0. xmin​f(x)=(x−2)2,g(x)=x−1≤0.

目标函数希望 x x x 接近 2,约束要求 x ≤ 1 x\leq1 x≤1。因此,原问题的最优点是 x = 1 x=1 x=1。在这个点,目标导数为:

f ′ ( 1 ) = 2 ( 1 − 2 ) = − 2. f'(1)=2(1-2)=-2. f′(1)=2(1−2)=−2.

这个负导数说明,继续向右移动仍然可以降低目标值。但右侧的位置已经超出可行域;向左移动虽然可行,目标值又会增大。因此, x = 1 x=1 x=1 已经是约束下的最优点,目标导数仍然可以不为零。

第 2 节用 f ′ ( x ) = 0 f'(x)=0 f′(x)=0 描述无约束问题的内部最优点。这里需要扩展这个条件,把目标导数和约束排除的移动方向一并考虑。

7.2 用 λ 表达目标与约束的梯度关系

约束函数 g ( x ) = x − 1 g(x)=x-1 g(x)=x−1 的导数为 g ′ ( x ) = 1 g'(x)=1 g′(x)=1。它说明,向右移动会使 g g g 增大;在 g = 0 g=0 g=0 的边界上,这个方向会违反约束。

在最优点处,目标与约束的导数分别为 − 2 -2 −2 和 1 1 1。我们可以引入一个系数 λ \lambda λ,把它们的关系写成:

f ′ ( x ) + λ g ′ ( x ) = 0. f'(x)+\lambda g'(x)=0. f′(x)+λg′(x)=0.

这个系数称为拉格朗日乘子。代入 x = 1 x=1 x=1,得到:

− 2 + λ × 1 = 0 ⟹ λ = 2. -2+\lambda\times1=0 \quad\Longrightarrow\quad\lambda=2. −2+λ×1=0⟹λ=2.

这里的 λ = 2 \lambda=2 λ=2 表达了目标导数与约束导数在该点的平衡关系。这样,我们就能够描述一个“目标导数仍不为零,但移动已经受到约束限制”的最优点。后面会把这个关系称为梯度平衡条件。

求解时, λ \lambda λ 是与 x x x 一起确定的未知量。采用本讲义的 g ≤ 0 g\leq0 g≤0 写法,不等式乘子要求满足 λ ≥ 0 \lambda\geq0 λ≥0。如果暂时固定 x = 1 x=1 x=1,当前 λ = 1 \lambda=1 λ=1 就需要增大到 2;当前 λ = 3 \lambda=3 λ=3 就需要减小到 2。实际迭代会同时调整 x x x 和 λ \lambda λ。

因此, λ \lambda λ 可以随求解过程变化。它调整的是辅助方程中约束梯度的系数;原来的 f ( x ) f(x) f(x) 和 g ( x ) ≤ 0 g(x)\leq0 g(x)≤0 保持不变,最终结果仍需满足原约束。

7.3 KKT 条件:同时检查变量与乘子

梯度平衡只表达了导数之间的关系。候选点还需要位于可行域内,乘子也需要与约束是否到达边界相对应。

当一条不等式还留有严格余量时,足够小的局部移动仍能满足它,它暂时没有限制局部方向。到达边界后,这条约束才可能参与限制进一步改善目标的方向。互补条件把这一区别写成乘子与约束值的关系。把这些要求合在一起,就得到本例的 KKT 条件:

2 ( x − 2 ) + λ = 0 , x − 1 ≤ 0 , λ ≥ 0 , λ ( x − 1 ) = 0. \begin{aligned} 2(x-2)+\lambda&=0,\\ x-1&\leq0,\\ \lambda&\geq0,\\ \lambda(x-1)&=0. \end{aligned} 2(x−2)+λx−1λλ(x−1)​=0,≤0,≥0,=0.​

前两行分别要求梯度平衡和约束可行,第三行规定不等式乘子的符号。第四行称为互补条件,需要分两种情况理解:

约束状态互补条件对 λ 的要求
g ( x ) < 0 g(x)<0 g(x)<0,还留有余量 g ( x ) g(x) g(x) 不为零,因此必须有 λ = 0 \lambda=0 λ=0
g ( x ) = 0 g(x)=0 g(x)=0,恰好位于边界 λ × 0 = 0 \lambda\times0=0 λ×0=0 自动成立, λ \lambda λ 可以为零或正数,具体值还要满足梯度平衡

这里用到的只是乘积为零的规则:至少一个因子为零。因为 g ≤ 0 g\leq0 g≤0 包含 g = 0 g=0 g=0,所以互补条件允许边界上的乘子为正。

可以用一个具体的候选点看清互补条件的作用。取 x = 0.8 x=0.8 x=0.8,此时 g ( x ) = − 0.2 g(x)=-0.2 g(x)=−0.2,到边界还剩 0.2 0.2 0.2 的余量。如果给这条约束配上乘子 λ = 2.4 \lambda=2.4 λ=2.4,梯度平衡式恰好成立:

f ′ ( 0.8 ) + λ g ′ ( 0.8 ) = − 2.4 + 2.4 × 1 = 0. f'(0.8)+\lambda g'(0.8) =-2.4+2.4\times1=0. f′(0.8)+λg′(0.8)=−2.4+2.4×1=0.

虽然梯度平衡式为零, x = 0.8 x=0.8 x=0.8 仍然可以改善。 向右移动到 x = 0.9 x=0.9 x=0.9,仍满足 x ≤ 1 x\leq1 x≤1,目标值也从 f ( 0.8 ) = 1.44 f(0.8)=1.44 f(0.8)=1.44 降到了 f ( 0.9 ) = 1.21 f(0.9)=1.21 f(0.9)=1.21。这条约束还有余量,尚未阻止这次改善目标的移动。

互补条件会排除 x = 0.8 , λ = 2.4 x=0.8,\lambda=2.4 x=0.8,λ=2.4 这组取值,因为:

λ g ( x ) = 2.4 × ( − 0.2 ) = − 0.48 ≠ 0. \lambda g(x)=2.4\times(-0.2)=-0.48\ne0. λg(x)=2.4×(−0.2)=−0.48=0.

在原问题的 KKT 条件中, g ( 0.8 ) < 0 g(0.8)<0 g(0.8)<0 要求对应的乘子为零。代入 λ = 0 \lambda=0 λ=0 后,梯度平衡式的左边等于 − 2.4 -2.4 −2.4,就能看出当前位置还没有满足最优性条件。这个例子说明,需要同时检查梯度平衡和互补条件,才能排除这种仍有改善空间的候选点。

现在用这些条件求解本例:

  • 若 x < 1 x<1 x<1,互补条件给出 λ = 0 \lambda=0 λ=0。梯度平衡随之要求 2 ( x − 2 ) = 0 2(x-2)=0 2(x−2)=0,即 x = 2 x=2 x=2,与 x < 1 x<1 x<1 矛盾。这一区域没有满足全部 KKT 条件的点。
  • 若 x = 1 x=1 x=1,互补条件成立,梯度平衡给出 λ = 2 \lambda=2 λ=2。这一组取值满足全部条件。

因此,本例得到 x = 1 x=1 x=1、 λ = 2 \lambda=2 λ=2。也可以直接验证它的最优性:对任意可行的 x ≤ 1 x\leq1 x≤1,都有 ( x − 2 ) 2 ≥ 1 = f ( 1 ) (x-2)^2\geq1=f(1) (x−2)2≥1=f(1)。

7.4 拉格朗日函数把梯度关系组织在一起

前面写出的梯度平衡式包含 f f f 和 g g g 的导数。把这两个函数按相同的系数组合起来,定义拉格朗日函数:

L ( x , λ ) = f ( x ) + λ g ( x ) . L(x,\lambda)=f(x)+\lambda g(x). L(x,λ)=f(x)+λg(x).

对 x x x 求偏导,正好得到:

∂ L ∂ x = f ′ ( x ) + λ g ′ ( x ) . \frac{\partial L}{\partial x} =f'(x)+\lambda g'(x). ∂x∂L​=f′(x)+λg′(x).

于是,梯度平衡可以简写为 ∂ L / ∂ x = 0 \partial L/\partial x=0 ∂L/∂x=0。引入 L L L,就能把目标与约束的导数组织到同一个表达式里,便于后续求导和计算迭代方向。

这个写法容易引出一个误解:把 x x x 和 λ \lambda λ 都当成用来不断降低 L L L 的变量。我们用具体数值检查这种做法。固定 x = 0 x=0 x=0 时, f ( 0 ) = 4 f(0)=4 f(0)=4、 g ( 0 ) = − 1 g(0)=-1 g(0)=−1,所以:

L ( 0 , λ ) = 4 − λ . L(0,\lambda)=4-\lambda. L(0,λ)=4−λ.

只要增大 λ \lambda λ, L L L 就会一直下降,甚至趋于负无穷。然而 x x x 没有改变,原始目标仍然等于 4。

KKT 条件会排除这组取值。固定 x = 0 x=0 x=0 时,互补条件要求 − λ = 0 -\lambda=0 −λ=0,所以 λ \lambda λ 只能取 0;再检查梯度平衡,却得到 − 4 + 0 ≠ 0 -4+0\ne0 −4+0=0。这说明固定在 x = 0 x=0 x=0,无论怎样调整乘子都无法同时满足 KKT 条件,变量 x x x 也需要改变。

在满足 KKT 条件的点上,互补条件使 λ g ( x ) = 0 \lambda g(x)=0 λg(x)=0,于是 L ( x , λ ) = f ( x ) L(x,\lambda)=f(x) L(x,λ)=f(x)。求解时要共同检查可行性、梯度平衡和互补条件,仅观察 L L L 的数值下降无法判断是否得到原问题的解。

7.5 多个变量与多条约束的统一写法

前面的例子只有一个变量和一条不等式。推广到第 6 节的一般问题时, x x x 收集所有变量, h ( x ) h(x) h(x) 收集等式约束, g ( x ) g(x) g(x) 收集不等式约束:

min ⁡ x f ( x ) , h ( x ) = 0 , g ( x ) ≤ 0. \min_x f(x),\qquad h(x)=0,\qquad g(x)\leq0. xmin​f(x),h(x)=0,g(x)≤0.

本讲义把原始等式 h j ( x ) = 0 h_j(x)=0 hj​(x)=0 的乘子记为 ν j \nu_j νj​,把原始不等式 g i ( x ) ≤ 0 g_i(x)\leq0 gi​(x)≤0 的乘子记为 λ i \lambda_i λi​。这些字母用于区分约束的来源。等式本身不给乘子施加符号限制;采用这里的 g i ≤ 0 g_i\leq0 gi​≤0 写法,不等式乘子要求非负。把各条约束的贡献相加,得到:

L ( x , ν , λ ) = f ( x ) + ν T h ( x ) + λ T g ( x ) . L(x,\nu,\lambda)=f(x)+\nu^Th(x)+\lambda^Tg(x). L(x,ν,λ)=f(x)+νTh(x)+λTg(x).

在适当的光滑性和约束正则条件下,局部最优点满足以下 KKT 条件:

∇ x L ( x , ν , λ ) = 0 , h ( x ) = 0 , g ( x ) ≤ 0 , λ ≥ 0 , λ i g i ( x ) = 0 for every  i . \begin{aligned} \nabla_x L(x,\nu,\lambda)&=0,\\ h(x)&=0,\qquad g(x)\leq0,\\ \lambda&\geq0,\\ \lambda_i g_i(x)&=0\quad\text{for every }i. \end{aligned} ∇x​L(x,ν,λ)h(x)λλi​gi​(x)​=0,=0,g(x)≤0,≥0,=0for every i.​

它们仍然分别表达梯度平衡、约束可行性、乘子符号和互补关系。满足这些条件时,等式项和各个互补项都为零,所以仍有 L = f L=f L=f。

本章的一维例子可以通过 KKT 条件和直接代入确定全局最优解。对于一般非凸问题,满足 KKT 条件的点还可能是局部极大点或鞍点,需要结合二阶信息等进一步判断最优性。

7.6 原始变量、对偶变量与手工权重

到这里,我们已经引入两类未知量。 x x x 表示原模型要寻找的结果,称为原始变量; λ , ν \lambda,\nu λ,ν 分别对应不等式和等式的拉格朗日乘子,在这里也称为对偶变量。后面出现“乘子”和“对偶变量”时,指的是同一类量。

“对偶”这个名称来自数学对偶理论:乘子可以作为另一个优化问题的变量,用于研究原问题最优值的界。IPOPT 的原始—对偶方法通过同一组最优性方程联合更新 x x x 与乘子;使用者通常只需提供原模型、初值和求解选项。

乘子还可以帮助理解约束对最优结果的影响。仍看一维例子,把边界暂时写为 x ≤ b x\leq b x≤b。当 b b b 在 1 附近时,最优点为 x = b x=b x=b,最优目标值随边界变化为:

V ( b ) = ( b − 2 ) 2 , V ′ ( 1 ) = − 2 = − λ ∗ . V(b)=(b-2)^2,\qquad V'(1)=-2=-\lambda^*. V(b)=(b−2)2,V′(1)=−2=−λ∗.

如果把边界从 1 放宽到 1.01,最优目标值由 1 降到 0.9801 0.9801 0.9801,降低约 0.02 0.02 0.02,与 λ ∗ × 0.01 = 0.02 \lambda^*\times0.01=0.02 λ∗×0.01=0.02 相符。本例的乘子因此同时表达了梯度平衡,以及最优目标值对边界小幅变化的敏感程度。

在建模时,手工权重决定目标函数怎样评价结果;乘子则由求解过程结合约束条件求出。例如,改变目标中某个误差项的权重,会改变 f f f;更新 λ \lambda λ 会改变最优性方程中约束梯度的系数,原来的 f f f 和约束要求保持不变。

7.7 从最优性条件进入数值求解

本章说明了变量与乘子在候选最优点应满足的关系。 x x x 描述实际的解, λ \lambda λ 和 ν \nu ν 描述各约束梯度如何参与平衡。求解器需要把这些未知量一起确定下来。

第 7 章给出求解希望达到的条件,第 8 章开始介绍逼近这些条件的计算形式。 在迭代中,当前位置和乘子通常还不能同时满足全部条件。后面的算法需要计算这些条件的误差,据此求出修正方向,并检查更新后的结果。

接下来,第 8 章会把 KKT 条件与第 5 节的障碍参数 μ \mu μ 连接起来:先建立固定 μ \mu μ 时的变量与乘子方程,再为后续的迭代计算和 μ \mu μ 更新作准备。

下一章内容:
【机器人感知运控笔记四】理解 IPOPT:原始—对偶内点法与二阶信息

如果感兴趣,欢迎留言讨论。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐