深入浅出最优化(8) 拉格朗日乘子法

1 拉格朗日乘子法的数学背景

当使用前面介绍的罚函数法求解约束问题时,为获得足够好的近似解,罚参数需取足够大的值,这将导致增广目标函数的黑森矩阵出现病态,从而导致数值计算上的困难。因此提出拉格朗日乘子法。

学高数的时候我们就学过等式约束条件下的拉格朗日乘子法。延续前一节中对约束最优化问题的定义,则拉格朗日函数L(x,\mu)=f(x)-\displaystyle\sum_{j\in E}\mu_jh_j(x)。局部最优解的条件是对x求梯度及对所有\mu求导均为0

下面来讨论不等式和等式同时约束条件下的拉格朗日乘子法。拉格朗日函数L(x,\mu)=f(x)-\displaystyle\sum_{i\in I}\lambda_ig_i(x)-\displaystyle\sum_{j\in E}\mu_jh_j(x)。对\lambda的情况需要讨论:

  1. 最优解在D内部时,g(x^*)>0,约束条件无效,有\lambda^*_i=0,i\in I
  2. 最优解在D边界上时,g(x^*)=0,约束条件有效。此时对x求梯度设为0,有\nabla f(x^*)=\displaystyle\sum_{i\in I}\lambda_i^*\nabla g_i(x^*)+\sum_{j\in E}\mu^*_j\nabla h_i(x^*),\nabla f(x^*)指向D内部(因为边界处是最优解),\nabla g_i(x^*)也指向D内部(因为边界处为0,D内大于0),所以\lambda^*_i>0,i\in I

可见,无论最优解在何处,都有\lambda_i^*g_i(x^*)=0,i\in I,这个条件被称为互补松弛条件

因此针对不等式和等式同时约束条件下的拉格朗日乘子法,局部最优解的条件可以用如下的KKT条件表示:

\begin{cases}\nabla_xL(x^*,\lambda^*,\mu^*)=\nabla f(x^*)-\displaystyle\sum_{i\in I}\lambda_i^*\nabla g_i(x^*)-\sum_{j\in E}\mu_j^*\nabla h_j(x^*)=0\\h_j(x^*)=0,j\in E\\g_i(x^*)\geq0,\lambda_i^*\geq0,\lambda_i^*g_i(x^*)=0,i\in I\end{cases}

满足KKT条件的点被称为KKT点

2 拉格朗日乘子法的构成

2.1 等式约束问题的乘子法

将外点罚函数法的思想引入拉格朗日函数的最优化问题。设S(x)=\displaystyle\sum_{i\in E}h_i^2(x),构造辅助函数L_\mu(x,\lambda)=L(x,\lambda)+\frac{1}{2}\mu S(x)=f(x)-\displaystyle\sum_{i\in E}\lambda_ih_i(x)+\frac{1}{2}\mu\sum_{i\in E}h_i^2(x)

求驻点,令\nabla_xL_\mu(x,\lambda)=\nabla f(x)-\displaystyle\sum_{i\in E}\lambda_i\nabla h_i(x)+\mu\sum_{i\in E}h_i(x)\nabla h_i(x)=0

根据KKT条件有\nabla f(x^*)-\displaystyle\sum_{i\in E}\lambda_i^*\nabla h_i(x^*)=0

\nabla_xL_{\mu_k}(x_k,\lambda_k)=\nabla f(x_k)-\displaystyle\sum_{i\in E}\lambda_i^{(k)}\nabla h_i(x_k)+\mu_k\sum_{i\in E}h_i(x_k)\nabla h_i(x_k)=0

\nabla f(x_k)-\displaystyle\sum_{i\in E}[\lambda_i^{(k)}-\mu_kh_i(x_k)]\nabla h_i(x_k)=0

  • 为了使得\lambda收敛向\lambda^*,有\lambda_i^{(k+1)}=\lambda_i^{(k)}-\mu_k h_i(x_k),i\in E
  • 为了使得h_j(x)→0,j\in E,每一步增加罚因子\mu_{k+1}=\sigma\mu_k\sigma为放大系数)

