动手学深度学习11.2. 凸性-笔记练习(PyTorch)
本节课程地址:72 优化算法【动手学深度学习v2】_哔哩哔哩_bilibili
本节教材地址:11.2. 凸性 — 动手学深度学习 2.0.0 documentation
本节开源代码:...>d2l-zh>pytorch>chapter_multilayer-perceptrons>convexity.ipynb
凸性
凸性(convexity)在优化算法的设计中起到至关重要的作用, 这主要是由于在这种情况下对算法进行分析和测试要容易。 换言之,如果算法在凸性条件设定下的效果很差, 那通常我们很难在其他条件下看到好的结果。 此外,即使深度学习中的优化问题通常是非凸的, 它们也经常在局部极小值附近表现出一些凸性。 这可能会产生一些像 ("https://zh-v2.d2l.ai/chapter_references/zreferences.html#id76">Izmailovet al., 2018)这样比较有意思的新优化变体。
%matplotlib inline
import numpy as np
import torch
from mpl_toolkits import mplot3d
from d2l import torch as d2l
定义
在进行凸分析之前,我们需要定义凸集(convex sets)和凸函数(convex functions)。
凸集
凸集(convex set)是凸性的基础。 简单地说,如果对于任何 ,连接 和 的线段也位于 中,则向量空间中的一个集合 是凸(convex)的。 在数学术语上,这意味着对于所有 ,我们得到
当 (11.2.1)
这听起来有点抽象,那我们来看一下 图11.2.1里的例子。 第一组存在不包含在集合内部的线段,所以该集合是非凸的,而另外两组则没有这样的问题。
接下来来看一下交集 图11.2.2 。 假设 和 是凸集,那么 也是凸集的。 现在考虑任意 , 因为 和 是凸集, 所以连接 和 的线段包含在 和 中。 鉴于此,它们也需要包含在 中,从而证明我们的定理。
我们可以毫不费力地进一步得到这样的结果: 给定凸集 ,它们的交集 是凸的。 但是反向是不正确的,考虑两个不相交的集合 , 取 和 。 因为我们假设 , 在 图11.2.3 中连接 和 的线段需要包含一部分既不在 也不在 中。 因此线段也不在 中,因此证明了凸集的并集不一定是凸的,即非凸(nonconvex)的。
通常,深度学习中的问题是在凸集上定义的。 例如, ,即实数的 -维向量的集合是凸集(毕竟 中任意两点之间的线存在 )中。 在某些情况下,我们使用有界长度的变量,例如球的半径定义为{ 且}。
凸函数
现在我们有了凸集,我们可以引入凸函数(convex function) 。 给定一个凸集 ,如果对于所有 和所有 ,函数 是凸的,我们可以得到
(11.2.2)
补充:
可以更直观地理解为,在函数 的图像上取任意两点 和 ,连接这两点的线段完全位于函数图像的上方或在图像上。这意味着,对于这两点间的任何点 ,函数值 都不会超过这两点函数值的加权平均。
为了说明这一点,让我们绘制一些函数并检查哪些函数满足要求。 下面我们定义一些函数,包括凸函数和非凸函数。
f = lambda x: 0.5 * x**2 # 凸函数
g = lambda x: torch.cos(np.pi * x) # 非凸函数
h = lambda x: torch.exp(0.5 * x) # 凸函数
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)
不出所料,余弦函数为非凸的,而抛物线函数和指数函数为凸的。 请注意,为使该条件有意义, 是凸集的要求是必要的。 否则可能无法很好地界定 的结果。
詹森不等式
给定一个凸函数 ,最有用的数学工具之一就是詹森不等式(Jensen's inequality)。 它是凸性定义的一种推广:
(11.2.3)
其中 是满足 的非负实数, 是随机变量。 换句话说,凸函数的期望不小于期望的凸函数,其中后者通常是一个更简单的表达式。 为了证明第一个不等式,我们多次将凸性的定义应用于一次求和中的一项。
补充:
可以理解为,对于凸函数,函数在随机变量 上的期望值不小于 期望值处的函数值。
詹森不等式的一个常见应用:用一个较简单的表达式约束一个较复杂的表达式。 例如,它可以应用于部分观察到的随机变量的对数似然。 具体地说,由于 ,所以
(11.2.4)
这里, 是典型的未观察到的随机变量, 是它可能如何分布的最佳猜测, 是将 积分后的分布。 例如,在聚类中 可能是簇标签,而在应用簇标签时, 是生成模型。
性质
下面我们来看一下凸函数一些有趣的性质。
局部极小值是全局极小值
首先凸函数的局部极小值也是全局极小值。 下面我们用反证法给出证明。
假设 是一个局部最小值,则存在一个很小的正值 ,使得当 满足 时,有 。
现在假设局部极小值 不是 的全局极小值:存在 使得 。 则存在 ,比如 ,使得 。
然而,根据凸性的性质,有
(11.2.5)
这与 是局部最小值相矛盾。 因此,不存在 满足 。 综上所述,局部最小值 也是全局最小值。
例如,对于凸函数 ,有一个局部最小值 ,它也是全局最小值。
f = lambda x: (x - 1) ** 2
d2l.set_figsize()
d2l.plot([x, segment], [f(x), f(segment)], 'x', 'f(x)')
凸函数的局部极小值同时也是全局极小值这一性质是很方便的。 这意味着如果我们最小化函数,我们就不会“卡住”。 但是请注意,这并不意味着不能有多个全局最小值,或者可能不存在一个全局最小值。 例如,函数 在 区间上都是最小值。 相反,函数 在 上没有取得最小值。对于 ,它趋近于 0 ,但是没有 的 。
凸函数的下水平集是凸的
我们可以方便地通过凸函数的下水平集(below sets)定义凸集。 具体来说,给定一个定义在凸集 上的凸函数 ,其任意一个下水平集
(11.2.6)
是凸的。
让我们快速证明一下。 对于任何 ,我们需要证明:当 时, 。 因为 且 ,所以
(11.2.7)
凸性和二阶导数
当一个函数的二阶导数 存在时,我们很容易检查这个函数的凸性。 我们需要做的就是检查 , 即对于所有 , . 例如,函数 是凸的,因为 ,即其导数是单位矩阵。
更正式地讲, 为凸函数,当且仅当任意二次可微一维函数 是凸的。 对于任意二次可微多维函数 , 它是凸的当且仅当它的Hessian 。
首先,我们来证明一下一维情况。 为了证明凸函数的 ,我们使用:
(11.2.8)
因为二阶导数是由有限差分的极限给出的,所以遵循
(11.2.9)
为了证明 可以推导 是凸的, 我们使用这样一个事实: 意味着 是一个单调的非递减函数。 假设 是 中的三个点, 其中, 且 . 根据中值定理,存在 , ,使得
且 (11.2.10)
通过单调性 ,因此
(11.2.11)
由于 ,所以
(11.2.12)
从而证明了凸性。
第二,我们需要一个引理证明多维情况: 是凸的当且仅当对于所有
(11.2.13)
是凸的。
为了证明 的凸性意味着 是凸的, 我们可以证明,对于所有的 (这样有 ),
(11.2.14)
为了证明这一点,我们可以证明对 中所有的 :
(11.2.15)
最后,利用上面的引理和一维情况的结果,我们可以证明多维情况: 多维函数 是凸函数,当且仅当 是凸的,这里 , 。 根据一维情况, 此条成立的条件为,当且仅当对于所有 , ()。 这相当于根据半正定矩阵的定义, 。
补充:
1. Hessian矩阵:在多维情况下,函数 的Hessian矩阵 是一个二阶偏导数构成的方阵,即 。Hessian矩阵提供了函数在各个方向上的曲率信息。
2. 半正定矩阵:如果对于所有非零向量 ,都有 ,则称矩阵 是半正定的。这意味着Hessian矩阵在任何方向上的二次型都是非负的。
3. 凸性条件:根据上述定义,如果Hessian矩阵 对所有 都是半正定的,即 ,那么函数 是凸的。这是因为半正定的Hessian矩阵保证了函数在任何方向上的曲率都是非负的,这与一维情况下二阶导数非负的条件是一致的。
约束
凸优化的一个很好的特性是能够让我们有效地处理约束(constraints)。 即它使我们能够解决以下形式的约束优化(constrained optimization)问题:
(11.2.16)
这里 是目标函数, 是约束函数。 例如第一个约束 ,则参数 被限制为单位球。 如果第二个约束 ,那么这对应于半空间上所有的 。 同时满足这两个约束等于选择一个球的切片作为约束集。
拉格朗日函数
通常,求解一个有约束的优化问题是困难的,解决这个问题的一种方法来自物理中相当简单的直觉。 想象一个球在一个盒子里,球会滚到最低的地方,重力将与盒子两侧对球施加的力平衡。 简而言之,目标函数(即重力)的梯度将被约束函数的梯度所抵消(由于墙壁的“推回”作用,需要保持在盒子内)。 请注意,任何不起作用的约束(即球不接触壁)都将无法对球施加任何力。
这里我们简略拉格朗日函数 的推导,上述推理可以通过以下鞍点优化问题来表示:
(11.2.17)
这里的变量 ( )是所谓的拉格朗日乘数(Lagrange multipliers),它确保约束被正确地执行。 选择它们的大小足以确保所有 的 。 例如,对于 中任意 ,我们最终会选择 。 此外,这是一个鞍点(saddlepoint)优化问题。 在这个问题中,我们想要使 相对于 最大化(maximize),同时使它相对于 最小化(minimize)。 有大量的文献解释如何得出函数 。 我们这里只需要知道 的鞍点是原始约束优化问题的最优解就足够了。
惩罚
一种至少近似地满足约束优化问题的方法是采用拉格朗日函数 。除了满足 之外,我们只需将 添加到目标函数 。 这样可以确保不会严重违反约束。
事实上,我们一直在使用这个技巧。 比如权重衰减 4.5节,在目标函数中加入 ,以确保 不会增长太大。 使用约束优化的观点,我们可以看到,对于若干半径 ,这将确保 。 通过调整 的值,我们可以改变 的大小。
通常,添加惩罚是确保近似满足约束的一种好方法。 在实践中,这被证明比精确的满意度更可靠。 此外,对于非凸问题,许多使精确方法在凸情况下的性质(例如,可求最优解)不再成立。
投影
满足约束条件的另一种策略是投影(projections)。 同样,我们之前也遇到过,例如在 8.5节 中处理梯度截断时,我们通过
(11.2.18)
确保梯度的长度以 为界限。
这就是 在半径为 的球上的投影(projection)。 更泛化地说,在凸集 上的投影被定义为
(11.2.19)
它是 中离 最近的点。
投影的数学定义听起来可能有点抽象,为了解释得更清楚一些,请看 图11.2.4 。 图中有两个凸集,一个圆和一个菱形。 两个集合内的点(黄色)在投影期间保持不变。 两个集合(黑色)之外的点投影到集合中接近原始点(黑色)的点(红色)。 虽然对 的球面来说,方向保持不变,但一般情况下不需要这样。
凸投影的一个用途是计算稀疏权重向量。 在本例中,我们将权重向量投影到一个 的球上, 这是 图11.2.4 中菱形例子的一个广义版本。
小结
在深度学习的背景下,凸函数的主要目的是帮助我们详细了解优化算法。 我们由此得出梯度下降法和随机梯度下降法是如何相应推导出来的。
- 凸集的交集是凸的,并集不是。
- 根据詹森不等式,“一个多变量凸函数的总期望值”大于或等于“用每个变量的期望值计算这个函数的总值“。
- 一个二次可微函数是凸函数,当且仅当其Hessian(二阶导数矩阵)是半正定的。
- 凸约束可以通过拉格朗日函数来添加。在实践中,只需在目标函数中加上一个惩罚就可以了。
- 投影映射到凸集中最接近原始点的点。
练习
- 假设我们想要通过绘制集合内点之间的所有直线并检查这些直线是否包含来验证集合的凸性。i.证明只检查边界上的点是充分的。ii.证明只检查集合的顶点是充分的。
解:
i)设集合 为凸集,则对于任意两点 和所有 ,点 。
那么考虑 和 是两个边界点,则 边界上任意两点之间的点 都在 内。
由于边界上的点定义了 的“形状”,如果边界上的线段都在集合内,那么集合内部的点之间的线段也必然在集合内,因为它们位于边界点连线的内侧。
因此,只要边界上的点之间的所有线段都包含在集合内,就可以推断出集合X是凸集。即证,只检查边界上的点是充分的。
ii)顶点是集合 的一个特殊边界点,在有限维空间中,凸集的顶点是边界上那些不能被表示为其他边界点凸组合的点。如果一个凸集 的所有顶点之间的线段都包含在 内,那么根据凸集的定义,这些线段上的所有点也都在 内。由于顶点是凸集边界上最“极端”的点,任何集合内的点都可以看作是顶点以及可能的其他点的凸组合。因此,如果顶点之间的线段都是凸的,那么由顶点以及顶点的凸组合形成的线段也将是凸的。即证,只检查集合的顶点是充分的。 - 用 -范数表示半径为 的球,证明 , 对于所有 是凸的。
解:
证明 , 对于所有 是凸的,即是证明对于任意 和 :
闵可夫斯基不等式表明对于任意向量 和 ,有:
应用闵可夫斯基不等式可得:
由于 -范数是齐次的,则有:
和
代入并简化可得:
因此,对于任意 和 ,点 。
即证以 -范数定义的半径为 的球 对于所有 是凸的。 - 已知凸函数 和 表明 也是凸函数。证明 是非凸的。
解:
反例法证明 是非凸的,如下:
设凸函数 和 为:
若 为凸函数,则对于所有 和 ,以下不等式成立:
设 和 ,有:
当时:
由上可见:
因此不是一个凸函数。
即证,即使 和 是凸函数, 也可能是非凸的。 - 证明Softmax函数的规范化是凸的,即 的凸性。
解:
要证明函数 是凸的,即证明Hessian矩阵是半正定的。
对 的一阶导数是:
对 和 的二阶导数是:
对上式使用商规则,可得:
其中 是克罗内克函数,当 时为1,否则为0。
Hessian矩阵是二阶偏导数的矩阵,即:
证明 是半正定的,即是要证明对于任何向量 ,。
由于任何实数的平方都是非负的,所以:
因此,Hessian矩阵是半正定的,即证softmax函数 是凸的。 - 证明线性子空间 是凸集。
解:
证明线性子空间 是凸集,即是证明对于任意两点 和任意,点 也在 内,即:
上式代入 和 ,得:
因此,,
即证线性子空间 是凸集。 - 证明在线性子空间 的情况下,对于矩阵 的投影 可以写成 。
解:
当 时,意味着 是通过原点的子空间,则投影操作不会涉及到额外的平移。
投影矩阵 可以将任何向量投影到子空间 上,对于列向量 , 给出了 中每列向量在 上的投影。
具体来说,假设,其中每个 是 的一列,并且 是到 的投影矩阵。则 可以写作: 上式中的每一项 就是向量 在 上的投影。因此, 的结果是一个新矩阵,其列向量分别是原矩阵 的列向量在 上的投影。 - 证明对于凸二次可微函数 ,对于 ,我们可以写成 。
解:
对于凸二次可微函数f进行二阶泰勒展开:
其中 , 表示当 时比 更高阶的小量,可忽略。
根据拉格朗日中值定理,上式中的 可以写成 的形式,其中 。因此,上式可以改写为:
因为,所以x+ξϵ落在区间 内。将 重新标记为 ,那么 就落在 内,即证对于,有: - 给定一个凸集 和两个向量 和 证明了投影不会增加距离,即 。
解:
根据投影的非扩张性,对于任何点 和 及其在X上的投影 和 ,有
令上式中的 和 ,则有:
即证对于任意的 和 以及凸集 ,投影操作不会增加两点之间的距离。这表明投影是一种非扩张映射,保持或减少了原始空间中点对之间的距离。