了解扩散概率模型 (DPM)

一、介绍

        对复杂的概率分布进行建模是机器学习的核心问题。如果这个问题可以出现在不同的形状下,最常见的设置之一如下:给定仅由一些可用样本描述的复杂概率分布,如何生成新样本?

        所有生成模型都依赖于相同的基本思想,即将简单分布转换为我们感兴趣的复杂分布。换句话说,假设随机变量 X 服从简单分布(例如高斯分布),我们正在寻找一个函数 G,使得 G(X) 服从我们的目标分布。当然,函数 G 非常复杂,不能显式给出。一种可能的方法是使用将从可用数据中学习的神经网络对 G 进行建模。然后,我们讨论深度学习生成模型,如VAE,GAN或DPM,它们都依赖于不同的机制来定义和训练这个建模G的生成网络。

        生成模型旨在学习一个函数,该函数从简单分布中获取数据并将其转换为来自复杂分布的数据。

        早在2013年,Kingma和Welling就推出了变分自动编码器(VAE)。简而言之,VAE的想法是训练具有正则化潜在空间的自动编码器。然后,正则化编码器被迫将数据编码为接近高斯的分布,而解码器则从潜在空间重建数据。这样做,我们最终得到一个可以作为函数 G 的解码器,从高斯分布中获取数据并从原始分布中生成新数据。更多细节可以在我们之前关于VAE的文章中找到。

        一年后的2014年,Ian Goodfellow推出了生成对抗网络(GAN)。简而言之,这个想法是假设如果生成网络 G 从目标分布中生成样本,那么这些样本应该与真正的可用样本无法区分。因此,可以推导出GAN所依赖的对抗性训练的概念。生成网络 G 被训练为接受随机输入(例如,来自高斯)并从目标分布输出数据。训练判别网络 D 以区分真实数据和生成的数据。两种模型同时训练,并在竞争中变得更好(G试图愚弄D,D试图不被G愚弄)。在这个训练过程中,G 必须始终产生更有说服力的数据来欺骗 D,换句话说,正如预期的那样,遵循目标分布的数据。更多详细信息可以在我们之前关于 GAN 的文章中找到。

        如果深度学习生成模型多年来已经受到了很多关注,那么近年来(甚至几个月)随着一些能够产生出色结果的图像或视频生成模型的提高,它们变得更加暴露。一个接一个,大型科技公司首先发布了图像生成模型(来自Open AI的DALL-E 2,来自Google的Imagen,来自Meta的Make-A-Scene),然后再解决视频生成问题(来自Google的Imagen Video,来自Meta的Make-A-Video)。尽管存在差异,但这些宣布该领域光明未来的伟大模型都依赖于相同的基本概念:扩散概率模型(DPM)。

        Make-A-Scene,Imagen,DALL-E 2是扩散概率模型,能够从文本提示生成高质量的图像。上述示例由 Meta Make-A-Scene 模型生成,该模型从文本提示和基本草图生成图像,以实现更高水平的创意控制。

        扩散概率模型于2015年首次出现在Sohl-Dickstein的一篇论文中,并且由于使用它们所取得的巨大成果而获得了越来越多的关注。基本上,DPM 的想法是学习定义明确的随机过程的反向过程,该过程逐渐破坏信息,从我们的复杂目标分布中获取数据并将它们带到简单的高斯分布中。然后,这种反向过程将采用相反方向的路径,将高斯噪声作为输入并从感兴趣的分布中生成数据。

事不宜迟,让我们一起(重新)发现 DPM!

二、大纲

在本文中,我们将重点介绍深入了解 DPM 由什么组成所需的主要思想。在第一部分中,我们将回顾一些与随机过程相关的概念,并介绍什么是扩散过程。然后,在第二部分,我们将给出理解扩散概率模型的主要直觉。特别是,我们将看到如何使用扩散过程来逐步破坏信息,以及如何学习逆转此过程以逐步从噪声中生成信息。在第三部分中,我们将形式化我们的直觉,并对扩散模型进行数学描述。最后,在最后一节中,我们将在这个理论框架的基础上进行构建,看看扩散模型是如何在实践中训练的。特别是,我们将闭环,看看训练和采样的实际实现如何很好地表达我们给出的第一个直觉。请注意,尽管我们将讨论它们所依赖的许多基本概念,但我们不会详细介绍前面提到的特定模型(Make-A-Scene,Imagen,DALL-E 2等),这些模型将成为以后帖子的主题。

