变分推断学习

2023-11-17

#! https://zhuanlan.zhihu.com/p/401456634

变分推断

1.变分推断的背景

   在机器学习中,有很多求后验概率的问题,求后验概率的过程被称为推断(Inference),推断分为精确推断和近似推断。精确推断一般主要是根据贝叶斯等概率公式推导出后验概率,但在一些生成模型中,如RBM, DBN, DBM很难应用精确推断,于是乎我们就有了近似推断,近似推断又分为确定性近似和随机性近似,确定性近似方法就是变分推断(Variance Inference, VI),随机性近似的方法有马尔可夫蒙特卡洛采样(Markov Chain Monte Carlo, MCMC)、Metropolis-Hastings采样(MH)、吉布斯采样(Gibbs)。具体关系如下图:
image

2.变分推断介绍

2.1.问题的提出

假设 X X X是观测数据, Z Z Z是隐变量+参数, ( X , Z ) (X, Z) (X,Z)是完全数据。
在最大似然估计里面有这么个事实:
log ⁡ p ( x ) = log ⁡ p ( x , z ) − log ⁡ p ( z ∣ x ) = log ⁡ p ( x , z ) q ( z ) − log ⁡ p ( z ∣ x ) q ( z ) \begin{aligned} \log p(x) &=\log p(x, z)-\log p(z \mid x) \\ &=\log \frac{p(x, z)}{q(z)}-\log \frac{p(z \mid x)}{q(z)} \end{aligned} logp(x)=logp(x,z)logp(zx)=logq(z)p(x,z)logq(z)p(zx)
两边都关于 z z z积分有,左边= ∫ z log ⁡ p ( x ) q ( z ) d z = log ⁡ p ( x ) \int_{z} \log p(x) q(z) d z=\log p(x) zlogp(x)q(z)dz=logp(x),而右边,
∫ z q ( z ) log ⁡ p ( x , z ) q ( z ) d z + ( − ∫ z q ( z ) log ⁡ p ( z ∣ x ) q ( z ) d z ) = L ( q ) + K L ( q ∥ p ) (1) \begin{aligned} & \int_{z} q(z) \log \frac{p(x, z)}{\left.q{(z}\right)} d z+\left(-\int_{z} q(z) \log \frac{p(z \mid x)}{\left.q(z\right)} d z\right) \\ =& \mathcal{L}(q)+KL(q \| p) \end{aligned}\tag{1} =zq(z)logq(z)p(x,z)dz+(zq(z)logq(z)p(zx)dz)L(q)+KL(qp)(1)
其中 L ( q ) \mathcal{L}(q) L(q)就是我们说的变分,也即ELBO,这样就把对数似然转化为了变分和 K L KL KL散度的和。

因为后验函数 p ( z ∣ x ) p(z|x) p(zx)求不出,所以我们的任务就是要找到一个分布 q ( z ) q(z) q(z)来近似这个后验,也就是使 K L ( q ∥ p ) KL(q \| p) KL(qp)最小,此时要求变分 L ( q ) \mathcal{L}(q) L(q)达到最大值,也即把问题转化为了求 q ( z ) = a r g m a x q L ( q ) q(z) = \underset{q}{argmax}\mathcal{L}(q) q(z)=qargmaxL(q)

2.2.问题的转化

