当前位置: 首页 > news >正文

1. 统计推断-基于神经网络与Langevin扩散的自适应潜变量建模与优化

为克服上述两大局限,本文提出了一种新的框架——ALMOND,即 adaptive latent modeling and optimization via neural networks and Langevin diffusion(基于神经网络与Langevin扩散的自适应潜变量建模与优化),作为潜变量模型建模与推断的新方法。

  • ALMOND 针对第一个挑战,借鉴了机器学习文献中各种深度生成模型的思想(Goodfellow et al.,2014; Kingma and Welling,2014;Han et al.,2017),通过深度神经网络(DNN,Goodfellow et al.,2016)将低维的已知分布变换为潜变量分布 π(u)\pi(u)π(u) 。这种方式使潜变量分布具有高度灵活性,从而用户无需在受限的参数形式下显式定义 π(u)\pi(u)π(u)

  • 在模型参数估计方面,已有的两种方法是变分自编码器和交替反向传播 ,旨在优化某个目标函数,该目标函数可视为对真实似然函数的近似:前者利用变分下界,后者依赖蒙特卡洛采样。相比之下,我们的贡献在于提出了一种基于真实似然函数的估计方法并具备坚实的收敛性保证。同时,我们设计了一种高效的计算算法,使该框架适用于复杂模型和大规模数据集。更为重要的是,与近似方法相比,该方法并未牺牲统计精度。凭借这些优势,我们的目标是帮助数据分析人员更专注于潜变量建模,而不必再为大规模计算而设计繁琐的定制算法。

该框架之所以能具备上述特性,源于对 Langevin 采样算法与随机逼近方法的系统性分析。这两类技术在潜变量模型中的应用已在文献中得到广泛探讨,但这些工作大多忽略了 Langevin 算法的偏差。本文的创新在于将 Langevin 算法的有限样本偏差纳入优化过程的一部分(研究了 Langevin 算法在有限迭代步和有限样本条件下的偏差以及其与随机逼近方法之间的相互作用)。这一分析为现代统计与机器学习模型中常用的采样与优化技术提供了理论支撑。值得注意的是,这些结果是普遍性的,而不仅限于潜变量模型。

本文其余部分的组织如下:第二节对所提出的推断框架进行概述;第三节介绍相应的计算算法;第四节给出算法的理论保证;第五节和第六节分别通过模拟实验和真实数据分析展示方法的实际表现;第七节进行总结与讨论。

1. 本文提出的框架

1.1. 隐式模型表示 π(u)\pi(u)π(u)

我们假设潜变量分布 π\piπ 完全未知(如果已有π\piπ 的先验知识也可以很容易地将其纳入模型中)。然而直接寻找一个密度估计器 π^\hat{\pi}π^ 非常困难,因为这需要在一个给定的分布族中优化 π\piπ 的某个特定函数。

由于多维密度函数受约束较多,因此考虑对 π\piπ 进行另一种表示方式是有益的。我们通过一个灵活的隐式模型来表示 π(u)\pi(u)π(u) ,采用两步法:

  1. 首先,从一个固定的分布 π0(z)\pi_0(z)π0(z) 中采样一个变量 Z∈Z⊆RrZ \in \mathscr{Z} \subseteq \mathbb{R}^rZZRr

  2. 然后,通过一个确定性变换 h:Z→Uh: \mathscr{Z} \rightarrow \mathscr{U}h:ZUZZZ 映射到潜变量 U=h(Z)U=h(Z)U=h(Z) 。这里,π0\pi_0π0 可以是任何常见分布,例如标准正态 N(0,Ir)N\left(\mathbf{0}, \mathbf{I}_r\right)N(0,Ir) 。这种表示方法在深度学习中很常见,比如生成对抗网络和变分自编码器(VAE)。当 UUUZZZ 是一维变量时,这种映射就称为概率积分变换。

这种方法的优点包括:(a)h(Z)h(Z)h(Z) 可以表示非常广泛的分布;(b)在许多情况下,潜变量 UUU 实际上只位于一个低维流形上,因此 ZZZ 的维度 rrr 可以远小于 UUU 的维度 ddd ;(c)映射 hhh 没有额外约束,这大大简化了优化问题。