注意:这篇文章的某些部分比其他部分在数学上更密集。如果所有部分都不是完全独立的,我们尽可能让读者跳过某些部分。然后可以跳过介绍扩散过程的部分和给出扩散模型数学定义的部分,因为其他两个部分包含与扩散模型相关的大部分直觉和实际考虑因素。

三、什么是扩散过程?

        顾名思义,扩散概率模型在某种程度上与扩散过程有关。因此,让我们从头开始,看看扩散过程是什么以及它的性质是什么。当然,由于它不是本文的核心主题,因此我们将不得不进行一些简化,以保持足够简短,同时仍然提供基本想法。

        扩散过程是具有连续样品路径的连续时间马尔可夫随机过程。让我们分解这个非常尴尬的定义,以更好地了解我们在说什么。随机过程是随机变量的集合,通常由正整数索引

        然后我们讨论离散时间随机过程,或正实数

        然后我们讨论连续时间随机过程。与称为样本的简单随机变量的实现类似,我们将随机过程的实现称为样本路径或轨迹。对于连续时间随机过程,如果可以随机观察到的所有可能轨迹都是连续的,我们说它具有连续的样本路径。

不同类型的随机过程,在时间和空间上是离散的或连续的。

最后,马尔可夫过程是一个没有记忆的随机过程。这意味着根据现在和过去的过程的未来行为仅取决于现在。过去的信息可以被丢弃,因为它不提供任何其他信息。换句话说,这个过程的未来状态并不取决于我们如何达到现在的状态,而只取决于现在的状态。在数学上,它可以写成

任何扩散过程都可以用随机微分方程(SDE)来描述,该方程以以下形式编写

其中a称为漂移系数,σ称为扩散系数,W为维纳过程。维纳过程更广为人知的是布朗运动。粗略地说,与维纳过程相关的总和的正确部分是使这个微分方程“随机”的原因。如果没有这第二项,我们将处理一个简单的微分方程。维纳过程带来了一些具有独立高斯增量的(连续)随机性,使得

如果我们稍微离散微分方程以使事情更容易掌握,我们得到

也可以写

然后我们可以看到 X_{t+dt} 的值是X_t的值,我们在其中添加一个确定性漂移项和一个随机扩散项,该值由正态随机变量定义,方差与扩散系数的平方成正比。因此,扩散系数表示要应用的随机性的强度。

扩散处理不同随机微分方程和相关(非随机)微分方程的样本。我们可以看到,漂移项给出了趋势,而扩散项带来了一些随机性。扩散系数越高,随机性越大。

最后,让我们以扩散过程的一个有趣属性来结束,这将在本文后面有用。如果X_t是一个扩散过程,使得

则逆时间过程 X̄_t = X_{T-t} 也是具有相同泛函形式的扩散过程,由以下随机微分方程描述

其中 p(X_t) 定义了X_t和

称为评分函数。

