原版写的不太满意。。修改了以下
极值问题
目前机器学习里面的很多东西,都涉及到优化某个函数,比如一个线性二分类问题,我们可能需要找到一个超平面,使得其距离两个分类尽可能远,则我们要令距离函数最大化,如果这个函数是个凸函数,则极值点就是最值点,那我们就可以直接求导,找到导数为 0 0 0的点,如果该函数非凸,那么问题可能会更复杂一些。(不过在某些理论认为,某些任务下,如深度学习,大部分极值点和最优值点相差不远)。所以我们主要讨论求极值点。
而极值问题大致又分为两种:
-
- 无约束极值问题
-
- 有约束极值问题
无约束极值问题,其实就是求导数 / 梯度为0的点,该点一定是一个极值点。
而有约束极值问题,其实就是在自变量的取值上进行了一定的限制,也就是函数的定义域并不是每一个值都能取到,并在这种情况下求这个带约束条件的函数的极值。所以接下来我们主要讨论这一种问题。
带约束的极值问题
网上大多数文章,都喜欢用山比作(二元)函数图像,那我们这里也是一样,这里先做出一点假设,方便大家代入。
假设你是一位摄影爱好者,你最喜欢做的事情就是到各地的山上进行摄影,并且你还有一个原则:坚持站得高看得远,所以你总是尽可能的往高处走。
这里把函数比作山,姑且认为这座山非常连续平滑,没有什么断崖之类的。(就是函数处处可微分)。
对于无约束问题:
这座山的任何一个地方你都可以到达。
对于有约束问题:
这座山上修了栈道,并且强制要求游客(你)必须走栈道,否则一律赶出山 (2333);
或是这座山上只有部分区域是安全区,游客(你)只能在这个区域探索。
而你的目标
就是在你能活动的区域,尽可能找到最高能到达的地方,然后拍照装X发朋友圈。
由于你每次拍照都会去不同的山区,所以每当来到一个新的地点,你也不知道哪里是最高处。不过对于每个新地点,你都准备了一份神奇——这座山的地图,当然不是一般的地图,而是这座山的梯度图。。。
那么,什么是梯度呢,梯度,是一个向量,有大小和方向,梯度的方向总是指向函数增长最快的方向,而大小则是每次增长的一个度量,因此,你在山上照着梯度方向爬,肯定上升的最快。
而当你爬到山的最高点时,此时的梯度为0向量,没有方向,表示你此时无论往哪里走都不能走的更高。
所以每当你到了无约束的山,用这份神器你可以立马找到你的目的地和行进路线:目的地就是梯度为0的点,路线就是从你的出发点沿着梯度方向一路走。
不过当你碰见了修栈道的山,或者有安全区域的山,问题就不一样了。为了简单,这里先讨论只修了栈道的山。
如图
绿色的就是我们的山,红色的就是我们的栈道(虽然很奇怪,就当它是吧)
我们把栈道投影到地平面上,就有:
此处的橙线就是我们的约束条件,而红线就是在约束条件下的函数值。
也就是说,我们的水平位置一定是要在橙线(约束条件)上的,于是我们可以得到一些新的信息:
当我们处于某一个位置的时候,我们能移动的方向为约束条件的切线方向(此处图片举例及其不恰当……),所以我找了个约束条件不是直线的来。。
图中橙线是约束,粉红色和绿色交线是栈道,黑线是约束在某点的切线。
因此现在我们知道的信息有:1. 山在某点的梯度;2. 我们在栈道任意一点可以移动的方向(栈道每点切线)
只要利用好这两个信息,我们还是很容易能到达我们所能到达的最高点的。
由于只要朝着山的梯度方向进行移动,我们就能爬的更高,而我们在栈道上的某一点时,我们只需要考虑,我们沿着约束切线方向移动时,是不是也朝着梯度移动了一些即可。
那么目前有这么两种情况:
1.我们能移动的方向和梯度垂直,也就是说此时我们不管往哪里移动,都不能朝着梯度的方向更近一步,也就是不能在上升了,因此此处就是一个极值点。
2.如果移动方向和梯度不垂直,也就是说我们的移动方向为梯度的一个分量,不过虽然是分量,也代表着我们正在上升,如果极端情况下,移动方向和梯度平行,嗯哼!
我们把约束条件的切线描述换成法线,则有:当原函数在某点的梯度和约束条件在该点的法线平行时,该点为约束条件下的极值点。
并且根据空间曲线的法向量求法,我们也可以转换成求某一个函数梯度的问题。那么我们是不是可以想一种办法,把约束问题也转换为求函数梯度,从而把约束去掉(没有约束多方便多开心)。而下面说的拉格朗日乘子法,就是以这种想法来解决带约束的极值问题。
注:如果要看安全区域类型的爬山,请转到文章《KTT条件》,这篇文章只讲等式约束,那片是不等式约束的天下。
以下为部分原文
拉格朗日乘子法
按照维基百科的定义,拉格朗日乘数法是一种寻找多元函数在其变量受到一个或多个条件的约束时的极值的方法。用数学式子表达为:
(这里以极小值为例)
m
i
n
i
m
i
z
e
 
