当前位置: 首页 > news >正文

【计算机视觉|生成对抗】生成对抗网络(GAN)

本系列博文为深度学习/计算机视觉论文笔记,转载请注明出处

标题:Generative Adversarial Nets

链接:Generative Adversarial Nets (nips.cc)

摘要

我们提出了一个通过**对抗(adversarial)**过程估计生成模型的新框架,在其中我们同时训练两个模型:

  • 一个生成模型G,捕获数据分布

  • 一个判别模型D,估计样本来自训练数据还是G的概率。

G的训练过程是最大化D犯错误的概率。

该框架对应于一个极小极大的两人博弈。

在任意函数G和D的空间中,存在一个唯一解决方案,G恢复训练数据分布,D在任何地方都等于1/2。在G和D由多层感知机定义的情况下,可以通过反向传播训练整个系统。在训练或生成样本期间,不需要任何马尔可夫链或展开的近似推理网络。

实验通过生成样本的定性和定量评估展示了该框架的潜力。

1 引言

深度学习的作用是发现丰富的、层次化的模型[2],它们表示人工智能应用中遇到的数据类型的概率分布,例如自然图像、包含语音的音频波形和自然语言语料库中的符号。

到目前为止,深度学习最引人注目的成功涉及判别模型,通常是将高维、丰富的感觉输入映射到类标签[14, 20]的模型。这些引人注目的成功主要基于反向传播和随机失活算法,使用分段线性单元[17, 8, 9],它们具有特别良好的梯度行为。

深度生成模型的影响较小,这是由于在最大似然估计和相关策略中出现的许多难 以近似的概率计算,以及在生成环境中难以利用分段线性单元的好处所造成的。我们提出了一种新的生成模型估计过程,可以避开这些困难。1

在所提出的对抗网络框架中,生成模型与一个敌手相对立:

  • 一个判别模型,学会判断样本是来自模型分布还是数据分布。生成模型可以被看作与一组伪造者相类似,试图生产假货币并在不被检测的情况下使用它

  • 判别模型则与警察相类似,试图检测伪造货币

这个游戏中的竞争推动两个团队改进其方法,直到伪造品与真品无法区分。

该框架可以为许多种模型和优化算法产生特定的训练算法。

在本文中,我们探讨了生成模型通过多层感知机(MLP)传递随机噪声生成样本,而判别模型也是多层感知机的特殊情况。我们将此特殊情况称为对抗网络(adversarial nets)。

在这种情况下,我们可以仅使用高度成功的反向传播和随机失活算法[17]来训练两个模型,并仅使用前向传播从生成模型中抽样。不需要近似推断或马尔可夫链。

2 相关工作

直到现在,深度生成模型的大部分工作都集中在提供有规范参数的概率分布函数,然后可以通过最大化对数似然函数来训练模型上。

  • 在这类模型中,可能最成功的是深度玻尔兹曼机(deep Boltzmann machine)[25]。
  • 这类模型通常具有难以处理的似然函数,因此需要对似然梯度进行多次近似。

这些困难促使“生成机(generative machines)”模型的发展——

  • 这些模型不显式地表示似然函数,但能够从所需分布中生成样本。

  • 生成随机网络[4]就是一个生成机的例子,它可以通过精确的反向传播进行训练,而不需要像玻尔兹曼机那样进行多次近似。

本文通过消除生成随机网络中使用的马尔可夫链,扩展了生成机的思想

我们的工作通过利用以下观察,利用生成过程进行导数的反向传播:
lim ⁡ σ → 0 ∇ x E ϵ ∼ N ( 0 , σ 2 I ) f ( x + ϵ ) = ∇ x f ( x ) \lim_{\sigma\rightarrow0}\nabla_{\pmb{x}}\mathbb{E}_{\epsilon\sim\mathcal{N}(0,\sigma^{2}\pmb{I})}f(\pmb{x}+\epsilon)=\nabla_{\pmb{x}}f(\pmb{x}) σ0limxEϵN(0,σ2I)f(x+ϵ)=xf(x)

译者注:上述公式的意思是对 f f f的期望求导等价于对 f f f自己求导,这也是为什么作者会利用误差的反向传递对GAN进行求解

当时,我们不知道Kingma和Welling [18]以及Rezende等人[23]已经开发了更通用的随机反向传播规则,可以通过有限方差的高斯分布进行反向传播,并且可以反向传播到协方差参数以及均值参数

  • 这些反向传播规则可以让我们学习生成器的条件方差,在本文中我们将其视为超参数。

Kingma和Welling [18]以及Rezende等人[23]使用随机反向传播来训练变分自动编码器(variational autoencoders,VAEs)。

  • 与GAN不同,VAE将一个可微分的生成器网络与第二个神经网络配对。

  • 不同于GAN,VAE中的第二个网络是一个执行近似推断的识别模型。

  • GAN需要通过可见单元进行微分,因此无法对离散数据建模,而VAE需要通过隐藏单元进行微分,因此无法具有离散潜变量。

还存在其他类似VAE的方法[12, 22],但与我们的方法关联性较小。

先前的工作也采用了使用判别标准来训练生成模型的方法[29, 13]。这些方法对于深度生成模型来说是难以处理的,因为它们涉及概率的比值,而这些比值不能通过将概率下界的变分近似进行近似来处理。

噪声对比估计(Noise-contrastive estimation,NCE)[13]涉及通过学习使模型对来自固定噪声分布的数据具有区分性的权重来训练生成模型。

  • 使用先前训练过的模型作为噪声分布允许训练一系列质量逐渐提高的模型。这可以看作是一种非正式的竞争机制,类似于对抗网络游戏中使用的正式竞争机制。

  • NCE的关键局限在于其“鉴别器(discriminator)”是由噪声分布和模型分布的概率密度比率定义的,因此需要能够评估并反向传播这两个密度。

先前的工作使用了两个神经网络相互竞争的一般概念。最相关的工作是可预测性最小化(predictability minimization,下称PM)[26]。在可预测性最小化中,神经网络中的每个隐藏单元被训练得与第二个网络的输出不同,而这第二个网络根据所有其他隐藏单元的值来预测该隐藏单元的值。

译者注:可预测性最小化是一种神经网络训练方法,旨在使隐藏单元在给定其他隐藏单元的值的情况下与另一个网络的输出不同。具体而言,第二个网络会预测某个隐藏单元的值,而这个隐藏单元是在网络中的一个特定部分。通过训练隐藏单元与预测的值不同,可预测性最小化试图确保网络的隐藏表示在进行某项任务时具有统计上的独立性。这有助于提高网络的表达能力和泛化性能。

本文与可预测性最小化有三个重要的区别:

  1. 在本文中,**网络之间的竞争是唯一的训练准则,**足以训练网络。可预测性最小化只是一种鼓励神经网络的隐藏单元在完成其他任务的同时具有统计独立性的正则化器,它不是主要的训练准则。

  2. 竞争的性质是不同的。在可预测性最小化中,比较了两个网络的输出,其中一个网络试图使输出相似,而另一个网络试图使输出不同。所涉及的输出是一个单一标量。在GAN中,一个网络产生一个丰富的高维向量,用作另一个网络的输入,并试图得出一个另一个网络不知道如何处理的输入。

  3. 学习过程的规范是不同的。可预测性最小化被描述为一个要最小化的目标函数的优化问题,学习接近目标函数的最小值。**GAN基于极小极大博弈而不是优化问题,并且具有一个值函数,其中一个代理试图最大化,而另一个代理试图最小化。**游戏在一个鞍点终止,该鞍点对于一个玩家的策略是一个最小值,对于另一个玩家的策略是一个最大值。