四、扩散模型的直觉

        通过一些精心选择的系数,扩散过程具有逐渐破坏任何相关信息的效果。实际上,具有“收缩”漂移系数 (|a|<1) 和非零扩散系数的扩散将逐渐将数据从任何复分布转换为来自简单各向同性高斯噪声(高斯,其协方差矩阵为对角线,这意味着所有维度都是独立的高斯)的数据。让我们首先用一个简单的一维示例来说明这一点。

        扩散过程具有逐渐破坏信息的效果。在此一维示例中,任何初始分布都将转换为高斯分布(渐近)。

        在这个一维示例中,我们将“离散扩散过程”定义为

        我们说,对于任何X_0,这个过程最终都会趋向于高斯分布。让我们对这一事实进行非正式演示,这也将证明我们系数中的这些平方根是合理的。在给定的步骤 T 之后,我们可以写

        其中所有高斯都是独立的,这意味着第二项可以表示为单个高斯,其方差是所有方差的总和。对于足够大的步骤 T 的许多,我们有

        我们看到第一项变得可以忽略不计,方差之和收敛于 1,这意味着对于任何起点,我们倾向于在一维示例中的标准高斯分布。

        当然,同样的想法可以应用于更高的维度。例如,大小为 100*100 的图像分布是一个非常复杂的高维分布,可以逐渐转换为相同维数的非常简单分布:100*100 各向同性噪声。在这种情况下,扩散过程将以类似于我们在 1D 示例中描述的方式起作用,但它将针对每个像素的每个 RGB 通道执行此操作。

        扩散过程可以定义为将图像等高维数据转换为各向同性高斯噪声。

        到目前为止,我们知道我们可以使用扩散从复分布到简单的各向同性高斯噪声。从本文开头讨论的内容来看,我们可以概述我们对反向过程更感兴趣:从简单分布到复杂分布。最重要的是,从复分布到简单分布并不难,因为我们可以简单地将复分布的任何点随机投影到简单分布中,因为我们知道如何从最后一个点中采样。

        那么在这里使用扩散的真正意义是什么?简单的答案是,它为我们提供了一种渐进的结构化方法,可以从复分布到各向同性高斯噪声,这将简化反向过程的学习。让我们对最后一点有一个直觉。

        正如我们提到的,将任何给定的图像随机投影到各向同性高斯噪声中非常容易。相反,逆转这个过程是非常困难的:看着一些给定的噪声,我们不能从先前的图像中说太多,因为没有结构可以依赖。

一次从纯噪声到高质量样品可能是一项相当复杂的任务。

        现在让我们假设这些图像中的每一个都不是直接的,而是通过扩散过程逐渐投影到各向同性高斯噪声的。看着最后一步,基本上是我们之前得到的噪音,我们仍然不能说太多。然而,从中间步骤来看,我们显然有一些线索可以指导我们逆转这个过程。

从纯噪声到高质量样本逐渐出现中间步骤,我们可以依靠这些步骤来简化生成任务。

        这里重要的一点是:中间步骤是强度扩散模型所依赖的。在这一点上,人们确实可以观察到,尽管扩散过程是逐步完成的,但扩散过程最终会从初始复分布中获取任何数据点,并将其从简单分布中转换为随机点。所以,最后,既然我们可以一次性从复杂到简单分布,为什么还要为中间步骤而烦恼呢?与其学习多步反向过程,为什么不学习一个大的反向过程,即多步骤过程的展开版本?我们甚至不能认为它会完全相同吗?

        乍一看,人们可能会认为学习T小模型或单个大模型是这些小模型的组合是非常相似的。

        如果有人想坚持这种推理,事实是,将过程分解为中间步骤会带来两件事。首先,所有反向步骤彼此之间并不完全不同,这意味着在实践中,我们不必为每个反向步骤学习完全不同的模型,而只需要将步骤作为参数来调整其行为的通用模型。它大大减少了要学习的模型的大小。其次,除了需要学习更多参数之外,一次性展开版本更难训练,因为它需要从纯噪声到最终的高质量数据,这使得任务和梯度下降学习更加复杂。相反,渐进式模型不需要一次处理整个复杂性,并且可以在早期阶段首先引入粗略信息,然后再添加越来越精细的信息。从某种意义上说,中间步骤也可以被视为指导培训过程以使其更容易的一种方式。

        然后,我们可以将扩散模型的主要思想总结如下。我们定义了一个逐渐破坏信息的扩散过程,并学习其期望恢复信息的反向过程。这种反向过程也是渐进的,我们可以依靠这一事实来使其学习更有效率。在实践中,建模和训练确实可以利用要学习的过程的迭代性质,而不能依赖这些有价值的中间步骤的一次性模型。

        渐进式逆向过程的学习可以利用问题的迭代结构,而直接模型则不能。明显的缺点是采样需要多个步骤,因此更长。

        退一步说,我们可以观察到,VAE的总体思路与VAE相去甚远:编码器以结构化的方式将初始复分布转换为简单分布,以便能够学习相反方向的解码器。DPM 和 VAE 之间的主要区别如下。首先,编码器是一个多步骤过程,而不是单步编码器。其次,编码器是完全固定的,不需要学习,因为要学习的解码器(反向过程)将直接依赖于扩散过程带来的结构,而不是依赖于训练过程中学习的结构。第三,潜在空间与输入具有完全相同的维度,与VAE的潜在空间相反,VAE的维度比编码输入低几个数量级。最后,学习的解码器是扩散过程的反向过程,因此是一个多步骤过程,而不是单个传递函数。

        DPM 的明显缺点是采样需要多个步骤,这意味着生成过程将比 GAN 或 VAE 更长,因为这些类型的模型需要一次通过。这一根本差异提出了许多问题。假设参数数量相同,当第一个输出进行多次传递时,将 DPM 输出与 GAN 和 VAE 输出进行比较是否完全公平(因此需要更多时间)?如果DMP的力量来自其生成过程的渐进性,那么尝试馏出DMP有多大意义?我们不会在这里回答这些问题,但它们肯定是值得思考的有趣问题。

