【机器人感知运控笔记三】约束优化基础:从简单问题到拉格朗日乘子与 KKT 条件
本文主要针对了解数值优化、但主要集中在调库,不理解算法原理的读者。(比如日常工作是定义一个带约束的优化问题进行求解,求解过程则全部交给优化器。)
本系列讲解了等式/不等式约束、罚函数、对数障碍,拉格朗日乘子法,约束最优性方程,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} qmins.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,…,qNmins.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} Fmins.t.21i=1∑r∥fi∥2AF=w,fiz≥0,i=1,…,r,fix2+fiy2≤ηifiz,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. xminf(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−αkf′(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+21f′′(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=[2114].
多变量牛顿方向通过一个线性方程组计算:
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+αkd.
工程实现通常直接求解线性方程组。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. xminFρ(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 |
|---|---|---|
| 1 | 1.500000 | 0.500000 |
| 10 | 1.090909 | 0.090909 |
| 100 | 1.009901 | 0.009901 |
| 1000 | 1.000999 | 0.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<1minFμ(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μ |
|---|---|---|
| 1 | 0.633975 | 0.366025 |
| 0.1 | 0.952277 | 0.047723 |
| 0.01 | 0.995025 | 0.004975 |
| 0.001 | 0.999500 | 0.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.01 | 0.995025 | 约 0.004975 | 约 406 |
| 0.001 | 0.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+αkdk.
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. xminf(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. xminf(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. xminf(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. xminf(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. xminf(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} ∇xL(x,ν,λ)h(x)λλigi(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:原始—对偶内点法与二阶信息
如果感兴趣,欢迎留言讨论。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)