有时人们会将GAN错误地与相关概念“对抗性样本(adversarial examples)”[28]混淆。

  • 对抗性样本是通过对分类网络的输入直接使用基于梯度的优化方法找到的例子,目的是找到与数据相似但被错误分类的例子。

  • 这与本文的工作不同,因为对抗性样本不是一种训练生成模型的机制。相反,对抗性样本主要是用于分析工具,用于展示神经网络的行为方式,即使两个图像在人类观察者看来几乎无法区分,神经网络也会自信地对它们进行不同的高置信度分类。

  • 这种对抗性样本的存在确实暗示着GAN训练可能是低效的,因为它们表明现代判别网络可以自信地识别一类,而无需模拟出该类别的任何人类可感知属性。

3 对抗网络

对抗模型框架在模型都是多层感知机(MLP)时最直接应用。

  • 为了学习生成器的数据 x \pmb{x} x上的分布 p g p_g pg,我们在输入噪声变量 p z ( z ) p_z(z) pz(z)上定义一个先验,然后将映射的数据空间表示为 G ( z ; θ g ) G(z;\theta_g) G(z;θg),其中 G G G是一个由参数 θ g \theta_g θg表示的多层感知机的可微函数。

  • 我们还定义了第二个多层感知机 D ( x ; θ d ) D(\pmb{x};\theta_d) D(x;θd),其输出一个标量。 D ( x ) D(\pmb{x}) D(x)代表了 x \pmb{x} x来自真实数据而不是生成分布 p g p_g pg的概率。

我们训练 D D D以最大化将正确标签分配给训练示例和来自 G G G的样本的概率。

我们同时训练 G G G以最小化 log ⁡ ( 1 − D ( G ( z ) ) ) \log(1-D(G(z))) log(1D(G(z)))

译者注:可以对上述内容进行更生动的描述。

GAN的目的就是要得到最强大的判别器(D)强大的生成器(G)

假如需要使用某种方法模仿某游戏渲染画面,比如要渲染出符合某分布的(比如角色阵亡时的)、 x x x个像素( x x x维)的画面 x \pmb{x} x,可以有两种方法:

  1. 反汇编游戏程序,了解到具体每行代码对于每帧画面生成所具体产生的作用,如“人物造型”、“对象移动”等,以期对画面分布的生成进行完美的建模。
  2. 定义若干个变量(即一个若干维的变量),然后假定认为这若干维的变量通过某种函数关系,共同影响了最终生成数据 x \pmb{x} x的分布情况。

前者类似“相关工作”中所提到的“拟合似然函数”的方法,即“追根溯源”的方法,这种方法解释性很强,可以很好地解释出每个参数对于最终结果生成所产生的影响,但是操作难度较高,也难找到合适的似然函数。

后者就有点类似于“多层感知机(MLP)”的方法了,理论上来说,MLP可以拟合任意函数的表达,只是可解释性差。虽然我不知道从游戏代码到画面其背后到底是个什么映射关系,但是我估摸着这若干维的参数就足以表达这内容背后隐藏的逻辑了。

只不过我不会知道那若干维的参数之中的每一个,最终对结果 x \pmb{x} x到底产生了怎样的影响,以及每个参数具体有什么含义而已。

整理一下。论文当中的各个变量可以作如下解释:


