拉格朗日乘子法详解(Lagrange multiplier)

2023-05-16

最近在视频的变换编码里推导最优变换(KL变换)时需要用拉格朗日乘子法,之前在机器学习的各种优化问题里也要用到这个方法,特此仔细钻研一番,总结如下:

注:这篇博客讲的很全面,这里部分参考了他的讲解。

注:本文只讲了拉格朗日函数的构造,看完本文后再去了解拉格朗日对偶函数的推导以及对偶问题


先上浓缩精华
  • 核心极值点处,函数和约束条件一定相切,梯度一定共线(同向or反向)!!!
    以此为思想基础构建拉格朗日函数,把等式约束条件和不等式约束都通过引入拉格朗日乘子(就是个系数)整合到一个新函数里,使得原本的复杂的多约束优化问题变成了最简单的无约束优化问题,直接对构造出的拉格朗日函数的所有变量(包括原本的变量 x i , i = 1 , 2 … , m x_i,i=1,2\ldots,m xi,i=1,2,m和新引入的乘子变量 λ k , μ j , j = 1 , 2 … , n , k = 1 , 2 … , l \lambda_k,\mu_j,j=1,2\ldots,n,k=1,2\ldots,l λk,μj,j=1,2,n,k=1,2,l)求偏导等于零,得到的就是最终解。

  • 用途:求解含有等式约束的最优化问题的局部最优解!!(极值点不一定是最小点,所以不是全局最小哟);对于含有不等式约束的问题,要用到扩展的拉格朗日乘数法,这个扩展就是KKT条件的引入,更多细节参见这篇博文。


再谈完整细节

最优化问题按照约束条件的有无和类别可分为三类:
(一) “无约束" 优化问题
直接对所有 m m m个变量求偏导,令偏导等于0,联立方程组求出来的点就可能是极值点,具体是不是那就代到原函数里看看是不是比周围的值都小就行。
∂ F x i = 0 i = 1 , 2 … , m \frac{\partial F}{x _i}=0 \quad i=1,2\ldots,m xiF=0i=1,2,m
补充注解:

  1. 偏导等于0只是极值点的必要条件,所以可能是。
  2. 直观地看,极值点左右的导数一定异号,又因为函数连续,所以极值点的导数只能为0。
  3. 必要条件:满足必要条件不能说明一定是;不满足则一定不是!!
  4. 充分条件:满足充分条件则一定是;不满足则给出的信息为0

下面(二)(三)类优化问题都是通过构造拉格朗日函数把问题转化为第(一)类的。

(二)“等式约束” 优化问题
目标函数(待优化的函数)为 f ( x ) f(x) f(x),约束条件为 h k ( x ) , k = 1 , 2 … , l h_k(x),k=1,2\ldots,l hk(x),k=1,2,l,问题建模为
m i n f ( x ) s . t . h k ( x ) = 0 min f(x) \quad s.t. \quad h_k(x)=0 minf(x)s.t.hk(x)=0
这时候我们构建拉格朗日函数
为什么这么构建参见知乎这个回答,很好理解,就因为梯度共线:
一个等式约束欸但表示对理解共线最有帮助:
∇ f ( x ∗ ) + λ ∇ h ( x ∗ ) = 0 , x ∗ 为 极 值 点 \nabla f(x^*)+\lambda\nabla h(x^*)=0,x^*为极值点 f(x)+λh(x)=0,x
多个等式约束则表示为:
∇ f ( x ∗ ) + ∑ k = 1 l λ k ∇ h k ( x ∗ ) = 0 , x ∗ 为 极 值 点 \nabla f(x^*)+\sum_{k=1}^l\lambda_k \nabla h_k(x^*)=0,x^*为极值点 f(x)+k=1lλkhk(x)=0,x
L ( x , λ ) = f ( x ) + ∑ k = 1 l λ k h k ( x ) L(x,\lambda)=f(x)+\sum_{k=1}^l\lambda_kh_k(x) L(x,λ)=f(x)+k=1lλkhk(x)
L ( x , λ ) L(x,\lambda) L(x,λ)即拉格朗日函数, λ k \lambda_k λk是拉格朗日乘子.上面的公式实际上就是下面的拉格朗日函数对x求偏导的结果。