通过 U=h(Z)U=h(Z)U=h(Z) ,可以定义 (X,Z)(X, Z)(X,Z) 的联合分布:Z∼π0,X∣Z∼pX∣Z(x∣z)=fθ(x∣h(z)) Z \sim \pi_0, \quad X \mid Z \sim p_{X \mid Z}(x \mid z)=f_\theta(x \mid h(z)) Zπ0,XZpXZ(xz)=fθ(xh(z))其中 pX∣Z(x∣z)p_{X \mid Z}(x \mid z)pXZ(xz) 是给定 Z=zZ=zZ=zXXX 的条件密度,pZ∣X(z∣x)p_{Z \mid X}(z \mid x)pZX(zx) 则表示给定 X=xX=xX=xZZZ 的条件密度。在这种表述下,潜变量模型的推断问题就转化为三个任务:1.估计映射 hhh ;2.估计参数向量 θ\thetaθ ;3.估计条件分布 pZ∣X(z∣x)p_{Z \mid X}(z \mid x)pZX(zx)

1.2. 神经网络拟合

过去十年中,深度神经网络(DNN)在复杂人工智能任务中表现出巨大成功,例如图像识别和语音理解。在统计领域,也有越来越多的工作使用 DNN 来解决问题,例如变量选择。为了利用 DNN 的优势,我们用一个 DNN hηh_\etahη 来近似映射 hhh ,其定义如下:
(2)hη=TD∘σ∘TD−1∘⋯∘σ∘T1(3)T1∈AdN,T2,…,TD−1∈ANN,TD∈ANrσ((x1,…,xN)T)=(σ(x1),…,σ(xN))T \begin{aligned} &(2)\quad h_\eta=T_D \circ \sigma \circ T_{D-1} \circ \cdots \circ \sigma \circ T_1 \\ &(3)\quad T_1 \in \mathcal{A}_d^N, T_2, \ldots, T_{D-1} \in \mathcal{A}_N^N, T_D \in \mathcal{A}_N^r \\ & \sigma\left(\left(x_1, \ldots, x_N\right)^{\mathrm{T}}\right)=\left(\sigma\left(x_1\right), \ldots, \sigma\left(x_N\right)\right)^{\mathrm{T}} \end{aligned} (2)hη=TDσTD1σT1(3)T1AdN,T2,,TD1ANN,TDANrσ((x1,,xN)T)=(σ(x1),,σ(xN))T其中,NNNDDD 分别表示 DNN 的宽度和深度, An1n2\mathcal{A}_{n_1}^{n_2}An1n2 表示从 Rn1\mathbb{R}^{n_1}Rn1Rn2\mathbb{R}^{n_2}Rn2 的仿射变换,其形式为xn1×1↦Wn2×n1x+bn2×1, x_{n_1 \times 1} \mapsto W_{n_2 \times n_1} x+b_{n_2 \times 1}, xn1×1Wn2×n1x+bn2×1,σ\sigmaσ 是非线性激活函数,η\etaη 表示 DNN 中的全部参数。在公式(3)中,每一层使用固定宽度 NNN 仅是为了简化符号;在实际应用中,每一层 TiT_iTi 的维度可以不同。DNN 模型在选择激活函数上具有很大的灵活性。常用的激活函数包括整流线性单元(ReLU,Glorot,Bordes,and Bengio,2011),σ(x)=max⁡{x,0}\sigma(x)=\max \{x, 0\}σ(x)=max{x,0} ,以及其平滑版本 σ(x)=log⁡(1+exp⁡(x))≈max⁡{x,0}\sigma(x)=\log (1+\exp (x)) \approx \max \{x, 0\}σ(x)=log(1+exp(x))max{x,0}