数据 x \pmb{x} x的分布规律 p g p_g pg,这是最终要得到的结果

  • 生成器 G ( z ; θ g ) G(z;\theta_g) G(z;θg)
    • 输入:取自随机噪声 p z ( z ) p_z(z) pz(z)的初始化数据 z z z
    • 参数: θ g \theta_g θg
    • 输出: x \pmb{x} x(如,上例中 x x x维的画面 x \pmb{x} x
    • 优秀的生成器 G G G,能够尽可能生成
      • 更接近真实数据的 x \pmb{x} x
      • 更接近真实分布的 p g p_g pg
  • 判别器 D ( x ; θ d ) D(\pmb{x};\theta_d) D(x;θd)
    • 输入: x \pmb{x} x
    • 参数: θ d \theta_d θd
    • 输出:一个标量,表示 x \pmb{x} x来自真实数据而非生成分布 p g p_g pg中取样的概率。
      • x \pmb{x} x越可能来自于真数据,输出 D ( x ) D(\pmb{x}) D(x)越接近 1 1 1
      • x \pmb{x} x越可能来自于生成器,输出 D ( x ) D(\pmb{x}) D(x)越接近 0 0 0
    • 优秀的判别器 D D D,能够尽可能判断出
      • x \pmb{x} x的来源是生成器
      • x \pmb{x} x的来源是真实分布的采样

训练GAN就是要同时训练 G G G D D D,并期望都达到优秀标准。

为了训练出更好的 G G G,作者提出了一种衡量标准,即 log ⁡ ( 1 − D ( G ( z ) ) ) \log(1-D(G(z))) log(1D(G(z))),要求这个式子表达的内容尽可能小,下面我们仔细一下分析这个式子:

  • z z z表示初始化的随机输入
  • G ( z ) G(z) G(z)表示生成器生成的结果,期望这个结果更接近真实分布中的采样
    • 即期望让生成器 G G G造出更“真”的假数据。
  • D ( G ( z ) ) D(G(z)) D(G(z))表示使用判别器 D D D判别生成器 G G G所生成的结果,期望这个结果更接近 1 1 1
    • 即期望让判别器 D D D尽可能误以为结果 G ( z ) G(z) G(z)为来自真实分布的采样
  • 只有当 D ( G ( z ) ) D(G(z)) D(G(z))越接近 1 1 1时, log ⁡ ( 1 − D ( G ( z ) ) ) \log(1-D(G(z))) log(1D(G(z)))才会越接近负无穷( − ∞ -\infty
    • 这就是文中说的要“最小化 log ⁡ ( 1 − D ( G ( z ) ) ) \log(1-D(G(z))) log(1D(G(z)))”的原因

换句话说, D D D G G G玩以下两人极小极大游戏(two-player minimax game),价值函数为 V ( G , D ) V(G,D) V(G,D)

min ⁡ G max ⁡ D V ( D , G ) = E x ∼ p data ( x ) [ log ⁡ D ( x ) ] + E z ∼ p z ( x ) [ log ⁡ ( 1 − D ( G ( z ) ) ) ] (1) \mathop{\min}\limits_{G}\mathop{\max}\limits_{D}V(D,G)=\mathbb{E}_{x\sim{p_{\text{data}}(x)}}[\log D(x)]+\mathbb{E}_{z\sim{p_{z}(x)}}[\log(1 - D(G(z)))]\tag{1} GminDmaxV(D,G)=Expdata(x)[logD(x)]+Ezpz(x)[log(1D(G(z)))](1)

译者注:式中不写 V ( G , D ) V(G,D) V(G,D)而写 V ( D , G ) V(D,G) V(D,G),应该是作者笔误。

  • E x ∼ p data ( x ) [ log ⁡ D ( x ) ] \mathbb{E}_{x\sim{p_{\text{data}}(x)}}[\log D(x)] Expdata(x)[logD(x)]中的 x x x采样于真实值的分布
    • 在判别器 D D D很完美的情况下,应该能识别得出所有 x x x都是来自于真实分布的采样
    • D ( x ) D(x) D(x)应该是趋向于 1 1 1的, log ⁡ D ( x ) \log D(x) logD(x)就应该是趋向于 0 0 0
    • 那么该期望就应该是趋向于 0 0 0
  • E z ∼ p z ( x ) [ log ⁡ ( 1 − D ( G ( z ) ) ) ] \mathbb{E}_{z\sim{p_{z}(x)}}[\log(1 - D(G(z)))] Ezpz(x)[log(1D(G(z)))]中的 z z z采样于随机噪声 p z ( z ) p_z(z) pz(z)
    • 在生成器 G G G和判别器 D D D都很完美的情况下, D D D应该能识别得出所有 G ( z ) G(z) G(z)都是来自于生成器的结果
    • D ( G ( z ) ) D(G(z)) D(G(z))应该是趋向于 0 0 0的, log ⁡ ( 1 − D ( G ( z ) ) ) \log(1-D(G(z))) log(1D(G(z)))就应该也是趋向于 0 0 0
    • 那么该期望也应该是趋向于 0 0 0
  • max ⁡ D \mathop{\max}\limits_{D} Dmax表示期望使得 D D D尽量不犯错,即要最大化 D D D的值。
  • min ⁡ G \mathop{\min}\limits_{G} Gmin表示期望 G G G能使 D D D尽量犯错,即要最小化 G G G的值。

在下一节中,我们将提供对抗网络的理论分析,本质上显示训练标准允许在给予 G G G D D D足够容量的情况下,即在非参数限制下,恢复数据生成分布。

对于一种不太正式、但是更好理解的方法解释,请参见图1。

图1:GAN通过同时更新判别分布( D D D,蓝色,虚线)来进行训练,以便它能够区分来自数据生成分布(黑色,虚点线) p x p_x px与生成分布 p g p_g pg G G G)(绿色,实线)的样本。下面的水平线是 z z z的均匀采样域。上面的水平线是 x x x的域的一部分。向上的箭头显示了映射 x = G ( z ) x = G(z) x=G(z)如何在变换后的样本上施加非均匀分布 p g p_g pg G G G p g p_g pg的高密度区域收缩,在低密度区域扩展。 (a) 考虑一个接近收敛的对抗对: p g p_g pg p d a t a p_{data} pdata相似, D D D是一个部分准确的分类器。 (b) 在算法的内循环中, D D D被训练来区分来自数据的样本,收敛到 D ∗ ( x ) = p d a t a ( x ) p d a t a ( x ) + p g ( x ) D^*(x) = \frac{p_{data}(x)}{p_{data}(x)+p_g(x)} D(x)=pdata(x)+pg(x)pdata(x)。 © 更新 G G G后, D D D的梯度引导了 G ( z ) G(z) G(z)流向更有可能被分类为数据的区域。 (d) 经过多次训练,如果 G G G D D D有足够的容量,它们将达到一个点,即 p g = p d a t a p_g = p_{data} pg=pdata。 此时判别器无法区分这两个分布,即 D ( x ) = 1 2 D(x) = \frac{1}{2} D(x)=21

在实践中,我们必须使用迭代数值方法来实现游戏。在训练的内部循环中完全优化 D D D在计算上是禁止的,并且在有限的数据集上可能会导致过拟合。相反,我们在优化 D D D的k个步骤和优化 G G G的一个步骤之间交替。只要 G G G的变化足够缓慢,就能使 D D D保持在其最佳解附近。该程序在算法1中正式呈现。

在实践中,等式1可能不提供足够的梯度供 G G G良好学习。在学习的早期阶段,当 G G G表现不佳时, D D D可以高度自信地拒绝样本,因为它们与训练数据明显不同。在这种情况下, log ⁡ ( 1 − D ( G ( z ) ) ) \log(1 - D(G(z))) log(1D(G(z)))会饱和。我们可以训练 G G G来最大化 log ⁡ D ( G ( z ) ) \log D(G(z)) logD(G(z)),而不是训练 G G G来最小化 log ⁡ ( 1 − D ( G ( z ) ) ) \log(1 - D(G(z))) log(1D(G(z)))。这个目标函数导致 G G G D D D的动态相同的固定点,但在学习早期提供了更强的梯度。

4 理论结果

生成器 G G G隐式地定义了一个概率分布 p g p_g pg,当 z ∼ p z z \sim p_z zpz时,这个分布作为样本 G ( z ) G(z) G(z)的分布。因此,如果给定足够的容量和训练时间,我们希望算法1收敛到 p d a t a p_{data} pdata的一个良好估计器。本节的结果是在一个非参数设置中完成的,例如,我们通过研究概率密度函数空间中的收敛来表示具有无限容量的模型。

算法 1 用于GAN的小批量随机梯度下降训练。应用于判别器的步骤数, k k k,是一个超参数。在我们的实验中,我们使用了 k = 1 k = 1 k=1,这是最不昂贵的选项。


  • for number of training iterations do

    • for k steps do

      • 从噪声先验 p g ( z ) p_g(z) pg(z)中抽样m个噪声样本 { z ( 1 ) , … , z ( m ) } \{z^{(1)}, \ldots, z^{(m)}\} {z(1),,z(m)}
      • 从数据生成分布 p d a t a ( x ) p_{data}(x) pdata(x)中抽样m个样本 { x ( 1 ) , … , x ( m ) } \{x^{(1)}, \ldots, x^{(m)}\} {x(1),,x(m)}
      • 通过提升其随机梯度来更新判别器:

      ∇ θ d 1 m ∑ i = 1 m [ log ⁡ D ( x ( i ) ) + log ⁡ ( 1 − D ( G ( z ( i ) ) ) ) ] \nabla \theta_d \frac{1}{m} \sum_{i=1}^{m} \left[ \log D \left( x^{(i)} \right) + \log \left( 1 - D \left( G \left( z^{(i)} \right) \right) \right) \right] θdm1i=1m[logD(x(i))+log(1D(G(z(i))))]

    • end for

    • 从噪声先验 p g ( z ) p_g(z) pg(z)中抽样m个噪声样本 { z ( 1 ) , … , z ( m ) } \{z^{(1)}, \ldots, z^{(m)}\} {z(1),,z(m)}

    • 通过降低其随机梯度来更新生成器:

    ∇ θ g 1 m ∑ i = 1 m log ⁡ ( 1 − D ( G ( z ( i ) ) ) ) \nabla \theta_g \frac{1}{m} \sum_{i=1}^{m} \log \left( 1 - D \left( G \left( z^{(i)} \right) \right) \right) θgm1i=1mlog(1D(G(z(i))))

  • end for

基于梯度的更新可以使用任何标准的基于梯度的学习规则。我们在我们的实验中使用了动量。

4.1 p g = p d a t a p_g = p_{data} pg=pdata的全局最优性

我们首先考虑任何给定生成器 G G G的最优判别器 D D D

命题 1 对于固定的 G G G,最优判别器 D D D
D G ∗ ( x ) = p d a t a ( x ) p d a t a ( x ) + p g ( x ) (2) D^*_G(x) = \frac{p_{data}(x)}{p_{data}(x) + p_g(x)} \tag{2} DG(x)=pdata(x)+pg(x)pdata(x)(2)

证明:给定任何生成器 G G G,判别器 D D D的训练标准是最大化量 V ( G , D ) V(G, D) V(G,D)

V ( G , D ) = ∫ x p d a t a ( x ) log ⁡ ( D ( x ) ) d x + ∫ z p z ( z ) log ⁡ ( 1 − D ( g ( z ) ) ) d z = ∫ x p d a t a ( x ) log ⁡ ( D ( x ) ) + p g ( x ) log ⁡ ( 1 − D ( x ) ) d x (3) \begin{align} V(G, D) & = \int_x p_{data}(x) \log(D(x))dx + \int_z p_z(z) \log(1 - D(g(z)))dz \\ & = \int_x p_{data}(x) \log(D(x)) + p_g(x) \log(1 - D(x))dx \end{align} \tag{3} V(G,D)=xpdata(x)log(D(x))dx+zpz(z)log(1D(g(z)))dz=xpdata(x)log(D(x))+pg(x)log(1D(x))dx(3)

对于任何 ( a , b ) ∈ R 2 ∖ { 0 , 0 } (a, b) \in \mathbb{R}^2 \setminus \{0, 0\} (a,b)R2{0,0},函数 y → a log ⁡ ( y ) + b log ⁡ ( 1 − y ) y \rightarrow a \log(y) + b \log(1 - y) yalog(y)+blog(1y) [ 0 , 1 ] [0, 1] [0,1] 中达到其最大值,即 a a + b \frac{a}{a+b} a+ba。判别器不需要在 S u p p ( p d a t a ) ∪ S u p p ( p g ) Supp(p_{data}) \cup Supp(p_g) Supp(pdata)Supp(pg) 之外定义,从而得出证明。

请注意, D D D的训练目标可以解释为最大化对条件概率 P ( Y = y ∣ x ) P(Y = y|x) P(Y=yx)的对数似然估计,其中 Y Y Y表示 x x x是否来自 p d a t a p_{data} pdata(当 y = 1 y = 1 y=1时)或来自 p g p_g pg(当 y = 0 y = 0 y=0时)。现在,方程1中的极小极大游戏可以重新表述为:

C ( G ) = max ⁡ D V ( G , D ) = E x ∼ p d a t a [ log ⁡ D G ∗ ( x ) ] + E z ∼ p z [ log ⁡ ( 1 − D G ∗ ( G ( z ) ) ) ] = E x ∼ p d a t a [ log ⁡ D G ∗ ( x ) ] + E x ∼ p g [ log ⁡ ( 1 − D G ∗ ( x ) ) ] = E x ∼ p d a t a [ log ⁡ p d a t a ( x ) p d a t a ( x ) + p g ( x ) ] + E x ∼ p g [ log ⁡ p g ( x ) p d a t a ( x ) + p g ( x ) ] (4) \begin{align} C(G) & = \max_{D} V (G, D) \\ & = \mathbb{E}_{x\sim p_{data}} [\log D^*_{G}(x)] + \mathbb{E}_{z\sim p_z} [\log(1 - D^*_{G}(G(z)))] \\ & = \mathbb{E}_{x\sim p_{data}} [\log D^*_{G}(x)] + \mathbb{E}_{x\sim p_g} [\log(1 - D^*_{G}(x))] \\ & = \mathbb{E}_{x\sim p_{data}} \left[ \log \frac{p_{data}(x)}{p_{data}(x) + p_g(x)} \right] + \mathbb{E}_{x\sim p_g} \left[ \log \frac{p_g(x)}{p_{data}(x) + p_g(x)} \right] \end{align} \tag{4} C(G)=DmaxV(G,D)=Expdata[logDG(x)]+Ezpz[log(1DG(G(z)))]=Expdata[logDG(x)]+Expg[log(1DG(x))]=Expdata[logpdata(x)+pg(x)pdata(x)]+Expg[logpdata(x)+pg(x)pg(x)](4)

定理 1 当且仅当 p g = p d a t a p_g = p_{data} pg=pdata 时,虚拟训练准则 C ( G ) C(G) C(G) 达到全局最小值。在那一点上, C ( G ) C(G) C(G) 达到值 − log ⁡ 4 - \log 4 log4

证明:对于 p g = p d a t a p_g = p_{data} pg=pdata D G ∗ ( x ) = 1 2 D^*_G(x) = \frac{1}{2} DG(x)=21(参考方程2)。因此,通过在 D G ∗ ( x ) = 1 2 D^*_G(x) = \frac{1}{2} DG(x)=21 时检查方程4,我们发现 C ( G ) = log ⁡ 1 2 + log ⁡ 1 2 = − log ⁡ 4 C(G) = \log \frac{1}{2} + \log \frac{1}{2} = - \log 4 C(G)=log21+log21=log4。要看到这是 C ( G ) C(G) C(G) 的最佳可能值,只有在 p g = p d a t a p_g = p_{data} pg=pdata 时才能达到,请注意

E x ∼ p d a t a [ − log ⁡ 2 ] + E x ∼ p g [ − log ⁡ 2 ] = − log ⁡ 4 \mathbb{E}_{x\sim p_{data}} [- \log 2] + \mathbb{E}_{x\sim p_g} [- \log 2] = - \log 4 Expdata[log2]+Expg[log2]=log4

并且通过从 C ( G ) = V ( D G ∗ , G ) C(G) = V (D^*_G, G) C(G)=V(DG,G) 中减去此表达式,我们得到:

C ( G ) = − log ⁡ ( 4 ) + KL ( p d a t a | | p d a t a + p g 2 ) + KL ( p g | | p d a t a + p g 2 ) (5) C(G) = - \log(4) + \text{KL} \left( p_{data} \middle| \middle| \frac{p_{data} + p_g}{2} \right) + \text{KL} \left( p_g \middle| \middle| \frac{p_{data} + p_g}{2} \right) \tag{5} C(G)=log(4)+KL(pdata 2pdata+pg)+KL(pg 2pdata+pg)(5)

其中 KL 是 Kullback–Leibler 散度。我们在上述表达式中识别出模型分布与数据生成过程之间的 Jensen–Shannon 散度:

C ( G ) = − log ⁡ ( 4 ) + 2 ⋅ JSD ( p d a t a ∥ p g ) (6) C(G) = - \log(4) + 2 \cdot \text{JSD} (p_{data} \parallel p_g) \tag{6} C(G)=log(4)+2JSD(pdatapg)(6)

由于两个分布之间的 Jensen–Shannon 散度总是非负的,并且仅当它们相等时为零,我们已经证明了 C ∗ = − log ⁡ ( 4 ) C^* = - \log(4) C=log(4) C ( G ) C(G) C(G) 的全局最小值,唯一的解是 p g = p d a t a p_g = p_{data} pg=pdata,即生成模型完美复制了数据生成过程。

4.2 算法1的收敛性

命题2 如果 G G G D D D有足够的容量,并且在算法1的每一步中,都允许鉴别器 D D D在给定 G G G的情况下达到其最优,并且 p g p_g pg被更新以改善准则
E x ∼ p d a t a [ log ⁡ D G ∗ ( x ) ] + E x ∼ p g [ log ⁡ ( 1 − D G ∗ ( G ( x ) ) ) ] \mathbb{E}_{x\sim p_{data}} [\log D^*_{G}(x)] + \mathbb{E}_{x\sim p_g} [\log(1 - D^*_{G}(G(x)))] Expdata[logDG(x)]+Expg[log(1DG(G(x)))]

那么 p g p_g pg收敛于 p d a t a p_{data} pdata

证明:考虑 V ( G , D ) = U ( p g , D ) V(G, D) = U(p_g, D) V(G,D)=U(pg,D)作为 p g p_g pg的函数,如上述准则所做的那样。注意 U ( p g , D ) U(p_g, D) U(pg,D) p g p_g pg中是凸的。凸函数的最大值的次导数包括在最大值取得的点处的函数的导数。换句话说,如果 f ( x ) = sup ⁡ α ∈ A f α ( x ) f(x) = \sup_{\alpha\in A} f_\alpha(x) f(x)=supαAfα(x) f α ( x ) f_\alpha(x) fα(x)对于每个 α \alpha α x x x中是凸的,那么 ∂ f β ( x ) ∈ ∂ f \partial f_\beta(x) \in \partial f fβ(x)f如果 β = arg ⁡ sup ⁡ α ∈ A f α ( x ) \beta = \arg \sup_{\alpha\in A} f_\alpha(x) β=argsupαAfα(x)。这等效于在给定对应 G G G的最优 D D D的情况下计算 p g p_g pg的梯度下降更新。 sup ⁡ D U ( p g , D ) \sup_D U(p_g, D) supDU(pg,D) p g p_g pg中是凸的,并且有一个唯一的全局最优值,如定理1所证明的那样,因此,通过对 p g p_g pg进行足够小的更新, p g p_g pg收敛于 p x p_x px,从而得出证明。

实际上,对抗网络通过函数 G ( z ; θ g ) G(z; \theta_g) G(z;θg)表示 p g p_g pg分布的有限族,并且我们优化 θ g \theta_g θg而不是 p g p_g pg本身。使用多层感知机定义 G G G会在参数空间中引入多个临界点。然而,多层感知机在实践中的出色性能表明,尽管缺乏理论保证,它们仍是合理的模型。

5 实验

我们在一系列数据集上训练了对抗网络,包括MNIST[21],多伦多人脸数据库(TFD) [27],和CIFAR-10 [19]。生成器网络使用了整流线性激活[17,8]和S型激活的混合,而鉴别器网络则使用了maxout [9]激活。在训练鉴别器网络时应用了Dropout[16]。虽然我们的理论框架允许在生成器的中间层使用dropout和其他噪声,但我们仅将噪声用作生成器网络的最底层输入。

我们通过将高斯Parzen窗拟合到使用 G G G生成的样本,并报告在此分布下的对数似然来估计测试集数据在 p g pg pg下的概率。高斯的σ参数是通过对验证集进行交叉验证获得的。这个程序最初是在Breuleux等人的工作中[7]引入的,并被用于各种精确似然不可行的生成模型[24,3,4]。结果在表1中报告。这种估计似然的方法具有较高的方差,且在高维空间中表现不佳,但据我们所知,这是最好的可用方法。可以采样但无法直接估计似然的生成模型的进展激发了关于如何评估此类模型的进一步研究。

表 1:基于Parzen窗口的对数似然估计。在MNIST上报告的数字是测试集样本的平均对数似然,均值的标准误差是根据样本计算的。在TFD上,我们根据数据集的折叠计算了标准误差,并使用每个折叠的验证集选择了不同的σ。在TFD上,每个折叠上都进行了σ的交叉验证,并计算了每个折叠上的平均对数似然。对于MNIST,我们与数据集的实值(而不是二进制)版本的其他模型进行了比较。

在图2和图3中,我们展示了训练后从生成器网络中抽取的样本。虽然我们并不声称这些样本优于现有方法生成的样本,但我们相信这些样本至少可以与文献中更好的生成模型相媲美,并突显了对抗框架的潜力。

图2:模型样本的可视化。最右侧一列显示相邻样本的最近训练示例,以证明该模型没有记忆训练集。样本是公平的随机抽取,没有精选。与大多数深度生成模型的其他可视化不同,这些图像显示了来自模型分布的实际样本,而不是隐藏单元样本给出的条件均值。此外,这些样本是不相关的,因为采样过程不依赖于马尔可夫链混合。a)MNIST b)TFD c)CIFAR-10(全连接模型)d)CIFAR-10(卷积鉴别器和“反卷积”生成器)

