论文笔记(六十三)Understanding Diffusion Models: A Unified Perspective(六)(完结)
Understanding Diffusion Models: A Unified Perspective(六)(完结)
- 文章概括
- 指导(Guidance)
- 分类器指导
- 无分类器引导(Classifier-Free Guidance)
- 总结
文章概括
引用:
@article{luo2022understanding,title={Understanding diffusion models: A unified perspective},author={Luo, Calvin},journal={arXiv preprint arXiv:2208.11970},year={2022}
}
Luo, C., 2022. Understanding diffusion models: A unified perspective. arXiv preprint arXiv:2208.11970.
原文: https://arxiv.org/abs/2208.11970
代码、数据和视频:https://arxiv.org/abs/2208.11970
系列文章:
请在 《 《 《文章 》 》 》 专栏中查找
指导(Guidance)
到目前为止,我们专注于仅对数据分布 p ( x ) p(x) p(x)进行建模。然而,我们通常还对学习条件分布 p ( x ∣ y ) p(x|y) p(x∣y)感兴趣,这将使我们能够通过条件信息 y y y明确控制生成的数据。这构成了图像超分辨率模型(如级联扩散模型[Cascaded Diffusion Models][18])的基础,同时也是图像-文本模型(如DALL-E 2[19]和Imagen[7])的前沿技术。
一种自然的方式是简单地在每次迭代中将条件信息与时间步信息一起添加。回忆公式32中的联合分布:
p ( x 0 : T ) = p ( x T ) ∏ t = 1 T p θ ( x t − 1 ∣ x t ) p(x_{0:T}) = p(x_T) \prod_{t=1}^T p_\theta(x_{t-1}|x_t) p(x0:T)=p(xT)t=1∏Tpθ(xt−1∣xt)
然后,为了将其转化为一个条件扩散模型,我们可以在每个转换步骤中简单地添加任意条件信息 y y y,表示为:
p ( x 0 : T ∣ y ) = p ( x T ) ∏ t = 1 T p θ ( x t − 1 ∣ x t , y ) p(x_{0:T}|y) = p(x_T) \prod_{t=1}^T p_\theta(x_{t-1}|x_t, y) p(x0:T∣y)=p(xT)t=1∏Tpθ(xt−1∣xt,y)
例如, y y y可以是在图像-文本生成中的文本编码,也可以是用于执行超分辨率的低分辨率图像。因此,我们可以像之前一样,通过预测 x ^ θ ( x t , t , y ) ≈ x 0 \hat{x}_\theta(x_t,t,y) \approx x_0 x^θ(xt,t,y)≈x0、 ϵ ^ θ ( x t , t , y ) ≈ ϵ 0 \hat{\epsilon}_\theta(x_t,t,y) \approx \epsilon_0 ϵ^θ(xt,t,y)≈ϵ0或 s θ ( x t , t , y ) ≈ ∇ log p ( x t ∣ y ) s_\theta(x_t,t,y) \approx \nabla \log p(x_t|y) sθ(xt,t,y)≈∇logp(xt∣y),学习VDM的核心神经网络,以实现每种所需的解释和实现。
这种基础公式的一个警告是,通过这种方式训练的条件扩散模型可能会倾向于忽略或弱化任何给定的条件信息。因此,提出了指导(Guidance)作为一种更明确控制模型对条件信息权重的方法,但代价是样本多样性的降低。两种最流行的指导形式被称为分类器指导(Classifier Guidance)[10, 20]和无分类器指导(Classifier-Free Guidance)[21]。
这段内容主要讲解了如何将扩散模型从无条件生成(直接建模数据分布 p ( x ) p(x) p(x))扩展到条件生成(建模条件分布 p ( x ∣ y ) p(x|y) p(x∣y)),并提到了一种潜在的问题,即条件信息 y y y在训练过程中可能被模型忽略或弱化。
1. 从无条件生成到条件生成
1.1 无条件生成建模 扩散模型在无条件生成建模中专注于直接建模数据分布 p ( x ) p(x) p(x)。联合分布形式(回忆公式 32): p ( x 0 : T ) = p ( x T ) ∏ t = 1 T p θ ( x t − 1 ∣ x t ) . p(x_{0:T}) = p(x_T) \prod_{t=1}^T p_\theta(x_{t-1} | x_t). p(x0:T)=p(xT)t=1∏Tpθ(xt−1∣xt).
- x 0 : T x_{0:T} x0:T:表示数据从初始噪声 x T x_T xT 到去噪还原 x 0 x_0 x0 的一系列中间步骤。
- p θ ( x t − 1 ∣ x t ) p_\theta(x_{t-1} | x_t) pθ(xt−1∣xt):表示从时间 t t t 的噪声分布 x t x_t xt 逐步还原到 t − 1 t-1 t−1 的噪声分布 x t − 1 x_{t-1} xt−1。
- p ( x T ) p(x_T) p(xT):初始噪声的分布,通常为标准高斯分布。
1.2 条件生成建模 我们希望生成样本不仅符合 p ( x ) p(x) p(x),还能够通过条件信息 y y y 控制生成过程,即建模条件分布 p ( x ∣ y ) p(x|y) p(x∣y)。 为了实现条件生成,只需在无条件模型的每个步骤中添加条件信息 y y y:
p ( x 0 : T ∣ y ) = p ( x T ) ∏ t = 1 T p θ ( x t − 1 ∣ x t , y ) . p(x_{0:T} | y) = p(x_T) \prod_{t=1}^T p_\theta(x_{t-1} | x_t, y). p(x0:T∣y)=p(xT)t=1∏Tpθ(xt−1∣xt,y).公式含义
- p ( x T ) p(x_T) p(xT):与无条件模型相同,初始噪声的分布仍然为标准高斯分布。
- p θ ( x t − 1 ∣ x t , y ) p_\theta(x_{t-1} | x_t, y) pθ(xt−1∣xt,y):条件扩散模型的核心,用于学习在给定条件 y y y 下从 x t x_t xt 转换到 x t − 1 x_{t-1} xt−1 的概率。
如何引入条件信息 y y y 条件信息 y y y 的形式是任意的,比如:
- 在图像-文本生成任务中, y y y 是文本编码。
- 在图像超分辨率任务中, y y y 是低分辨率图像。
模型通过神经网络参数化 p θ ( x t − 1 ∣ x t , y ) p_\theta(x_{t-1} | x_t, y) pθ(xt−1∣xt,y),可以在每次迭代中引入 y y y,如:
- 预测 x ^ θ ( x t , t , y ) ≈ x 0 \hat{x}_\theta(x_t, t, y) \approx x_0 x^θ(xt,t,y)≈x0:从条件 y y y 中还原出原始数据 x 0 x_0 x0。
- 预测 ϵ ^ θ ( x t , t , y ) ≈ ϵ 0 \hat{\epsilon}_\theta(x_t, t, y) \approx \epsilon_0 ϵ^θ(xt,t,y)≈ϵ0:预测初始噪声。
- 预测 s θ ( x t , t , y ) ≈ ∇ log p ( x t ∣ y ) s_\theta(x_t, t, y) \approx \nabla \log p(x_t | y) sθ(xt,t,y)≈∇logp(xt∣y):学习条件得分函数。
2. 条件扩散模型忽略条件信息的问题
2.1 问题来源 条件扩散模型的训练目标类似于无条件模型,只是多了条件 y y y: E p ( x 0 : T , y ) [ ∥ s θ ( x t , t , y ) − ∇ log p ( x t ∣ y ) ∥ 2 2 ] . \mathbb{E}_{p(x_{0:T}, y)} \left[ \| s_\theta(x_t, t, y) - \nabla \log p(x_t | y) \|_2^2 \right]. Ep(x0:T,y)[∥sθ(xt,t,y)−∇logp(xt∣y)∥22].
- 损失函数关注的是得分函数 s θ ( x t , t , y ) s_\theta(x_t, t, y) sθ(xt,t,y) 对于数据 x t x_t xt 的预测精度。
- 目标是让模型通过学习条件分布 p ( x t ∣ y ) p(x_t | y) p(xt∣y) 更好地指导采样。
问题: 在很多情况下,模型可以选择忽略 y y y,只关注数据分布 p ( x ) p(x) p(x),也能在损失函数上取得较低值。这是因为:
- 在 y y y 的影响很弱时,模型可以退化为无条件扩散模型,只预测 p ( x t ) p(x_t) p(xt) 的得分函数,而不使用 y y y。
- 如果 y y y 与 x t x_t xt 的关系较复杂,而简单的无条件预测已经足够降低损失,模型倾向于忽略 y y y。
2.2 为什么模型可能忽略 y y y 这个现象称为“条件退化问题”(Conditional Degradation Problem),其主要原因包括:
目标函数对条件信息的依赖较弱:
- 损失函数中没有显式地对条件信息 y y y 强化约束,模型更容易忽略 y y y。
- 在高维数据空间中, p ( x t ) p(x_t) p(xt) 的特征可能已经足够显著,使得条件信息 y y y 显得无足轻重。
训练数据中条件信息的质量和多样性不足:
- 如果 y y y 的分布较简单或信息量不足,模型可能会学习到“忽略 y y y”更容易优化。
无条件预测较为简单:
- 如果无条件生成已经能够很好地降低损失,模型可能会放弃更复杂的条件生成。
3. 示例:条件扩散中的问题
3.1 图像超分辨率中的条件扩散 任务:给定低分辨率图像 y y y,生成对应的高分辨率图像 x x x。
条件扩散公式: p ( x 0 : T ∣ y ) = p ( x T ) ∏ t = 1 T p θ ( x t − 1 ∣ x t , y ) . p(x_{0:T} | y) = p(x_T) \prod_{t=1}^T p_\theta(x_{t-1} | x_t, y). p(x0:T∣y)=p(xT)t=1∏Tpθ(xt−1∣xt,y). 模型可能的问题:
- 如果模型发现低分辨率图像 y y y 信息不足以显著影响生成结果,它可能退化为无条件生成,仅根据 p ( x ) p(x) p(x) 生成高分辨率图像。
- 结果是生成的图像可能与 y y y 无关,仅符合高分辨率图像的分布。
3.2 图像-文本生成中的条件扩散 任务:给定文本描述 y y y,生成对应的图像 x x x。
条件扩散公式: p ( x 0 : T ∣ y ) = p ( x T ) ∏ t = 1 T p θ ( x t − 1 ∣ x t , y ) . p(x_{0:T} | y) = p(x_T) \prod_{t=1}^T p_\theta(x_{t-1} | x_t, y). p(x0:T∣y)=p(xT)t=1∏Tpθ(xt−1∣xt,y). 模型可能的问题:
- 如果文本 y y y 的语义信息较模糊,模型可能倾向于生成一个与 p ( x ) p(x) p(x) 相符的“通用图像”。
- 比如,输入“猫在沙发上”,但生成的结果可能是一只猫,而无关沙发。
4. 解决条件信息弱化问题
为了解决模型倾向于忽略条件信息的问题,可以采取以下方法:
加强条件信息的权重:
- 在训练中通过损失函数显式强调 ( y ) 的影响,比如引入条件正则化项:
E p ( x 0 : T , y ) [ ∥ s θ ( x t , t , y ) − ∇ log p ( x t ∣ y ) ∥ 2 2 + λ ∥ f ( y ) − g ( x t ) ∥ 2 2 ] , \mathbb{E}_{p(x_{0:T}, y)} \left[ \| s_\theta(x_t, t, y) - \nabla \log p(x_t | y) \|_2^2 + \lambda \| f(y) - g(x_t) \|_2^2 \right], Ep(x0:T,y)[∥sθ(xt,t,y)−∇logp(xt∣y)∥22+λ∥f(y)−g(xt)∥22],
其中 f ( y ) f(y) f(y) 和 g ( x t ) g(x_t) g(xt) 表示条件和数据的特征提取函数。改进条件编码方式:
- 增加条件编码的质量,比如在图像-文本任务中引入更强大的文本编码器(如预训练的 CLIP 模型)。
增加条件数据多样性:
- 确保训练数据中条件 y y y 的分布足够广泛,覆盖各种可能的情况。
使用交叉注意力机制:
- 在神经网络中引入交叉注意力层,使条件信息 y y y 更加显著地影响生成过程。
总结
- 条件扩散模型通过引入条件信息 y y y,在每次迭代中将无条件生成扩展为条件生成。
- 条件信息可能被忽略的原因包括目标函数弱化对 y y y 的依赖、数据分布的复杂性以及模型训练中的简化偏好。
- 可以通过加强条件编码、调整损失函数和改进训练数据等方法解决这一问题。
分类器指导
让我们从扩散模型的基于分数(score-based)形式开始,其中我们的目标是在任意噪声水平 t t t下学习条件模型的分数 ∇ log p ( x t ∣ y ) \nabla\log p(x_t|y) ∇logp(xt∣y)。回顾一下, ∇ \nabla ∇是 ∇ x t \nabla_{x_t} ∇xt的简写,为了简洁起见采用此形式。根据贝叶斯公式,我们可以推导出以下等价形式:
∇ log p ( x t ∣ y ) = ∇ log ( p ( x t ) p ( y ∣ x t ) p ( y ) ) ( 163 ) = ∇ log p ( x t ) + ∇ log p ( y ∣ x t ) − ∇ log p ( y ) ( 164 ) = ∇ log p ( x t ) ⏟ unconditional score + ∇ log p ( y ∣ x t ) ⏟ adversarial gradient ( 165 ) \begin{aligned} \nabla \log p(x_t|y) &= \nabla \log \left(\frac{p(x_t)p(y|x_t)}{p(y)}\right) \quad & (163) \\ &= \nabla \log p(x_t) + \nabla \log p(y|x_t) - \nabla \log p(y) \quad & (164) \\ &= \underbrace{\nabla \log p(x_t)}_{\text{unconditional score}} + \underbrace{\nabla \log p(y|x_t)}_{\text{adversarial gradient}} \quad & (165) \end{aligned} ∇logp(xt∣y)=∇log(p(y)p(xt)p(y∣xt))=∇logp(xt)+∇logp(y∣xt)−∇logp(y)=unconditional score ∇logp(xt)+adversarial gradient ∇logp(y∣xt)(163)(164)(165)
我们利用了一个事实,即 log p ( y ) \log p(y) logp(y)关于 x t x_t xt的梯度为零。
我们最终推导的结果可以理解为学习一个无条件的分数函数,并将其与分类器 p ( y ∣ x t ) p(y|x_t) p(y∣xt)的对抗梯度相结合。因此,在分类器引导(Classifier Guidance)中,无条件扩散模型的分数函数按照之前的推导进行学习,同时训练一个分类器,该分类器接收任意带噪的 x t x_t xt并尝试预测条件信息 y y y。然后,在采样过程中,用于退火Langevin动态的整体条件分数函数被计算为无条件分数函数与带噪分类器的对抗梯度之和。
为了引入细粒度控制,以鼓励或阻止模型考虑条件信息,分类器引导通过一个超参数 γ \gamma γ对带噪分类器的对抗梯度进行缩放。在分类器引导下学习的分数函数可以总结如下:
∇ log p ( x t ∣ y ) = ∇ log p ( x t ) + γ ∇ log p ( y ∣ x t ) ( 166 ) \nabla\log p(x_t|y) = \nabla\log p(x_t) + \gamma\nabla\log p(y|x_t) \quad (166) ∇logp(xt∣y)=∇logp(xt)+γ∇logp(y∣xt)(166)
直观来看,当 γ = 0 \gamma=0 γ=0时,条件扩散模型完全忽略条件信息的学习,而当 γ \gamma γ值较大时,条件扩散模型会学习生成严格符合条件信息的样本。这种情况以牺牲样本多样性为代价,因为模型仅会生成那些即使在有噪声的情况下也能轻松再现所提供条件信息的数据。
条件引导(Classifier Guidance)的一个显著缺点是它依赖于单独训练的分类器。由于分类器必须处理任意噪声输入,而大多数现有的预训练分类模型并未针对这种情况进行优化,因此分类器必须与扩散模型同时进行特定的训练。
无分类器引导(Classifier-Free Guidance)
无分类器引导(Classifier-Free Guidance)中,作者摒弃了单独训练分类器模型的方法,而是选择了无条件扩散模型和条件扩散模型。为了推导无分类器引导下的得分函数,我们可以首先重排公式165,得到:
∇ log p ( y ∣ x t ) = ∇ log p ( x t ∣ y ) − ∇ log p ( x t ) ( 167 ) \nabla \log p(y|x_t) = \nabla \log p(x_t|y) - \nabla \log p(x_t) \quad (167) ∇logp(y∣xt)=∇logp(xt∣y)−∇logp(xt)(167)
然后,将其代入公式166,我们得到:
∇ log p ( x t ∣ y ) = ∇ log p ( x t ) + γ ( ∇ log p ( x t ∣ y ) − ∇ log p ( x t ) ) (168) = ∇ log p ( x t ) + γ ∇ log p ( x t ∣ y ) − γ ∇ log p ( x t ) (169) = γ ∇ log p ( x t ∣ y ) ⏟ conditional score + ( 1 − γ ) ∇ log p ( x t ) ⏟ unconditional score (170) \begin{aligned} \nabla \log p(x_t|y) &= \nabla \log p(x_t) + \gamma \left(\nabla \log p(x_t|y) - \nabla \log p(x_t)\right) \quad &\text{(168)} \\ &= \nabla \log p(x_t) + \gamma \nabla \log p(x_t|y) - \gamma \nabla \log p(x_t) \quad &\text{(169)} \\ &= \underbrace{\gamma \nabla \log p(x_t|y)}_\text{conditional score} + \underbrace{(1 - \gamma)\nabla \log p(x_t)}_\text{unconditional score} \quad &\text{(170)} \end{aligned} ∇logp(xt∣y)=∇logp(xt)+γ(∇logp(xt∣y)−∇logp(xt))=∇logp(xt)+γ∇logp(xt∣y)−γ∇logp(xt)=conditional score γ∇logp(xt∣y)+unconditional score (1−γ)∇logp(xt)(168)(169)(170)
再一次, γ \gamma γ是一个控制学习的条件模型对条件信息关注程度的参数。当 γ = 0 \gamma=0 γ=0时,学习的条件模型完全忽略条件信息并学习一个无条件扩散模型。当 γ = 1 \gamma=1 γ=1时,模型明确地学习不带引导的普通条件分布。当 γ > 1 \gamma>1 γ>1时,扩散模型不仅优先考虑条件得分函数,还会朝远离无条件得分函数的方向移动。换句话说,它降低了生成不使用条件信息的样本的概率,更倾向于生成明确使用条件信息的样本。这也会导致样本多样性下降,但以生成准确匹配条件信息的样本为代价。
由于学习两个独立的扩散模型代价较高,我们可以将条件扩散模型和无条件扩散模型合并为一个单一的条件模型;通过将条件信息替换为固定的常量值(例如零),可以查询无条件扩散模型。这本质上是在条件信息上随机执行dropout操作。无分类器引导(Classifier-Free Guidance)的优雅之处在于,它让我们能够更灵活地控制条件生成过程,同时不需要额外训练多个扩散模型,仅需训练一个单一的扩散模型即可。
总结
让我们回顾一下在研究过程中的发现。首先,我们将变分扩散模型(VDM)推导为一种马尔科夫分层变分自编码器(HVAE)的特殊情况,其中三个关键假设使得证据下界(ELBO)的计算和优化变得可行且可扩展。接着,我们证明了优化VDM归结为学习一个神经网络来预测以下三种潜在目标之一:从任意噪声化的图像中恢复原始源图像,从任意噪声化图像中预测原始噪声,或在任意噪声水平下的噪声化图像的得分函数。然后,我们深入探讨了学习得分函数的意义,并将其与基于得分的生成建模(Score-based Generative Modeling)的视角明确关联起来。最后,我们探讨了如何使用扩散模型来学习条件分布。
总之,扩散模型作为生成模型表现出了令人难以置信的能力;实际上,它们为当前最先进的基于文本条件的图像生成模型(如Imagen和DALL-E 2)提供了支持。此外,这些模型背后的数学理论极其优雅。然而,仍有一些需要考虑的缺点:
- 这很可能并非我们人类自然建模和生成数据的方式;我们并不是通过将样本生成为随机噪声后迭代去噪的方式进行数据建模。
- VDM无法生成可解释的潜变量(Latents)。而VAE通过对编码器的优化,有望学习一个具有结构化的潜变量空间,而在VDM中,每个时间步的编码器已经是一个线性高斯模型,无法灵活优化。因此,中间的潜变量仅限于原始输入的噪声版本。
- 潜变量被限制为与原始输入相同的维度,这进一步增加了学习有意义、压缩的潜在结构的难度。
- 采样是一个代价高昂的过程,因为在这两种方法下都需要运行多个去噪步骤。请记住,其中一个限制是必须选择足够大的时间步数 T T T,以确保最终的潜变量完全是高斯噪声;在采样过程中,我们必须遍历所有这些时间步以生成样本。
最后,扩散模型的成功凸显了分层变分自编码器(HVAE)作为生成模型的强大能力。我们已经表明,当我们将其推广到无限的潜变量层次时,即使编码器是简单的,潜变量维度是固定的,并且假设了马尔科夫转换,我们仍然能够学习到强大的数据模型。这表明,在一般的、深层的HVAE中,通过学习复杂的编码器和语义上有意义的潜变量空间,可能会实现进一步的性能提升。
致谢:我想感谢Josh Dillon、Yang Song、Durk Kingma、Ben Poole、Jonathan Ho、Yiding Jiang、Ting Chen、Jeremy Cohen和Chen Sun,他们审阅了本文的草稿并提供了许多有帮助的修改建议和评论。非常感谢!
相关文章:
论文笔记(六十三)Understanding Diffusion Models: A Unified Perspective(六)(完结)
Understanding Diffusion Models: A Unified Perspective(六)(完结) 文章概括指导(Guidance)分类器指导无分类器引导(Classifier-Free Guidance) 总结 文章概括 引用: …...
oracle比较一下统计信息差异吧
统计信息发生了哪些变化? 从上次收集到最近一次收集有什么不同? set long 999999 longc 99999 line 100 select report, maxdiffpct from table(dbms_stats.diff_table_stats_in_history(SYS,T1,to_timestamp(2025-01-22 09:01:46,YYYY-MM-DD hh24:mi:s…...
Hive:内部表和外部表,内外转换
内部表和外部表 内部表示例 给表添加数据 外部表示例 给表添加数据 外部表示例 用location指定表目录位置,那么表的位置在实际指定的位置,但是可以被映射 外部表和内部表的区别 删除表后使用show tables in shao; 已经没有被删除的表,说明元数据已经被删除(mysql里面存放),但是…...
P1030 [NOIP2001 普及组] 求先序排列(c++)详解
题目链接:P1030 [NOIP2001 普及组] 求先序排列 - 洛谷 | 计算机科学教育新生态 思路: 1.先确定跟节点 2.根据根节点,划分出左右子树 中:BADC 后:BDCA 分析: 根据后序遍历࿰…...
Mac cursor设置jdk、Maven版本
基本配置 – Cursor 使用文档 首先是系统用户级别的设置参数,运行cursor,按下ctrlshiftp,输入Open User Settings(JSON),在弹出的下拉菜单中选中下面这样的: 在打开的json编辑器中追加下面的内容: {"…...
提升企业内部协作的在线知识库架构与实施策略
内容概要 在当前快速变化的商业环境中,企业对于提升内部协作效率的需求愈显迫切。在线知识库作为信息存储与共享的平台,成为了推动企业数字化转型的重要工具。本文将深入探讨如何有效打造与实施在线知识库,强调架构设计、知识资产分类管理及…...
单链表专题(上)
链表的定义与创建 线性表: 1. 物理结构上不一定是线性的 2. 逻辑结构上一定是线性的 链表是一种物理存储结构上非连续,非顺序的存储结构 链表也是线性表的一种,但是在物理结构上不是连续的 链表是由一个一个的节点组成,需要数…...
.NET MAUI 入门学习指南
引言 在当今移动应用和跨平台开发的热潮中,.NET MAUI(Multi - platform App UI)应运而生,为开发者提供了一种高效、统一的方式来构建跨多个平台(如 iOS、Android、Windows 等)的原生应用。它整合了 Xamarin.Forms 的优点,并在此基础上进行了诸多改进和创新,使得开发者…...
Vue3.5 企业级管理系统实战(三):页面布局及样式处理 (Scss UnoCSS )
本章主要是关于整体页面布局及样式处理,在进行这一章代码前,先将前两章中的示例代码部分删除(如Home.vue、About.vue、counter.ts、App.vue中引用等) 1 整体页面布局 页面整体布局构成了产品的框架基础,通常涵盖主导…...
Excel中LOOKUP函数的使用
文章目录 VLOOKUP(垂直查找):HLOOKUP(水平查找):LOOKUP(基础查找):XLOOKUP(高级查找,较新版本Excel提供): 在Excel中&…...
【Unity】cinemachine核心知识
cinemachine核心知识 cinemachineVirtualCamera中body参数作用cinemachineVirtualCamera中body有哪些选项cinemachineVirtualCamera中am参数作用以及选项 cinemachineVirtualCamera中body参数作用 在 Unity 的 Cinemachine Virtual Camera 中,Body 参数模块主要负责…...
CMake常用命令指南(CMakeList.txt)
CMakeList从入门到精通的文章有很多不再赘述( 此处附带一篇优秀的博文链接:一个简单例子,完全入门CMake语法与CMakeList编写 )。 本文主要列举 CMake 中常用命令的详细说明、优缺点分析以及推荐做法,以更好地理解和灵…...
美创科技获浙江省网络空间安全协会年度表彰
近日,浙江省网络空间安全协会第二届理事会第三次会议在杭州隆重召开,会议总结部署工作、表彰先进、分享创新实践成果。 会上,省委网信办副主任马晓军出席会议并致辞、宋皆荣理事长向第二届理事会报告2024年协会工作、常务副理事长单位浙江联通…...
UE学习日志#14 GAS--ASC源码简要分析10 GC相关
注:1.这个分类是按照源码里的注释分类的 2.本篇是通读并给出一些注释形式的,并不涉及结构性的分析 3.看之前要对UE的GAS系统的定义有初步了解 4.因为都是接口函数,有些没细看的研究那一部分的时候会细看 1 一些接口函数,但是…...
Ubuntu 18.04安装Emacs 26.2问题解决
个人博客地址:Ubuntu 18.04安装Emacs 26.2问题解决 | 一张假钞的真实世界 no X development libraries were found checking for X... no checking for X... true configure: error: You seem to be running X, but no X development libraries were found. You …...
游戏引擎介绍:Game Engine
简介 定义:软件框架,一系列为开发游戏的工具的集合 可协作创意生产工具,复杂性艺术,注重realtime实时 目的 为艺术家,设计师,程序员设计工具链 游戏引擎开发参考书 推荐:Game Engine Archite…...
[A-29]ARMv8/v9-GIC-中断子系统的安全架构设计(Security/FIQ/IRQ)
ver0.1 前言 打开这篇文章的时候,我们已经为每一个中断信号规划一条路径,在外设和PE-Core之间建立了消息通道,外设有紧急的情况下可以给SOC中的大哥打报告了。下面就把接力棒就交到了CPU手里了,但是PE-Core要交给那个Exception Level以及Security下运行的软件处理呢?本文…...
启元世界(Inspir.ai)技术浅析(二):深度强化学习
深度强化学习(Deep Reinforcement Learning, DRL)是启元世界在人工智能领域的一项核心技术,广泛应用于游戏AI、智能决策等领域。 一、状态(State) 1.1 概念与作用 **状态(State)**是指智能体对环境的感知,是智能体进行决策的基础。在深度强化学习中,状态通常是一个高…...
能够对设备的历史数据进行学习与分析,通过与设备当前状态的比对,识别潜在故障并做出预判的名厨亮灶开源了。
明厨亮灶视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。AI技术可以24小时…...
Zookeeper(31)Zookeeper的事务ID(zxid)是什么?
在 Zookeeper 中,事务 ID(zxid,ZooKeeper Transaction ID)是一个全局唯一的标识符,用于标识每一个事务操作。每个写操作(如创建节点、删除节点、更新节点数据等)都会生成一个新的 zxid。zxid 是…...
Linux进程调度与等待:背后的机制与实现
个人主页:chian-ocean 文章专栏-Linux 前言: 当一个进程发起某种操作(如I/O请求、信号、锁的获取等),但该操作需要的资源暂时不可用时,进程会被操作系统挂起,进入“等待队列”或“阻塞状态”。…...
寒假1.25
题解 web:[极客大挑战 2019]Upload 打开环境 上传一个一句话木马试试 只能上传图片那就再上传一次,bp抓包修改type-content为image/jpeg试试 不行 看来是文件后缀被绕过了,上传一个.html然后抓包改类型试试 上传成功了,但是提示‘<&…...
28. 【.NET 8 实战--孢子记账--从单体到微服务】--简易报表--报表定时器与报表数据修正
这篇文章是《.NET 8 实战–孢子记账–从单体到微服务》系列专栏的《单体应用》专栏的最后一片和开发有关的文章。在这片文章中我们一起来实现一个数据统计的功能:报表数据汇总。这个功能为用户查看月度、年度、季度报表提供数据支持。 一、需求 数据统计方面&…...
C++/stack_queue
目录 1.stack 1.1stack的介绍 1.2stack的使用 练习题: 1.3stack的模拟实现 2.queue的介绍和使用 2.1queue的介绍 2.2queue的使用 2.3queue的模拟实现 3.priority_queue的介绍和使用 3.1priority_queue的介绍 3.2priority_queue的使用 欢迎 1.stack 1.1stack…...
【Java】微服务找不到问题记录can not find user-service
一、问题描述 运行网关微服务与用户微服务后,nacos服务成功注册 但是测试接口的时候网关没有找到相关服务 二、解决方案 我先检查了pom文件确定没问题后查看配置文件 最后发现是配置里spring.application.namexxx-user里面服务的名字后面多了一个空格 三、总结…...
QT:图像上绘制图形
需求描述 1、展示一张图像 2、在图像上可以使用数据绘制图像:矩形、不规则图形、线条 3、有按键可以选择 概要设计 规划布局如下 1、左边是Qlabel 用于展示图片 2、右边是三个按钮 具体实现 1、 首先设计 UI 界面,对控件进行布局 在 mainwindow.u…...
基于java线程池和EasyExcel实现数据异步导入
基于java线程池和EasyExcel实现数据异步导入 2.代码实现 2.1 controller层 PostMapping("import")public void importExcel(MultipartFile file) throws IOException {importService.importExcelAsync(file);}2.2 service层 Resource private SalariesListener sa…...
HPO3:提升模型性能的高效超参数优化工具
引言 在当今快速发展的数据科学和机器学习领域中,超参数优化(Hyperparameter Optimization, HPO)是构建高性能模型不可或缺的一环。为了简化这一复杂过程,恒通网络科技团队推出了HPO3模块——一个专为Python开发者设计的强大库&a…...
重回C语言之老兵重装上阵(十五)C语言错误处理
C语言错误处理 在C语言中,错误处理是非常重要的一部分。C语言没有像高级语言(例如Python、Java)那样内建的异常处理机制(如try-catch),但它提供了几种方法来捕捉和处理错误。正确的错误处理可以提高程序的稳…...
使用国内镜像加速器解决 Docker Hub 拉取镜像慢或被屏蔽的问题
一、问题背景 Docker Hub 是 Docker 默认的镜像仓库,但由于网络限制,国内用户直接拉取镜像可能面临以下问题: 下载速度极慢(尤其是大镜像)。连接超时或完全被屏蔽(部分网络环境)。依赖国外源的…...
