0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

PyTorch教程-12.2. 凸度

jf_pJlTbmA9 来源:PyTorch 作者:PyTorch 2023-06-05 15:44 次阅读

凸性在优化算法的设计中起着至关重要的作用。这主要是因为在这种情况下分析和测试算法要容易得多。换句话说,如果算法即使在凸设置中也表现不佳,通常我们不应该希望在其他情况下看到很好的结果。此外,尽管深度学习中的优化问题通常是非凸的,但它们通常在局部最小值附近表现出凸问题的某些性质。这可能会导致令人兴奋的新优化变体,例如 ( 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。第一组不是凸的,因为存在不包含在其中的线段。其他两组没有这样的问题。

poYBAGR9ONiAbXl9AAAV34UF81I581.svg

图 12.2.1第一组是非凸的,另外两组是凸的。

定义本身并不是特别有用,除非您可以对它们做些什么。在这种情况下,我们可以查看如图 12.2.2所示的交叉点。假使,假设X和 Y是凸集。然后 X∩Y也是凸的。要看到这一点,请考虑任何a,b∈X∩Y. 自从 X和Y是凸的,连接的线段a和b都包含在 X和Y. 鉴于此,它们还需要包含在X∩Y,从而证明了我们的定理。

poYBAGR9ONmADqyeAAAltXQlkkc338.svg

图 12.2.2两个凸集的交集是凸的。

我们可以毫不费力地加强这个结果:给定凸集 Xi, 他们的交集∩iXi 是凸的。要看到相反的情况不成立,请考虑两个不相交的集合X∩Y=∅. 现在挑 a∈X和b∈Y. 图 12.2.3中的线段连接a和b 需要包含一些既不在X也不在 Y, 因为我们假设 X∩Y=∅. 因此线段不在X∪Y要么,从而证明通常凸集的并集不一定是凸的。

poYBAGR9ONuAbQvuAAAPn5BHPpQ030.svg

图 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)

poYBAGR9ON2AQ3x2AAEdZcGg_Ic222.svg

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)

pYYBAGR9OOGAVHsEAAEdYlf0Wgc651.svg

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)

poYBAGR9OOOAfZSDAAEdZFpHdcc629.svg

正如预期的那样,余弦函数是非凸的,而抛物线和指数函数是。请注意,要求 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)[−log⁡P(X∣Y)]≥−log⁡P(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 = lambda x: (x - 1) ** 2
d2l.set_figsize()
d2l.plot([x, segment], [f(x), f(segment)], 'x', 'f(x)')

pYYBAGR9OOWAYs-hAABbSxSSZlo899.svg

f = lambda x: (x - 1) ** 2
d2l.set_figsize()
d2l.plot([x, segment], [f(x), f(segment)], 'x', 'f(x)')

pYYBAGR9OOWAYs-hAABbSxSSZlo899.svg

f = lambda x: (x - 1) ** 2
d2l.set_figsize()
d2l.plot([x, segment], [f(x), f(segment)], 'x', 'f(x)')

poYBAGR9OOqANuAOAABbUB9D4XE191.svg

凸函数的局部最小值也是全局最小值这一事实非常方便。这意味着如果我们最小化功能,我们就不会“卡住”。但是请注意,这并不意味着不能有一个以上的全局最小值,或者甚至可能存在一个。例如,函数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.

pYYBAGR9OOyAclEnAAASJvLk7Go503.svg

图 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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • pytorch
    +关注

    关注

    2

    文章

    764

    浏览量

    12836
收藏 人收藏

    评论

    相关推荐

    在Linux中安装12.2 ISE怎么启动

    我已经下载并成功运行.xsetup到Debian lenny但现在我在终端输入:/opt/Xilinx/12.2/ISE_DS# source settings32.sh/ bin / ls
    发表于 12-07 11:09

    Pytorch模型训练实用PDF教程【中文】

    ?模型部分?还是优化器?只有这样不断的通过可视化诊断你的模型,不断的对症下药,才能训练出一个较满意的模型。本教程内容及结构:本教程内容主要为在 PyTorch 中训练一个模型所可能涉及到的方法及函数,并且
    发表于 12-21 09:18

    ISE 12.2读取UCF文件,但所有输入节点都断开连接

    strange problems with ISE 12.2. (1) It seems to read UCF files but all the input nodes
    发表于 06-10 13:38

    为什么BRAM无法在最新的ISE 14.7中初始化文件但在ISE 12.2中工作正常?

    targeting the spartan-6 (LX45) that has been working with no problems being built in ISE 12.2.
    发表于 07-12 15:10

    Pytorch自动求导示例

    Pytorch自动微分的几个例子
    发表于 08-09 11:56

    Pytorch入门之的基本操作

    Pytorch入门之基本操作
    发表于 05-22 17:15

    PyTorch如何入门

    PyTorch 入门实战(一)——Tensor
    发表于 06-01 09:58

    PyTorch10的基础教程

    PyTorch 10 基础教程(4):训练分类器
    发表于 06-05 17:42

    Pytorch AI语音助手

    想做一个Pytorch AI语音助手,有没有好的思路呀?
    发表于 03-06 13:00

    如何安装TensorFlow2 Pytorch

    如何安装TensorFlow2 Pytorch
    发表于 03-07 07:32

    如何往星光2板子里装pytorch

    如题,想先gpu版本的pytorch只安装cpu版本的pytorch,pytorch官网提供了基于conda和pip两种安装方式。因为咱是risc架构没对应的conda,而使用pip安装提示也没有
    发表于 09-12 06:30

    pytorch模型转换需要注意的事项有哪些?

    什么是JIT(torch.jit)? 答:JIT(Just-In-Time)是一组编译工具,用于弥合PyTorch研究与生产之间的差距。它允许创建可以在不依赖Python解释器的情况下运行的模型
    发表于 09-18 08:05

    iOS 12.2.首个测试版中,已经暗示了苹果即将发布的新品

    现在有开发者Steve Troughton-Smith在推特上发文称,iOS 12.2.首个测试版中,已经暗示了苹果即将发布的新品,其中包含了新iPad,而且是有四个型号。
    的头像 发表于 01-28 14:51 4074次阅读

    基于PyTorch的深度学习入门教程之PyTorch简单知识

    本文参考PyTorch官网的教程,分为五个基本模块来介绍PyTorch。为了避免文章过长,这五个模块分别在五篇博文中介绍。 Part1:PyTorch简单知识 Part2:PyTorch
    的头像 发表于 02-16 15:20 2010次阅读

    PyTorch教程12.2凸度

    电子发烧友网站提供《PyTorch教程12.2凸度.pdf》资料免费下载
    发表于 06-05 14:57 0次下载
    <b class='flag-5'>PyTorch</b>教程<b class='flag-5'>12.2</b>之<b class='flag-5'>凸度</b>