五、扩散模型的数学

        现在我们已经建立了直觉,让我们给出一个更正式的 DPM 数学公式。尽管存在扩散模型的连续和离散时间公式,但我们将在这篇文章中重点介绍后面的内容。这意味着我们将假设正向扩散过程和向后反向过程已被离散化为有限数量的T步长。请注意,对于正向和反向过程,用高斯转移概率核而不是扩散过程谈论马尔可夫链更准确,但思路是相同的。

        让我们表示x_0来自我们想要从中采样的分布中的数据,以及分布本身的 q(x_0)。我们用高斯转移概率(扩散核)定义正向过程,如下所示

其中β_t指示每一步要保留的上一步信息与要添加的新噪声之间的权衡。我们也可以写

在这里,我们可以清楚地识别离散扩散过程。我们可以很容易地用一个简单的递归论证来证明,链中的任何步骤x_0都可以根据

哪里

        根据马尔可夫性质,我们可以将给定前进轨迹的概率写为

        我们在上一节中描述过,我们的目标是学习这个正向扩散过程的逆过程,或者更准确地说,这个正向马尔可夫链的逆链。我们之前提到,在漂移和扩散系数的一些假设下(这里满足),扩散过程的逆向也是相同功能形式的扩散过程(具有相同的扩散系数,但我们稍后会回到这一点)。通过足够小的时间步长(大T,意味着小β_t),我们可以对我们正在寻找的反向链进行相同性质的近似,这也应该是具有高斯转移概率的马尔可夫链。相反的过程

        然后可以近似为

        其中 μ_θ 和 Σ_θ 是由 θ 参数化的两个函数。使用马尔可夫性质,给定后向轨迹的概率可以近似为

        其中 p(x_T) 是不依赖于 θ 的各向同性高斯分布

数学设置的图示。

        现在我们已经定义了我们的正向过程并模拟了它的反向过程,这就出现了一些大问题。我们如何学习 μ_θ 和 Σ_θ 参数?需要优化的损失是多少?我们从反向过程中主要期望的是p_θ(x_0)接近q(x_0)。换句话说,反向过程的最终采样步骤后生成的数据的分布应与目标分布相同。因此,反向过程的学习在于找到 μ_θ 和 Σ_θ,以最小化 q(x_0) 和 p_θ(x_0) 之间的 KL 散度,或者等价地最小化 q(x_0) 下 p_θ(x_0) 的负对数可能性。在数学上,我们希望找到最小化的 μ_θ 和 Σ_θ

        在现阶段,尚不清楚中间步骤在哪里发挥作用,但很快就会发挥作用。让我们先稍微修改一下括号中的表达式。

        然后,对数函数是凹的,我们从詹森不等式得到

        因此,我们可以定义一个更高的界限到L

        与其最小化L,我们可以最小化L的上限,这更容易处理。在推导的这一点上,至少从理论的角度来看,我们已经更清楚了如何通过从正向过程迭代采样并调整参数以最小化上限的负对数比率来学习逆过程的参数。但是,让我们做最后的努力,将推导推得更远一点,以获得更方便的上限形式。

        使用贝叶斯定理,我们有

        等等

        第一项不依赖于 μ_θ 和 Σ_θ,因此在优化过程中不需要考虑。最后一个术语是不言自明的,并不难优化。最后,其余项是高斯分布之间的KL散度。事实上,我们已经看到

        我们可以证明这一点

        此处

        具有闭合形式的 2 个高斯分布之间的 KL 散度,我们将在下一节中看到,这个上限定义了一个非常容易处理的损失函数,在训练过程中需要最小化。

