论文笔记(六十三)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) 总结 文章概括 引用: …...
NPM 使用介绍
NPM 使用介绍 引言 NPM(Node Package Manager)是Node.js生态系统中的一个核心工具,用于管理JavaScript项目的依赖包。无论是开发一个小型脚本还是构建大型应用程序,NPM都能极大地提高开发效率。本文将详细介绍NPM的使用方法,包括安装、配置、依赖管理、包发布等,帮助您…...
http3网站的设置(AI不会配,得人工配)
堡塔PHP项目中配置nginx1.26.0设置http3协议 # 文件所在服务器中的路径 /www/server/nginx/conf/nginx.confuser www www; worker_processes auto; error_log /www/wwwlogs/nginx_error.log crit; pid /www/server/nginx/logs/nginx.pid; worker_rlimit_nofile 512…...
Vue+Echarts 实现青岛自定义样式地图
一、效果 二、代码 <template><div class"chart-box"><chart ref"chartQingdao" style"width: 100%; height: 100%;" :options"options" autoresize></chart></div> </template> <script> …...
Java教程练习:学生信息管理系统
文章目录 学生管理系统1、需求文档需求分析 2、新建学生实体类3、实现基本菜单和退出功能4、查询和添加4.1 查询学生信息4.2 添加学生信息 5、修改和删除5.1 删除功能实现5.2 修改功能实现 完整代码下载 学生管理系统 1、需求文档 需求 采取控制台的方式书写学生管理系统。 …...
书生大模型实战营4
文章目录 L0——入门岛玩转HF/魔搭/魔乐社区HF 平台1 注册2 InternLM模型下载3 GitHub CodeSpace的使用4 Hugging Face Spaces的使用5 模型上传 魔搭社区平台简介创建开发机环境配置 下载指定多个文件上传模型 魔乐社区平台下载internlm2_5-chat-1_8b模型上传模型 始智AI平台下…...
麒麟操作系统服务架构保姆级教程(十四)iptables防火墙四表五链和防火墙应用案例
如果你想拥有你从未拥有过的东西,那么你必须去做你从未做过的事情 防火墙在运维工作中有着不可或缺的重要性。首先,它是保障网络安全的关键防线,通过设置访问控制规则,可精准过滤非法网络流量,有效阻挡外部黑客攻击、恶…...
8. 网络编程
网络的基本概念 TCP/IP协议概述 OSI和TCP/IP模型 socket(套接字) 创建socket 字节序 字节序转换函数 通用地址结构 因特网地址结构 IPV4地址族和字符地址间的转换(点分十进制->网络字节序) 填写IPV4地址族结构案例 掌握TCP协议网络基础编程 相关函数 …...
C++并发编程指南04
文章目录 共享数据的问题3.1.1 条件竞争双链表的例子条件竞争示例恶性条件竞争的特点 3.1.2 避免恶性条件竞争1. 使用互斥量保护共享数据结构2. 无锁编程3. 软件事务内存(STM) 总结互斥量与共享数据保护3.2.1 互斥量使用互斥量保护共享数据示例代码&…...
常见的同态加密算法收集
随着对crypten与密码学的了解,我们将逐渐深入学习相关知识。今天,我们将跟随同态加密的发展历程对相关算法进行简单的收集整理 。 目录 同态加密概念 RSA算法 ElGamal算法 ELGamal签名算法 Paillier算法 BGN方案 Gentry 方案 BGV 方案 BFV 方案…...
深入探讨数据库索引类型:B-tree、Hash、GIN与GiST的对比与应用
title: 深入探讨数据库索引类型:B-tree、Hash、GIN与GiST的对比与应用 date: 2025/1/26 updated: 2025/1/26 author: cmdragon excerpt: 在现代数据库管理系统中,索引技术是提高查询性能的重要手段。当数据量不断增长时,如何快速、有效地访问这些数据成为了数据库设计的核…...
记录 | Docker的windows版安装
目录 前言一、1.1 打开“启用或关闭Windows功能”1.2 安装“WSL”方式1:命令行下载方式2:离线包下载 二、Docker Desktop更新时间 前言 参考文章:Windows Subsystem for Linux——解决WSL更新速度慢的方案 参考视频:一个视频解决D…...
AI智慧社区--生成验证码
接口文档: 从接口文档中可以得知的信息: 代码的返回格式为json格式,可以将Controlller换为RestController前端发起的请求为Get请求,使用注解GetMapping通过返回的数据类型,定义一个返回类型Result package com.qcby.…...
2501,20个窗口常用操作
窗口是屏幕上的一个矩形区域.窗口分为3种:覆盖窗口,弹窗和子窗口.每个窗口都有由系统绘画的"非客户区"和应用绘画的"客户区". 在MFC中,CWnd类为各种窗口提供了基类. 1,通过窗柄取得CWnd指针 可调用Cwnd::FromHandle函数,通过窗柄取得Cwnd指针. void CD…...
【gopher的java学习笔记】一文讲懂controller,service,mapper,entity是什么
刚开始上手Java和Spring时,就被controller,service,mapper,entity这几个词搞懵了,搞不懂这些究竟代表什么,感觉使用golang开发的时候也没太接触过这些名词啊~ 经过两三个月的开发后,逐渐搞懂了这…...
消息队列篇--通信协议篇--STOMP(STOMP特点、格式及示例,WebSocket上使用STOMP,消息队列上使用STOMP等)
STOMP(Simple Text Oriented Messaging Protocol,简单面向文本的消息传递协议)是一种轻量级、基于文本的协议,旨在为消息代理(消息队列)和客户端之间的通信(websocket)提供一种简单的…...
基于SpringBoot的租房管理系统(含论文)
基于SpringBoot的租房管理系统是一个集订单管理、房源信息管理、屋主申诉处理、用户反馈等多项功能于一体的系统。该系统通过SpringBoot框架开发,拥有完善的管理员后台、屋主管理模块、用户功能模块等,适用于房地产租赁平台或中介公司进行日常管理与运营…...
提升企业内部协作的在线知识库架构与实施策略
内容概要 在当前快速变化的商业环境中,企业对于提升内部协作效率的需求愈显迫切。在线知识库作为信息存储与共享的平台,成为了推动企业数字化转型的重要工具。本文将深入探讨如何有效打造与实施在线知识库,强调架构设计、知识资产分类管理及…...
【物联网】ARM核常用指令(详解):数据传送、计算、位运算、比较、跳转、内存访问、CPSR/SPSR、流水线及伪指令
文章目录 指令格式(重点)1. 立即数2. 寄存器位移 一、数据传送指令1. MOV指令2. MVN指令3. LDR指令 二、数据计算指令1. ADD指令1. SUB指令1. MUL指令 三、位运算指令1. AND指令2. ORR指令3. EOR指令4. BIC指令 四、比较指令五、跳转指令1. B/BL指令2. l…...
Jackson中@JsonTypeId的妙用与实例解析
在日常的Java开发中,Jackson库是处理JSON数据的常用工具。其中,JsonTypeId注解是一个非常实用的功能,它可以帮助我们更好地控制多态类型信息在序列化过程中的表现。今天,我们就来深入探讨一下JsonTypeId的用法,并通过具…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