f
(
x
,
y
,
z
,
.
.
.
)
minimize \:f (x,y,z,...)
minimizef(x,y,z,...)
s
.
t
.
  
g
k
(
x
,
y
,
z
,
.
.
.
)
=
0
(
k
=
1
,
2
,
.
.
.
,
l
)
s.t. \:\:g_k(x,y,z,...)=0(k = 1,2,...,l)
s.t.gk(x,y,z,...)=0(k=1,2,...,l)
S.T.表示约束条件,可以理解为 g k ( x , y , z , . . . ) = 0 g_k(x,y,z,...) = 0 gk(x,y,z,...)=0为函数在高度为0处的等值线\面,我们自变量的取值被限制在这个等值线\面上
然后我们需要在这些约束条件下求得函数 f ( x , y , z , . . . ) f(x,y,z,...) f(x,y,z,...)的极小或极大值
例子
在约束条件: x 2 y − 3 = 0 x^2y - 3= 0 x2y−3=0即 x 2 y = 3 x^2y=3 x2y=3下,求 m i n    f ( x , y ) = x 2 + y 2 min\:\: f(x,y)=x^2+y^2 minf(x,y)=x2+y2
首先看看
x
2
y
=
3
x^2y=3
x2y=3这个,即函数
x
2
y
x^2y
x2y在高度为3处的等高线:
临时抱佛脚学的matplotlib……将就看看???(滑稽)
函数
x
2
+
y
2
x^2 + y^2
x2+y2图像(其实就是抛物线绕着Z轴旋转、、纵看就一个个同心圆,半径为
Z
\sqrt Z
Z)
然后我们可以先看看,,在约数条件下函数f的图像:
想象一下,我们在红线上移动,即在曲面上移动,什么时候能走到最低点呢
首先,我们考虑在曲面上移动,那么,明显朝着当前点的梯度向量的反方向移动,我们能以最快的速度下降,或者我们移动的方向的某个分量的方向和梯度向量的反方向一致,那么我们也可以在曲面上走下坡路,就这么一直走,一直到我们能走的方向和梯度方向垂直,则代表此时来到了一个极小值点,因为无论怎么移动,我都无法在走下坡路,要么水平走,要么上坡(我们只能在红线上移动,如果再顺着梯度走,就会“跳”出红线——约束条件)
也就是说,如果红线上(等高线上,也就是约数)某个点 ( x , y ) (x,y) (x,y),对应的 f ( x , y ) f(x,y) f(x,y)极小,则函数 f f f在点 ( x , y ) (x,y) (x,y)处的梯度向量的方向垂直于等高线过该点的切线。否则,我们还能继续在等高线上移动,保证移动的某个分量仍然可以沿着梯度的反方向,使 f f f减小。
所以,假设有点 ( x , y ) (x,y) (x,y),则梯度向量 ▽ f = ( ∂ f ∂ x ∂ f ∂ y ) = ( 2 x 2 y ) \bigtriangledown f = \begin{pmatrix} \frac{\partial f}{\partial x} \\ \\ \frac{\partial f}{\partial y} \end{pmatrix} = \begin{pmatrix} 2x \\ 2y \end{pmatrix} ▽f=⎝⎛∂x∂f∂y∂f⎠⎞=(2x2y) , ▽ g = ( ∂ g ∂ x ∂ g ∂ y ) = ( 2 x y x 2 ) \bigtriangledown g = \begin{pmatrix} \frac{\partial g}{\partial x} \\ \\ \frac{\partial g}{\partial y} \end{pmatrix} = \begin{pmatrix} 2xy \\ x^2 \end{pmatrix} ▽g=⎝⎛∂x∂g∂y∂g⎠⎞=(2xyx2)
根据上面所说,
f
f
f的梯度向量垂直于等高线切线其实等价于
f
f
f的梯度向量与
g
g
g的梯度向量共线,即:
▽
f
=
λ
▽
g
\bigtriangledown f = \lambda \bigtriangledown g
▽f=λ▽g
因此联立方程:
{ ( 2 x 2 y ) = λ ( 2 x y x 2 ) x 2 y = 3                  ⇒ { x ≈ ± 1.61 y ≈ 1.1       λ ≈ 0.87     \left\{\begin{matrix} \begin{pmatrix} 2x \\ 2y \end{pmatrix} = \lambda \begin{pmatrix} 2xy \\ x^2 \end{pmatrix} \\ x^2y = 3 \:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\: \end{matrix}\right.\Rightarrow \left\{\begin{matrix} x \approx \pm 1.61 \\ y \approx 1.1\:\:\:\:\: \\ \lambda \approx 0.87\:\:\: \end{matrix}\right. ⎩⎨⎧(2x2y)=λ(2xyx2)x2y=3⇒⎩⎨⎧x≈±1.61y≈1.1λ≈0.87
这就是拉格朗日乘子法。
当然,对于方程:
{
▽
f
=
λ
▽
g
g
=
0
           
\left\{\begin{matrix} \bigtriangledown f = \lambda \bigtriangledown g \\ g = 0\:\:\:\:\:\:\:\:\:\:\: \end{matrix}\right.
{▽f=λ▽gg=0
我们可以定义:
F
=
f
+
λ
g
F = f + \lambda g
F=f+λg
然后求解下面的方程:
( ∂ F ∂ x ∂ F ∂ y ∂ F ∂ λ ) = ( 0 0 0 ) \begin{pmatrix} \frac{\partial F}{\partial x} \\ \frac{\partial F}{\partial y} \\ \frac{\partial F}{\partial \lambda } \end{pmatrix}=\begin{pmatrix} 0 \\ 0 \\ 0 \end{pmatrix} ⎝⎛∂x∂F∂y∂F∂λ∂F⎠⎞=⎝⎛000⎠⎞
这里奇怪就奇怪在——约数条件呢?
其实,上面的方程要满足,就要满足
∂
F
∂
λ
=
g
=
0
\frac{\partial F}{\partial \lambda } = g = 0
∂λ∂F=g=0,也就变相的满足了约束条件。
上方例子中,约束条件一直都只有一个,当约数条件增加,我们能“走到”的点,只有这些不同等高线的交点,此时,是不是我们的梯度既要垂直于某条等高线的切线,又要垂直另一条等高线的切线?
不不不,我们只需要满足梯度是这些等高线法线的现行组合( ▽ f = λ ▽ g + μ ▽ h + . . . \bigtriangledown f = \lambda \bigtriangledown g + \mu \bigtriangledown h + ... ▽f=λ▽g+μ▽h+...)即可。
求解时,只需联立方程:
{
▽
f
=
λ
▽
g
+
μ
▽
h
+
.
.
.
g
=
0
                             
h
=
0
                             
.
.
.
                             
\left\{\begin{matrix} \bigtriangledown f = \lambda \bigtriangledown g + \mu \bigtriangledown h + ... \\ g=0 \:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\: \\ h=0 \:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\: \\ ... \:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\: \end{matrix}\right.
⎩⎪⎪⎨⎪⎪⎧▽f=λ▽g+μ▽h+...g=0h=0...
解出各值即可。
参考资料:马同学—拉格朗日乘子法如何理解?