六、实践中的扩散模型

        到目前为止,我们已经定义了一个正向过程q作为我们的(离散)扩散过程,它逐渐破坏信息

        以及一个反向过程 p_θ 建模要学习并应该逐步恢复信息的反向过程

        然后,我们已经看到,训练我们的反向过程包括找到最小化上限的 μ_θ 和 Σ_θ

        在这一点上,值得注意的是,如果我们省略要学习的反向模型的参数在步骤之间共享,则上限表达式中的不同项是相互独立的。因此,假设我们的模型有足够的容量,最小化整个上限类似于最小化其每个项。

        现在让我们做一些假设,看看在实践中如何进行培训。首先,为了使事情变得更容易,我们可以决定将逆过程的方差设置为未经训练的时间相关常数,以便

        第一个选项匹配 q(x_{t-1} | x_t) 的方差,假设时间步长足够小(大 T,意味着小β_t),因此,反向过程具有与正向过程具有相同“扩散系数”的属性。第二个选项匹配 q(x_{t-1} | x_t, x_0) 的方差。在实践中,研究似乎表明这两种选择给出了相似的结果。我们现在将假设第二个选项。

        它只允许我们学习一个模型来学习反向过程的均值。提醒

        使用两个高斯的KL散度的闭合形式可以证明,

        然后,我们可以看到,上界的每个KL散度项对应于给定的时间步长,其优化仅包括最小化模型之间的L2距离和以x_0为条件的反向过程的平均值,两者都在考虑的时间步长进行评估。

如果这个公式已经非常方便,通常最好根据噪声重新参数化模型。首先,我们注意到

        这意味着

        因此,我们可以通过定义来重新参数化模型

        因此

        通过这种新的参数化,我们不再学习代表反向过程均值的模型,而是代表已添加到x_0以获得x_t的噪声的模型。现在,上限的每个KL散度项的最小化包括最小化模型和噪声之间的L2距离。

        到目前为止,我们已经省略了我们想要最小化的上限中的最后一项

        尽管需要注意以适当的方式处理,但根据所选的参数化,该术语也可以很好地用 μ_θ(x_1, 1) 或 ε_θ(x_1, 1) 来表示。最后,整体表达式相对于模型参数 θ 是可以很好地微分的,并且可以通过最小化这个上限来完成训练。

        但是,如果确切的上限可用于训练,则建议使用以下更简单的变体,并且在实践中经常使用

        该变体定义了要实现的更简单的损失函数,并且已被证明有利于样品质量。

        作为与初始上限的主要区别,可以观察到期望不再是在整个随机前向轨迹上,而是在定义随机前向轨迹的单个步长的随机三元组(初始数据、步长、噪声)上。这种变化可以用上限项的独立性来解释(忽略要优化的参数是共享的)。正如我们前面已经提到的,这种独立性意味着最小化整个上限相当于最小化其每个条款。在迭代训练过程中,对单个步骤进行采样并优化相应的项实际上比对完整的前向轨迹进行采样并针对所有项进行优化要容易得多。这是使这种变体如此吸引人的原因之一。

        归根结底,我们只剩下这个非常简洁的损失函数需要优化。对噪声进行建模的神经网络几乎可以采用任何形状,具体取决于数据的性质。在图像的情况下,许多论文使用以U-Net形状组织的卷积和注意力块,但其他架构也可以适应。然后,训练只需迭代采样一些三元组(初始数据、步长、噪声)并针对损失函数应用梯度下降步长。

