以下文章摘录自
《机器学习观止——核心原理与实践》
京东: https://item.jd.com/13166960.html
当当:http://product.dangdang.com/29218274.html
最优化理论
概述
最优化理论是数学的一个分支,它主要研究的是在满足某些条件限制下,如何达到最优目标的一系列方法。最优化理论的应用范围相当广泛,所涉及的知识面也很宽,并不是简单的一两个章节就可以涵盖的——因而本小节我们的主要讲解重点,在于和后续章节中强相关的一些最优化基础理论,从而为大家的进一步学习扫清障碍。
根据所选分类角度的不同,我们可以把最优化问题划分为多种类型。例如从限制条件的角度,最优化问题通常可以被分为下面3种类型:
l unconstrained optimization problem
l equality constraint optimization problem
l inequality constraint optimization problem
接下来我们针对上述3种类型分别进行讲解。
(1) unconstrained optimization problem
这是最简单的一种最优化问题,即在没有任何限制条件下实现最大值或者最小值(minimize和maximize实际上是可以互相转化的)的求解。
比如对于求解f(x) = x2函数最小值的问题,可以表示为:
从下面图例中,不难看出它的最小值是当x=0时,此时函数取值为0。
图 ‑ 无限制条件下的极值范例
总的来说,这种情况下的最优解通常可以通过求导数的方式来获得。
(2) equality constraint optimization problem
对于带有限制条件的最优解问题,也可以再细分为两种情况——即equality和inequality contraint,简单而言就是等式和不等式约束的区别。
比如前面所讲述的f(x) = x2函数,我们可以增加一个equality constraint,这样一来问题就变成了:
subject to x -2 =0
其中“subject to”后面紧跟着的就是限制条件了。
图 ‑ 带有一个equality constraint的最优解
在这个限制条件下,当x=2时f(x)可以取得最小值,对应函数值为4。
当然,我们也可以同时要求多个equality constaints,例如:
f(x, y) = x2 + y2
subject to x - 3 = 0
y - 5 = 0
不过多个限制条件有可能出现无解的情况,譬如:
subject to x - 2 = 0
x - 5 = 0
这一点我们在提出限定条件时需要特别注意。
(3) inequality constraint optimization problem
与equality相对应的是inequality,后者也同样不难理解——它代表的是限定条件为不等式时的情况。
例如下面是圆形函数的不等式限定条件:
f(x, y) = x2 + y2
subject to x - 3 >= 0
y - 5 <= 0
另外,equality和inequality constraint还可以同时出现,共同做为某个最优解问题的限制条件。举例如下:
f(x, y) = x2 + y2
subject to x - 3 = 0
y - 5 <= 0
针对不同的限定条件,最优解问题的解决策略也会有所差异。
概况来说,有如下几个核心点:
l 等式限定条件
拉格朗日乘子法是将equality constraint“隐含”到最大值/最小值求解过程中的关键理论基础
l 不等式限定条件
除了拉格朗日乘子法以外,对于inequality constrint条件下的最优化问题,我们还需要借助于另一个理论——KKT(Karush-Kuhn-Tucher)
在接下来的几个小节中,我们将首先基于若干范例来引出这些理论的应用场景,让大家有一个“感性”的认识。然后再尽量“抽丝剥茧”地为大家详细分析隐藏在它们背后的基础原理以及各种公式的推导过程。
函数等高线
在讲解Lagrange Multiplier和KKT之前,我们首先来补充一些基础知识,即什么是函数等高线,以及它的一些核心应用。
地理学科上的等高线指的是高程海拔相等的相邻各个点所组成的闭合曲线。按照百科上的描述,即是“把地面上海拔高度相同的点连成的闭合曲线,并垂直投影到一个水平面上,并按比例缩绘在图纸上,就得到等高线。等高线也可以看作是不同海拔高度的水平面与实际地面的交线,所以等高线是闭合曲线。在等高线上标注的数字为该等高线的海拔”。
如下示例图所示:
图 ‑ contour line示例
从地理学上的contour line,还可以引申出函数的等高线。其实并不难理解,比如对于函数f(x1, x2),它的等高线可以被表述为如下的形式:
f(x1, x2) = c
这样一来,如果我们针对上述公式取微分值,那么可以得到
另外,业界有多个库函数可以提供非常便捷的API来帮助我们快速绘制出函数的等高线,比如matplotlib。范例代码如下所示:
import matplotlib.pyplot as plt
import numpy as np
def contour_func(x, y):
return (x / 5 + x ** 5 + y ** 3 - 4) * np.exp(- x ** 2 - y ** 2)
n = 500
x = np.linspace(-3, 3, n)
y = np.linspace(-3, 3, n)
X, Y = np.meshgrid(x, y)
plt.contourf(X, Y, contour_func(X, Y), 8, alpha = 0.75, cmap = plt.cm.RdBu)
C = plt.contour(X, Y, contour_func(X, Y),8, colors = 'red', linewidth = 0.5)
plt.clabel(C, inline = True, fontsize = 12)
plt.show()
输出的效果图如下所示:
图 ‑ 绘制等高线
等高线可以帮助我们从几何角度来分析拉格朗日乘子法及KKT的原理,因而对大家后续学习有不小的促进作用,建议读者自行编写代码来加深理解。
拉格朗日乘子法
约瑟夫·拉格朗日(Joseph-Louis Lagrange,1736~1813)相信大家都不会陌生,他是法国著名的数学家和物理学家。Lagrange的一生著作颇丰,而且横跨数学、天文学、力学等多个领域(据悉,他的“主业”是数学,而在其它学科上的狩猎则是他为了证明数学威力而从事的“副业”),比如拉格朗日中值定理、微分方程、数论等等。
以拉格朗日命名的Lagrange Multiplier,是求解equality constraint optimization problem最为重要的理论依据之一(求解inequality constraint optimization problem通常还依赖于KKT,我们将在下一小节中做详细阐述)。
Lagrange Multiplier虽然是大学时期高等数学课程的一个知识点。不过为了让大家可以“零基础”学习本章内容,我们还是有必要简单的做一下复习。
接下来我们引用同济大学出版的《高等数学》一书中的一道习题,来逐步引导出拉格朗日乘子法以及它的相关应用。
问题:求表面积为a2而体积为最大的长方体的体积问题。
我们假设长方体的三条棱的长分别为x、y和z,那么体积V = xyz。又因为要求面积为a2,所以还有一个附加条件:
2*(xy + yz + xz) = a2
换句话说,这个问题可以表述为:
V = xyz
subject to 2*(xy + yz + xz) - a2 = 0
如何求解呢?
针对这个问题其实有一个比较简易的解决方案,即根据约束条件,用x和y来表示z,然后应用到V函数中。具体过程如下所述:
2*(xy + yz + xz) - a2 = 0
将上述公式代入前面的V函数,可以得到:
V = xyz
这样一来,约束条件自然而然地就被“隐含”到V函数中了,而且通过这种简易的办法还降低了变量个数。遗憾的是,并不是所有条件约束下的极值问题都这么简单直接——我们需要一种更为通用的解决方案,这就是拉格朗日乘子法了。
它的定义如下:
拉格朗日乘子法: 要找函数z = f(x, y)在附加条件下的可能极值点,可以先作拉格朗日函数
L(x, y) = f(x, y) +
其中为参数。将上述L函数分别针对x和y求一阶偏导数,并使它们为零,同时结合约束条件可得:
上述方程组有3个函数,3个变量,因而可以分别解出x、y和。由此得到的(x,y)就是函数f在附加条件 =0下的可能极值点。
拉格朗日乘子法还可以推广到多变量(>=2)和多约束条件(>=2)下的情况下。例如如果我们要求解4个变量的函数u
u = f(x, y, z, t)
在两个附加条件
下的极值,那么可以先构造出如下的拉格朗日函数:
L(x, y, z, t) = f(x, y, z, t) + +
然后通过如下的方程组:
求解得到极值点(x、y、z、t),以及对应的和参数。
还是以前面长方体最大体积的问题为例,应用拉格朗日乘子法来求解的过程如下:
首先构造拉格朗日函数
L(x, y, z) = f(x, y, z) +
= xyz +
分别针对几个参数求偏导数,可得:
由上述方程组,我们不难求解得到:
另外,我们还可以从几何意义上来理解拉格朗日乘子法。
如下图例所示(引用自wikipedia):
图 ‑ 拉格朗日乘子法几何释义
上面图例中包含了一个目标函数(最大值/最小值)f(x,y)和一个约束函数g(x,y) = c,或者按照我们之前的表述方式即是:
subject to g(x, y) = c
不难理解,函数f和g有3种可能的关系:
l 不相交
l 相交不相切
l 相交且相切
由于我们需要满足g(x, y) = 0的条件,所以寻找的潜在极值只能在这条线上。进一步来讲,上述三种关系最有可能出现极值的是哪一个呢?
不相交的关系首先可以被排除掉,因为这种情况通常意味着无解。
对于相交但不相切的情况,只要我们沿着g线移动,那么一定可以走到比当时相交点更高或者更低的等高线上。换句话说,只有当g(x, y)和f(x, y) = d产生相切关系时,才有可能出现极值点。这样一来就得到:
可以看到上述参与求导的函数就是前面我们讲解的Lagrange函数了。
拉格朗日乘子法在机器学习领域应用广泛,比如本书后续章节中将会讲解到的SVM支持向量机就是以此为理论基础构建的,建议大家可以结合起来阅读。
拉格朗日对偶性
我们发现不少参考资料在讲解KKT时并没有提及拉格朗日对偶性,或者把这两者完全割裂开来阐述,这可能会让初学者产生或多或少的疑惑——例如对偶性和KKT到底是什么关系,它们对于约束条件下的最优解都有什么样的贡献等等。
有鉴于此,我们觉得有必要言简意赅地为大家先铺垫一下对偶性的相关知识,以便读者们在学习KKT时既可以“知其然,知其所以然”,同时还能“触类而旁通”。
如果我们从目标函数和约束条件的角度来分析,那么大致可以有如下几种分类:
l 线性规划
当目标函数和约束条件都为线性函数的时候,我们称之为线性规划。这是相对容易求解的优化问题
l 二次规划
如果目标函数是二次函数,而约束条件为线性函数,那么这种最优化问题通常被称为二次规划
l 非线性规划
如果目标函数和约束条件都是非线性函数,那么这类最优化问题就被称为非线性规划问题
等等
对于线性规划问题,它们都会有一个与之相对应的对偶问题。那么什么是对偶问题呢?对此维基百科上给出了很好的释义,引用如下:
“In mathematical optimization theory, duality or the duality principle is the principle that optimization problems may be viewed from either of two perspectives, the primal problem or the dual problem. The solution to the dual problem provides a lower bound to the solution of the primal (minimization) problem. However in general the optimal values of the primal and dual problems need not be equal. Their difference is called the duality gap. For convex optimization problems, the duality gap is zero under a constraint qualification condition”
上述这段话明确指出了对偶问题的如下几个核心点:
l primal problem和dual problem
duality就像是从两个不同角度来看待同一个问题一样,它们分别被称为primal problem和dual problem
l duality的意义
通常duality的一个重要意义,在于它可以借助更容易获得的dual problem答案,来间接得到(或者接近)primal problem的答案,从而简化问题的解决方案——甚至有的时候,primal problem是无解的
l duality gap
因为dual problem并不总是可以完全等价于primal problem,所以它们之间可能会存在“duality gap”。最理想的情况是这个gap=0,此时我们又称之为strong duality;反之如果gap != 0,那么就是weak duality
所以现在大家应该很清楚了,对偶性duality是我们降低某些艰深问题的复杂度,从而达到“歼灭”目标的有效手段。
最优化问题的标准形式(optimization problem in the standard form)
最优化问题的标准形式表述需要综合考虑多个等式、不等式约束条件下的最优解,下面所示的是学术界常见的一种表述手段:
minimize f(x)
subject to <=0, i = 1, 2, 3, …k
=0, j = 1, 2, 3, …l
针对上述最优化问题,我们定义Lagrangian L:
=
其中被称为与第i个不等式限制ci (x) <=0相关联的Lagrange multiplier; 同理被称为与第个j等式限制hj (x) =0相关联的Lagrange multiplier;和的专业术语则是dual variables或者Lagrange multiplicer vectors。
primal problem: min-max
拉格朗日对偶的原始问题是在前述标准表述上的一种改进。
我们引入另一个函数,它的定义如下所示:
=
其中函数的下标p是primal的缩写。
由此我们可以得出一个非常重要的结论,即和前一小节表述的标准问题是等价的——相信大家心里已经有一个大大的问号了,如何得出这样的结论?
证明如下:
a) 当x满足最优化问题的约束条件时
换句话说,x必须同时满足下面的等式和不等式条件:
<=0, i = 1, 2, 3, …k
=0, j = 1, 2, 3,…l
由于 <=0且,所以:
换句话说它的最大值只能是0。
另外,因为 =0,所以:
=0
这样一来,不难得出:
=
<= f(x) + 0 + 0
进一步来说,我们可以得到:
=
= f(x)
b) 当x不满足约束条件时
当x不满足约束条件时,也就是说存在:
l 任何一个i使得 >0 或者
l 任何一个j使得 != 0
毫无疑问,在这种情况下:
->
综上所述,我们可以得到:
论题得证。
那么我们费这么大的周折利用primal problem来表述问题的原因是什么呢?其实它的好处是非常明显的,简单来讲就是可以有效地将约束条件“隐藏”进函数中,让我们摆脱原始问题无从下手的“尴尬”。
这种将“无形问题”化解为“有形问题”的形式就是min-max,如下所示:
或者也被称为广义拉格朗日函数的极小极大问题。
为了表述的方便,通常我们用如下的p*来代表原始问题的最优值:
p* =
dual problem: max-min
假定有另外一个,它的定义如下:
如果针对它求极大值,即:
那么上式就是广义拉格朗日函数的极大极小问题。
当然,也可以按照前面小节的问题表述方式,把它定义为:
subject to , i=1,2,3, … k
和前面的p*类似,我们将对偶问题的最优值表示为d*:
d* =
与原始问题和对偶问题相关的有多个定理。例如:
如果原始问题和对偶问题都有最优值,则:
证明如下(参考《统计学习方法》一书中的附录C):
根据和的定义,我们可以得到:
<=
<= =
换句话说就是:
<=
又因为原始问题和对偶问题都有最优值,所以,
<=
所以,
weak duality
从前面小节的讲解中,我们知道有如下的关系:
d* <= p*
所以说d*是p*的lower bound。值得一提的是,这个不等式对于任意的最优化问题(即使它不是凸优化问题)都是成立的。
另外,p*-d*在最优化问题中代表的是“optimal duality gap of the original problem”,它具备如下特性:
l 非负数
由于d* <= p*,所以很自然的有p*-d* >=0
l 值越小,表示d*越接近原始问题的最优解
图 ‑ Lower bound
如果它们不相等,那么就是weak duality了;而最理想的情况就是它们的差为0的时候。此时就是强对偶关系了,大家可以参见下面小节的讲解。
strong duality
如果满足下面的等式:
d* = p*
也就是说duality gap是0,那么我们就说它们具备了强对偶关系。
在最优化理论中,强对偶关系显然不会在所有问题中都成立。不过根据《Convex optimization》中的论述,如果primal problem满足:
中的f0, … fm均为convex的话,那么这种情况下的最优化问题通常(注意:也不是绝对的)就会满足强对偶关系。
那么有没有strong duality一定存在的情况呢?
答案是肯定的,而且还不止一种——比如Slater’s condition,或者后续小节我们将重点介绍的KKT都是。
Slater’s condition是以Morton L.Slater命名的,它是strong duality的一个充分条件(注意:非必要条件)。简单而言,它是指满足如下条件的问题:
大家可以注意看下上述与原始问题中的约束条件不太一样,后者使用的是<=,而前者则是<。换句话说,就是slater’s condition要求更为严格。
接下来我们再分析一下KKT条件。
KKT
前面几个小节大家已经学习了如何利用拉格朗日乘子法来解决等式约束条件下的最优化问题,而且也补充了拉格朗日对偶性等基础知识,接下来就可以进一步学习不等式情况下的最优解问题了。
Karush-Kuhn-Tucker就是上述问题的答案——简单来讲,KKT是以三个人的名字组成的几个conditions。其中Harold W. Kuhn和Albert W. Tucker是在1951年发表了这个适用于不等式约束条件的conditions,所以它又被称为Kuhn-Tucker conditions。只不过后来人们又发现William Karush其实在更早的1939年就已经在他的硕士论文中阐述了完全一致的观点了,所以就成了现在大家所熟知的Karush-Kuhn-Tucker Conditions (简称KKT)了。
KKT是在满足一些有规则的条件下,一个非线性规划问题具备最优化解法的必要和充分条件。它也可以被理解为广义的拉格朗日乘子法——换句话说,当不存在不等式约束条件时,那么它和前面小节所讲述的拉格朗日乘子法就是等价的。
接下来我们通过几个examples来逐步引导大家学习和理解KKT条件。
(1) 范例1
f(x) = +
g(x) = + - 1
subject to g(x1, x2) <=0
那么f(x)函数的等高线如下:
图 ‑ f函数等高线
引用自KTH DD3364 Course,下同
(未完待续)