由此得到等式约束问题乘子法的步骤:

  1. 选定初始点x_0\in R^n,初始乘子估计\lambda_1,初始罚因子\mu_1>0,常数\sigma>1\beta\in(0,1),精度\epsilon>0,置k=1
  2. 构造增广目标函数L_{\mu_k}(x,\lambda_k)=L(x,\lambda_k)+\frac{1}{2}\mu_kS(x)
  3. x_{k-1}为初始点求解无约束问题minL_{\mu_{k}}(x,\lambda_k),其解为x_{k}
  4. S(x_k)^{\frac{1}{2}}\leq\epsilon,则得解x_k,停止迭代
  5. \frac{S(x_k)^{\frac{1}{2}}}{S(x_{k-1})^{\frac{1}{2}}}\leq\beta成立,则令\mu_{k+1}=\mu_k,否则\mu_{k+1}=\sigma\mu_k
  6. \lambda_i^{(k+1)}=\lambda_i^{(k)}-\mu_kh_i(x_k),i\in E,令k=k+1,转步2

2.2 一般约束问题的乘子法

引入松弛变量z将不等式问题化为等价的等式约束问题:g_i(x)\geq 0,i\in I\Rightarrow g_i(x)-z_i^2=0,i\in I

构造增广拉格朗日函数:\overline{L_\mu}(x,z,\lambda)=f(x)-\displaystyle\sum_{i\in I}\lambda_i[g_i(x)-z_i^2]+\frac{\mu}{2}\sum_{i\in I}[g_i(x)-z_i^2]^2

配方后可得:\overline{L_\mu}(x,z,\lambda)=f(x)-\displaystyle\sum_{i\in I}\{\frac{\mu}{2}[z_i^2-\frac{1}{\mu}(\mu g_i(x)-\lambda_i)]^2-\frac{\lambda^2_i}{2\mu}\}

将该式对z_i求偏导,令偏导为0,有2z_i\{\lambda_i-\mu[g_i(x)-z_i^2]\}=0

因此z_i^2=\frac{1}{\mu}max\{0,\mu g_i(x)-\lambda_i\},代入消去z得L_\mu(x,\lambda)=f(x)+\frac{1}{2\mu}\displaystyle\sum_{i\in I}(max^2\{0,\lambda_i-\mu g_i(x)\}-\lambda_i^2)

\nabla_xL(x,\lambda)=\nabla f(x)-\displaystyle\sum_{i\in I}(max\{0,\lambda_i-\mu g_i(x)\})\nabla g_i(x)

根据KKT条件有\nabla f(x^*)-\displaystyle\sum_{i\in E}\lambda_i^*\nabla g_i(x^*)=0

为了使得\lambda收敛向\lambda^*,根据KKT条件,有\lambda_i^{(k+1)}=max\{\lambda_i^{(k)}-\mu g_i(x_k),0\},i\in E

可以得到一般约束条件下的增广目标函数和\lambda的递推公式:

L_\mu(x,\lambda)=f(x)+\frac{1}{2\mu}\displaystyle\sum_{i\in I}(max^2\{0,\lambda_i-\mu g_i(x)\}-\lambda_i^2)-\displaystyle\sum_{j\in E}\lambda_jh_j(x)+\frac{1}{2}\mu\sum_{j\in E}h_j^2(x)

\begin{cases}\lambda_i^{(k+1)}=max\{\lambda_i^{(k)}-\mu g_i(x_k),0\},i\in I\\\lambda_j^{(k+1)}=\lambda_j^{(k)}-\mu h_j(x_k),j\in E\end{cases}

由此得到一般约束问题乘子法的步骤:

  1. 选定初始点x_0\in R^n,初始乘子估计\lambda_1,初始罚因子\mu_1>0,常数\sigma>1\beta\in(0,1),精度\epsilon>0,置k=1
  2. 构造增广目标函数
  3. x_{k-1}为初始点求解无约束问题minL_{\mu_{k}}(x,\lambda_k),其解为x_{k}
  4. (\displaystyle\sum_{j\in E}h_j^2(x_k))^{\frac{1}{2}}+(\displaystyle\sum_{i\in I}min^2\{g_i(x_k),0\})^{\frac{1}{2}}\leq\epsilon,则得解x_k,停止迭代
  5. \frac{(\displaystyle\sum_{j\in E}h_j^2(x_k))^{\frac{1}{2}}+(\displaystyle\sum_{i\in I}min^2\{g_i(x_k),0\})^{\frac{1}{2}}}{(\displaystyle\sum_{j\in E}h_j^2(x_{k-1}))^{\frac{1}{2}}+(\displaystyle\sum_{i\in I}min^2\{g_i(x_{k-1}),0\})^{\frac{1}{2}}}\leq\beta成立,则令\mu_{k+1}=\mu_k,否则\mu_{k+1}=\sigma\mu_k
  6. 计算\lambda^{(k+1)},令k=k+1,转步2