在介绍变分问题前,我们还需要了解到一个概念,平均场假设,这个假设来源于统计物理中的mean field theory思想,将 q ( z ) q(z) q(z)划分为M个独立的分布,即 q ( z ) = ∏ i = 1 M q i ( z i ) q(z)=\prod_{i=1}^{M}q_{i}(z_{i}) q(z)=i=1Mqi(zi)
代入 L ( q ) \mathcal{L}(q) L(q)中有:
L ( q ) = ∫ z q ( z ) log ⁡ p ( x , z ) d z − ∫ z q ( z ) log ⁡ q ( z ) d z \mathcal{L}(q)=\int_{z} q(z) \log p(x, z) d z-\int_{z} q(z) \log q(z) d z L(q)=zq(z)logp(x,z)dzzq(z)logq(z)dz,其中第一部分:
∫ z q ( z ) log ⁡ p ( x , z ) d z = ∫ z ∏ i = 1 m q i ( z i ) log ⁡ p ( x , z ) d z = ∫ z j q j ( z j ) [ ∫ ∏ i ≠ j M q i ( z i ) log ⁡ p ( x , z ) d z 1 d z 2 ⋯ d z M ] d z j = ∫ z j q j ( z j ) ⋅ E ∏ i ≠ j M q i ( z i ) [ log ⁡ p ( x , z ) ] d z j = ∫ z j q j ( z j ) ⋅ l o g p ^ ( x , z ) ] d z j \begin{aligned} \int_{z} q(z) \log p(x, z) d z &=\int_{z} \prod_{i=1}^{m} q_{i}\left(z_{i}\right) \log p\left(x, z\right) d z \\ &=\int_{z j} q_{j}\left(z_{j}\right)\left[\int \prod_{i \neq j}^{M} q_{i}\left(z_{i}\right) \log p(x, z)dz_1dz_2\cdots dz_M \right]dz_j\\ &=\int_{z_{j}} q_{j}\left(z_{j}\right) \cdot E_{\prod_{i \neq j}^{M} q_{i}\left(z_{i}\right)}[\log p(x, z)] d z_{j}\\ &=\int_{z_{j}} q_{j}\left(z_{j}\right) \cdot log \hat{p}(x, z)] d z_{j}\end{aligned} zq(z)logp(x,z)dz=zi=1mqi(zi)logp(x,z)dz=zjqj(zj)i=jMqi(zi)logp(x,z)dz1dz2dzMdzj=zjqj(zj)Ei=jMqi(zi)[logp(x,z)]dzj=zjqj(zj)logp^(x,z)]dzj
∫ z q ( z ) log ⁡ q ( z ) d z = ∫ z ∏ i = 1 M q i ( z i ) log ⁡ ∏ i = 1 M q i ( z i ) d z = ∫ z ∏ i = 1 m q i ( z i ) ∑ i = 1 m log ⁡ q i ( z i ) d z \begin{aligned} \int_{z} q(z) \log q(z) d z &=\int_{z} \prod_{i=1}^{M} q_{i} \left(z_{i}\right) \log \prod_{i=1}^{M} q_{i}\left(z_i\right) d z \\ &=\int_{z} \prod_{i=1}^{m} q_{i}\left(z_{i}\right) \sum_{i=1}^{m} \log q_{i}\left(z_{i}\right) d z \end{aligned} zq(z)logq(z)dz=zi=1Mqi(zi)logi=1Mqi(zi)dz=zi=1mqi(zi)i=1mlogqi(zi)dz
因为
∫ z ∏ i = 1 M q i ( z i ) log ⁡ q 1 d z = ∫ z 1 q 1 ( z 1 ) log ⁡ q 1 d z 1 ∫ z 2 q 2 ( z 2 ) d z 2 ⋯ ∫ z m q m ( z m ) d z m = ∫ z 1 q 1 ( z 1 ) log ⁡ q 1 d z 1 \begin{aligned} \int_{z} \prod_{i=1}^{M}q_{i}\left(z_{i}\right) \log q_{1} d z &=\int_{z_{1}}q_{1}\left(z_{1}\right) \log q_{1} d z_{1} \int_{z_{2}} q_{2}\left(z_{2}\right) d z_{2} \cdots \int_{z_{m}} q_{m}\left(z_{m}\right) d z_{m} \\ &=\int_{z_{1}}q_{1}\left(z_{1}\right) \log q_{1} d z_{1} \end{aligned} zi=1Mqi(zi)logq1dz=z1q1(z1)logq1dz1z2q2(z2)dz2zmqm(zm)dzm=z1q1(z1)logq1dz1
所以继续化简有:
∫ z q ( z ) log ⁡ q ( z ) d z = ∑ i = 1 m ∫ z i q i ( z i ) log ⁡ q i ( z i ) d z i = ∫ z j q j ( z j ) log ⁡ q j ( z j ) d z j + C \begin{aligned} \int_{z} q(z) \log q(z) d z &=\sum_{i=1}^{m} \int_{z_{i}} q_{i}\left(z_{i}\right) \log q_{i}\left(z_{i}\right) d z_{i} \\ &=\int_{z_{j}} q_{j}\left(z_{j}\right) \log q_{j}\left(z_{j}\right) d z_{j}+C \end{aligned} zq(z)logq(z)dz=i=1mziqi(zi)logqi(zi)dzi=zjqj(zj)logqj(zj)dzj+C