DNN 的有效性在很大程度上源于其通用逼近性质。为了简化表示,我们将映射 hhh 视为一个函数向量,h=(h1,…,hd)h= \left(h_1, \ldots, h_d\right)h=(h1,,hd) ,其中每个 hih_ihi 是定义在 Rr\mathbb{R}^rRr 上的 rrr 维连续函数;同样地,根据输出维度,hηh_\etahη 可分解为 hη=(h1,η,…,hd,η)h_{\boldsymbol{\eta}}= \left(h_{1, \eta}, \ldots, h_{d, \eta}\right)hη=(h1,η,,hd,η) 。Leshno 等人(1993)的定理 1 表明:只要隐含单元数足够,每个 hηh_\etahη 的分量 hi,ηh_{i, \eta}hi,η 在连续函数类中是稠密的,前提是激活函数 σ(x)\sigma(x)σ(x) 连续、局部有界,且不是多项式函数。大多数常用的激活函数,如 σ(x)=max⁡{x,0}\sigma(x)=\max \{x, 0\}σ(x)=max{x,0}σ(x)=log⁡(1+exp⁡(x))\sigma(x)=\log (1+\exp (x))σ(x)=log(1+exp(x)) ,都满足这一条件。因此,DNN 模型 hηh_{\boldsymbol{\eta}}hη(公式(2))可以以任意预设精度逼近任意连续函数 hhh 。当然,在有限样本情况下,需要对 hηh_\etahη 的宽度和深度进行调节,以在偏差与方差之间取得平衡。本文不讨论这种超参数的调节,而是关注在有限 NNNDDD 下,如何求解最优参数 η\etaη ,因为本文的结论适用于任意固定架构的 DNN 模型。

如果 DNN 参数 η\etaη 和条件分布参数 θ\boldsymbol{\theta}θ 已知,则观测数据的边际密度函数可以表示为
(4)fβ(x)=∫Ufθ(x∣u)πη(u)du=∫Zfθ(x∣hη(z))π0(z)dz (4) \quad f_\beta(x)=\int_{\mathscr{U}} f_\theta(x \mid u) \pi_\eta(u) \mathrm{d} u=\int_{\mathscr{Z}} f_\theta\left(x \mid h_\eta(z)\right) \pi_0(z) \mathrm{d} z (4)fβ(x)=Ufθ(xu)πη(u)du=Zfθ(xhη(z))π0(z)dz其中 β=(η,θ)\beta=(\eta, \theta)β=(η,θ) 包含模型中的所有参数。在本文的后续部分,如果不会引起混淆,我们将省略积分区域的符号。

给定观测数据 X1,…,XnX_1, \ldots, X_nX1,,Xn ,感兴趣的参数 β\betaβ 可以根据最大似然原则进行估计:
(5)β^=arg⁡max⁡β1n∑i=1nℓ(β;Xi)=arg⁡max⁡β1n∑i=1nlog⁡[fβ(Xi)], (5) \quad \hat{\beta}=\underset{\beta}{\arg \max } \frac{1}{n} \sum_{i=1}^n \ell\left(\beta ; X_i\right)=\underset{\beta}{\arg \max } \frac{1}{n} \sum_{i=1}^n \log \left[f_\beta\left(X_i\right)\right], (5)β^=βargmaxn1i=1n(β;Xi)=βargmaxn1i=1nlog[fβ(Xi)],其中 ℓ(β;x)=log⁡[fβ(x)]\ell(\beta ; x)=\log \left[f_\beta(x)\right](β;x)=log[fβ(x)] 是对数似然函数。

然而,优化问题(5)的主要困难在于计算 ℓ(β;x)\ell(\boldsymbol{\beta} ; \boldsymbol{x})(β;x) 及其关于 β\betaβ 的梯度。对于固定的 xxx ,精确计算 fβ(x)f_\beta(x)fβ(x) 是不可行的,因为一般来说积分(4)是高维的且没有闭式解。因此,如何高效地计算估计量 β^\hat{\beta}β^ 成为本文剩余部分的主要关注点。我们的算法将在下一节介绍。

2.算法

2.1 随机梯度方法

为简化讨论,我们先考虑对 ℓ(β;x)\ell(\beta ; x)(β;x) 的单个固定 xxx 的处理,因为方法可以很容易推广到求和形式 n−1∑i=1nℓ(β;Xi)n^{-1} \sum_{i=1}^n \ell\left(\beta ; X_i\right)n1i=1n(β;Xi)

