• 拉格朗日乘子法和 KKT 条件


    在求解最优化问题中,拉格朗日乘子法KKT 条件是两种最常用的方法。在有等式约束时使用拉格朗日乘子法,在有不等约束时使用 KKT 条件。

    1 无约束条件

       这是最简单的情况,解决方法通常是函数对变量求导,令求导函数等于 $0$ 的点可能是极值点。将结果带回原函数进行验证即可。

    2 等式约束条件(拉格朗日条件)

       考虑约束最优化问题:

    $$min ; f(x) \
    s.t. ;;; g_{i}(x) = 0 ;;; i = 1,2,cdots, k$$

       问题有 $k$ 个等式约束,$x$ 是一个 $n$ 维的向量,即 $x = (x^{(1)}, x^{(2)}, cdots, x^{(n)})^{T}$

       如果我们想绘制函数 $f(x)$ 和 $g_{i}(x)$,那需要在 $n + 1$ 维空间,而绘制 $f(x) = C_{1}$ 和 $g_{i}(x) = C_{2}$ 需要在 $n$ 维空间。

       1)关于等高(值)线

          那么降一个维度后,图像 $f(x) = C_{1}$ 和 $g_{i}(x) = C_{2}$ 代表什么呢?

             a. $f(x) = C_{1}$ 表示函数 $f(x)$ 的等高线,$C_{1}$ 可以取任意值,$n$ 维空间中的任意一个点都会有一条与之对应的等高线,在这条线上,函数值相同。

             b. $g_{i}(x) = C_{2}$ 表示函数 $g_{i}(x)$ 的等高线,因为约束条件 $g_{i}(x) = 0$($C_{2} = 0$),所以每个约束函数只对应一条等高线。

          在 $n$ 维空间中,设所有约束函数的等高线相交的图像为 $M$,我们的目标是在 $M$ 上找到函数 $f(x)$ 的局部极值

          注意:$M$ 上的任意一个点肯定都会对应一条 $f(x)$ 的等高线,推广到高维,这个等高线就是代表一个线性空间。

       2)梯度向量和等值线的关系

          理解了等高线(等值线),还需要知道某点的梯度方向和过这一点的等高线的关系。

          多元函数中的方向导数指的是 $xoy$ 平面上的一个矢量,梯度方向代表所有方向中函数值增长最快的方向,我们知道等高线上所有点的函数值

          都是相等的,所以某点的梯度方向必然不会是与等高线相切,那应该怎么移动呢?

          先给出结论:梯度方向与等高线的切线方向垂直。

            

          证明:

              对于任意一条等高线 $f(x,y) = C$,其上任意一点的切线斜率为:

    $$k = -frac{f_{x}^{'}}{f_{y}^{'}}$$

              所以该点的法线斜率为:

    $$k^{'} = -frac{1}{k} = frac{f_{y}^{'}}{f_{x}^{'}}$$

              又该点的梯度向量为:

    $$(frac{partial f}{partial x}, frac{partial f}{partial y})$$

              梯度向量的斜率和法线向量的斜率是一样的,所以梯度方向和法线方向是一样的。

          证毕

       3)关于可行域

          所有不等式约束和等式约束会有一个交集,交集可以是一个点,一个曲面或一个高维的线性空间,将这个交集称为可行域

          可行域内的点才满足约束条件,所以必须在可行域内考虑问题。

          现在假设有 $k$ 个约束条件:$g_{1}(x),g_{2}(x),cdots,g_{k}(x)$,它们的可行域为 $S$,在 $S$ 上取一点 $(x,y)$,那么各约束条件在该

          点处的梯度 $ abla g_{1}(x), abla g_{2}(x),cdots, abla g_{k}(x)$ 和可行域方向有什么联系呢?

          高维空间想象不出来,我们先考虑二维和三维(即约束条件是一元或二元函数),然后进行推广。

          a. 当 $k = 1$ 时,那么约束条件本身就是可行域,在曲面或曲线上任一点的任意切线方向(即可行域方向)与该点的梯度必然相互垂直。

          b. 当 $k = 2$ 时,且约束条件是 $2$ 个曲面,那么可行域就是它们的交线,交线上任意一点处的切线是两个约束曲面 $g_{1}(x),g_{2}(x)$在该点

             处切平面的交线,而梯度 $ abla g_{1}(x), abla g_{2}(x)$ 是各自切平面的法线,所以可行域方向会垂直于 $ abla g_{1}(x), abla g_{2}(x)$。

          所以:可行方向的全体是 $ abla g_{1}(x), abla g_{2}(x),cdots, abla g_{k}(x)$ 张成的线性子空间的正交子空间

       4)可行域内某点为极值的条件

          我们先考虑二维和三维(即约束条件是一元或二元函数),然后进行推广。

          a. 首先来看一个例子:

    $$max/min ; f(x,y) = x^{2} + y^{2}\
    s.t. ; x^{2}y = 3 $$

                       

             如上图所示,蓝线是约束,点只能在上面移动,红线是目标函数的等高线,有无数条。蓝线和红线一共就两种情况:

             i:蓝线与红线相交

                如图中 $C$ 点,这样的点会成为极值点吗?

                因为是相交的,那么蓝线上的点便可以穿过红线,此时不妨假设目标函数 $f(x)$ 在点 $C$ 处的梯度向量朝外,如图中 $ abla f$。

                那么在这个相交点 $C$ 的邻域内,$C$ 点若移动到 $C_{1}$ 处,此时函数值便会增加,若向下移动到 $C_{2}$ 处,此时函数值

                就会减少,所以 $C$ 点或者任一相交点不满足极值的条件,在相交点处,均可再继续移动来使函数值增大或者减小。

             ii:蓝线与红线相切

                如图中 $A,B$ 两点,这样的点会成为极值点吗?

                在 $A$ 点的邻域内,$A$ 点到蓝线(邻域内)上的任意一点的方向必然与梯度向量的夹角均为锐角或钝角,对 $B$ 点也是如此,所以

                在 $A$ 点或 $B$ 点处再移动点,只能导致函数值超一个方向变动,即只增大或只减少。

                所以 $A$ 点和 $B$ 点都是约束条件下的极值点。

         b. 下面再来看一个例子,如下图

                             

            i:曲线 $L$ 和 $f(x)$ 的等高面相交

               如上右图所示,和上面的分析类似,在 $O$ 点的邻域内,红线上的点可以继续向上或向下移动,向上移动则函数值继续增加(因为梯度方向

               和切线方向夹角为锐角),向下移动则函数值会减少,所以交点不会是极值点。

            ii:曲线 $L$ 和 $f(x)$ 的等高面相切

               此处不再赘述,切点是极值点。

         综上分析得:只有可行域和目标函数等高线相切的点才会是极值点,即可行域方向和目标函数的梯度方向互相垂直的点才会是极值点,

                     也可以说,某点的 $ abla f(x)$ 必须落在对应的 $ abla g_{1}(x), abla g_{2}(x),cdots, abla g_{k}(x)$ 张成的线性子空间中(线性表示),该点才会成为极值点。

         为求解极值点,可列方程:

    $$left{egin{matrix}
    abla f = lambda_{1} abla g_{1} + lambda_{2} abla g_{2} + cdots + lambda_{k} abla g_{k} \
    g_{i} = C_{i}, ;;; i = 1,2,cdots,k
    end{matrix} ight.$$

         这样约束问题就变成了一个无约束问题,即下面两个问题是等价的:

    $$left{egin{matrix}
    min_{x} ; f(x) \
    s.t. ;;; g_{i}(x) = 0 ;;; i = 1,2,cdots, k
    end{matrix} ight.
    ; Leftrightarrow ;
    min_{x,lambda}L(x,lambda) = f(x) + sum_{i=1}^{k}lambda_{i}g_{i}(x)$$

    3 不等式约束条件(KKT条件)

       考虑约束最优化问题:

    $$min ; f(x) \
    s.t. ;;; g_{i}(x) leq 0, ;;; i = 1,2,cdots,k \
    c_{j}(x) = 0, ;;; j = 1,2,cdots, l $$

       问题有 $k$ 个等式约束和 $l$ 个不等式约束,$x$ 是一个 $n$ 维的向量,即 $x = (x^{(1)}, x^{(2)}, cdots, x^{(n)})^{T}$。

       上面的问题比较复杂,现在考虑简单一点的情形,即只有一个不等式约束:

    $$min ; f(x) \
    s.t. ;;; g(x) leq 0 $$

       拉格朗日函数:

    $$L(x,lambda) = f(x) + lambda g(x),lambda geq 0$$

       那么就只有如下两种情形:

          

       1)$f(x)$ 在约束条件下的极值点本身就在可行域里面(如上左图)

          如果不是相切,那么对任意一个在可行域中的点,如果在它附近往里走或者往外走,$f(x)$ 一般都会变大或者变小,所以绝大部分点都不会是极值点。

          除非这个点在可行域内部,且本身就是 $f(x)$ 的极值点。这样的话,不等式约束就失效了,直接求 $f(x)$ 的极小值点即可。求解方程为:

    $$left{egin{matrix}
    abla f = 0\
    g(x) < 0 \
    lambda = 0
    end{matrix} ight.$$

       2)$f(x)$ 在约束条件下的极值点还是在 $g(x) = 0$ 边界曲线上(如上右图)

          对于这种情况,不等式约束就变成等式约束了,这时就可以使用 $2$ 中介绍的方法,所求解的方程为:

    $$left{egin{matrix}
    abla f + lambda g = 0\
    g(x) = 0 \
    lambda geq 0
    end{matrix} ight.$$

          下面解释下为什么 $lambda geq 0$。

          图中阴影部分是可行域,边界上的点 $x^{*}$ 为最终所求的极值点,讨论如下两个梯度方向:

          a. 约束函数 $g(x)$ 在点 $x_{*}$ 处的梯度方向:因为阴影部分 $g(x) < 0$,那个方向的函数值更小,所以 $g(x)$ 的梯度是指向大于 0 的一侧,

             也就是不是可行域的一侧。

          b. 目标函数 $f(x)$ 在点 $x_{*}$ 处的梯度方向:因为已经假定极值点发生在边界曲线上,且所求的问题是极小值,如果 $ abla f$ 指向非阴影区域,

             那么意味着梯度反方向指向可行域,那显然还可以继续往可行域移动找到函数值更小的点,所以 $f(x)$ 的梯度指向可行域的一侧。

          因为极值点处 $ abla f$ 和 $ abla g$ 梯度方向相反,所以必须 $lambda leq 0$(可以为 $0$,意味着该点就是 $f(x)$ 的极小值点)。

          综上可得求解方程组:

    $$left{egin{matrix}
    abla f + lambda g = 0\
    g(x) leq 0 \
    lambda geq 0 \
    lambda g(x) = 0
    end{matrix} ight.$$

          这个方程组就是该问题的 KKT 条件,只有满足这些条件才会存在极小值。

          回到最初的问题,它的 KKT 条件为:

    $$left{egin{matrix}
    min_{x} ; f(x) \
    s.t. ;; g_{i}(x) leq 0, ;;; i = 1,2,cdots,k \
    c_{j}(x) = 0, ;;; j = 1,2,cdots, l
    end{matrix} ight.  ; Leftrightarrow ;
    left{egin{matrix}
    abla f + sum_{i=1}^{k}lambda_{i} abla g_{i} + sum_{j=1}^{l}mu_{j} abla c_{j}= 0 \
    g_{i}(x) leq 0, ; i = 1,2,cdots,k \
    c_{j}(x) = 0, ; j = 1,2,cdots,l \
    lambda_{i} geq 0, ; i = 1,2,cdots,k \
    lambda_{i} g_{i}(x) = 0, ; i = 1,2,cdots,k
    end{matrix} ight.$$

  • 相关阅读:
    oracle数据库查看修改字符集问题
    C/C++内存问题检查利器—Purify (五)
    C/C++内存问题检查利器—Purify (四)
    C/C++内存问题检查利器—Purify (三)
    Oracle 字符集的查看和修改
    C/C++内存问题检查利器—Purify (二)
    linux内存管理之活动内存区
    C/C++内存问题检查利器—Purify (一)
    postman——基础操作——API请求与响应——API响应
    postman——基础操作——History选项卡
  • 原文地址:https://www.cnblogs.com/yanghh/p/13739024.html
Copyright © 2020-2023  润新知