【计算机视觉|生成对抗】生成对抗网络(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 上找到。 ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/59446.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android T 窗口层级相关的类(更新中)

窗口在App端是以PhoneWindow的形式存在,承载了一个Activity的View层级结构。这里我们探讨一下WMS端窗口的形式。 可以通过adb shell dumpsys activity containers 来看窗口显示的层级 窗口容器类 —— WindowContainer类 /*** Defines common functionality for c…

docker菜谱大全

记录docker常用软件安装,感谢小马哥和杨师傅的投稿。😎😎😎 相关文档: DockerHub:https://hub.docker.com/Linux手册:https://linuxcool.com/Docker文档:https://docs.docker.com/Do…

Flink正常消费一段时间后,大量反压,看着像卡住了,但又没有报错。

文章目录 前言一、原因分析二、解决方案 前言 前面我也有提到,发现flink运行一段时间后,不再继续消费的问题。这个问题困扰了我非常久,一开始也很迷茫。又因为比较忙,所以一直没有时间能够去寻找答案,只是通过每天重启…

网络编程——深入理解TCP/IP协议——OSI模型和TCP/IP模型:构建网络通信的基石

TCP/IP协议— 一、简介 TCP/IP协议,即传输控制协议/互联网协议,是一组用于在计算机网络中实现通信的协议。它由两个主要的协议组成:TCP(传输控制协议)和IP(互联网协议)。TCP负责确保数据的可靠…

215. 数组中的第K个最大元素(快排+大根堆+小根堆)

题目链接:力扣 解题思路: 方法一:基于快速排序 因为题目中只需要找到第k大的元素,而快速排序中,每一趟排序都可以确定一个最终元素的位置。 当使用快速排序对数组进行降序排序时,那么如果有一趟排序过程…

数据结构--单链表

前言 上一章,我们讲了数据结构--动态顺序表,我们会发现有以下问题: 1.当我们要头部或者插入或删除时,都需要进行位置挪动,腾出某一个位置,时间复杂度为0(N); 2.增容需要申请新空间,…

Unity进阶--通过PhotonServer实现联网登录注册功能(服务器端)--PhotonServer(二)

文章目录 Unity进阶--通过PhotonServer实现联网登录注册功能(服务器端)--PhotonServer(二)服务器端大体结构图BLL层(控制层)DAL层(数据控制层)模型层DLC 服务器配置类 发送消息类 以及消息类 Unity进阶–通过PhotonServer实现联网…

Windows安装Redis

自己电脑做个测试,需要用到Redis,把安装过程记录下,方便有需要的人 1、找到下载地址:Releases microsoftarchive/redis GitHub Windows的Redis需要到GitHub上下载: 2、下载完后设置密码,打开文件夹&…

mysql二进制方式升级8.0.34

一、概述 mysql8.0.33 存在如下高危漏洞&#xff0c;需要通过升级版本修复漏洞 Oracle MySQL Cluster 安全漏洞(CVE-2023-0361) mysql/8.0.33 Apache Skywalking <8.3 SQL注入漏洞 二、查看mysql版本及安装包信息 [rootlocalhost mysql]# mysql -V mysql Ver 8.0.33 fo…

【Spring】Bean的作用域和生命周期

目录 一、引入案例来探讨Bean的作用域 二、Bean的作用域 2.1、Bean的6种作用域 2.2、设置Bean的作用域 三、Spring的执行流程 四、Bean的声明周期 1、生命周期演示 一、引入案例来探讨Bean的作用域 首先我们创建一个User类&#xff0c;定义一个用户信息&#xff0c;在定义…

Baumer工业相机堡盟工业相机如何通过BGAPISDK获取相机接口数据吞吐量(C++)

Baumer工业相机堡盟工业相机如何通过BGAPISDK里函数来获取相机当前数据吞吐量&#xff08;C&#xff09; Baumer工业相机Baumer工业相机的数据吞吐量的技术背景CameraExplorer如何查看相机吞吐量信息在BGAPI SDK里通过函数获取相机接口吞吐量 Baumer工业相机通过BGAPI SDK获取数…

【Axure教程】移动端二级滑动选择器

今天教大家制作移动端二级滑动选择器的原型模板&#xff0c;该原型已全国一二级省市选择器为案例&#xff0c;因为该原型用中继器做的&#xff0c;所以制作完成之后使用也很方便&#xff0c;只需修改中继器表格里的内容即可 一、效果展示 1. 拖动选择 2. 快捷选择 【原型预览…