ℓ(β;x)=log⁡[fβ(x)]\ell(\beta ; x)=\log \left[f_\beta(x)\right](β;x)=log[fβ(x)] 无法精确计算时,一种常见的做法是找到一个"低成本"的随机量来近似它,然后使用随机逼近方法进行优化。这种方法通常称为随机梯度方法

例如,很容易看出(6)f~β(x,V)=1M∑i=1Mfθ(x∣hη(Vi)),V1,…,VM∼iidπ0(6)\quad \tilde{f}_\beta(x, V)=\frac{1}{M} \sum_{i=1}^M f_\theta\left(x \mid h_\eta\left(V_i\right)\right), \quad V_1, \ldots, V_M \stackrel{\mathrm{iid}}{\sim} \pi_0 (6)f~β(x,V)=M1i=1Mfθ(xhη(Vi)),V1,,VMiidπ0fβ(x)f_\beta(x)fβ(x) 的无偏估计,其中 V=(V1,…,VM)V=\left(V_1, \ldots, V_M\right)V=(V1,,VM) 为蒙特卡洛样本,MMM 为样本量。

评价:原则上,ℓ~(β;x,V)=log⁡[f~β(x,V)]\tilde{\ell}(\beta ; x, V)= \log \left[\tilde{f}_\beta(x, V)\right]~(β;x,V)=log[f~β(x,V)] 可以通过足够大的 MMM 任意精确地逼近 ℓ(β;x)\ell(\beta ; x)(β;x) ,且随机梯度方法收敛的条件已有充分研究。然而,尽管理论上简单,但公式(6)通常方差较高,因为大部分求和项接近于零。这会导致收敛速度极慢,因此直接使用 ℓ~(β;x,V)\tilde{\ell}(\beta ; x, V)~(β;x,V) 并不实用。

我们引入一个在优化方法中起核心作用的函数。考虑对对数似然函数
ℓ(β;x)=log⁡[fβ(x)]=log⁡∫Zfθ(x∣hη(z))π0(z)dz\ell(\beta ; x)=\log \left[f_\beta(x)\right]=\log \int_{\mathscr{Z}} f_\theta\left(x \mid h_\eta(z)\right) \pi_0(z) \mathrm{d} z(β;x)=log[fβ(x)]=logZfθ(xhη(z))π0(z)dz的一个代理函数,定义为
(7)L(β,β~;x)=∫log⁡[fθ(x∣hη(z))π0(z)pβ~(z∣x)]pβ~(z∣x)dz (7)\quad \mathcal{L}(\beta, \tilde{\beta} ; x)=\int \log \left[\frac{f_\theta\left(x \mid h_\eta(z)\right) \pi_0(z)}{p_{\tilde{\beta}}(z \mid x)}\right] p_{\tilde{\beta}}(z \mid x) \mathrm{d} z (7)L(β,β~;x)=log[pβ~(zx)fθ(xhη(z))π0(z)]pβ~(zx)dz其中 pβ~p_{\tilde{\beta}}pβ~ 表示当 β\betaβ 固定为 β~\tilde{\beta}β~ 时的条件密度 pZ∣X(z∣x)p_{Z \mid X}(z \mid x)pZX(zx)

函数 L(β,β~;x)\mathcal{L}(\beta, \tilde{\beta} ; x)L(β,β~;x) 具有以下简单而重要的性质:

引理1. L(β,β~;x)\mathcal{L}(\beta, \tilde{\beta} ; x)L(β,β~;x)ℓ(β;x)\ell(\beta ; x)(β;x) 的一致下界,即对任意 β~\tilde{\beta}β~ ,有L(β,β~;x)≤ℓ(β;x)\mathcal{L}(\beta, \tilde{\beta} ; x) \leq \ell(\beta ; x)L(β,β~;x)(β;x)。此外,当 β~=β\tilde{\beta}=\betaβ~=β 时,L(β,β;x)=ℓ(β;x)\mathcal{L}(\beta, \beta ; x)=\ell(\beta ; x)L(β,β;x)=(β;x)