去噪扩散概率模型训练的训练过程图示。

        在采样时,我们将首先从各向同性高斯分布中采样一些噪声,然后,我们将使用我们学习的逆过程从目标分布生成数据。在生成过程的每一步,噪声参数化意味着模型同时获取噪声数据和当前步骤,并估计噪声分量。然后可以计算x_0的近似值,并用于定义以该接近x_0为条件的反向过程的平均值。

        乍一看,人们可能会在我们的采样过程中发现一些令人费解的行为:在第一步(以及所有后续步骤,事实上)我们估计噪声数据中的噪声,从而可以计算出x_0的估计值。那么,为什么要为所有后续步骤而烦恼呢?为什么不只保留第一个估计x_0作为要返回的最终数据?答案是,该模型根本不被认为足够强大,无法一次性消除所有噪点。因此,x_0的第一个估计值预计不会是完美的,但它表明下一个采样步骤要遵循的粗略方向,因为我们将从以该估计为条件的反向过程中进行采样。

        以x_0(μ_t(x_t, x_0))为条件的反向过程均值的公式是x_t和x_0之间的线性组合(见上等式),它清楚地表明了我们的下一个采样步骤x_{t-1}将以某种方式混合当前步骤和估计x_0。可以粗略地说,我们将在“当前步骤和x_0之间的某个地方”对下一步进行采样。考虑到这一点,我们可以将生成模型想象如下:首先,我们从随机噪声中采样最后一步x_T,然后逐步从当前状态估计x_0并根据当前状态生成上一步,并将此估计作为某种“目标”。我们提到过,在第一步中,x_0估计不会很好,因为模型预计不具有这样做的预测能力,但是一次又一次的迭代,这些估计将指导反向生成过程,并且会变得越来越好,直到我们得到高质量的最终样本。

去噪扩散概率模型的采样过程图示。

        最后,我们可以弥合我们建立的第一个直觉和我们刚刚给出的更正式的 DPM 描述之间的差距。我们可以“在数学上”看到渐进式生成过程(如 DPM)相对于单次传递生成过程的优势。经过训练的模型不需要一次性处理所有生成。相反,该模型可以首先在早期阶段引入粗略的信息,然后在保持降噪的同时逐渐添加越来越多的细节。最重要的是,在对这种反向去噪过程进行建模时,我们利用了这样一个事实,即对具有不同噪声水平的图像进行降噪并不是完全不同的任务,而是依赖于可以通过单个神经网络相互化和学习的类似机制。

七、总结

        本文的主要内容是:

  • 生成过程都针对同一个目标,即定义一个函数,该函数从简单分布中获取数据并将其转换为来自复杂分布的数据。
  • 学习一个函数(由神经网络表示),该函数获取一些高斯噪声并从目标复分布中输出数据可能是一项非常困难的任务
  • 扩散过程,或其离散版本,具有高斯核的马尔可夫链,可用于逐步破坏信息,这意味着它们可用于从复杂分布(例如有意义的图像)中获取数据,并通过添加噪声将它们逐渐转换为来自非常简单分布(例如高斯噪声)的数据
  • 扩散概率模型的想法是学习扩散的反向过程,期望通过消除噪声从一些高斯噪声逐渐进入复杂分布
  • 任务的迭代性质使其更简单,因为经过训练的模型不需要一次性处理整个生成,并且可以先引入粗略的信息,然后在不断降噪的同时逐步添加越来越多的细节。
  • 要学习的模型依赖于这样一个事实,即对具有不同噪声水平的图像进行去噪是类似的任务,依赖于可以通过训练单个神经网络共享的通用机制。

        在本文中,我们描述了理解扩散概率模型基础知识的主要概念。当然,还有很多知识需要探索,从我们在本文中描述的基本设置的可能改进,到去噪扩散隐式模型(DDIM)的想法,通过条件反射和指导的概念(基于分类器和无分类器),这是我们这些天在互联网上随处可见的惊人生成模型的核心。约瑟夫·罗卡