3 实战测试

对于上节深入浅出最优化(7) 罚函数法中提出的约束最优化问题,x_1,x_2,x_3的初值均在[0,4]的范围内随机生成,总共生成100组起点。统计迭代成功(在1000步内得到最优解且单次步长搜索迭代次数不超过1000次)的样本的平均迭代步数、平均迭代时间和得到的最优解及开销函数最小值。

迭代步数 迭代时间 最优解 函数最小值
17 24.3729s x_1=1.1051~x_2=1.1969~x_3=1.5352 0.03257

代码实现

本博客所有代码在https://github.com/HarmoniaLeo/optimization-in-a-nutshell开源,如果帮助到你,请点个star,谢谢这对我真的很重要!

你可以在上面的GitHub链接或本文集的第一篇文章深入浅出最优化(1) 最优化问题概念与基本知识中找到Function.py和lagb.py

使用共轭梯度PRP+法的拉格朗日乘子法

import numpy as np
from Function import Function   #定义法求导工具
from lagb import *  #线性代数工具库
from scipy import linalg

n=3 #x的长度
mu=2
lj=np.ones(1)   #λj初值,长度等于等式限制条件个数
li=np.ones(2)   #λi初值,长度等于不等式限制条件个数

def func(x):    #目标函数,x是一个包含所有参数的列表
    return (x[0]-1)**2+(x[0]-x[1])**2+(x[1]-x[2])**2

def hj(x):  #构造数组h,第j位是第j+1个等式限制条件计算的值,x是一个包含所有参数的列表
    return np.array([x[0]*(1+x[1]**2)+x[2]**4-4-3*np.sqrt(2)])

def gi(x):  #构造数组g,第i位是第i+1个不等式限制条件计算的值,x是一个包含所有参数的列表
    return np.array([x[0]+10,-x[0]+10])

def myFunc(x):
    return  func(x)+\
        1/(2*mu)*np.sum(np.power(np.where(li-mu*gi(x)>0,li-mu*gi(x),0),2)-np.power(li,2))-\
            np.sum(lj*hj(x))+0.5*mu*np.sum(np.power(hj(x),2))

def cdt(x):
    return np.sqrt(np.sum(np.power(hj(x),2)))+np.sqrt(np.sum(np.power(np.where(gi(x)>0,0,gi(x)),2)))

sigma2=1.5  #放大因子
e2=0.001
beta=0.5
x=np.array([2.0,2.0,2.0])   #初值点
k1=0
while cdt(x)>=e2:
    e=0.001
    beta1=1
    sigma=0.4
    rho=0.55
    tar=Function(myFunc)
    k=0
    d=-tar.grad(x)
    x1=x
    while tar.norm(x)>e:
        a=1
        if not (tar.value(x+a*d)<=tar.value(x)+rho*a*dot(turn(tar.grad(x)),d) and \
            np.abs(dot(turn(tar.grad(x+a*d)),d))>=sigma*dot(turn(tar.grad(x)),d)):
            a=beta1
            while tar.value(x+a*d)>tar.value(x)+rho*a*dot(turn(tar.grad(x)),d):
                a*=rho
            while np.abs(dot(turn(tar.grad(x+a*d)),d))<sigma*dot(turn(tar.grad(x)),d):
                a1=a/rho
                da=a1-a
                while tar.value(x+(a+da)*d)>tar.value(x)+rho*(a+da)*dot(turn(tar.grad(x)),d):
                    da*=rho
                a+=da
        lx=x
        x=x+a*d
        beta=np.max((dot(turn(tar.grad(x)),tar.grad(x)-tar.grad(lx))/(tar.norm(lx)**2),0))  #PRP+
        d=-tar.grad(x)+beta*d
        k+=1
        print(k1,k)
    if cdt(x)/cdt(x1)>beta:
        mu*=sigma2
    k1+=1
print(x)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342