凸性在优化算法的设计中起着至关重要的作用。这主要是因为在这种情况下分析和测试算法要容易得多。换句话说,如果算法即使在凸设置中也表现不佳,通常我们不应该希望在其他情况下看到很好的结果。此外,尽管深度学习中的优化问题通常是非凸的,但它们通常在局部最小值附近表现出凸问题的某些性质。这可能会导致令人兴奋的新优化变体,例如 ( Izmailov et al. , 2018 )。
%matplotlib inline import numpy as np import torch from mpl_toolkits import mplot3d from d2l import torch as d2l
%matplotlib inline from mpl_toolkits import mplot3d from mxnet import np, npx from d2l import mxnet as d2l npx.set_np()
%matplotlib inline import numpy as np import tensorflow as tf from mpl_toolkits import mplot3d from d2l import tensorflow as d2l
12.2.1。定义
在凸分析之前,我们需要定义凸集和凸函数。它们导致了通常应用于机器学习的数学工具。
12.2.1.1。凸集
集合是凸性的基础。简单的说,一套X 在向量空间中是凸的,如果对于任何a,b∈X 连接的线段a和b也在 X. 用数学术语来说,这意味着对于所有 λ∈[0,1]我们有
(12.2.1)λa+(1−λ)b∈Xwhenevera,b∈X.
这听起来有点抽象。考虑图 12.2.1。第一组不是凸的,因为存在不包含在其中的线段。其他两组没有这样的问题。
图 12.2.1第一组是非凸的,另外两组是凸的。
定义本身并不是特别有用,除非您可以对它们做些什么。在这种情况下,我们可以查看如图 12.2.2所示的交叉点。假使,假设X和 Y是凸集。然后 X∩Y也是凸的。要看到这一点,请考虑任何a,b∈X∩Y. 自从 X和Y是凸的,连接的线段a和b都包含在 X和Y. 鉴于此,它们还需要包含在X∩Y,从而证明了我们的定理。
图 12.2.2两个凸集的交集是凸的。
我们可以毫不费力地加强这个结果:给定凸集 Xi, 他们的交集∩iXi 是凸的。要看到相反的情况不成立,请考虑两个不相交的集合X∩Y=∅. 现在挑 a∈X和b∈Y. 图 12.2.3中的线段连接a和b 需要包含一些既不在X也不在 Y, 因为我们假设 X∩Y=∅. 因此线段不在X∪Y要么,从而证明通常凸集的并集不一定是凸的。
图 12.2.3两个凸集的并集不一定是凸集。
通常,深度学习中的问题是在凸集上定义的。例如,Rd, 的集合d维实数向量,是一个凸集(毕竟,在任何两点之间的线Rd留在Rd). 在某些情况下,我们使用有界长度的变量,例如半径为 r定义为 {x|x∈Rdand‖x‖≤r}.
12.2.1.2。凸函数
现在我们有了凸集,我们可以引入凸函数 f. 给定一个凸集X, 一个函数 f:X→R是凸的,如果对所有 x,x′∈X对于所有人λ∈[0,1]我们有
(12.2.2)λf(x)+(1−λ)f(x′)≥f(λx+(1−λ)x′).
为了说明这一点,让我们绘制一些函数并检查哪些函数满足要求。下面我们定义了几个函数,包括凸函数和非凸函数。
f = lambda x: 0.5 * x**2 # Convex g = lambda x: torch.cos(np.pi * x) # Nonconvex h = lambda x: torch.exp(0.5 * x) # Convex x, segment = torch.arange(-2, 2, 0.01), torch.tensor([-1.5, 1]) d2l.use_svg_display() _, axes = d2l.plt.subplots(1, 3, figsize=(9, 3)) for ax, func in zip(axes, [f, g, h]): d2l.plot([x, segment], [func(x), func(segment)], axes=ax)
f = lambda x: 0.5 * x**2 # Convex g = lambda x: np.cos(np.pi * x) # Nonconvex h = lambda x: np.exp(0.5 * x) # Convex x, segment = np.arange(-2, 2, 0.01), np.array([-1.5, 1]) d2l.use_svg_display() _, axes = d2l.plt.subplots(1, 3, figsize=(9, 3)) for ax, func in zip(axes, [f, g, h]): d2l.plot([x, segment], [func(x), func(segment)], axes=ax)
f = lambda x: 0.5 * x**2 # Convex g = lambda x: tf.cos(np.pi * x) # Nonconvex h = lambda x: tf.exp(0.5 * x) # Convex x, segment = tf.range(-2, 2, 0.01), tf.constant([-1.5, 1]) d2l.use_svg_display() _, axes = d2l.plt.subplots(1, 3, figsize=(9, 3)) for ax, func in zip(axes, [f, g, h]): d2l.plot([x, segment], [func(x), func(segment)], axes=ax)
正如预期的那样,余弦函数是非凸的,而抛物线和指数函数是。请注意,要求 X是一个凸集是使条件有意义所必需的。否则结果 f(λx+(1−λ)x′)可能没有明确定义。
12.2.1.3。詹森不等式
给定一个凸函数f,最有用的数学工具之一是詹森不等式。它相当于凸性定义的概括:
(12.2.3)∑iαif(xi)≥f(∑iαixi)andEX[f(X)]≥f(EX[X]),
在哪里αi是非负实数使得 ∑iαi=1和X是一个随机变量。换句话说,凸函数的期望不亚于期望的凸函数,后者通常是更简单的表达式。为了证明第一个不等式,我们一次重复将凸性的定义应用于总和中的一项。
Jensen 不等式的一个常见应用是用一个更简单的表达式来约束一个更复杂的表达式。例如,它的应用可以关于部分观察到的随机变量的对数似然。也就是说,我们使用
(12.2.4)EY∼P(Y)[−logP(X∣Y)]≥−logP(X),
自从∫P(Y)P(X∣Y)dY=P(X). 这可以用于变分法。这里Y通常是未观察到的随机变量,P(Y)是对它可能如何分布的最佳猜测,并且P(X)是分布Y整合出来。例如,在聚类Y可能是集群标签和 P(X∣Y)是应用集群标签时的生成模型。
12.2.2。特性
凸函数有许多有用的性质。我们在下面描述了一些常用的。
12.2.2.1。局部最小值是全局最小值
首先,凸函数的局部最小值也是全局最小值。我们可以用反证法证明如下。
考虑一个凸函数f定义在凸集上 X. 假设x∗∈X是局部最小值:存在一个小的正值p这样对于 x∈X满足 0<|x−x∗|≤p我们有f(x∗)
假设局部最小值x∗不是全局最小值f: 那里存在x′∈X为了哪个 f(x′)
然而,根据凸函数的定义,我们有
(12.2.5)f(λx∗+(1−λ)x′)≤λf(x∗)+(1−λ)f(x′)<λf(x∗)+(1−λ)f(x∗)=f(x∗),
这与我们的声明相矛盾x∗是局部最小值。因此,不存在x′∈X为了哪个f(x′)
例如,凸函数f(x)=(x−1)2有一个局部最小值x=1,这也是全局最小值。
凸函数的局部最小值也是全局最小值这一事实非常方便。这意味着如果我们最小化功能,我们就不会“卡住”。但是请注意,这并不意味着不能有一个以上的全局最小值,或者甚至可能存在一个。例如,函数f(x)=max(|x|−1,0) 在区间内达到最小值[−1,1]. 相反,函数f(x)=exp(x)没有达到最小值 R: 为了x→−∞它渐近于 0, 但没有x为了哪个f(x)=0.
12.2.2.2。下面的凸函数集是凸的
我们可以通过下面的一组凸函数方便地定义凸集。具体来说,给定一个凸函数f定义在凸集上X, 任何以下集合
(12.2.6)Sb=def{x|x∈Xandf(x)≤b}
是凸的。
让我们快速证明这一点。回想一下,对于任何 x,x′∈Sb我们需要证明 λx+(1−λ)x′∈Sb只要 λ∈[0,1]. 自从f(x)≤b和 f(x′)≤b, 根据凸性的定义我们有
(12.2.7)f(λx+(1−λ)x′)≤λf(x)+(1−λ)f(x′)≤b.
12.2.2.3。凸性和二阶导数
每当函数的二阶导数 f:Rn→R存在很容易检查是否f是凸的。我们需要做的就是检查 Hessian 是否f是半正定的: ∇2f⪰0,即表示Hessian矩阵 ∇2f经过H, x⊤Hx≥0对全部 x∈Rn. 例如,函数 f(x)=12‖x‖2是凸的,因为 ∇2f=1,即它的 Hessian 矩阵是一个单位矩阵。
形式上,一个二次可微分的一维函数 f:R→R是凸的当且仅当它的二阶导数f″≥0. 对于任何二次可微的多维函数 f:Rn→R, 它是凸的当且仅当它是 Hessian 矩阵∇2f⪰0.
首先,我们需要证明一维情况。看到的凸性f暗示f″≥0我们使用这样的事实
(12.2.8)12f(x+ϵ)+12f(x−ϵ)≥f(x+ϵ2+x−ϵ2)=f(x).
由于二阶导数由有限差分的极限给出,因此
(12.2.9)f″(x)=limϵ→0f(x+ϵ)+f(x−ϵ)−2f(x)ϵ2≥0.
看到那个f″≥0暗示f是凸的,我们使用这个事实f″≥0暗示f′是单调非递减函数。让a
(12.2.10)f′(α)=f(x)−f(a)x−aandf′(β)=f(b)−f(x)b−x.
通过单调性f′(β)≥f′(α), 因此
(12.2.11)x−ab−af(b)+b−xb−af(a)≥f(x).
自从x=(1−λ)a+λb, 我们有
(12.2.12)λf(b)+(1−λ)f(a)≥f((1−λ)a+λb),
从而证明凸性。
其次,在证明多维情况之前我们需要一个引理: f:Rn→R是凸的当且仅当对所有x,y∈Rn
(12.2.13)g(z)=deff(zx+(1−z)y)wherez∈[0,1]
是凸的。
为了证明凸性f暗示g是凸的,我们可以证明对于所有a,b,λ∈[0,1](因此 0≤λa+(1−λ)b≤1)
(12.2.14)g(λa+(1−λ)b)=f((λa+(1−λ)b)x+(1−λa−(1−λ)b)y)=f(λ(ax+(1−a)y)+(1−λ)(bx+(1−b)y))≤λf(ax+(1−a)y)+(1−λ)f(bx+(1−b)y)=λg(a)+(1−λ)g(b).
为了证明相反的情况,我们可以证明对于所有 λ∈[0,1]
(12.2.15)f(λx+(1−λ)y)=g(λ⋅1+(1−λ)⋅0)≤λg(1)+(1−λ)g(0)=λf(x)+(1−λ)f(y).
最后,利用上面的引理和一维情况的结果,多维情况可以证明如下。多维函数 f:Rn→R是凸的当且仅当对所有x,y∈Rn g(z)=deff(zx+(1−z)y), 在哪里z∈[0,1], 是凸的。根据一维情况,这成立当且仅当 g″=(x−y)⊤H(x−y)≥0 (H=def∇2f) 对全部 x,y∈Rn,相当于 H⪰0根据半正定矩阵的定义。
12.2.3。约束条件
凸优化的一个很好的特性是它允许我们有效地处理约束。也就是说,它允许我们解决 以下形式的约束优化问题:
(12.2.16)minimizexf(x)subject toci(x)≤0for alli∈{1,…,n},
在哪里f是目标和功能ci是约束函数。看看这确实考虑了以下情况 c1(x)=‖x‖2−1. 在这种情况下,参数x被限制在单位球内。如果第二个约束是 c2(x)=v⊤x+b,那么这对应于所有x躺在半空间上。同时满足这两个约束相当于选择球的一部分。
12.2.3.1。拉格朗日量
通常,解决约束优化问题很困难。解决这个问题的一种方法来自物理学,具有相当简单的直觉。想象一个盒子里的球。球将滚动到最低的位置,重力将与盒子侧面可以施加在球上的力平衡。简而言之,目标函数(即重力)的梯度将被约束函数的梯度所抵消(由于墙壁“推回”,球需要留在盒子内)。请注意,某些约束可能未激活:球未接触的墙壁将无法对球施加任何力。
跳过拉格朗日量的推导 L,上述推理可以通过以下鞍点优化问题来表达:
(12.2.17)L(x,α1,…,αn)=f(x)+∑i=1nαici(x)whereαi≥0.
这里的变量αi(i=1,…,n) 是所谓的拉格朗日乘数,可确保正确执行约束。它们被选择得足够大以确保 ci(x)≤0对全部i. 例如,对于任何 x在哪里ci(x)<0自然地,我们最终会选择αi=0. 此外,这是一个想要最大化的鞍点优化问题 L关于所有αi并同时将其最小化x. 有大量的文献解释了如何达到这个功能 L(x,α1,…,αn). 为了我们的目的,知道鞍点就足够了L是原始约束优化问题得到最优解的地方。
12.2.3.2。处罚
至少近似满足约束优化问题的一种方法 是采用拉格朗日量L. 而不是满足ci(x)≤0我们只需添加 αici(x)到目标函数f(x). 这确保了约束不会被严重违反。
事实上,我们一直在使用这个技巧。考虑第 3.7 节中的权重衰减。在其中我们添加 λ2‖w‖2到目标函数以确保w不会长得太大。从约束优化的角度我们可以看出,这将确保‖w‖2−r2≤0对于一些半径r. 调整值λ允许我们改变大小 w.
通常,添加惩罚项是确保近似约束满足的好方法。在实践中,这比完全满意更稳健。此外,对于非凸问题,许多使精确方法在凸情况下如此有吸引力的属性(例如,最优性)不再成立。
12.2.3.3。预测
满足约束的另一种策略是预测。同样,我们以前遇到过它们,例如,在9.5 节中处理梯度裁剪时。在那里我们确保梯度的长度为θ通过
(12.2.18)g←g⋅min(1,θ/‖g‖).
这原来是一个投影g到半径球上θ. 更一般地,凸集上的投影 X定义为
(12.2.19)ProjX(x)=argminx′∈X‖x−x′‖,
这是最近的点X到x.
图 12.2.4凸投影。
投影的数学定义听起来有点抽象。 图 12.2.4解释得更清楚一些。其中有两个凸集,一个圆和一个菱形。两组(黄色)内的点在投影期间保持不变。两个集合外的点(黑色)被投影到集合内最接近原始点(黑色)的点(红色)。而对于ℓ2球这会使方向保持不变,一般情况下不必如此,正如在菱形的情况下所看到的那样。
凸投影的用途之一是计算稀疏权重向量。在这种情况下,我们将权重向量投影到ℓ1球,这是图 12.2.4 中菱形情况的一般化版本 。
12.2.4。概括
在深度学习的背景下,凸函数的主要目的是激发优化算法并帮助我们详细理解它们。下面我们将看到梯度下降和随机梯度下降是如何相应推导出来的。
凸集的交集是凸的。工会不是。
凸函数的期望不亚于期望的凸函数(詹森不等式)。
当且仅当它的 Hessian(二阶导数矩阵)是半正定的时,二次可微函数是凸函数。
可以通过拉格朗日添加凸约束。在实践中,我们可以简单地将它们与对目标函数的惩罚相加。
投影映射到凸集中最接近原始点的点。
12.2.5。练习
假设我们要通过在集合内的点之间绘制所有线并检查是否包含这些线来验证集合的凸性。
证明仅检查边界上的点就足够了。
证明仅检查集合的顶点就足够了。
表示为 Bp[r]=def{x|x∈Rdand‖x‖p≤r} 半径球r使用p-规范。证明 Bp[r]对所有人都是凸的p≥1.
给定凸函数f和g, 显示 max(f,g)也是凸的 证明 min(f,g)不是凸的。
证明softmax函数的归一化是凸的。更具体地证明的凸性 f(x)=log∑iexp(xi).
证明线性子空间,即 X={x|Wx=b}, 是凸集。
证明在线性子空间的情况下 b=0投影 ProjX可以写成 Mx对于一些矩阵M.
表明对于二次可微凸函数f我们可以写 f(x+ϵ)=f(x)+ϵf′(x)+12ϵ2f″(x+ξ) 对于一些ξ∈[0,ϵ].
给定一个凸集X和两个向量 x和y,证明投影永远不会增加距离,即 ‖x−y‖≥‖ProjX(x)−ProjX(y)‖.
Discussions
f = lambda x: (x - 1) ** 2
d2l.set_figsize()
d2l.plot([x, segment], [f(x), f(segment)], 'x', 'f(x)')
f = lambda x: (x - 1) ** 2
d2l.set_figsize()
d2l.plot([x, segment], [f(x), f(segment)], 'x', 'f(x)')
f = lambda x: (x - 1) ** 2
d2l.set_figsize()
d2l.plot([x, segment], [f(x), f(segment)], 'x', 'f(x)')
-
pytorch
+关注
关注
2文章
808浏览量
13216
发布评论请先 登录
相关推荐
评论