需要注意的是,公式(7)是变分推断和深度学习文献中证据下界的一个特例。然而,一般的 ELBO 只满足引理1的第一个性质,而额外的恒等式 L(β,β;x)=ℓ(β;x)\mathcal{L}(\beta, \beta ; x)= \ell(\beta ; x)L(β,β;x)=(β;x) 是本文算法的关键。

定义 L(β,β~;x)\mathcal{L}(\beta, \tilde{\beta} ; x)L(β,β~;x)β\betaβ 的偏导为g(β,β~;x)=∂L(β,β~;x)∂βg(\beta, \tilde{\beta} ; x)=\frac{\partial \mathcal{L}(\beta, \tilde{\beta} ; x)}{\partial \beta}g(β,β~;x)=βL(β,β~;x),则我们的迭代更新方法为βt+1=βt+αt⋅gt(βt;x) \beta_{t+1}=\beta_t+\alpha_t \cdot g_t\left(\beta_t ; x\right) βt+1=βt+αtgt(βt;x)其中 βt=(ηt,θt)\beta_t=\left(\eta_t, \theta_t\right)βt=(ηt,θt) 是第 ttt 次迭代的估计值,t∈N,αtt \in \mathbb{N}, \alpha_ttN,αt 为步长,且gt(β;x)=g(β,βt;x)=∫∂log⁡[fθ(x∣hη(z))]∂βpβt(z∣x)dz g_t(\beta ; x)=g\left(\beta, \beta_t ; x\right)=\int \frac{\partial \log \left[f_\theta\left(x \mid h_\eta(z)\right)\right]}{\partial \beta} p_{\beta_t}(z \mid x) \mathrm{d} zgt(β;x)=g(β,βt;x)=βlog[fθ(xhη(z))]pβt(zx)dz为梯度。然而,精确计算 gt(β;x)g_t(\beta ; x)gt(β;x) 是不可行的,因此我们使用随机梯度 g~(β;x,Wt)\tilde{g}\left(\beta ; x, W_t\right)g~(β;x,Wt) 进行替代:
βt+1=βt+αt⋅g~(βt;x,Wt) \beta_{t+1}=\beta_t+\alpha_t \cdot \tilde{g}\left(\beta_t ; x, W_t\right) βt+1=βt+αtg~(βt;x,Wt)其中 Wt=(Wt(1),…,Wt(Mt))W_t=\left(W_t^{(1)}, \ldots, W_t^{\left(M_t\right)}\right)Wt=(Wt(1),,Wt(Mt)) 为一系列随机向量,MtM_tMt 为序列长度。一个常见选择是从 pβt(z∣x)p_{\beta_t}(z \mid x)pβt(zx) 中采样足够大的马尔可夫链蒙特卡洛样本,使得 g~(β;x,Wt)\tilde{g}\left(\beta ; x, W_t\right)g~(β;x,Wt) 近似无偏地估计 gt(β;x)g_t(\beta ; x)gt(β;x) 。然而,通常很难事先确定 MCMC 样本量,因此在下一节中我们将介绍一种对超参数更透明的替代采样策略。

3.2. Langevin 算法

在所提出的 ALMOND 框架中,随机梯度 g~(β;x,Wt)\tilde{g}\left(\beta ; x, W_t\right)g~(β;x,Wt) 的计算基于 Langevin 算法。

  • 从整体上看,Langevin 算法是一种从目标分布中获取近似样本的方法。
  • 基于 Langevin 采样,我们得到的 g~(β;x,Wt)\tilde{g}\left(\beta ; x, W_t\right)g~(β;x,Wt)gt(β;x)g_t(\beta ; x)gt(β;x) 的 有偏估计,但其偏差可以通过增加计算时间而变得任意小。
  • 直观上,在优化初期我们只需粗略的近似来节省计算开销,同时参数仍然可能沿着上升方向前进;而随着优化的进行,会使用更高精度的采样来保证在最优点附近的梯度更新更加准确。

这些启发性解释将在下一节得到严格化:我们将仔细研究 Langevin 算法中的偏差来源,提出控制偏差的方法,并讨论在何种条件下式(9)的迭代能够保证收敛。下一节给出了 Langevin 算法的必要背景知识,