这时就成了第一类的无约束优化了,只是变量增多了 l l l个,同第一类问题,分别对 m + l m+l m+l个变量求偏导,得出来的解代入目标函数就ok了!
∂ F λ k = 0 , 这 得 到 的 就 是 那 组 等 式 约 束 \frac{\partial F}{\lambda _k}=0 , 这得到的就是那组等式约束 λkF=0
∂ F x i = 0 , 这 得 到 的 就 是 ∇ f ( x ∗ ) + ∑ k = 1 l λ k ∇ h k ( x ∗ ) = 0 \quad \frac{\partial F}{x _i}=0,这得到的就是\nabla f(x^*)+\sum_{k=1}^l\lambda_k \nabla h_k(x^*)=0 xiF=0f(x)+k=1lλkhk(x)=0
(三)“等式约束+不等式约束” 优化问题
这是最复杂也最常见的一种模型。问题建模为:
m i n f ( x ) s . t . h k ( x ) = 0 , g j ( x ) ≤ 0 j = 1 , 2 … , n ; k = 1 , 2 … , l minf(x) \quad s.t.h_k(x)=0\quad,\quad g_j(x)\leq0\quad j=1,2\ldots,n;k=1,2\ldots,l minf(x)s.t.hk(x)=0,gj(x)0j=1,2,n;k=1,2,l
思路一样,还是要最终转化为无约束的简单优化问题,但这里要分为两步:

  1. 先把不等式约束条件转化为等式约束条件。 how? → \to 引入 松弛变量 / KKT乘子
  2. 再把等式约束转化为无约束优化问题。 how? → \to 同(二),引入拉格朗日乘子

构造拉格朗日函数为:
L ( x , λ , μ ) = f ( x ) + ∑ k = 1 l λ k h k ( x ) + ∑ j = 1 n μ j g j ( x ) L(x,\lambda,\mu)=f(x)+\sum_{k=1}^l\lambda_kh_k(x)+\sum_{j=1}^n\mu_jg_j(x) L(x,λ,μ)=f(x)+k=1lλkhk(x)+j=1nμjgj(x)

λ k \lambda_k λk是为等式约束引入的拉格朗日乘子
μ j \mu_j μj是为不等式约束引入的松弛变量