图3:通过在完整模型的z空间坐标之间线性插值获得的数字。

6 优点和缺点

这个新框架相对于先前的建模框架具有优点和缺点。主要的缺点是没有对 p g ( x ) pg(x) pg(x) 的明确表示,以及训练过程中 D D D 必须与 G G G 很好地同步(特别是,不能在不更新 D D D 的情况下过度训练 G G G,以避免出现“Helvetica情景”,其中 G G G 将太多的 z z z 值塌陷到相同的 x x x 值,从而没有足够的多样性来模拟 p d a t a p_data pdata),就像Boltzmann机器在学习步骤之间必须保持负链一样。优点是永远不需要Markov链,只使用反向传播来获得梯度,学习过程中不需要推理,而且可以将各种功能合并到模型中。表2总结了GAN与其他生成建模方法的比较。

表2:生成建模中的挑战:不同方法在深度生成建模中遇到的主要操作难题的总结。

上述优点主要是计算方面的。敌对模型还可能从生成器网络不直接用数据示例更新,而只通过通过鉴别器流动的梯度进行更新这一点上获得一些统计优势。这意味着输入的组成部分不会直接复制到生成器的参数中。敌对网络的另一个优点是,它们可以表示非常锐利,甚至是退化的分布,而基于Markov链的方法则要求分布在某种程度上模糊,以便链能够在模式之间混合。