而这里我们主要描述其计算方法: 目标是g~(β;x,Wt)\tilde{g}\left(\beta ; x, W_t\right)g~(β;x,Wt) 近似无偏地估计 gt(β;x)=∫∂log⁡[fθ(x∣hη(z))]∂βpβt(z∣x)dzg_t(\beta ; x)=\int \frac{\partial \log \left[f_\theta\left(x \mid h_\eta(z)\right)\right]}{\partial \beta} p_{\beta_t}(z \mid x) \mathrm{d} zgt(β;x)=βlog[fθ(xhη(z))]pβt(zx)dz

定义
vt(z)=∂∂zlog⁡[fθt(x∣hηt(z))π0(z)],G(β;x,z)=∂∂βlog⁡[fθ(x∣hη(z))],v_t(z)=\frac{\partial}{\partial z} \log \left[f_{\theta_t}\left(x \mid h_{\eta_t}(z)\right) \pi_0(z)\right], \quad G(\beta ; x, z)=\frac{\partial}{\partial \beta} \log \left[f_\theta\left(x \mid h_\eta(z)\right)\right], vt(z)=zlog[fθt(xhηt(z))π0(z)],G(β;x,z)=βlog[fθ(xhη(z))],则有下式可以近似gt(β;x)=∫∂log⁡[fθ(x∣hη(z))]∂βpβt(z∣x)dzg_t(\beta ; x)=\int \frac{\partial \log \left[f_\theta\left(x \mid h_\eta(z)\right)\right]}{\partial \beta} p_{\beta_t}(z \mid x) \mathrm{d} zgt(β;x)=βlog[fθ(xhη(z))]pβt(zx)dz,g~(β;x,Wt)=1Mt∑i=1MtG(β;x,Wt(i))=1Mt∑i=1Mt∂∂βlog⁡[fθ(x∣hη(Wt(i)))]. \tilde{g}\left(\beta ; x, W_t\right)=\frac{1}{M_t} \sum_{i=1}^{M_t} G\left(\beta ; x, W_t^{(i)}\right) =\frac{1}{M_t} \sum_{i=1}^{M_t}\frac{\partial}{\partial \beta} \log \left[f_\theta\left(x \mid h_\eta(W_t^{(i)})\right)\right]. g~(β;x,Wt)=Mt1i=1MtG(β;x,Wt(i))=Mt1i=1Mtβlog[fθ(xhη(Wt(i)))].接下来,我们描述随机向量序列 WtW_tWt 的计算方法,以及整个随机梯度方法的概要(见 算法 1)。
在这里插入图片描述

在 ALMOND 框架里,目标分布是条件分布:pβt(z∣x)∝fθt(x∣hηt(z))π0(z) p_{\beta_t}(z \mid x) \propto f_{\theta_t}\left(x \mid h_{\eta_t}(z)\right) \pi_0(z) pβt(zx)fθt(xhηt(z))π0(z)于是 Langevin 动力学写成:Wt(k+1)=Wt(k)+γt⋅∇zlog⁡(fθt(x∣hηt(Wt(k)))π0(Wt(k)))+2γtξ(k) W_t^{(k+1)}=W_t^{(k)}+\gamma_t \cdot \nabla_z \log \left(f_{\theta_t}\left(x \mid h_{\eta_t}\left(W_t^{(k)}\right)\right) \pi_0\left(W_t^{(k)}\right)\right)+\sqrt{2 \gamma_t} \xi^{(k)} Wt(k+1)=Wt(k)+γtzlog(fθt(xhηt(Wt(k)))π0(Wt(k)))+2γtξ(k)这正是 Algorithm 1 里的更新式。由于我们设计的 drift 使用了 ∇zlog⁡pβt(z∣x)\nabla_z \log p_{\beta_t}(z \mid x)zlogpβt(zx) ,那么其平稳分布自然就是pβt(z∣x)p_{\beta_t}(z \mid x)pβt(zx)