这篇文章已经相当长和密集了。因此,在此处输入与 DPM 相关的更高级机制的详细信息将涉及太多信息。但是,我们强烈建议感兴趣的读者阅读上面链接的论文,以加深其知识和对该领域的理解。而且,也许,我们会写另一篇文章来解决我们现在留下的这些概念......一步一步来,就像我们的 DPM 一样。

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

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

相关文章

【Python从入门到进阶】32、bs4的基本使用

接上篇《31、使用JsonPath解析淘票票网站地区接口数据》 上一篇我们介绍了如何使用JSONPath来解析淘票票网站的地区接口数据&#xff0c;本篇我们来学习BeautifulSoup的基本概念&#xff0c;以及bs4的基本使用。 一、BeautifulSoup简介 1、bs4基本概念 BeautifulSoup是一个P…

Flink之时间语义

Flink之时间语义 简介 Flink中时间语义可以说是最重要的一个概念了,这里就说一下关于时间语义的机制,我们下看一下下面的表格,简单了解一下 时间定义processing time处理时间,也就是现实世界的时间,或者说代码执行时,服务器的时间event time事件时间,就是事件数据中所带的时…

怎样让音频速度变慢?请跟随以下方法进行操作

怎样让音频速度变慢&#xff1f;在会议录音过程中&#xff0c;经常会遇到主讲人语速过快&#xff0c;导致我们无法清晰听到对方说的内容。如果我们能够减慢音频速度&#xff0c;就能更好地记录对方的讲话内容。此外&#xff0c;在听到快速播放的外语或方言时&#xff0c;我们也…

途乐证券|买了股票但不管可以吗?会不会被撤回?

炒股是个说简略也简略、说难也难的事情&#xff0c;一些股民绞尽脑汁、忙前忙后紧盯大盘&#xff0c;实时剖析&#xff0c;把自己累够呛&#xff1b;一些股民云淡风轻&#xff0c;买了股票却几乎不怎么理睬&#xff0c;兴致来了看两眼&#xff0c;也就算研讨股票行情了。那么&a…

8.4.tensorRT高级(3)封装系列-infer推理封装,输入输出tensor的关联

目录 前言1. infer封装总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记&#xff0c;很多东西也忘了。这次重新撸一遍&#xff0c;顺便记记笔记。 本次课程学习 tensorRT 高级-infer推理封装&#xff0c;输入输出…

「UG/NX」Block UI 面收集器FaceCollector

✨博客主页何曾参静谧的博客📌文章专栏「UG/NX」BlockUI集合📚全部专栏「UG/NX」NX二次开发「UG/NX」BlockUI集合「VS」Visual Studio「QT」QT5程序设计「C/C+&#

分类预测 | MATLAB实现MTBO-CNN多输入分类预测

分类预测 | MATLAB实现MTBO-CNN多输入分类预测 目录 分类预测 | MATLAB实现MTBO-CNN多输入分类预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.MATLAB实现MTBO-CNN多输入分类预测 2.代码说明&#xff1a;基于登山队优化算法&#xff08;MTBO&#xff09;、卷积神经…

使用本地电脑搭建可以远程访问的SFTP服务器

文章目录 1. 搭建SFTP服务器1.1 下载 freesshd 服务器软件1.3 启动SFTP服务1.4 添加用户1.5 保存所有配置 2. 安装SFTP客户端FileZilla测试2.1 配置一个本地SFTP站点2.2 内网连接测试成功 3. 使用cpolar内网穿透3.1 创建SFTP隧道3.2 查看在线隧道列表 4. 使用SFTP客户端&#x…

代码随想录打卡—day21—【二叉树】— 8.21

1 530. 二叉搜索树的最小绝对差 530. 二叉搜索树的最小绝对差 想法&#xff1a;先直接中序遍历&#xff08;升序的序列&#xff09;过程中相邻两个数的差值取min&#xff0c;自己写一次AC代码&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* …