至此,含不等式约束的最复杂的优化问题也转化为无约束的简单问题了,剩下的就只有求偏导了。
即最终只需要求解,解出来的就可能是极值点啦(KKT也只是必要条件):
{ ∇ f ( x ∗ ) + ∑ k λ k ∇ h k ( x ∗ ) + ∑ j μ j ∇ g j ( x ∗ ) = 0 ( 1 ) μ j ≥ 0 ( 2 ) μ j g j ( x ∗ ) = 0 ( 3 ) h k ( x ∗ ) = 0 ( 4 ) g j ( x ∗ ) ≤ 0 ( 5 ) \left\{ \begin{aligned} \nabla f(x^*) + \sum_{k}\lambda_k\nabla h_k(x^*)+\sum_{j}\mu_j\nabla g_j(x^*)& = &0 \quad (1)\\ \mu_j & \geq & 0 \quad (2)\\ \mu_jg_j(x^*) & = & 0 \quad (3)\\ h_k(x^*) & = & 0 \quad (4)\\ g_j(x^*) & \leq & 0\quad (5)\\ \end{aligned} \right. f(x)+kλkhk(x)+jμjgj(x)μjμjgj(x)hk(x)gj(x)===0(1)0(2)0(3)0(4)0(5)

这里由于有不等式约束因此要引入KKT条件(Karush–Kuhn–Tucker conditions)

这个KKT可以说是很神秘很厉害了,之前学无线网络也一直在用它求解不等式优化问题,现在学机器学习,视频编码竟然还是要用,所以只要有不等式约束的优化是绕不开了,不过thank god也不算太难?(手动一个不太自信还很尴尬的微笑) 关于KKT条件,我这篇博文做了详解。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

拉格朗日乘子法详解(Lagrange multiplier) 的相关文章

  • LQR制导

    LQR制导 引言 在ardupilot中固定翼飞机横航向位置控制 xff08 制导律 xff09 采用L1制导律 xff0c 最近想将一些其他的控制理论用于ardupilot代码中 xff0c 通过ardupilot论坛 xff0c 看到已
  • 2022年度总结

    年度总结 参加工作的第一年很快就过去了 xff0c 从四月份离校到公司 xff0c 直到农历腊月27回家 xff0c 工作了9个月的时间 xff0c 总的来说工作和学习的差别还是很大的 xff0c 从学生到社畜的转换还是花了一段时间的 接下
  • HTTP基本认证

    在HTTP中 xff0c 基本认证 xff08 英语 xff1a Basic access authentication xff09 是允许http用户代理 xff08 如 xff1a 网页浏览器 xff09 在请求时 xff0c 提供 用
  • c# 设置代理服务器发送http请求

    span class token keyword using span span class token namespace System span span class token punctuation span span class
  • Blaze:高性能C++数学库

    Blaze xff1a 高性能C 43 43 数学库 本文译自 xff1a Blaze A high performance C 43 43 math library Blaze是一个用于密集和稀疏算法的开源 高性能 C 43 43 数学库
  • c/c++编译:使用CMAKE进行跨平台开发

    前言 本文介绍跨平台cmake的编写 xff0c 主要是linux和windows用cmake对项目的编译 这是一个通用模板 xff0c 能够应用到更加复杂的项目中 xff0c 项目例子用https blog csdn net qq 364
  • 对于应用层HTTP协议的学习

    lt start gt 在TCP IP协议栈中 xff0c HTTP协议处于应用层 xff0c 它在最顶层进行数据报转发给应用进程 xff0c 它是最靠近用户的那一层 它的默认端口号为80 HTTP协议是基于请求响应的协议 xff0c 那么
  • 编程开发环境搭建

    全部目录 下载 amp 安装官方下载Vs2019其它历史 版本下载 开始使用安装C 43 43 的工作负载 xff08 环境 xff09 打开vs后有这些模板创建出一个控制台应用程序更多参考文档 使用手册c 43 43 参考手册Visual
  • c++创建第一个控制台程序

    目录 创建控制台应用程序打印出Hello World 空项目创建vs自带打印的创建桌面向导 自定义创建 了解代码 抛转引玉减少为什么 什么是 include 它是预处理指令什么是iostream 它是c 43 43 标准库头件 编写前的了解
  • python3-操作SQLite、创建表、添加数据、查询数据

    SQLlte数据类型 SQLite能保存什么样的数据类型 可以保存空值 整数 浮点数 字符串和blob 什么是blob xff1f xff1f 是二进制大对象 例如图片 音乐 zip文件 什么是游标 游标是在数据库中用来移动和执行查询的对象
  • 初学者都能看懂的95%置信区间

    项目github地址 xff1a bitcarmanlee easy algorithm interview and practice 经常有同学私信或留言询问相关问题 xff0c V号bitcarmanlee github上star的同学
  • c# WindowForm练习项目主窗体设计

    窗体分割器 SpliContainer分割器 在项目主窗体分割成左右俩部分 设置边框线属性 MonthCalendar月历控件 添加程序所需要的按钮 退出 修改密码 添加会员 按钮 固定好左边的容器 组件 ImageList 按钮太多添加图
  • C#-WinForm班级下拉框数据绑定

    前台展示 后台方法 span class hljs keyword using span System span class hljs keyword using span System Collections Generic span c
  • C#--WinForm项目主窗体设计

    主窗体基本设置 大小 颜色 去边框 出现的位置 Panel控件 背景图 颜色 布局 xff1a Label标签 文本 字体 背景颜色 布局 按钮 布局 文本 字体颜色 背景色 底部panel 绑定控件边框 颜色 用label标签导入图标 S
  • C# -- 实现WinForm程序的密码修改

    修改窗体程序密码的示例 实现分析 前台弹出修改窗体 编写后台方法 xff0c 调用通用数据访问类Update方法 数据验证 xff0c 判断原密码是否与旧密码符合 xff0c 俩次输入的新密码是否一致 更新程序全局变量 前台弹出修改窗体 编
  • C#--WinForm--表格数据控件DataGridView--绑定模式

    官方文档 DataGridView控件提供了一种强大而灵活的以表格形式显示数据的方式 用户可以使用DataGridView控件来显示少量数据的只读视图 xff0c 也可以对其进行缩放以显示特大数据集的可编辑视图 扩展DataGridView
  • ASP.NET--网站配置、发布与部署

    网站发布前的配置信息 配置文件下载 网站发布的基本步骤 写好的项目 在本机上发布 打开目录查看 xff1a 部署网站 安装IIs 打开控制面板 程序和功能 启用或关闭Windows功能 安装后 返回控制面板 管理工具 双击打开 xff1a
  • c/c++ hash表 (哈希表、字典表)

    表 1 表 存储数据 key gt value 2 表存储数据结构的困难 怎么查找 一个一个key去比较去查找 xff1f 61 61 效率不高 3 Hash算法加快查找 将字符串的key 转成整数 使用整数找到对应的value Hash算
  • c/c++ UDP通讯

    UDP通讯 1 无连接的 不需要反复的确认和握手等待 根本不关心对方是否存在 2 不可靠 可能有丢包 和先发后到 3 UDP通讯快速 占用系统资源少 4 UDP提供作为传输层协议的最基本功能 将其他的交给用户自己来管理 UDP服务端 1 创

随机推荐