7 结论和未来工作

该框架允许许多直接的扩展:

  1. 通过将 c c c 作为 G G G D D D 的输入,可以获得条件生成模型 p ( x ∣ c ) p(x | c) p(xc)
  2. 通过训练一个辅助网络来预测给定 x x x z z z,可以执行学习近似推断。这与 wake-sleep 算法[15]训练的推断网类似,但具有优势,即可以在生成网完成训练后针对固定的生成网训练推断网。
  3. 可以通过训练一组共享参数的条件模型,大致地对所有条件 p ( x S ∣ x S n o t ) p(x_S | x_{S_{not}}) p(xSxSnot) 进行建模,其中 S S S x x x 的索引的子集。本质上,可以使用对抗网来实现确定性 MP-DBM [10]的随机扩展。
  4. 半监督学习:当只有有限的标记数据时,来自判别器或推断网络的特征可以提高分类器的性能。
  5. 效率改进:通过设计更好的方法来协调 G G G D D D,或确定在训练期间从中采样 z z z 的更好分布,可以大大加速训练。

本文已经展示了对抗建模框架的可行性,表明这些研究方向可能是有用的。

致谢

我们要感谢 Patrice Marcotte、Olivier Delalleau、Kyunghyun Cho、Guillaume Alain 和 Jason Yosinski 为有益的讨论。Yann Dauphin 与我们分享了他的 Parzen 窗口评估代码。我们要感谢 Pylearn2 [11] 和 Theano [6,1] 的开发者,特别是 Frédéric Bastien,他特别为了支持这个项目匆忙推出了一个 Theano 功能。Arnaud Bergeron 在 LATEX 排版方面提供了急需的支持。我们还要感谢 CIFAR 和加拿大研究主席为资助,以及 Compute Canada 和 Calcul Québec 为提供计算资源。Ian Goodfellow 得到了 2013 年 Google Fellowship in Deep Learning 的支持。最后,我们要感谢 Les Trois Brasseurs 刺激了我们的创造力。