我们的方法可以与 交替反向传播算法(Han et al. 2017, 算法 1)进行比较,但存在一个关键区别:在我们的 Langevin 算法中,参数 γt\gamma_tγtMtM_tMt 随迭代次数 ttt 而变化,而不是取固定值。这一点事实证明是整个优化过程最终收敛的关键。相关讨论将在 第 4.3 节展开。

在附录 A 中,我们介绍了若干有助于实际实现的技巧,包括通过 VAE 计算得到的初始值 (β0,q0)(\beta_0, q_0)(β0,q0),以及 Langevin 算法的 warm-start 策略。在实际应用中,这些技巧能够显著加速优化收敛,并减少计算成本。


文章转载自:

http://rcdzFH8o.wzjhL.cn
http://S0MGN3Md.wzjhL.cn
http://vQ0mEAoZ.wzjhL.cn
http://9Ao8sDxy.wzjhL.cn
http://3oH8Rm4R.wzjhL.cn
http://aDOXmPus.wzjhL.cn
http://LHi0LMfX.wzjhL.cn
http://B8COg33o.wzjhL.cn
http://o3kIKIlN.wzjhL.cn
http://ezDSJ3MR.wzjhL.cn
http://VuShbaV2.wzjhL.cn
http://HEtawt2u.wzjhL.cn
http://uB3sftAE.wzjhL.cn
http://uyonhqdm.wzjhL.cn
http://RZ4kvclX.wzjhL.cn
http://mWfXK3tD.wzjhL.cn
http://eYCymFxS.wzjhL.cn
http://ArgIjSXX.wzjhL.cn
http://GhGZesgg.wzjhL.cn
http://be7MVayL.wzjhL.cn
http://xXvLvZ1S.wzjhL.cn
http://gXDIqR1p.wzjhL.cn
http://ijF7GI3C.wzjhL.cn
http://lVPqOh4f.wzjhL.cn
http://hSxjYGqY.wzjhL.cn
http://22ONfwDA.wzjhL.cn
http://5kxipdHe.wzjhL.cn
http://QM8Hxf4u.wzjhL.cn
http://A3GpsQlY.wzjhL.cn
http://UavcE3xa.wzjhL.cn
http://www.dtcms.com/a/372789.html

相关文章:

  • STM32U575RIT6 简单代码(参考模板)
  • 在新发布的AI论文中 pytorch 和tensorflow 的使用比例
  • Chapter3—单例模式
  • k8s可视化的解决方案及技术选型
  • K8s Ingress Annotations参数使用指南
  • Kubernetes(K8S)入门以及命令指南
  • 自建prometheus监控腾讯云k8s集群
  • Go 1.25在性能方面做了哪些提升?
  • Next.js数据获取入门:`getStaticProps` 与 `getServerSideProps`
  • 为什么要在出口路由器router配置NAT与默认路由
  • 如何 正确使用 nrm 工具 管理镜像源
  • http response的工作流程详细解析
  • FastDFS(分布式RPC调用和分布式文件储存)
  • 国内开源时序数据库IoTDB介绍
  • TCL电视机音乐播放器动效背景模仿
  • 深入解析:Vue与React的异步批处理更新机制
  • 基于Spring Boot的火灾报警系统的设计与实现(代码+数据库+LW)
  • Spring Boot的配置文件加载顺序和规则
  • B.30.10.05-JVM电商实战应用
  • vulhub fastjson 1.2.24 反序列化导致任意命令执行漏洞
  • [特殊字符] 跨端视频通话实战:腾讯云 TRTC + IM(React Native Web)
  • 【重学 MySQL】九十八、MySQL用户管理全指南:创建、修改、删除
  • 2025时序数据库选型,以IoTDB为主从架构基因到AI赋能来解析
  • 如何用表单快速构建一个用户反馈系统?
  • 2020/12 JLPT听力原文 问题四
  • 基于ConvFormer的双条件域自适应方法的故障诊断模型
  • Day 14: RAG检索增强生成核心技术 - 从原理到实战的完整指南 [特殊字符]
  • mysql 回表查询(二次查询,如何检查,如何规避)
  • vue3+ts使用html2canvas,实现页面截图
  • 疾病语音数据集 WAV格式音频