Facebook 应用未启用:这款应用目前无法使用,应用开发者已得知这个问题。

错误&#xff1a;Facebook 应用未启用:这款应用目前无法使用&#xff0c;应用开发者已得知这个问题。应用重新启用后&#xff0c;你便能登录。 「应用未经过审核或未发布」&#xff1a; 如果一个应用还没有经过Facebook的审核或者开发者尚未将应用发布&#xff0c;那么它将无法…

【Mysql】MVCC版本机制的多并发

&#x1f307;个人主页&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;命运给你一个低的起点&#xff0c;是想看你精彩的翻盘&#xff0c;而不是让你自甘堕落&#xff0c;脚下的路虽然难走&#xff0c;但我还能走&#xff0c;比起向阳而生&#xff0c;我更想尝试逆风…

iOS设计规范是什么?都有哪些具体规范

iOS设计规范是苹果为移动设备操作系统iOS制定的设计指南。iOS设计规范的制定保证了苹果应用在外观和操作上的一致性和可用性&#xff0c;从而提高了苹果界面设计的用户体验和应用程序的成功性。本文将从七个方面全面分析iOS设计规范。 1.iOS设计规范完整版分享 由「即时设计」…

【LeetCode75】第三十四题 叶子相似的树

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 给我们两棵二叉树&#xff0c;让我们判断这两棵二叉树的从左到右的叶子节点组成的叶子序列是否一致&#xff0c;即从左到右的叶子节点的数…

Open3D 进阶(5)变分贝叶斯高斯混合点云聚类

目录 一、算法原理二、代码实现三、结果展示四、测试数据本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 系列文章(连载中。。。爬虫,你倒是爬个完整的呀?): Open3D 进阶(1) MeanShift点云聚类Open3D 进阶(2)DB…

Ajax介绍

1.与服务器进行数据交换&#xff1a;通过 Ajax 可以给服务器发送请求&#xff0c;并获取服务器响应的数据。 2.异步交互&#xff1a;可以在 不重新加载整个页面 的情况下&#xff0c;与服务器交换数据并 更新部分网页 的技术&#xff0c;如&#xff1a; 搜索联想、用户名是否可…

浅析Linux SCSI子系统:调试方法

文章目录 SCSI日志调试功能scsi_logging_level调整SCSI日志等级 SCSI trace events使能SCSI trace events方式一&#xff1a;通过set_event接口方式二&#xff1a;通过enable 跟踪trace信息 相关参考 SCSI日志调试功能 SCSI子系统支持内核选项CONFIG_SCSI_LOGGING配置日志调试…

Django学习笔记(2)

创建app 属于自动执行了python manage.py 直接在里面运行startapp app01就可以创建app01的项目了 之后在setting.py中注册app01 INSTALLED_APPS ["django.contrib.admin","django.contrib.auth","django.contrib.contenttypes","django.c…

Dockerfile制作Web应用系统nginx镜像

目录 1.所需实现的具体内容 2.编写Dockerfile Dockerfile文件内容&#xff1a; 默认网页内容&#xff1a; 3.构建镜像 4.现在我们运行一个容器&#xff0c;查看我们的网页是否可访问 5.现在再将我们的镜像打包并上传到镜像仓库 1.所需实现的具体内容 基于centos基础镜像…

Linux学习之ssh和scp

ls /etc/ssh可以看到这个目录下有一些文件&#xff0c;而/etc/ssh/ssh_config是客户端配置文件&#xff0c;/etc/ssh/sshd_config是服务端配置文件。 cat -n /etc/ssh/sshd_config | grep "Port "可以看一下sshd监听端口的配置信息&#xff0c;发现这个配置端口是22…

async和await

一&#xff0c;基本使用 其实就是之前学过的异步函数&#xff0c;异步编程在函数前写一个ansyc&#xff0c;就转化为异步函数&#xff0c;返回的是一个promise对象&#xff0c;于是就可以使用await关键字&#xff0c;可以把异步函数写成同步函数的形式&#xff0c;极大地提高代…