此时只把 q j ( z j ) q_j(z_j) qj(zj)看作变量,其余看作常量。所以
L ( q ) = ∫ z j q j ( z j ) log ⁡ p ^ ( x , z ) q j ( z j ) d z j − C \mathcal{L}(q)=\int_{z_{j}} q_{j}\left(z_{j}\right) \log \frac{\hat{p}(x, z)}{q_{j}(z_{j})} d z_{j}-C L(q)=zjqj(zj)logqj(zj)p^(x,z)dzjC因为 C C C是常量,z在求极大的时候可以省略。故我们得到了:
L ( q ) = ∫ z j q j ( z j ) log ⁡ p ^ ( x , z j ) q j ( z j ) d z j = − K L ( q j ∥ p ^ ( x , z j ) ) ≤ 0 \begin{aligned}\mathcal{L}(q)&=\int_{z_{j}} q_{j}\left(z_{j}\right) \log \frac{\hat{p}(x, z_j)}{q_{j}(z_{j})} d z_{j}\\ &=-KL(q_j\|\hat{p}(x, z_j)) \le 0\end{aligned} L(q)=zjqj(zj)logqj(zj)p^(x,zj)dzj=KL(qjp^(x,zj))0

注意,以上推导都是建立在平均场假设上。
  关于推导过程中的 K L KL KL散度有一些细节问题,要知道 K L KL KL散度是不对称的, K L ( q ∥ p ) 和 K L ( p ∥ q ) KL(q\|p)和KL(p\|q) KL(qp)KL(pq)有着不同的性质, K L ( q ∥ p ) KL(q\|p) KL(qp)鼓励分布 q q q在真实分布 p p p达到高概率达到高概率, K L ( p ∥ q ) KL(p\|q) KL(pq)则鼓励分布 q q q在真实分布 p p p概率较低的地方概率较小,他们各自有其优缺点,应用则取决于两者哪种效果更好。出于计算的角度,我们选择用 K L ( q ∥ p ) KL(q\|p) KL(qp),因为其涉及求在分布 q q q下的数学期望,比起求在真实分布 p p p下的数学期望较为简单。
  实际上,VI和EM的方法有些类似,关于EM算法,下次再写。

2.3.问题的解决

  至此,我们推导出了变分的形式,变分学习的核心思想就是在一个关于 q q q的有约束的分布族上最大化 L \mathcal{L} L。要使 q = p q=p q=p,则有 L = 0 \mathcal{L}=0 L=0,根据上面的推导过程,此时有公式
log ⁡ q j ( z j ) = E ∏ i ≠ j [ log ⁡ p ( x , z ) ] + C \log q_j(z_j)=E_{\prod_{i\ne j}}[\log p(x, z)]+C logqj(zj)=Ei=j[logp(x,z)]+C
展开就有
log ⁡ q j ( z j ) = ∫ z 1 ∫ z 2 ⋯ ∫ z j − 1 ∫ z j + 1 ⋯ ∫ z M q 1 q 2 ⋯ q j − 1 q j + 1 ⋯ q M log ⁡ p ( x , z ) d z 1 d z 2 ⋯ d z j − 1 d z j + 1 ⋯ d M \log q_j(z_j)=\int_{z_1}\int_{z_2}\cdots \int_{z_{j-1}}\int_{z_{j+1}}\cdots\int_{z_{M}}q_1q_2\cdots q_{j-1}q_{j+1}\cdots q_{M}\log p(x, z)dz_1dz_2\cdots d_{z_j-1}d_{z_j+1}\cdots d_{M} logqj(zj)=z1z2zj1zj+1zMq1q2qj1qj+1qMlogp(x,z)dz1dz2dzj1dzj+1dM
然后我们用常规的迭代算法求解上式,比如坐标上升发就可以得到 log ⁡ q j ( z j ) \log q_j(z_j) logqj(zj),然后求出所有的 q j q_j qj就可以得到后验概率了,目的达到!

2.4.变分的缺点

通过上面的推导我们可以发现所有推导都是建立在平均场假设上的,而平均场假设本身就较难满足,所以变分的一个主要缺点就是假设很难满足,不实用。

2.5.变分的变种

