Fisher散度:从信息几何到机器学习的隐藏利器
Fisher散度:从信息几何到机器学习的隐藏利器
在机器学习和统计学中,比较两个概率分布的差异是常见任务,比如评估真实分布与模型预测分布的差距。KL散度(Kullback-Leibler Divergence)可能是大家熟悉的选择,但今天我们要介绍一个不太常见却同样重要的指标——Fisher散度(Fisher Divergence)。它与Fisher信息矩阵关系密切,不仅有深厚的理论根基,还在生成模型和变分推断等领域大放异彩。这篇博客将详细讲解Fisher散度的定义、数学公式、推导过程及其应用,特别澄清推导中的关键步骤,既通俗易懂,也适合研究者深入探索。
什么是Fisher散度?
Fisher散度是一种基于对数密度梯度(即得分函数,Score Function)来度量两个概率分布 ( p ( x ) p(x) p(x) ) 和 ( q ( x ) q(x) q(x) ) 之间差异的指标。它得名于Fisher信息矩阵,源于信息几何,利用分布的局部曲率来比较“形状”差异。
通俗比喻
想象你在比较两座山(分布 ( p p p ) 和 ( q q q ))。KL散度像是在测量两座山的“总体体积差”,而Fisher散度更像是站在山坡上,比较两座山的“坡度”(梯度)在每个点的差异。它关注分布的局部变化,而非全局概率质量。
Fisher散度的数学定义
Fisher散度的形式因应用场景而异。最常见的是得分匹配(Score Matching)中的定义,表示为得分函数差异的平方范数:
D F ( p ∥ q ) = ∫ p ( x ) ∥ ∇ log p ( x ) − ∇ log q ( x ) ∥ 2 d x D_F(p \parallel q) = \int p(x) \left\| \nabla \log p(x) - \nabla \log q(x) \right\|^2 \, dx DF(p∥q)=∫p(x)∥∇logp(x)−∇logq(x)∥2dx
- ( ∇ log p ( x ) \nabla \log p(x) ∇logp(x) ) 和 ( \nabla \log q(x) ):分别是 ( p(x)$ ) 和 ( q ( x ) q(x) q(x) ) 的对数密度梯度。
- ( ∥ ⋅ ∥ 2 \left\| \cdot \right\|^2 ∥⋅∥2 ):欧几里得范数的平方,衡量梯度差异。
- ( p ( x ) p(x) p(x) ):以 ( p ( x ) p(x) p(x) ) 加权,强调真实分布的视角。
更广义的形式可能涉及Fisher信息矩阵:
D F ( p ∥ q ) = ∫ p ( x ) ( ∇ log p ( x ) − ∇ log q ( x ) ) T I ( x ) ( ∇ log p ( x ) − ∇ log q ( x ) ) d x D_F(p \parallel q) = \int p(x) \left( \nabla \log p(x) - \nabla \log q(x) \right)^T I(x) \left( \nabla \log p(x) - \nabla \log q(x) \right) \, dx DF(p∥q)=∫p(x)(∇logp(x)−∇logq(x))TI(x)(∇logp(x)−∇logq(x))dx
- ( I ( x ) I(x) I(x) ):Fisher信息矩阵,通常定义为 ( I ( x ) = E p [ ∇ log p ( x ) ∇ log p ( x ) T ] I(x) = E_p[\nabla \log p(x) \nabla \log p(x)^T] I(x)=Ep[∇logp(x)∇logp(x)T] )。
Fisher散度不对称(( D F ( p ∥ q ) ≠ D F ( q ∥ p ) D_F(p \parallel q) \neq D_F(q \parallel p) DF(p∥q)=DF(q∥p) )),也不满足三角不等式,因此不是严格的距离。
Fisher散度的推导
为了理解Fisher散度的来源,我们从得分匹配的角度推导其常见形式,并解决推导中的疑惑点(如交叉项系数调整)。
得分匹配中的Fisher散度
得分匹配的目标是让模型分布 ( q ( x ) q(x) q(x) ) 的得分函数 ( ∇ log q ( x ) \nabla \log q(x) ∇logq(x) ) 接近真实分布 ( p ( x ) p(x) p(x) ) 的得分函数 ( ∇ log p ( x ) \nabla \log p(x) ∇logp(x) )。Fisher散度是这一过程的自然损失函数。
推导步骤
假设我们要最小化 ( q ( x ) q(x) q(x) ) 和 ( p ( x ) p(x) p(x) ) 在得分函数上的差异,定义损失:
L ( q ) = ∫ p ( x ) ∥ ∇ log p ( x ) − ∇ log q ( x ) ∥ 2 d x L(q) = \int p(x) \left\| \nabla \log p(x) - \nabla \log q(x) \right\|^2 \, dx L(q)=∫p(x)∥∇logp(x)−∇logq(x)∥2dx
展开平方项:
L ( q ) = ∫ p ( x ) [ ∥ ∇ log p ( x ) ∥ 2 − 2 ∇ log p ( x ) T ∇ log q ( x ) + ∥ ∇ log q ( x ) ∥ 2 ] d x L(q) = \int p(x) \left[ \left\| \nabla \log p(x) \right\|^2 - 2 \nabla \log p(x)^T \nabla \log q(x) + \left\| \nabla \log q(x) \right\|^2 \right] \, dx L(q)=∫p(x)[∥∇logp(x)∥2−2∇logp(x)T∇logq(x)+∥∇logq(x)∥2]dx
- 第一项 ( ∫ p ( x ) ∥ ∇ log p ( x ) ∥ 2 d x \int p(x) \left\| \nabla \log p(x) \right\|^2 \, dx ∫p(x)∥∇logp(x)∥2dx ):只依赖 ( p ( x ) p(x) p(x) ),是常数。
- 第二项 ( − 2 ∫ p ( x ) ∇ log p ( x ) T ∇ log q ( x ) d x -2 \int p(x) \nabla \log p(x)^T \nabla \log q(x) \, dx −2∫p(x)∇logp(x)T∇logq(x)dx ):交叉项,依赖 ( p p p ) 和 ( q q q )。
- 第三项 ( ∫ p ( x ) ∥ ∇ log q ( x ) ∥ 2 d x \int p(x) \left\| \nabla \log q(x) \right\|^2 \, dx ∫p(x)∥∇logq(x)∥2dx ):依赖 ( q q q ),需要转换。
直接优化 ( L ( q ) L(q) L(q) ) 对 ( q ( x ) q(x) q(x) ) 的函数梯度较为复杂。得分匹配的关键是利用分部积分,将第三项转换为更易处理的形式。
分部积分简化
处理第三项:
∫ p ( x ) ∥ ∇ log q ( x ) ∥ 2 d x = ∫ p ( x ) ∇ log q ( x ) T ∇ log q ( x ) d x \int p(x) \left\| \nabla \log q(x) \right\|^2 \, dx = \int p(x) \nabla \log q(x)^T \nabla \log q(x) \, dx ∫p(x)∥∇logq(x)∥2dx=∫p(x)∇logq(x)T∇logq(x)dx
因为 ( ∇ log q ( x ) = ∇ q ( x ) q ( x ) \nabla \log q(x) = \frac{\nabla q(x)}{q(x)} ∇logq(x)=q(x)∇q(x) ):
∇ log q ( x ) T ∇ log q ( x ) = ∇ log q ( x ) T ∇ q ( x ) q ( x ) \nabla \log q(x)^T \nabla \log q(x) = \nabla \log q(x)^T \frac{\nabla q(x)}{q(x)} ∇logq(x)T∇logq(x)=∇logq(x)Tq(x)∇q(x)
应用向量形式的分部积分(散度定理):
∫ p ( x ) ∇ log q ( x ) T ∇ q ( x ) q ( x ) d x = ∫ ∇ T [ p ( x ) ∇ log q ( x ) ] d x − ∫ ∇ p ( x ) T ∇ log q ( x ) d x \int p(x) \nabla \log q(x)^T \frac{\nabla q(x)}{q(x)} \, dx = \int \nabla^T [p(x) \nabla \log q(x)] \, dx - \int \nabla p(x)^T \nabla \log q(x) \, dx ∫p(x)∇logq(x)Tq(x)∇q(x)dx=∫∇T[p(x)∇logq(x)]dx−∫∇p(x)T∇logq(x)dx
假设边界项 ( ∫ ∇ T [ p ∇ log q ] d x \int \nabla^T [p \nabla \log q] \, dx ∫∇T[p∇logq]dx ) 在无穷远为零(概率密度通常满足此条件),则:
∫ p ( x ) ∥ ∇ log q ( x ) ∥ 2 d x = − ∫ ∇ p ( x ) T ∇ log q ( x ) d x + ∫ p ( x ) ∇ T ∇ log q ( x ) d x \int p(x) \left\| \nabla \log q(x) \right\|^2 \, dx = - \int \nabla p(x)^T \nabla \log q(x) \, dx + \int p(x) \nabla^T \nabla \log q(x) \, dx ∫p(x)∥∇logq(x)∥2dx=−∫∇p(x)T∇logq(x)dx+∫p(x)∇T∇logq(x)dx
代入 ( ∇ p = p ∇ log p \nabla p = p \nabla \log p ∇p=p∇logp ):
∫ p ( x ) ∥ ∇ log q ( x ) ∥ 2 d x = − ∫ p ( x ) ∇ log p ( x ) T ∇ log q ( x ) d x + ∫ p ( x ) ∇ T ∇ log q ( x ) d x \int p(x) \left\| \nabla \log q(x) \right\|^2 \, dx = - \int p(x) \nabla \log p(x)^T \nabla \log q(x) \, dx + \int p(x) \nabla^T \nabla \log q(x) \, dx ∫p(x)∥∇logq(x)∥2dx=−∫p(x)∇logp(x)T∇logq(x)dx+∫p(x)∇T∇logq(x)dx
代回原始损失
将第三项替换回 ( L ( q ) L(q) L(q) ):
L ( q ) = ∫ p ( x ) ∥ ∇ log p ( x ) ∥ 2 d x − 2 ∫ p ( x ) ∇ log p ( x ) T ∇ log q ( x ) d x + [ − ∫ p ( x ) ∇ log p ( x ) T ∇ log q ( x ) d x + ∫ p ( x ) ∇ T ∇ log q ( x ) d x ] L(q) = \int p(x) \left\| \nabla \log p(x) \right\|^2 \, dx - 2 \int p(x) \nabla \log p(x)^T \nabla \log q(x) \, dx + \left[ - \int p(x) \nabla \log p(x)^T \nabla \log q(x) \, dx + \int p(x) \nabla^T \nabla \log q(x) \, dx \right] L(q)=∫p(x)∥∇logp(x)∥2dx−2∫p(x)∇logp(x)T∇logq(x)dx+[−∫p(x)∇logp(x)T∇logq(x)dx+∫p(x)∇T∇logq(x)dx]
合并交叉项:
− 2 ∫ p ( x ) ∇ log p ( x ) T ∇ log q ( x ) d x − ∫ p ( x ) ∇ log p ( x ) T ∇ log q ( x ) d x = − 3 ∫ p ( x ) ∇ log p ( x ) T ∇ log q ( x ) d x -2 \int p(x) \nabla \log p(x)^T \nabla \log q(x) \, dx - \int p(x) \nabla \log p(x)^T \nabla \log q(x) \, dx = -3 \int p(x) \nabla \log p(x)^T \nabla \log q(x) \, dx −2∫p(x)∇logp(x)T∇logq(x)dx−∫p(x)∇logp(x)T∇logq(x)dx=−3∫p(x)∇logp(x)T∇logq(x)dx
得到:
L ( q ) = ∫ p ( x ) ∥ ∇ log p ( x ) ∥ 2 d x − 3 ∫ p ( x ) ∇ log p ( x ) T ∇ log q ( x ) d x + ∫ p ( x ) ∇ T ∇ log q ( x ) d x L(q) = \int p(x) \left\| \nabla \log p(x) \right\|^2 \, dx - 3 \int p(x) \nabla \log p(x)^T \nabla \log q(x) \, dx + \int p(x) \nabla^T \nabla \log q(x) \, dx L(q)=∫p(x)∥∇logp(x)∥2dx−3∫p(x)∇logp(x)T∇logq(x)dx+∫p(x)∇T∇logq(x)dx
调整到标准形式
此时,交叉项系数是 ( − 3 -3 −3)。但得分匹配的标准形式(Hyvärinen, 2005)是:
L ( q ) = const + ∫ p ( x ) [ − 2 ∇ log p ( x ) T ∇ log q ( x ) + ∇ T ∇ log q ( x ) ] d x L(q) = \text{const} + \int p(x) \left[ -2 \nabla \log p(x)^T \nabla \log q(x) + \nabla^T \nabla \log q(x) \right] \, dx L(q)=const+∫p(x)[−2∇logp(x)T∇logq(x)+∇T∇logq(x)]dx
为什么从 ( − 3 -3 −3) 变成 ( − 2 -2 −2)?得分匹配的目标是优化 ( q ( x ) q(x) q(x) ) 使其得分匹配 ( p ( x ) p(x) p(x) ) 的得分。原始定义中的交叉项是 ( − 2 -2 −2),分部积分引入了额外的 ( − 1 -1 −1)。在优化中,我们只关心 ( q q q ) 的可变部分,等价形式保留原始的 ( − 2 -2 −2),将多余的 ( − 1 -1 −1)(即 ( − ∫ p ∇ log p T ∇ log q -\int p \nabla \log p^T \nabla \log q −∫p∇logpT∇logq ))归入常数,因为它不影响 ( q q q ) 的优化结果(详见附录)。
最终损失为:
L ( q ) = const + ∫ p ( x ) [ − 2 ∇ log p ( x ) T ∇ log q ( x ) + ∇ T ∇ log q ( x ) ] d x L(q) = \text{const} + \int p(x) \left[ -2 \nabla \log p(x)^T \nabla \log q(x) + \nabla^T \nabla \log q(x) \right] \, dx L(q)=const+∫p(x)[−2∇logp(x)T∇logq(x)+∇T∇logq(x)]dx
验证:最小化此损失,求变分导数为零,得 ( ∇ log q ( x ) = ∇ log p ( x ) \nabla \log q(x) = \nabla \log p(x) ∇logq(x)=∇logp(x) ),与 ( D F ( p ∥ q ) D_F(p \parallel q) DF(p∥q) ) 的目标一致。
Fisher散度的性质
-
非负性:
D F ( p ∥ q ) ≥ 0 ,等于 0 当且仅当 ∇ log p ( x ) = ∇ log q ( x ) (几乎处处) D_F(p \parallel q) \geq 0,等于0 当且仅当 \nabla \log p(x) = \nabla \log q(x) \,(几乎处处) DF(p∥q)≥0,等于0当且仅当∇logp(x)=∇logq(x)(几乎处处)
对于可微分布,意味着 ( p ( x ) ∝ q ( x ) p(x) \propto q(x) p(x)∝q(x) )。 -
不对称性:
Fisher散度以 ( p ( x ) p(x) p(x) ) 加权,因此 ( D F ( p ∥ q ) ≠ D F ( q ∥ p ) D_F(p \parallel q) \neq D_F(q \parallel p) DF(p∥q)=DF(q∥p) )。 -
局部性:
它聚焦得分函数差异,反映分布的局部特性。
在机器学习中的应用
Fisher散度在生成模型和统计推断中有重要应用:
1. 得分匹配(Score Matching)
- 用途:训练生成模型(如得分基模型)。
- 方法:通过最小化Fisher散度,模型 ( q ( x ) q(x) q(x) ) 学习 ( p ( x ) p(x) p(x) ) 的得分函数,再用朗之万采样生成样本。
- 优势:无需归一化常数,适合高维数据(如图像)。
2. 扩散模型(Diffusion Models)
- 联系:反向去噪过程依赖得分估计,Fisher散度是训练核心。
- 例子:Stable Diffusion 通过神经网络逼近 ( ∇ log p ( x t ) \nabla \log p(x_t) ∇logp(xt) )。
3. 变分推断
- 用途:近似后验分布时,衡量局部差异。
- 优势:计算简便,梯度易得。
4. GAN改进
- 用途:替代判别器损失,提升稳定性。
与KL散度的对比
-
KL散度:
D K L ( p ∥ q ) = ∫ p ( x ) log p ( x ) q ( x ) d x D_{KL}(p \parallel q) = \int p(x) \log \frac{p(x)}{q(x)} \, dx DKL(p∥q)=∫p(x)logq(x)p(x)dx- 全局性:关注概率质量差异。
- 计算复杂:需归一化。
-
Fisher散度:
- 局部性:关注得分差异。
- 计算简便:仅需梯度。
总结
Fisher散度通过得分函数差异量化分布距离,兼具理论优雅与实践威力。它在得分匹配和扩散模型中大放异彩,推导中的分部积分虽复杂,但最终形式清晰简洁,确保优化目标正确。无论是研究分布特性,还是生成高质量样本,Fisher散度都是不可忽视的利器。下次遇到分布比较问题,试试Fisher散度吧!
有疑问或想看例子?欢迎留言交流!
附录:为什么不改变优化结果?常数可以随便改吗?
为什么不改变优化结果?
在得分匹配中,原始损失 ( L ( q ) = ∫ p ( x ) ∥ ∇ log p ( x ) − ∇ log q ( x ) ∥ 2 d x L(q) = \int p(x) \left\| \nabla \log p(x) - \nabla \log q(x) \right\|^2 \, dx L(q)=∫p(x)∥∇logp(x)−∇logq(x)∥2dx ) 展开后,分部积分将第三项转换为:
∫ p ( x ) ∥ ∇ log q ( x ) ∥ 2 d x = − ∫ p ( x ) ∇ log p ( x ) T ∇ log q ( x ) d x + ∫ p ( x ) ∇ T ∇ log q ( x ) d x \int p(x) \left\| \nabla \log q(x) \right\|^2 \, dx = - \int p(x) \nabla \log p(x)^T \nabla \log q(x) \, dx + \int p(x) \nabla^T \nabla \log q(x) \, dx ∫p(x)∥∇logq(x)∥2dx=−∫p(x)∇logp(x)T∇logq(x)dx+∫p(x)∇T∇logq(x)dx
代回后,交叉项系数变成 ( − 3 -3 −3):
L ( q ) = ∫ p ( x ) ∥ ∇ log p ( x ) ∥ 2 d x − 3 ∫ p ( x ) ∇ log p ( x ) T ∇ log q ( x ) d x + ∫ p ( x ) ∇ T ∇ log q ( x ) d x L(q) = \int p(x) \left\| \nabla \log p(x) \right\|^2 \, dx - 3 \int p(x) \nabla \log p(x)^T \nabla \log q(x) \, dx + \int p(x) \nabla^T \nabla \log q(x) \, dx L(q)=∫p(x)∥∇logp(x)∥2dx−3∫p(x)∇logp(x)T∇logq(x)dx+∫p(x)∇T∇logq(x)dx
但标准形式是:
L ( q ) = const + ∫ p ( x ) [ − 2 ∇ log p ( x ) T ∇ log q ( x ) + ∇ T ∇ log q ( x ) ] d x L(q) = \text{const} + \int p(x) \left[ -2 \nabla \log p(x)^T \nabla \log q(x) + \nabla^T \nabla \log q(x) \right] \, dx L(q)=const+∫p(x)[−2∇logp(x)T∇logq(x)+∇T∇logq(x)]dx
多出的 ( − 1 -1 −1)(即 ( − ∫ p ∇ log p T ∇ log q -\int p \nabla \log p^T \nabla \log q −∫p∇logpT∇logq ))被归入常数,为什么不影响优化结果?
- 优化目标的等价性:得分匹配的目标是让 ( ∇ log q ( x ) = ∇ log p ( x ) \nabla \log q(x) = \nabla \log p(x) ∇logq(x)=∇logp(x) )。无论交叉项系数是 ( − 3 -3 −3) 还是 ( − 2 -2 −2),只要损失函数的最优解(变分导数为零)保持一致,优化结果不变。
- 变分导数:对 ( L ( q ) L(q) L(q) ) 求变分导数,忽略常数项:
- 对于 (-3) 形式:
δ L δ q = − 3 ∇ log p + ∇ T ∇ log q = 0 ⟹ ∇ log q = 3 ∇ log p \frac{\delta L}{\delta q} = -3 \nabla \log p + \nabla^T \nabla \log q = 0 \implies \nabla \log q = 3 \nabla \log p δqδL=−3∇logp+∇T∇logq=0⟹∇logq=3∇logp
(错误,结果不匹配)。 - 对于标准 ( − 2 -2 −2) 形式:
δ L δ q = − 2 ∇ log p + ∇ T ∇ log q = 0 ⟹ ∇ log q = ∇ log p \frac{\delta L}{\delta q} = -2 \nabla \log p + \nabla^T \nabla \log q = 0 \implies \nabla \log q = \nabla \log p δqδL=−2∇logp+∇T∇logq=0⟹∇logq=∇logp
(正确,与目标一致)。
- 对于 (-3) 形式:
- 修正原因:直接用 ( − 3 -3 −3) 会导致错误的最优解。Hyvärinen (2005) 通过等价变换,保留原始定义的 ( − 2 -2 −2),将分部积分引入的 ( − 1 -1 −1) 归入常数,确保优化目标正确。这是因为 ( − ∫ p ∇ log p T ∇ log q -\int p \nabla \log p^T \nabla \log q −∫p∇logpT∇logq ) 虽含 ( q q q ),但在等价损失中不改变最小值点。
常数可以随便改吗(如 ( − 5 -5 −5)、( − 6 -6 −6))?
- 不可以随便改:常数(如 ( const \text{const} const ))不影响优化结果,因为它不含 ( q q q ),对 ( q q q ) 的梯度为零。但交叉项系数(如 ( − 2 -2 −2))直接影响 ( q q q ) 的优化路径。
- 系数的作用:交叉项 ( − 2 ∫ p ∇ log p T ∇ log q d x -2 \int p \nabla \log p^T \nabla \log q \, dx −2∫p∇logpT∇logqdx ) 是 ( q q q ) 的线性项,改变系数(如 ( − 5 -5 −5)、( − 6 -6 −6))会改变变分导数的结果:
- 若改为 ( − 5 -5 −5):
δ L δ q = − 5 ∇ log p + ∇ T ∇ log q = 0 ⟹ ∇ log q = 5 ∇ log p \frac{\delta L}{\delta q} = -5 \nabla \log p + \nabla^T \nabla \log q = 0 \implies \nabla \log q = 5 \nabla \log p δqδL=−5∇logp+∇T∇logq=0⟹∇logq=5∇logp
(错误)。
- 若改为 ( − 5 -5 −5):
- 结论:常数 ( const \text{const} const ) 可以是任意值(如 ( 5 5 5)、( − 6 -6 −6)),不影响 ( q q q ) 的最优解。但交叉项系数必须是 ( − 2 -2 −2),以保证 ( ∇ log q = ∇ log p \nabla \log q = \nabla \log p ∇logq=∇logp )。多余的 ( − 1 -1 −1) 被归入常数,是推导中分离无关项的结果。
后记
2025年2月25日15点36分于上海,在Grok 3大模型辅助下完成。
相关文章:
Fisher散度:从信息几何到机器学习的隐藏利器
Fisher散度:从信息几何到机器学习的隐藏利器 在机器学习和统计学中,比较两个概率分布的差异是常见任务,比如评估真实分布与模型预测分布的差距。KL散度(Kullback-Leibler Divergence)可能是大家熟悉的选择,…...
事务管理-03.事务进阶-propagation属性
一.工具 在介绍事务的propagation属性前,我们首先介绍一个工具:Grep Console,该工具用来实现将idea输出出的日志信息进行选择性的高亮展示。 当要选择日志中的某一部分高亮展示时,只需要右键点击Add Highlight即可。此时日志中所…...
Pretraining Language Models with Text-Attributed Heterogeneous Graphs
Pretraining Language Models with Text-Attributed Heterogeneous Graphs EMNLP 推荐指数:#paper/⭐⭐# 贡献: 我们研究了在更复杂的数据结构上预训练LM的问题,即,TAHG。与大多数只能从每个节点的文本描述中学习的PLM不同&…...
模型疑问图像、嵌入、推理类型与说明
在进行模型使用的时候,有时候会碰到模型存在模型类型需要选择的情况,如下面deepseek模型选择模型类型图像、嵌入、推理。 以下是针对此问题的了解与说明: DeepSeek 模型是一个多模态人工智能模型,能够同时处理图像和文本数据,并在多种任务中实现高效的嵌入表示和推理。以下…...
WiFi IEEE 802.11协议精读:IEEE 802.11-2007,6,MAC service definition MAC服务定义
继续精读IEEE 802.11-2007 6,MAC service definition MAC服务定义 6.1 MAC服务概述 6.1.1 数据服务 此服务为对等逻辑链路控制(LLC)实体提供交换MAC服务数据单元(MSDU)的能力。为支持此服务,本地媒体访…...
Visual Studio Code 跨平台安装与配置指南(附官方下载链接)
一、软件定位与核心功能 Visual Studio Code(简称VS Code)是微软开发的开源跨平台代码编辑器,支持超过50种编程语言的智能补全、调试和版本控制功能。2025版本新增AI辅助编程模块,可自动生成单元测试代码和API文档注释。 二、下载…...
deepseek自动化代码生成
使用流程 效果第一步:注册生成各种大模型的API第二步:注册成功后生成API第三步:下载vscode在vscode中下载agent,这里推荐使用cline 第四步:安装完成后,设置模型信息第一步选择API provider: Ope…...
RK3568开发笔记-AD7616调试笔记
目录 前言 一、AD7616介绍 高分辨率 高速采样速率 宽模拟输入范围 集成丰富功能 二、原理图连接 三、设备树配置 四、内核驱动配置 五、AD芯片测试 总结 前言 在嵌入式数据采集领域,将模拟信号精准转换为数字信号至关重要。AD7616 作为一款性能卓越的 16 位模数转换器…...
【DeepSeek开源:会带来多大的影响】
DeepSeek 开源,震撼登场对云计算行业的冲击 巨头云厂商的新机遇 DeepSeek 开源后,为云计算行业带来了巨大的变革,尤其是为巨头云厂商创造了新的发展机遇。以阿里云为例,它作为云计算行业的领军者,与 DeepSeek 的合作…...
transformer架构嵌入层位置编码之动态NTK-aware位置编码
前文,我们已经构建了一个小型的字符级语言模型,是在transformer架构基础上实现的最基本的模型,我们肯定是希望对该模型进行改进和完善的。所以我们的另外一篇文章也从数据预处理、模型架构、训练策略、评估方法、代码结构、错误处理、性能优化等多个方面提出具体的改进点,但…...
OceanBase + DeepSeek:5分钟免费搭建企业知识库
过去一个月,DeepSeek 在全球范围内引发了热烈讨论。其突破性的 AI 能力使其日流量显著超越 Claude 和 Perplexity,吸引了众多企业和技术专家的高度关注。随着 AI 技术的不断进步,企业正面临一场深刻的智能化变革——如何通过 AI 重构业务&…...
水利工程安全包括哪几个方面
水利工程安全培训的内容主要包括以下几个方面: 基础知识和技能培训 : 法律法规 :学习水利工程相关的安全生产法律法规,了解安全生产标准及规范。 事故案例 :通过分析事故案例,了解事故原因和教训&#x…...
基于 sklearn 的均值偏移聚类算法的应用
基于 sklearn 的均值偏移聚类算法的应用 在机器学习和数据挖掘中,聚类算法是一类非常重要的无监督学习方法。它的目的是将数据集中的数据点划分为若干个类,使得同一类的样本点彼此相似,而不同类的样本点相互之间差异较大。均值偏移聚类&…...
C/C++语言知识点二
1. 编程算法之“哨兵”思想 哨兵思想是一种编程技巧,通过在数据结构的边界或特定位置放置一个特殊值(称为“哨兵”),来简化逻辑判断和提高代码效率。哨兵通常是一个标记值,用于指示某种条件或边界,从而避免…...
国产OS上完整编译Qt5.15、搭建基本开发环境需要的库
近期有师弟问我国产OS安装Qt5.15编译老是不完整,不是没声音,就是没视频,或者没有xcb。通过QEMU模拟Arm64,闲来20几天摸索,完整编译了Qt5.15,并编译成功了我的SDR玩具taskBus。 1.主要结论: 该O…...
Python 编程题第一节:判断素数、求阶乘、求圆的周长和面积、求三角形斜边长、比较三个数的大小、找出区间内的素数
判断素数 挺简单的,设一个flag来判断是否是素数,从2开始到前一个数,可以整除便不是素数,1不是素数 aint(input()) flagFalse for i in range(2,a):if a%i0:flagTruebreak if flagTrue or a1:print("不是素数") else:p…...
Python批量压缩并上载CSV数据文件到Box企业云盘
Python在Windows下批量压缩CSV文件为ZIP并异步上传到Box企业云,需整合文件处理、异步任务、配置管理和日志记录功能。 该方案通过线程池实现异步上传,每个文件独立压缩处理,异常发生时继续后续任务。日志系统记录完整操作流水,配置…...
MyBatis简明教程
MyBatis 是一个用于简化数据库操作的持久层框架,它的核心思想是 将 SQL 与 Java 代码解耦,让开发者专注于 SQL 的编写,同时自动处理重复的数据库操作步骤。 一、核心思想:SQL 与 Java 解耦 传统 JDBC 需要开发者手动管理数据库连…...
有什么区别?Elastic 和 Splunk 数据层
作者:来自 Elastic Ugo Sangiorgi, Matt Wehle 了解 Elastic 和 Splunk 数据管理方法之间的主要区别,以便做出明智的决策,实现高效的数据处理 在数据管理领域,在讨论如何根据不同的性能要求提供和/或保留数据时,经常会…...
Tips :仿真竞争条件 指的是什么?
文章目录 **为什么会出现仿真竞争条件?****典型场景举例****System Verilog 如何解决竞争条件?****1. 使用 `program` 块隔离测试平台****2. 使用 `clocking` 块明确时序关系****3. 非阻塞赋值(`<=`)的合理使用****竞争条件的根本原因****总结****代码结构****1. 设计模…...
BGP状态和机制
BGP邻居优化 为了增加稳定性,通常建议实验回环口来建立邻居。更新源:建立邻居和邻居所学习到的路由的下一跳。多跳:EBGP邻居建立默认选哟直连,因为TTL=1,如果非直连,必须修改TTL。命令备注peer 2.2.2.2 connect-interface lo1配置更新源peer 2.2.2.2 ebgp-max-hop 2配置T…...
【电机控制器】PY32F00BF15U6TR-从KEIL5中计算资源消耗资源
【电机控制器】PY32F00BF15U6TR-从KEIL5中计算资源消耗资源 文章目录 [TOC](文章目录) 前言一、MCU芯片手册二、实验三、实验结论四、参考资料总结 前言 使用工具: 1.KEIL5编译器 提示:以下是本篇文章正文内容,下面案例可供参考 一、MCU芯片…...
CaffeineCache自定义缓存时间
文章目录 1、POM文件依赖2、声明缓存3、缓存使用4、测试缓存5、自定义缓存过期时间6、测试自定义超时时间 1、POM文件依赖 <dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine</artifactId><version>3.1…...
python实战项目58:采集蜻蜓FM热门音频top排行榜
python实战项目58:采集蜻蜓FM热门音频top排行榜 一、采集流程介绍二、数据接口采集三、使用xpath提取页面数据1、抓包,找到数据接口2、发送请求,获取数据3、提取数据4、保存数据一、采集流程介绍 蜻蜓FM热门音频top排行榜的链接为: https://m.qingting.fm/rank/,首页如下图…...
STM32【3】芯片的底层组成概论
关于单片机的组成 单片机的意思是,小小计算电脑,麻雀虽小,五脏俱全,里面包含了CPU,ROM,RAM,各种外设。 CPU地位最高,可以访问ROM和RAM,Flash,GPIO等外设&…...
基于django图书信息管理系统的搭建(增删改查)
✍django项目搭建教程 ☞ ----------------- 教程 本文主要讲解django如何连接数据库MySQL并且可视化展示,实现增删改查功能 目录 一. 创建django应用 二. 数据库配置 三. 查看数据库 四. 编写代码 4.1视图函数 4.2 配置URL 4.3创建模板文件 4.…...
Kotlin 知识点二 延迟初始化和密封类
对变量延迟初始化 Kotlin 语言的许多特性,包括变量不可变,变量不可为空,等等。这些特性 都是为了尽可能地保证程序安全而设计的,但是有些时候这些特性也会在编码时给我们带来不 少的麻烦。 比如,如果你的类中存在很多…...
基于SpringBoot的“古城景区管理系统”的设计与实现(源码+数据库+文档+PPT)
基于SpringBoot的“古城景区管理系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统整体功能图 系统首页界面 系统注册界面 景…...
QT C++ QtConcurrent::run 异步任务 简单例子
QtConcurrent命名空间提供了高级API,使得无需使用低级线程原语即可编写多线程程序。 QtConcurrent::run是Qt框架中用于简化并发编程的一个功能,主要用于在后台线程中异步执行函数或成员函数。其主要用途包括: 异步执行函数…...
力扣hot100 —— 电话号码字母组合; 子集 (非回溯做法)简单易懂
由于博主对回溯也不是很熟悉,这里提出一种简单易懂的解法(有点暴力) 解题思路: 每个数字对应有自己的字母串; 首先遍历将每个字母存入也就是 res{{a},{b},{c}} 然后遍历后续数子对应的字母,让每个字母与…...