参考文献

  1. Bastien, F., Lamblin, P., Pascanu, R., Bergstra, J., Goodfellow, I. J., Bergeron, A., Bouchard, N., and Bengio, Y. (2012). Theano: 新功能和速度改进。深度学习和无监督特征学习 NIPS 2012 工作坊。
  2. Bengio, Y. (2009). 学习用于人工智能的深度结构。Now Publishers.
  3. Bengio, Y., Mesnil, G., Dauphin, Y., and Rifai, S. (2013). 通过深度表示改进混合。在 ICML’13 上。
  4. Bengio, Y., Thibodeau-Laufer, E., and Yosinski, J. (2014a). 通过反向传播训练的深度生成随机网络。在 ICML’14 上。
  5. Bengio, Y., Thibodeau-Laufer, E., Alain, G., and Yosinski, J. (2014b). 通过反向传播训练的深度生成随机网络。在第30届国际机器学习大会 (ICML’14) 论文集上。
  6. Bergstra, J., Breuleux, O., Bastien, F., Lamblin, P., Pascanu, R., Desjardins, G., Turian, J., Warde-Farley, D., and Bengio, Y. (2010). Theano: 一个 CPU 和 GPU 数学表达式编译器。在 Python科学计算会议 (SciPy) 论文集上。口头报告。
  7. Breuleux, O., Bengio, Y., and Vincent, P. (2011). 从 RBM 衍生的过程中快速生成代表性样本。《神经计算》(Neural Computation),23(8),2053–2073。
  8. Glorot, X., Bordes, A., and Bengio, Y. (2011). 深度稀疏整流器神经网络。在 AISTATS’2011 上。
  9. Goodfellow, I. J., Warde-Farley, D., Mirza, M., Courville, A., and Bengio, Y. (2013a). 最大输出网络。在 ICML’2013 上。
  10. Goodfellow, I. J., Mirza, M., Courville, A., and Bengio, Y. (2013b). 多预测深度 Boltzmann 机。在 NIPS’2013 上。
  11. Goodfellow, I. J., Warde-Farley, D., Lamblin, P., Dumoulin, V., Mirza, M., Pascanu, R., Bergstra, J., Bastien, F., and Bengio, Y. (2013c). Pylearn2: 一个机器学习研究库。arXiv预印本,编号:arXiv:1308.4214。
  12. Gregor, K., Danihelka, I., Mnih, A., Blundell, C., and Wierstra, D. (2014). 深度自回归网络。在 ICML’2014 上。
  13. Gutmann, M. and Hyvarinen, A. (2010). 噪声对比估计:一种新的非规范化统计模型估计方法。在第十三届国际人工智能和统计学会议 (AISTATS’10) 上。
  14. Hinton, G., Deng, L., Dahl, G. E., Mohamed, A., Jaitly, N., Senior, A., Vanhoucke, V., Nguyen, P., Sainath, T., and Kingsbury, B. (2012a). 语音识别中的深度神经网络。《IEEE信号处理杂志》(IEEE Signal Processing Magazine),29(6),82–97。
  15. Hinton, G. E., Dayan, P., Frey, B. J., and Neal, R. M. (1995). 无监督神经网络的唤醒-睡眠算法。《科学》(Science),268,1558–1161。
  16. Hinton, G. E., Srivastava, N., Krizhevsky, A., Sutskever, I., and Salakhutdinov, R. (2012b). 通过防止特征检测器的共适应来改进神经网络。技术报告,编号:arXiv:1207.0580。
  17. Jarrett, K., Kavukcuoglu, K., Ranzato, M., and LeCun, Y. (2009). 对象识别的最佳多级架构是什么?在国际计算机视觉大会 (ICCV’09) 论文集上,页码:2146–2153。IEEE。
  18. Kingma, D. P. and Welling, M. (2014). 自编码变分贝叶斯。在国际学习表示会议 (ICLR) 论文集上。
  19. Krizhevsky, A. and Hinton, G. (2009). 从小图像中学习多层特征。技术报告,多伦多大学。
  20. Krizhevsky, A., Sutskever, I., and Hinton, G. (2012). 使用深度卷积神经网络的ImageNet分类。在 NIPS’2012 上。
  21. LeCun, Y., Bottou, L., Bengio, Y., and Haffner, P. (1998). 基于梯度的文档识别。《IEEE会议录》(Proceedings of the IEEE),86(11),2278–2324。
  22. Mnih, A. and Gregor, K. (2014). 信念网络的神经变分推理和学习。技术报告,编号:arXiv:1402.0030。
  23. Rezende, D. J., Mohamed, S., and Wierstra, D. (2014). 深度生成模型中的随机反向传播和近似推断。技术报告,编号:arXiv:1401.4082。
  24. Rifai, S., Bengio, Y., Dauphin, Y., and Vincent, P. (2012). 一种用于采样收缩自编码器的生成过程。在 ICML’12 上。
  25. Salakhutdinov, R. and Hinton, G. E. (2009). 深度 Boltzmann 机。在 AISTATS’2009 上,页码:448-455。
  26. Schmidhuber, J. (1992). 通过可预测性最小化学习因子码。《神经计算》(Neural Computation),4(6),863–879。
  27. Susskind, J., Anderson, A., and Hinton, G. E. (2010). 多伦多面部数据集。《多伦多大学》技术报告,编号:UTML TR 2010-001。
  28. Szegedy, C., Zaremba, W., Sutskever, I., Bruna, J., Erhan, D., Goodfellow, I. J., and Fergus, R. (2014). 神经网络的奇异性质。ICLR,编号:abs/1312.6199。
  29. Tu, Z. (2007). 通过判别方法学习生成模型。在计算机视觉和模式识别,2007年。CVPR’07。IEEE国际会议上,页码:1–8。IEEE。