我们上面说可以用坐标上升法来计算,那我们很自然的就可以想到可不可以用梯度上升法(SGA),答案是可以的。
我们要求解的问题是
q = a r g m a x q L ( q ) q = \underset{q}{argmax}\mathcal{L}(q) q=qargmaxL(q)
q ( z ) q(z) q(z)写成 q Φ ( z ) q_{\Phi}(z) qΦ(z),这里应用了以下重参数化的技巧,因为对概率密度函数求梯度是不容易的,所以我们抽象出了一个连续变量 Φ \Phi Φ,从而可以对其求导,这里的 Φ \Phi Φ仍然有
Φ = a r g m a x Φ L ( Φ ) \Phi=\underset{\Phi}{argmax}\mathcal{L}(\Phi) Φ=ΦargmaxL(Φ)
因为
L ( q ) = ∫ z q Φ ( z ) log ⁡ p ( x , z ) q Φ ( z ) d z = E q Φ [ log ⁡ p θ ( x , z ) − log ⁡ q Φ ] \mathcal{L}(q)=\int_{z}q_{\Phi}(z)\log \frac{p(x, z)}{q_{\Phi}(z)}dz=E_{q_{\Phi}}[\log p_{\theta}(x, z)-\log q_{\Phi}] L(q)=zqΦ(z)logqΦ(z)p(x,z)dz=EqΦ[logpθ(x,z)logqΦ]
所以
▽ Φ L ( Φ ) = ▽ Φ E q Φ [ log ⁡ p θ ( x , z ) − log ⁡ q Φ ] = ▽ Φ ∫ z q Φ ( z ) [ log ⁡ p θ ( x , z ) − log ⁡ q Φ ] d z = ∫ z ▽ Φ q Φ ( z ) [ log ⁡ p θ ( x , z ) − log ⁡ q Φ ] d z + ∫ z q Φ ▽ Φ [ log ⁡ p θ ( x , z ) − log ⁡ q Φ ] d z = ① + ② \begin{aligned} \bigtriangledown_{\Phi}\mathcal{L}(\Phi) &=\bigtriangledown_{\Phi}E_{q_{\Phi}}[\log p_{\theta}(x, z)-\log q_{\Phi}] \\ &=\bigtriangledown_{\Phi}\int_zq_{\Phi}(z)[\log p_{\theta}(x, z) - \log q_{\Phi}]dz \\ &=\int_z\bigtriangledown_{\Phi}q_{\Phi}(z)[\log p_{\theta}(x, z) - \log q_{\Phi}]dz + \int_zq_{\Phi}\bigtriangledown_{\Phi}[\log p_{\theta}(x, z) - \log q_{\Phi}]dz \\ &=①+②\end{aligned} ΦL(Φ)=ΦEqΦ[logpθ(x,z)logqΦ]=ΦzqΦ(z)[logpθ(x,z)logqΦ]dz=zΦqΦ(z)[logpθ(x,z)logqΦ]dz+zqΦΦ[logpθ(x,z)logqΦ]dz=+
分析②
∫ z q Φ ▽ Φ [ log ⁡ p θ ( x , z ) − log ⁡ q Φ ] d z = − ∫ z q Φ ∗ 1 q Φ ∗ ▽ Φ q Φ d z = − ∫ z ▽ Φ q Φ d z = − ▽ Φ ∫ z q Φ d z = 0 \int_zq_{\Phi}\bigtriangledown_{\Phi}[\log p_{\theta}(x, z) - \log q_{\Phi}]dz=-\int_zq_{\Phi}*\frac{1}{q_{\Phi}}*\bigtriangledown_{\Phi}q_{\Phi}dz=-\int_z\bigtriangledown_{\Phi}q_{\Phi}dz=-\bigtriangledown_{\Phi}\int_zq_{\Phi}dz=0 zqΦΦ[logpθ(x,z)logqΦ]dz=zqΦqΦ1ΦqΦdz=zΦqΦdz=ΦzqΦdz=0
所以
▽ Φ L ( q ) = ∫ z ▽ Φ q Φ ( z ) [ log ⁡ p θ ( x , z ) − log ⁡ q Φ ] d z \bigtriangledown_{\Phi}\mathcal{L}(q)=\int_z\bigtriangledown_{\Phi}q_{\Phi}(z)[\log p_{\theta}(x, z) - \log q_{\Phi}]dz ΦL(q)=zΦqΦ(z)[logpθ(x,z)logqΦ]dz
用一个小技巧, ▽ Φ q Φ ( z ) = q Φ ▽ Φ log ⁡ q Φ \bigtriangledown_{\Phi}q_{\Phi}(z)=q_{\Phi}\bigtriangledown_{\Phi}\log q_{\Phi} ΦqΦ(z)=qΦΦlogqΦ,有
= ∫ z q Φ ▽ Φ log ⁡ q Φ [ log ⁡ p θ ( x , z ) − log ⁡ q Φ ] d z = E q Φ [ ▽ Φ log ⁡ q Φ [ log ⁡ p θ ( x , z ) − log ⁡ q Φ ] \begin{aligned} &=\int_zq_{\Phi}\bigtriangledown_{\Phi}\log q_{\Phi}[\log p_{\theta}(x, z) - \log q_{\Phi}]dz\\ &=E_{q_{\Phi}}[\bigtriangledown_{\Phi}\log q_{\Phi}[\log p_{\theta}(x, z) - \log q_{\Phi}] \end{aligned} =zqΦΦlogqΦ[logpθ(x,z)logqΦ]dz=EqΦ[ΦlogqΦ[logpθ(x,z)logqΦ]
此时就可以应用我们熟悉的采样方法来求解这个期望了,然后再进行梯度上升即可。
这里会有一个问题,就是期望中 ▽ Φ log ⁡ q Φ \bigtriangledown_{\Phi}\log q_{\Phi} ΦlogqΦ对样本点比较敏感,当 q Φ q_{\Phi} qΦ较小时,其梯度会趋于无穷,这就造成了采样结果方差较高,这就意味着我们需要大量的样本去拟合这个期望,可以认为不太现实,所以我们继续介绍求解这个梯度的另外一个方法。
重参数化技巧:
z ∼ g Φ ( ϵ , x ) , ϵ ∼ P ( ϵ ) z\sim g_{\Phi}(\epsilon, x), \epsilon \sim P(\epsilon) zgΦ(ϵ,x),ϵP(ϵ),在题解情况下有 z ∼ q ( z ∣ x ) ⇒ ϵ ∼ P ( ϵ ) z\sim q(z|x) \Rightarrow \epsilon \sim P(\epsilon) zq(zx)ϵP(ϵ),并且 q ( z ∣ x ) d z = P ( ϵ ) d ϵ q(z|x)dz=P(\epsilon)d\epsilon q(zx)dz=P(ϵ)dϵ,这里是因为 ∫ z q ( z ∣ x ) d z = 1 , ∫ ϵ P ( ϵ ) d ϵ = 1 \int_zq(z|x)dz=1,\int_{\epsilon}P(\epsilon)d\epsilon=1 zq(zx)dz=1ϵP(ϵ)dϵ=1并且 ϵ \epsilon ϵ z z z又有着对应关系,所以上述等式成立。
▽ Φ L ( Φ ) = ▽ Φ E q Φ [ log ⁡ p θ ( x , z ) − log ⁡ q Φ ] = ▽ Φ ∫ ( log ⁡ p θ ( x , z ) − log ⁡ q Φ ) q Φ d z = ▽ Φ ∫ ϵ ( log ⁡ p θ ( x , z ) − log ⁡ q Φ ) P ( ϵ ) d ϵ = ▽ Φ E P ( ϵ ) [ log ⁡ p θ ( x , z ) − log ⁡ q Φ ] = E P ( ϵ ) [ ▽ Φ ( log ⁡ p θ ( x , z ) − log ⁡ q Φ ) ] = E P ( ϵ ) [ ▽ z ( log ⁡ p θ ( x , z ) − log ⁡ q Φ ) ⋅ ▽ Φ z ] = E P ( ϵ ) [ ▽ z ( log ⁡ p θ ( x , z ) − log ⁡ q Φ ) ] ▽ Φ g Φ ( ϵ , x ) \begin{aligned} \bigtriangledown_{\Phi}\mathcal{L(\Phi)}&=\bigtriangledown_{\Phi}E_{q_{\Phi}}[\log p_{\theta}(x, z)-\log q_{\Phi}] \\ &=\bigtriangledown_{\Phi}\int(\log p_{\theta}(x, z)-\log q_{\Phi})q_{\Phi}dz \\ &=\bigtriangledown_{\Phi}\int_{\epsilon}(\log p_{\theta}(x, z)-\log q_{\Phi})P(\epsilon)d\epsilon \\ &=\bigtriangledown_{\Phi}E_{P(\epsilon)}[\log p_{\theta}(x, z)-\log q_{\Phi}] \\ &=E_{P(\epsilon)}[\bigtriangledown_{\Phi}(\log p_{\theta}(x, z)-\log q_{\Phi})] \\ &=E_{P(\epsilon)}[\bigtriangledown_{z}(\log p_{\theta}(x, z)-\log q_{\Phi})\cdot\bigtriangledown_{\Phi}z] \\ &=E_{P(\epsilon)}[\bigtriangledown_{z}(\log p_{\theta}(x, z)-\log q_{\Phi})]\bigtriangledown_{\Phi}g_{\Phi}(\epsilon, x) \end{aligned} ΦL(Φ)=ΦEqΦ[logpθ(x,z)logqΦ]=Φ(logpθ(x,z)logqΦ)qΦdz=Φϵ(logpθ(x,z)logqΦ)P(ϵ)dϵ=ΦEP(ϵ)[logpθ(x,z)logqΦ]=EP(ϵ)[Φ(logpθ(x,z)logqΦ)]=EP(ϵ)[z(logpθ(x,z)logqΦ)Φz]=EP(ϵ)[z(logpθ(x,z)logqΦ)]ΦgΦ(ϵ,x)
其中, P ( ϵ ) P(\epsilon) P(ϵ)是我们自己取的分布, 如均匀分布、正态分布,方便采样, ▽ z ( log ⁡ p θ ( x , z ) − log ⁡ q Φ ) \bigtriangledown_{z}(\log p_{\theta}(x, z)-\log q_{\Phi}) z(logpθ(x,z)logqΦ) ▽ Φ g Φ ( ϵ , x ) \bigtriangledown_{\Phi}g_{\Phi}(\epsilon, x) ΦgΦ(ϵ,x)都是已知的假设条件,此时再根据MCMC采样就可以得到梯度值了。然后根据梯度上升公式更新即可
Φ ( t + 1 ) = Φ ( t ) + λ ▽ Φ L ( Φ ) \Phi^{(t+1)}=\Phi^{(t)}+\lambda \bigtriangledown_{\Phi}\mathcal{L(\Phi)} Φ(t+1)=Φ(t)+λΦL(Φ)
这就是随机梯度变分法(Stochastic Gradient Variational Inference, SGVI)。

3.总结

  我们说明了变分的背景,以及变分推断的作用,是为了求一些在比较难求的后验,通常在无向图里使用。第二部分我们从最原始的条件推导变分,利用了平均场假设,说明了可以用坐标上升法和梯度上升法来求取后验。变分的主要作用就是求后验概率。
水平有限,如有错误,敬请指正。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

变分推断学习 的相关文章

随机推荐

  • vue中textarea高度的设置_vue中textarea自适应高度

    HTML data return pltxt 评论 inputText isHeight true minHeight 0 methods autoTextarea var extra 0 设置光标与输入框保持的距离 默认0 maxHeig
  • SQL操作

    一 查询语句 1 基本查询 SELECT FROM lt 表名 gt 查询表的所有行 SELECT FROM students 2 条件查询 SELECT FROM lt 表名 gt WHERE lt 条件表达式 gt 查询分数在80分以上
  • vscode+phpstudy连接使用mysql(解决phpstudy中mysql无法启动的问题)

    vscode phpstudy连接使用mysql 解决phpstudy中mysql无法启动的问题 使用vscode phpstudy配置php开发环境网上很文章都是挺好的 都成功解决了我的问题 但是对于使用mysql方面始终找不到很系统的文
  • 数据结构系列——先进先出队列queue

    本期主题 先进先出队列实现 目录 1 队列定义 2 实现一个简单的队列以及分析 1 代码实现分析 2 code 3 优缺点分析 3 循环队列实现 1 循环队列原理 2 循环队列实现分析 3 code 1 队列定义 队列是什么 定义 一个先进
  • unity,网格碰撞器(Mesh Collider)

    介绍 网格碰撞器 Mesh Collider 在实现物理碰撞检测时 可以自动检测凸面 但是它并不总是能够准确地生成凸多面体 这是因为在将一个网格模型转换为凸多面体的过程中 可能会出现模型内部空洞或者交叉的情况 这些情况会导致凸多面体的生成失
  • H5页面长按识别二维码

    vue 写的H5 内嵌在小程序上 img src 图片路径 style width 200px height 200px 直接在微信访问长按就可以实现 微信原生直接写长按识别二维码 aaa e let img e target datase
  • 八. springboot 的指标监控 (3、定制 Endpoint )

    3 定制 Endpoint 3 1 定制 Health 信息 import org springframework boot actuate health Health import org springframework boot act
  • http、https以及状态码超全详解

    文章目录 HTTP 概念 作用 http 请求 http 头部 http 连接 各版本的区别 http1 0 http1 1 http2 0 http3 0 HTTPS 概念 作用 工作原理 优点 缺点 http 和 https 区别 ht
  • [网络安全自学篇] 八.Web漏洞及端口扫描之Nmap、ThreatScan和DirBuster原理详解

    Web渗透技术的核心是发现Web漏洞 发现漏洞有手工和软件自动化扫描两种方式 对于用户验证漏洞 用户凭证管理问题 权限特权及访问控制漏洞 缓存漏洞 跨站脚本漏洞 加密漏洞 路径切换漏洞 代码注入漏洞 配置漏洞 数据和信息泄露 输入验证码漏洞
  • CA证书服务搭建

    准备一 域服务搭建 步骤一 搭建CA证书服务器 设置固定IP地址 192 168 0 与主机名 DC 打开服务器管理器 gt 点击添加角色和功能 步骤二 一路回车到达选择服务器角色位置 选中Active Directory域服务与Activ
  • 动态库装载及 dlsym的RTLD_NEXT参数详解

    在看公司spp框架代码的时候发现了如下一段宏定义 其中的dlsym函数及其RTLD NEXT参数的含义不是很明白 于是网上搜了下这里做个记录 define mt hook syscall name do if g mt syscall ta
  • 扔掉工具类!MyBatis 一个简单配置搞定加密、解密,好用!

    程序员的成长之路 互联网 程序员 技术 资料共享 关注 阅读本文大概需要 3 5 分钟 来自 https juejin cn post 6963811586184052767 目录 一 背景 二 解决方案 三 需求 四 实现思路 五 实现代
  • spring cloud alibaba 学习(二十五)nacos 服务地址动态更新

    目录 前言 服务地址动态更新 前言 通过配置endpoint来实现服务地址的动态更新 服务地址动态更新 1 在 NacosConfigBootstrapConfiguration 创建 NacosConfigManager 的过程中 会创建
  • Unity PlayerPrefs、JsonUtility

    Unity中有两个常用的数据存储方式 PlayerPrefs和JsonUtility PlayerPrefs PlayerPrefs是Unity内置的一种轻量级数据存储方式 可用于存储少量的游戏数据 如分数 解锁状态等 使用PlayerPr
  • LPDDR4协议规范之 (六)刷新

    LPDDR4协议规范之 六 刷新 刷新命令 刷新计数器 刷新时序 刷新前时序 刷新后时序 全存储体刷新时序 tRFCab tRFCpb 自刷新 自刷新期间进入掉电模式 自刷新中止 刷新命令 REFRESH命令在时钟的第一个上升沿以CS HI
  • GDI+ 中 Pen 使用总结

    背景 图形类 Graphics 是 GDI 的核心 它提供绘制图形 图像和文本的各种方法 Graphics 中使用 DrawString 方法在指定位置绘制文本或者在一个指定矩形内绘制文本 所有的 Graphics 类的绘制方法都得配合 P
  • MXNet简介

    MXNet是一个十分优秀的深度学习框架 目前包含了许多语言接口 如Python C Scala R等 目前 MXNet版本已经更新到1 3 0 本系列文章主要使用Python接口 在MXNet官网 1 上 官方建议新手使用Python接口
  • 网站代理是什么?有什么需要注意的?

    如今 网站代理已经成为一种不可或缺的经营方式 无论是企业还是个人 都需要通过代理来获得更多的流量和市场份额 一 网站代理的优势 网站代理的优势在于能够为您提供更加专业 周到的服务 这些优势包括 1 丰富的内容资源 能够满足客户对不同领域信息
  • Java-按照指定小时分割时间段

    按照指定小时分割时间段 param dateType 类型 M D H N gt 每月 每天 每小时 每分钟 param dBegin开始时间 param dEnd结束时间 param time 指定小时 如 1 2 3 4 return
  • 变分推断学习

    https zhuanlan zhihu com p 401456634 变分推断 1 变分推断的背景 在机器学习中 有很多求后验概率的问题 求后验概率的过程被称为推断 Inference 推断分为精确推断和近似推断 精确推断一般主要是根据