References

  1. Bastien, F., Lamblin, P., Pascanu, R., Bergstra, J., Goodfellow, I. J., Bergeron, A., Bouchard, N., and Bengio, Y. (2012). Theano: new features and speed improvements. Deep Learning and Unsupervised Feature Learning NIPS 2012 Workshop.
  2. Bengio, Y. (2009). Learning deep architectures for AI. Now Publishers.
  3. Bengio, Y., Mesnil, G., Dauphin, Y., and Rifai, S. (2013). Better mixing via deep representations. In ICML’13.
  4. Bengio, Y., Thibodeau-Laufer, E., and Yosinski, J. (2014a). Deep generative stochastic networks trainable by backprop. In ICML’14.
  5. Bengio, Y., Thibodeau-Laufer, E., Alain, G., and Yosinski, J. (2014b). Deep generative stochastic networks trainable by backprop. In Proceedings of the 30th International Conference on Machine Learning (ICML’14).
  6. Bergstra, J., Breuleux, O., Bastien, F., Lamblin, P., Pascanu, R., Desjardins, G., Turian, J., Warde-Farley, D., and Bengio, Y. (2010). Theano: a CPU and GPU math expression compiler. In Proceedings of the Python for Scientific Computing Conference (SciPy). Oral Presentation.
  7. Breuleux, O., Bengio, Y., and Vincent, P. (2011). Quickly generating representative samples from an RBM-derived process. Neural Computation, 23(8), 2053–2073.
  8. Glorot, X., Bordes, A., and Bengio, Y. (2011). Deep sparse rectifier neural networks. In AISTATS’2011.
  9. Goodfellow, I. J., Warde-Farley, D., Mirza, M., Courville, A., and Bengio, Y. (2013a). Maxout networks. In ICML’2013.
  10. Goodfellow, I. J., Mirza, M., Courville, A., and Bengio, Y. (2013b). Multi-prediction deep Boltzmann machines. In NIPS’2013.
  11. Goodfellow, I. J., Warde-Farley, D., Lamblin, P., Dumoulin, V., Mirza, M., Pascanu, R., Bergstra, J., Bastien, F., and Bengio, Y. (2013c). Pylearn2: a machine learning research library. arXiv preprint arXiv:1308.4214.
  12. Gregor, K., Danihelka, I., Mnih, A., Blundell, C., and Wierstra, D. (2014). Deep autoregressive networks. In ICML’2014.
  13. Gutmann, M. and Hyvarinen, A. (2010). Noise-contrastive estimation: A new estimation principle for unnormalized statistical models. In Proceedings of The Thirteenth International Conference on Artificial Intelligence and Statistics (AISTATS’10).
  14. Hinton, G., Deng, L., Dahl, G. E., Mohamed, A., Jaitly, N., Senior, A., Vanhoucke, V., Nguyen, P., Sainath, T., and Kingsbury, B. (2012a). Deep neural networks for acoustic modeling in speech recognition. IEEE Signal Processing Magazine, 29(6), 82–97.
  15. Hinton, G. E., Dayan, P., Frey, B. J., and Neal, R. M. (1995). The wake-sleep algorithm for unsupervised neural networks. Science, 268, 1558–1161.
  16. Hinton, G. E., Srivastava, N., Krizhevsky, A., Sutskever, I., and Salakhutdinov, R. (2012b). Improving neural networks by preventing co-adaptation of feature detectors. Technical report, arXiv:1207.0580.
  17. Jarrett, K., Kavukcuoglu, K., Ranzato, M., and LeCun, Y. (2009). What is the best multi-stage architecture for object recognition? In Proc. International Conference on Computer Vision (ICCV’09), pages 2146–2153. IEEE.
  18. Kingma, D. P. and Welling, M. (2014). Auto-encoding variational bayes. In Proceedings of the International Conference on Learning Representations (ICLR).
  19. Krizhevsky, A. and Hinton, G. (2009). Learning multiple layers of features from tiny images. Technical report, University of Toronto.
  20. Krizhevsky, A., Sutskever, I., and Hinton, G. (2012). ImageNet classification with deep convolutional neural networks. In NIPS’2012.
  21. LeCun, Y., Bottou, L., Bengio, Y., and Haffner, P. (1998). Gradient-based learning applied to document recognition. Proceedings of the IEEE, 86(11), 2278–2324.
  22. Mnih, A. and Gregor, K. (2014). Neural variational inference and learning in belief networks. Technical report, arXiv preprint arXiv:1402.0030.
  23. Rezende, D. J., Mohamed, S., and Wierstra, D. (2014). Stochastic backpropagation and approximate inference in deep generative models. Technical report, arXiv:1401.4082.
  24. Rifai, S., Bengio, Y., Dauphin, Y., and Vincent, P. (2012). A generative process for sampling contractive auto-encoders. In ICML’12.
  25. Salakhutdinov, R. and Hinton, G. E. (2009). Deep Boltzmann machines. In AISTATS’2009, pages 448455.
  26. Schmidhuber, J. (1992). Learning factorial codes by predictability minimization. Neural Computation, 4(6), 863–879.
  27. Susskind, J., Anderson, A., and Hinton, G. E. (2010). The Toronto face dataset. Technical Report UTML TR 2010-001, U. Toronto.
  28. Szegedy, C., Zaremba, W., Sutskever, I., Bruna, J., Erhan, D., Goodfellow, I. J., and Fergus, R. (2014). Intriguing properties of neural networks. ICLR, abs/1312.6199.
    er, J. (1992). Learning factorial codes by predictability minimization. Neural Computation, 4(6), 863–879.
  29. Susskind, J., Anderson, A., and Hinton, G. E. (2010). The Toronto face dataset. Technical Report UTML TR 2010-001, U. Toronto.
  30. Szegedy, C., Zaremba, W., Sutskever, I., Bruna, J., Erhan, D., Goodfellow, I. J., and Fergus, R. (2014). Intriguing properties of neural networks. ICLR, abs/1312.6199.
  31. Tu, Z. (2007). Learning generative models via discriminative approaches. In Computer Vision and Pattern Recognition, 2007. CVPR’07. IEEE Conference on, pages 1–8. IEEE.

  1. 所有代码和超参数可在 http://www.github.com/goodfeli/adversarial 上找到。 ↩︎

相关文章:

【计算机视觉|生成对抗】生成对抗网络(GAN)

本系列博文为深度学习/计算机视觉论文笔记,转载请注明出处 标题:Generative Adversarial Nets 链接:Generative Adversarial Nets (nips.cc) 摘要 我们提出了一个通过**对抗(adversarial)**过程估计生成模型的新框架…...

神经网络基础-神经网络补充概念-15-神经网络概览

概念 神经网络是一种机器学习模型,受到人脑神经元网络的启发而设计。它可以用来解决各种各样的问题,包括图像识别、自然语言处理、语音识别、游戏策略等。神经网络的核心思想是通过一系列的层次结构,从原始数据中自动地学习和提取特征&#…...

iOS Epub阅读器改造记录

六个月前在这个YHEpubDemo阅读器的基础上做了一些优化,这里做一下记录。 1.首行缩进修复 由于分页的存在,新的一页的首行可能是新的一行,则应该缩进;也可能是前面一页段落的延续,这时候不应该缩进。YHEpubDemo基于XDS…...

负载均衡搭建

LVS-DR部署 [客户端] node1 192.168.157.148 [lvs] node2 192.168.157.142 [web服务器] node3 192.168.157.145 node4 192.168.157.146(1)[lvs] yum install -y ipvsadm.x86_64 配置LVS负载均衡服务 (1)手动添加LVS转发1&#xff…...

form表单input标签的23种type类型值?

当你学了很多技术以后,再回头看来,竟然被一个被一个基础问题虐了,23个类型值说不全,不是少这个,就是少那个,那么23种类型都有什么呢? text 单行文本输入框 password 密码输入框 file …...

python selenium如何保存网站的cookie用于下次自动登录

## 一、python selenium如何保存网站的cookie 使用Selenium保存网站的Cookie非常简单。下面是一个示例,展示了如何使用Selenium打开网站,然后保存获取到的Cookie: from selenium import webdriver# 初始化浏览器 browser webdriver.Chrome…...

DHCP Server

简介 动态主机配置协议 DHCP(Dynamic Host Configuration Protocol,动态主机配置协议) 是 RFC 1541(已被 RFC 2131 取代)定义的标准协议,该协议允许服务器向客户端动态分配 IP 地址和配置信息。 使用UDP协…...

DMR+PoC宽窄融合互通解决方案

当前,Tetra、PDT、DMR、P25等专网通信的主流窄带技术,能够保障在紧急情况下可靠的关键语音通信对讲,但随着行业用户对图片、视频、数据等宽带业务的需求越来越强烈,原本单一的语音通信早已无法满足用户对新需求。 北峰BF-SCP810 D…...

Springboot定时执行任务

定时任务 TaskScheduler 任务调度者 TaskExecutor 任务执行者 EnableScheduling//开启定时功能的注释 Scheduled(cron"* * * * * * *")//什么时候执行~ cron表达式(秒 分 时 日 月 星期 ) Cron表达式 主启动类加上注解开启任务调度 package com.qf.sping09te…...

【Apollo】阿波罗自动驾驶:塑造自动驾驶技术的未来

前言 Apollo (阿波罗)是一个开放的、完整的、安全的平台,将帮助汽车行业及自动驾驶领域的合作伙伴结合车辆和硬件系统,快速搭建一套属于自己的自动驾驶系统。 开放能力、共享资源、加速创新、持续共赢是 Apollo 开放平台的口号。百度把自己所拥有的强大、…...

JavaEE初阶:多线程 - Thread 类的基本用法

上次我们了解了多线程的五种创建方法,今天来学习Thread的基本用法。 目录 run和start Thread常见的构造方法 Thread的几个常见属性 后台线程 是否存活 线程终止 1.使用标志位 2.使用Thread自带的标志 等待线程 run和start 首先需要理解Thread的run和star…...

编写 loading、加密解密 发布NPM依赖包,并实施落地使用

你的 Loading 开箱即可用的 loading, 说明:vue3-loading 是一个方便在 Vue 3 项目中使用的加载指示器组件的 npm 插件。它允许您轻松地在项目中添加加载动画,提升用户体验。 目录 你的 Loading🌍 安装🛹 演示地址&…...

【剑指Offer 57】和为s的连续正数序列,Java解密。

LeetCode 剑指Offer 75道练习题 文章目录 剑指Offer:和为s的连续正数序列示例:限制:解题思路:剑指Offer:和为s的连续正数序列 【题目描述】 输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。 序列内的数字由小到大排列,不同序列按照首…...

深度学习实战基础案例——卷积神经网络(CNN)基于SqueezeNet的眼疾识别|第1例

文章目录 前言一、数据准备1.1 数据集介绍1.2 数据集文件结构 二、项目实战2.1 数据标签划分2.2 数据预处理2.3 构建模型2.4 开始训练2.5 结果可视化 三、数据集个体预测 前言 SqueezeNet是一种轻量且高效的CNN模型,它参数比AlexNet少50倍,但模型性能&a…...

麦肯锡发布《2023年度科技报告》!

在经历了 2022 年技术投资和人才的动荡之后,2023 年上半年,人们对技术促进商业和社会进步的潜力重新燃起了热情。生成式人工智能(Generative AI)在这一复兴过程中功不可没,但它只是众多进步中的一个,可以推…...

JAVASE---数组的定义与使用

数组的基本概念 什么是数组 数组是具有相同类型元素的集合,在内存中连续存储。 1. 数组中存放的元素其类型相同 2. 数组的空间是连在一起的 3. 每个空间有自己的编号,起始位置的编号为0,即数组的下标 数组的创建及初始化 数组的创建 T[…...

211、仿真-基于51单片机土壤湿度智能盆栽灌溉报警Proteus仿真设计(程序+Proteus仿真+配套资料等)

毕设帮助、开题指导、技术解答(有偿)见文未 目录 一、硬件设计 二、设计功能 三、Proteus仿真图 四、程序源码 资料包括: 需要完整的资料可以点击下面的名片加下我,找我要资源压缩包的百度网盘下载地址及提取码。 方案选择 单片机的选择 方案一&am…...

记录TensorRT8.5.0安装

1.下载网址NVIDIA TensorRT 8.x Download | NVIDIA Developer TensorRT不同的版本依赖于不同的cuda版本和cudnn版本。根据自己电脑的cuda版本和cudnn版本来决定要下载哪个TensorRT版本 查看cudnn版本 cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2 cat /usr/l…...

flutter ListView 滚动到最后一个items位置

flutter 想要实现一个listview初始化时和数据变化后显示到列表的最末,简单地说就是像聊天窗或者是日志输出那样的情景。 要在Flutter中实现在初始化时和数据变化后将ListView自动定位到最后一个item的位置,你可以使用ScrollController来控制滚动位置&am…...

WMS:SurfaceView绘制显示

WMS:SurfaceView绘制显示 1、SurfaceView控件使用1.1 Choreographer接受VSync信号1.2 自定义SurfaceView1.3 结果 2、SurfaceView获取画布并显示2.1 SurfaceHolder.lockCanvas()2.2 SurfaceHolder.unlockCanvasAndPost(Canvas canvas) 1、SurfaceView控件使用 1.1 Choreograph…...

【Spring系列篇--关于IOC的详解】

目录 面试经典题目: 1. 什么是spring?你对Spring的理解?简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。 2.什么是IoC?你对IoC的理解?IoC的重要性?将实例化对象的权利从程序员…...

__ob__: Observer 后缀的数组的取值方式

开发中,经常从接口、父组件中,拿到数组然后给新的数组使用, 但是,有时候会发现带有 __ob__: Observer 后缀的数组,对这种数组来说,你是无法取到这个数组的值的, 而且,离谱的是consol…...

时序预测 | MATLAB实现WOA-CNN-BiLSTM鲸鱼算法优化卷积双向长短期记忆神经网络时间序列预测

时序预测 | MATLAB实现WOA-CNN-BiLSTM鲸鱼算法优化卷积双向长短期记忆神经网络时间序列预测 目录 时序预测 | MATLAB实现WOA-CNN-BiLSTM鲸鱼算法优化卷积双向长短期记忆神经网络时间序列预测预测效果基本介绍程序设计学习总结参考资料 预测效果 基本介绍 时序预测 | MATLAB实现…...

Java基础知识点

Java是一种高级计算机语言,是可以编写跨平台应用软件、完全面向对象的程序设计语言。 2、Java划分为三个技术平台:Java SE、Java EE、Java ME Java SE是桌面应用,Java EE是web应用,平台企业版,Java ME是手机应用&#…...

攻防世界-web-fileclude

1. 题目描述 打开链接,可以看到如下代码: 代码意思很简单,让我们传递两个参数,一个file1,一个file2,如果file2的内容为hello ctf,那么就可以在代码中include file1 2. 思路分析 这道题显然是…...

【100天精通python】Day36:GUI界面编程_高级功能操作和示例

专栏导读 专栏订阅地址:https://blog.csdn.net/qq_35831906/category_12375510.html 一、GUI 高级功能 1 自定义主题和样式 自定义主题和样式可以让你的GUI应用程序在外观方面更加出色。在使用Tkinter时,你可以使用ttkthemes库来应用不同的主题和样式。…...

无涯教程-Perl - sub函数

描述 此函数定义一个新的子例程。上面显示的参数遵循以下规则- NAME是子例程的名称。可以在有或没有原型规范的情况下预先声明命名的子例程(没有关联的代码块)。 匿名子例程必须具有定义。 PROTO定义了函数的原型,调用该函数以验证提供的参数时将使用该原型。 ATTRS为解析…...

wpf控件上移下移,调整子集控件显示顺序

页面代码: <!-- 导出A2,自定义导出设置列,添加时间:2023-8-9 14:14:18,作者:whl; --><Window x:Class="WpfSnqkGasAnalysis.WindowGasExportA2"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http:/…...

cesium学习记录08-鼠标绘制多边形

上一篇学习了实体的一些基础知识&#xff0c;这一篇来学习鼠标绘制实体多边形的实现 一、方法一&#xff1a; 1&#xff0c;结果显示 贴地&#xff1a; 不贴地&#xff1a; 2&#xff0c;方法全部代码&#xff1a; 主方法&#xff1a; /*** 绘制多边形* param {Object} op…...

rocketMq启动broker报错找不到或无法加载主类 Files\Java\jdk1.8.0_171\lib\dt.jar;C:\Program]

假如弹出提示框提示‘错误: 找不到或无法加载主类 xxxxxx’。 1.打开runbroker.cmd 将"%CLASSPATH%"加上英文双引号&#xff0c;切勿别加中文双引号 2.打开runserver.cmd 同理 将"%CLASSPATH%"加上英文双引号&#xff0c;切勿别加中文双引号 3.正常执行即…...