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

机器学习笔记之流形模型——标准流模型基本介绍

机器学习笔记之流形模型——标准流模型基本介绍

引言

本节将介绍概率生成模型——标准流模型(Normalizing Flow\text{Normalizing Flow}Normalizing Flow)。

回顾:隐变量模型的缺陷

关于隐变量模型(Latent Variable Model,LVM\text{Latent Variable Model,LVM}Latent Variable Model,LVM),如果表示隐变量的随机变量集合Z\mathcal ZZ足够复杂的话,很容易出现积分难问题:
此时隐变量Z\mathcal ZZ的维度(随机变量个数)极高(M)(\mathcal M)(M),对Z\mathcal ZZ求解积分的代价是极大的(Intractable)(\text{Intractable})(Intractable).
P(X)⏟Intractable=∫ZP(Z,X)dZ=∫ZP(Z)⋅P(X∣Z)dZ=∫Z1⋯∫ZMP(Z1,⋯,ZM)⋅P(X∣Z1,⋯,ZM)dZ1,⋯,ZM\begin{aligned} \underbrace{\mathcal P(\mathcal X) }_{\text{Intractable}} & = \int_{\mathcal Z} \mathcal P(\mathcal Z,\mathcal X) d\mathcal Z \\ & = \int_{\mathcal Z} \mathcal P(\mathcal Z) \cdot \mathcal P(\mathcal X \mid \mathcal Z) d\mathcal Z \\ & = \int_{\mathcal Z_1} \cdots \int_{\mathcal Z_{\mathcal M}} \mathcal P(\mathcal Z_1,\cdots,\mathcal Z_{\mathcal M}) \cdot \mathcal P(\mathcal X \mid \mathcal Z_1,\cdots,\mathcal Z_{\mathcal M}) d\mathcal Z_1,\cdots,\mathcal Z_{\mathcal M} \end{aligned}IntractableP(X)=ZP(Z,X)dZ=ZP(Z)P(XZ)dZ=Z1ZMP(Z1,,ZM)P(XZ1,,ZM)dZ1,,ZM
从而,关于隐变量Z\mathcal ZZ后验概率P(Z∣X)\mathcal P(\mathcal Z \mid \mathcal X)P(ZX)也同样是极难求解的:
P(Z∣X)⏟Intractable=P(Z,X)P(X)=P(Z)⋅P(X∣Z)P(X)⏟Intractable\begin{aligned} \underbrace{\mathcal P(\mathcal Z \mid \mathcal X)}_{\text{Intractable}} & = \frac{\mathcal P(\mathcal Z,\mathcal X)}{\mathcal P(\mathcal X)} \\ & = \frac{\mathcal P(\mathcal Z) \cdot \mathcal P(\mathcal X \mid \mathcal Z)}{\underbrace{\mathcal P(\mathcal X)}_{\text{Intractable}}} \end{aligned}IntractableP(ZX)=P(X)P(Z,X)=IntractableP(X)P(Z)P(XZ)

针对这种问题,由于无法得到精确解/精确解计算代价极高,因而通常采用近似推断(Approximate Inference\text{Approximate Inference}Approximate Inference)的方式对P(Z∣X)\mathcal P(\mathcal Z \mid \mathcal X)P(ZX)近似求解。

例如变分自编码器(Variational Auto-Encoder,VAE\text{Variational Auto-Encoder,VAE}Variational Auto-Encoder,VAE),它的底层逻辑是使用重参数化技巧人为设定分布Q(Z∣X)\mathcal Q(\mathcal Z \mid \mathcal X)Q(ZX)视作关于参数ϕ\phiϕ的函数Q(Z∣X,ϕ)\mathcal Q(\mathcal Z \mid \mathcal X,\phi)Q(ZX,ϕ),并通过神经网络学习参数ϕ\phiϕ并使其近似P(Z∣X)\mathcal P(\mathcal Z \mid \mathcal X)P(ZX)。关于变分自编码器的模型结构表示如下:
在这里插入图片描述
关于编码器(Encoder\text{Encoder}Encoder)函数Q(Z∣X;ϕ)\mathcal Q(\mathcal Z \mid \mathcal X;\phi)Q(ZX;ϕ)解码器(Decoder\text{Decoder}Decoder)函数P(X∣Z;θ)\mathcal P(\mathcal X \mid \mathcal Z;\theta)P(XZ;θ),变分自编码器的目标函数表示如下:
一个有趣的现象:其中−KL[Q(Z∣X;ϕ)∣∣P(Z;θ(t))]- \text{KL} [\mathcal Q(\mathcal Z \mid \mathcal X;\phi) || \mathcal P(\mathcal Z ;\theta^{(t)})]KL[Q(ZX;ϕ)∣∣P(Z;θ(t))]只是一个关于ϕ\phiϕ的惩罚项(约束),并且这个约束直接作用于EQ(Z∣X;ϕ)[log⁡P(X∣Z;θ)]\mathbb E_{\mathcal Q(\mathcal Z \mid \mathcal X;\phi)} \left[\log \mathcal P(\mathcal X \mid \mathcal Z;\theta)\right]EQ(ZX;ϕ)[logP(XZ;θ)].因此真正迭代的只有参数θ(θ(t)⇒θ(t+1))\theta(\theta^{(t)}\Rightarrow \theta^{(t+1)})θ(θ(t)θ(t+1)),参数ϕ\phiϕ仅是迭代过程中伴随着θ\thetaθ的更新而更新。
{L(ϕ,θ,θ(t))=EQ(Z∣X;ϕ)[log⁡P(X∣Z;θ)]−KL[Q(Z∣X;ϕ)∣∣P(Z;θ(t))](θ^(t+1),ϕ^(t+1))=arg⁡max⁡θ,ϕL(ϕ,θ,θ(t))\begin{cases} \mathcal L(\phi,\theta,\theta^{(t)}) = \mathbb E_{\mathcal Q(\mathcal Z \mid \mathcal X;\phi)} \left[\log \mathcal P(\mathcal X \mid \mathcal Z;\theta)\right] - \text{KL} [\mathcal Q(\mathcal Z \mid \mathcal X;\phi) || \mathcal P(\mathcal Z;\theta^{(t)})] \\ \quad \\ (\hat {\theta}^{(t+1)},\hat {\phi}^{(t+1)}) = \mathop{\arg\max}\limits_{\theta,\phi} \mathcal L(\phi,\theta,\theta^{(t)}) \end{cases}L(ϕ,θ,θ(t))=EQ(ZX;ϕ)[logP(XZ;θ)]KL[Q(ZX;ϕ)∣∣P(Z;θ(t))](θ^(t+1),ϕ^(t+1))=θ,ϕargmaxL(ϕ,θ,θ(t))
关于目标函数L(ϕ,θ,θ(t))\mathcal L(\phi,\theta,\theta^{(t)})L(ϕ,θ,θ(t))的底层逻辑是最大化ELBO\text{ELBO}ELBO
(θ^(t+1),ϕ^(t+1))=arg⁡max⁡θ,ϕ{EQ(Z∣X;ϕ)[log⁡P(X,Z;θ)Q(Z∣X;ϕ)]}(\hat {\theta}^{(t+1)},\hat {\phi}^{(t+1)}) = \mathop{\arg\max}\limits_{\theta,\phi} \left\{\mathbb E_{\mathcal Q(\mathcal Z \mid \mathcal X;\phi)} \left[\log \frac{\mathcal P(\mathcal X,\mathcal Z;\theta)}{\mathcal Q(\mathcal Z \mid \mathcal X;\phi)}\right]\right\}(θ^(t+1),ϕ^(t+1))=θ,ϕargmax{EQ(ZX;ϕ)[logQ(ZX;ϕ)P(X,Z;θ)]}
也就是说,它仅仅是最大化了极大似然估计log⁡P(X;θ)\log \mathcal P(\mathcal X;\theta)logP(X;θ)下界。实际上,它并没有直接对对数似然函数求解最优化问题。

这不可避免地存在误差,毕竟最优化对数似然函数和最优化它的下界 是两个概念。这一切的核心问题均在于P(X)\mathcal P(\mathcal X)P(X)无法得到精确解。

如果存在一种模型,它在学习任务过程中,P(X)\mathcal P(\mathcal X)P(X)可求解的(tractable\text{tractable}tractable),自然不会出现上述一系列的近似操作了。

标准流(Normalizing Flow\text{Normalizing Flow}Normalizing Flow)思想

关于样本X\mathcal XX的概率分布P(X)\mathcal P(\mathcal X)P(X),它可能是复杂的。但流模型(Flow-based Model\text{Flow-based Model}Flow-based Model)的思想是:分布P(X)\mathcal P(\mathcal X)P(X)的复杂并不是一蹴而就的,而是通过若干次的变化而产生出的复杂结果

关于流模型的概率图结构可表示为如下形式:
流模型-概率图结构
从模型结构中可以观察到,既然分布P(X)\mathcal P(\mathcal X)P(X)比较复杂,那么可以构建隐变量Z\mathcal ZZX\mathcal XX之间的函数关系X=f(Z)\mathcal X = f(\mathcal Z)X=f(Z),从而通过换元的方式描述P(Z)\mathcal P(\mathcal Z)P(Z)P(X)\mathcal P(\mathcal X)P(X)的函数关系。

如果隐变量Z\mathcal ZZ的结构同样复杂,可以继续针对该隐变量创造新的隐变量并构建函数关系。以此类推,最终可以通过一组服从简单分布的随机变量Zinit\mathcal Z_{init}Zinit通过若干次的函数的嵌套表示,得到关于X\mathcal XX的关联关系,从而得到Pinit(Zinit)⇒P(X)\mathcal P_{init}(\mathcal Z_{init}) \Rightarrow \mathcal P(\mathcal X)Pinit(Zinit)P(X)的函数关系。

分布变换的推导过程

以上图中隐变量ZK\mathcal Z_{\mathcal K}ZK观测变量X\mathcal XX之间关联关系示例:
在这里插入图片描述

  • 创建假设fKf_{\mathcal K}fK是一个 连续、可逆 函数,满足X=fK(ZK)\mathcal X = f_{\mathcal K}(\mathcal Z_{\mathcal K})X=fK(ZK)。其中ZK,X\mathcal Z_{\mathcal K},\mathcal XZK,X均表示随机变量集合,并服从对应的概率分布:
    • 其中PX(X)\mathcal P_{\mathcal X}(\mathcal X)PX(X)表示关于X\mathcal XX的概率分布,并且变量是X.ZK\mathcal X.\mathcal Z_{\mathcal K}X.ZK对应分布同理。
    • 反过来,由于fKf_{\mathcal K}fK函数可逆,因而有:ZK=fK−1(X)\mathcal Z_{\mathcal K} = f_{\mathcal K}^{-1}(\mathcal X)ZK=fK1(X).
      ZK∼PZK(ZK),X∼PX(X);ZK,X∈Rp\mathcal Z_{\mathcal K} \sim \mathcal P_{\mathcal Z_{\mathcal K}}(\mathcal Z_{\mathcal K}),\mathcal X \sim \mathcal P_{\mathcal X}(\mathcal X);\quad \mathcal Z_{\mathcal K},\mathcal X \in \mathbb R^pZKPZK(ZK),XPX(X);ZK,XRp
  • 不可否认的是,无论是PZK(ZK)\mathcal P_{\mathcal Z_{\mathcal K}}(\mathcal Z_{\mathcal K})PZK(ZK)还是PX(X)\mathcal P_{\mathcal X}(\mathcal X)PX(X),它们都是概率分布。根据概率密度积分的定义,必然有:
    ∫ZKPZK(ZK)dZK=∫XPX(X)dX=1\int_{\mathcal Z_{\mathcal K}} \mathcal P_{\mathcal Z_{\mathcal K}}(\mathcal Z_{\mathcal K}) d\mathcal Z_{\mathcal K} = \int_{\mathcal X} \mathcal P_{\mathcal X}(\mathcal X) d\mathcal X =1ZKPZK(ZK)dZK=XPX(X)dX=1
    从而有:
    变分推断——重参数化技巧一节中也使用这种描述进行换元,在不定积分中,PZK(ZK)dZK\mathcal P_{\mathcal Z_{\mathcal K}}(\mathcal Z_{\mathcal K}) d\mathcal Z_{\mathcal K}PZK(ZK)dZKPX(X)dX\mathcal P_{\mathcal X}(\mathcal X)d \mathcal XPX(X)dX必然相等;但是在定积分中,ZK,X\mathcal Z_{\mathcal K},\mathcal XZK,X位于不同的特征空间,对应的积分值(有正有负)存在差异。因此需要加上‘模’符号。
    ∣PZK(ZK)dZK∣=∣PX(X)dX∣|\mathcal P_{\mathcal Z_{\mathcal K}}(\mathcal Z_{\mathcal K}) d\mathcal Z_{\mathcal K}| = |P_{\mathcal X}(\mathcal X) d\mathcal X|PZK(ZK)dZK=PX(X)dX
    但由于PZK(ZK),PX(X)\mathcal P_{\mathcal Z_{\mathcal K}}(\mathcal Z_{\mathcal K}),\mathcal P_{\mathcal X}(\mathcal X)PZK(ZK),PX(X)它们是概率密度函数,它们的实际结果表示概率值(恒正)。因此∣PX(X)∣=PX(X)|\mathcal P_{\mathcal X}(\mathcal X)| = \mathcal P_{\mathcal X}(\mathcal X)PX(X)=PX(X)PZK(ZK)\mathcal P_{\mathcal Z_{\mathcal K}}(\mathcal Z_{\mathcal K})PZK(ZK)同理。经过移项,可将概率分布之间的关系表示为如下形式:
    PX(X)=∣dZKdX∣⋅PZK(ZK)\mathcal P_{\mathcal X}(\mathcal X) = \left|\frac{d\mathcal Z_{\mathcal K}}{d\mathcal X}\right| \cdot \mathcal P_{\mathcal Z_{\mathcal K}}(\mathcal Z_{\mathcal K})PX(X)=dXdZKPZK(ZK)
    ZK=fK−1(X)\mathcal Z_{\mathcal K} = f_{\mathcal K}^{-1}(\mathcal X)ZK=fK1(X)代入,最终可得到如下形式:
    PX(X)=∣∂fK−1(X)∂X∣⋅PZK(ZK)\mathcal P_{\mathcal X}(\mathcal X) = \left|\frac{\partial f_{\mathcal K}^{-1}(\mathcal X)}{\partial \mathcal X}\right| \cdot \mathcal P_{\mathcal Z_{\mathcal K}}(\mathcal Z_{\mathcal K})PX(X)=XfK1(X)PZK(ZK)
  • 观察系数项∣∂fK−1(X)∂X∣\left|\frac{\partial f_{\mathcal K}^{-1}(\mathcal X)}{\partial \mathcal X}\right|XfK1(X),它是一个标量、常数,但∂fK−1(X)∂X\frac{\partial f_{\mathcal K}^{-1}(\mathcal X)}{\partial\mathcal X}XfK1(X)自身是一个矩阵
    该矩阵被称作雅可比矩阵Jacobian\text{Jacobian}Jacobian
    ∂fK−1(X)∂X=[∂fK−1(X1)∂X1∂fK−1(X1)∂X2⋯∂fK−1(X1)∂Xp∂fK−1(X2)∂X1∂fK−1(X2)∂X2⋯∂fK−1(X2)∂Xp⋮⋮⋱⋮∂fK−1(Xp)∂X1∂fK−1(Xp)∂X2⋯∂fK−1(Xp)∂Xp]p×p\frac{\partial f_{\mathcal K}^{-1}(\mathcal X)}{\partial \mathcal X} = \begin{bmatrix} \frac{\partial f_{\mathcal K}^{-1}(\mathcal X_1)}{\partial \mathcal X_1} & \frac{\partial f_{\mathcal K}^{-1}(\mathcal X_1)}{\partial \mathcal X_2}& \cdots & \frac{\partial f_{\mathcal K}^{-1}(\mathcal X_1)}{\partial \mathcal X_p} \\ \frac{\partial f_{\mathcal K}^{-1}(\mathcal X_2)}{\partial \mathcal X_1} & \frac{\partial f_{\mathcal K}^{-1}(\mathcal X_2)}{\partial \mathcal X_2} & \cdots & \frac{\partial f_{\mathcal K}^{-1}(\mathcal X_2)}{\partial \mathcal X_p}\\ \vdots & \vdots & \ddots & \vdots\\ \frac{\partial f_{\mathcal K}^{-1}(\mathcal X_p)}{\partial \mathcal X_1} & \frac{\partial f_{\mathcal K}^{-1}(\mathcal X_p)}{\partial \mathcal X_2} & \cdots & \frac{\partial f_{\mathcal K}^{-1}(\mathcal X_p)}{\partial \mathcal X_p} \end{bmatrix}_{p \times p}XfK1(X)=X1fK1(X1)X1fK1(X2)X1fK1(Xp)X2fK1(X1)X2fK1(X2)X2fK1(Xp)XpfK1(X1)XpfK1(X2)XpfK1(Xp)p×p
    那么∣∂fK−1(X)∂X∣\left|\frac{\partial f_{\mathcal K}^{-1}(\mathcal X)}{\partial \mathcal X}\right|XfK1(X)实际上是与雅克比矩阵对应的雅克比行列式(Jacobian Determinant\text{Jacobian Determinant}Jacobian Determinant)的绝对值。使用det[∂fK−1(X)∂X]\text{det}\left[\frac{\partial f_{\mathcal K}^{-1}(\mathcal X)}{\partial \mathcal X}\right]det[XfK1(X)]进行表示:
    PX(X)=∣det[∂fK−1(X)∂X]∣⋅PZK(ZK)\mathcal P_{\mathcal X}(\mathcal X) = \left|\text{det}\left[\frac{\partial f_{\mathcal K}^{-1}(\mathcal X)}{\partial \mathcal X}\right]\right| \cdot \mathcal P_{\mathcal Z_{\mathcal K}}(\mathcal Z_{\mathcal K})PX(X)=det[XfK1(X)]PZK(ZK)
  • 继续变换,观察∂fK−1(X)∂X\frac{\partial f_{\mathcal K}^{-1}(\mathcal X)}{\partial \mathcal X}XfK1(X),可以继续向下变换:
    {∂fK−1(X)∂X⋅∂fK(ZK)∂ZK=1⇒∂fK−1(X)∂X=[∂fK(ZK)∂ZK]−1⇒∣det[∂fK−1(X)∂X]∣=∣det[∂fK(ZK)∂ZK]∣−1\begin{cases} \frac{\partial f_{\mathcal K}^{-1}(\mathcal X)}{\partial \mathcal X} \cdot \frac{\partial f_{\mathcal K}(\mathcal Z_{\mathcal K})}{\partial \mathcal Z_{\mathcal K}} = 1 \Rightarrow \frac{\partial f_{\mathcal K}^{-1}(\mathcal X)}{\partial \mathcal X} = \left[\frac{\partial f_{\mathcal K}(\mathcal Z_{\mathcal K})}{\partial \mathcal Z_{\mathcal K}}\right]^{-1} \\ \Rightarrow \left|\text{det}\left[\frac{\partial f_{\mathcal K}^{-1}(\mathcal X)}{\partial \mathcal X}\right]\right| = \left|\text{det}\left[\frac{\partial f_{\mathcal K}(\mathcal Z_{\mathcal K})}{\partial \mathcal Z_{\mathcal K}}\right]\right|^{-1} \end{cases}XfK1(X)ZKfK(ZK)=1XfK1(X)=[ZKfK(ZK)]1det[XfK1(X)]=det[ZKfK(ZK)]1
    最终,分布PX(X)\mathcal P_{\mathcal X}(\mathcal X)PX(X)与分布PZK(ZK)\mathcal P_{\mathcal Z_{\mathcal K}}(\mathcal Z_{\mathcal K})PZK(ZK)之间的关系表示为:
    PX(X)=∣det[∂fK(ZK)∂ZK]∣−1⋅PZK(ZK)\mathcal P_{\mathcal X}(\mathcal X) = \left|\text{det}\left[\frac{\partial f_{\mathcal K}(\mathcal Z_{\mathcal K})}{\partial \mathcal Z_{\mathcal K}}\right]\right|^{-1} \cdot \mathcal P_{\mathcal Z_{\mathcal K}}(\mathcal Z_{\mathcal K})PX(X)=det[ZKfK(ZK)]1PZK(ZK)

至此,从随机变量ZK\mathcal Z_{\mathcal K}ZK随机变量X\mathcal XX之间的函数关系,转化为概率分布PX(X)\mathcal P_{\mathcal X}(\mathcal X)PX(X)PZK(ZK)\mathcal P_{\mathcal Z_{\mathcal K}}(\mathcal Z_{\mathcal K})PZK(ZK)之间的函数关系已表示出来。而流模型中的每一个过程均是基于上述关系,一层一层计算过来。

不同于以往对P(X)\mathcal P(\mathcal X)P(X)的求解过程,它能够将P(X)\mathcal P(\mathcal X)P(X)描述出来,直到使用隐变量的层数选择完成,其对应的P(X)\mathcal P(\mathcal X)P(X)计算精度达到条件即可。关于流模型的学习方式依然是极大似然估计(Maximum Likelihood Estimation,MLE\text{Maximum Likelihood Estimation,MLE}Maximum Likelihood Estimation,MLE):
log⁡PX(X)=log⁡{∏k=1K∣det[∂fk(Zk)∂Zk]∣−1⋅Pinit(Zinit)}=log⁡Pinit(Zinit)+∑k=1Klog⁡{∣det[∂fk(Zk)∂Zk]∣−1}\begin{aligned} \log \mathcal P_{\mathcal X}(\mathcal X) & = \log \left\{\prod_{k=1}^{\mathcal K} \left|\text{det} \left[\frac{\partial f_{k}(\mathcal Z_k)}{\partial \mathcal Z_k}\right]\right|^{-1} \cdot \mathcal P_{init}(\mathcal Z_{init})\right\} \\ & = \log \mathcal P_{init}(\mathcal Z_{init}) + \sum_{k=1}^{\mathcal K} \log \left\{\left|\text{det} \left[\frac{\partial f_{k}(\mathcal Z_k)}{\partial \mathcal Z_k}\right]\right|^{-1}\right\} \end{aligned}logPX(X)=log{k=1Kdet[Zkfk(Zk)]1Pinit(Zinit)}=logPinit(Zinit)+k=1Klog{det[Zkfk(Zk)]1}

相关参考:
雅可比矩阵——百度百科
【机器学习白板推导系列(三十三) ~ 流模型(Flow Based Model)】

相关文章:

机器学习笔记之流形模型——标准流模型基本介绍

机器学习笔记之流形模型——标准流模型基本介绍引言回顾:隐变量模型的缺陷标准流(Normalizing Flow\text{Normalizing Flow}Normalizing Flow)思想分布变换的推导过程引言 本节将介绍概率生成模型——标准流模型(Normalizing Flow\text{Normalizing Flow}Normalizi…...

MIT:只需一层RF传感器,就能为AR头显赋予“X光”穿透视力

近年来,AR在仓库、工厂等场景得到应用,比如GlobalFoundries、亚马逊、菜鸟裹裹就使用摄像头扫描定位货品,并使用AR来导航和标记。目前,这种方案主要基于视觉算法,因此仅能定位视线范围内的目标。然而,在一些…...

对 Dom 树的理解

什么是 DOM 从网络传给渲染引擎的 HTML 文件字节流是无法直接被渲染引擎理解的,所以要将其转化为渲染引擎能够理解的内部结构,这个结构就是 DOM。 DOM 提供了对 HTML 文档结构化的表述。 在渲染引擎中,DOM 有三个层面的作用: …...

电商搜索入门

一、搜索用途通常一个电商平台里面的商品,少则几十万多则上千万甚至上亿的sku,在这么多的商品中,如何让用户可以快速查找到自己想要的商品,那么就需要用到搜索功能来实现。通过分析数据发现,接近40%的点击率是直接通过…...

4.3.1初阶数据结构(C语言)(无头不循环单链表)

1.完整的单链表注释&#xff1a; #pragma once #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h>typedef int SLTDateType; // 重定义数据类型typedef struct SListNode // 定义结构体类型的节点 {SLTDateType data;str…...

一文深度解读音视频行业技术发展历程

从1948年的香农定律&#xff0c;到音视频的今天。IMMENSE、36氪&#xff5c;作者 北京时间2月28日凌晨&#xff0c;FIFA年度颁奖典礼在巴黎举行。梅西荣膺年度最佳球员&#xff0c;斯卡洛尼当选年度最佳男足主帅&#xff0c;马丁内斯荣获年度最佳男足门将&#xff01;阿根廷因…...

面向对象拓展贴

1. 类和对象的内存分配机制 1.1 分配机制  Java 内存的结构分析 栈&#xff1a; 一般存放基本数据类型(局部变量)堆&#xff1a; 存放对象(Cat cat , 数组等)方法区&#xff1a;常量池(常量&#xff0c;比如字符串)&#xff0c; 类加载信息示意图 [Cat (name, age, price)]…...

Android仿QQ未读消息拖拽粘性效果

效果图原理分析首先是在指定某个位置画一个圆出来&#xff0c;手指按到这个圆的时候再绘制一个可以根据手指位置移动的圆&#xff0c;随着手指的移动两个圆逐渐分离&#xff0c;分离的过程中两圆中间出现连接带&#xff0c;随着两圆圆心距的增大&#xff0c;半径也是根据某一比…...

Linux 打包压缩解压指令 gzip bzip2 tar

总结自鸟哥Linux私房菜 Linux压缩文件的扩展名大多是&#xff1a;“.tar, .tar.gz, .tgz, .gz, .Z, .bz2, *.xz”&#xff0c; 不同压缩文件使用了不同的算法&#xff0c;不能通用压缩或解压 常见扩展名&#xff1a; *.Z compress 程序压缩的文件&#xff1b; *.zip zip 程序…...

系统升级丨分享返佣,助力商企实现低成本高转化营销

秉承助力传统经济数字化转型的长远理念 酷雷曼VR再次在VR全景营销中发力 创新研发“分享返佣”功能 进一步拓宽商企VR全景营销渠道 助力商企搭建低成本、高传播、高转化 的VR营销体系 01、什么是“分享返佣”&#xff1f; ●“分享返佣”即“推广”返佣&#xff0c;是酷…...

机试代码模板

文章目录进制转换高精度加/乘法搜索BFSDFS树二叉树遍历图Dijkstra算法Kruskal算法动态规划最长公共子序列(LCS)最长上升子序列(LIS)KMP算法进制转换 #include <iostream> #include <string> #include <cmath> #include <iomanip> #include <algori…...

Java性能优化-垃圾回收算法-理解CMS回收器

垃圾回收算法 理解 CMS回收器 三个基本操作 1.回收新生代&#xff08;同时暂停所有的应用线程&#xff09; 2.运行并发周期来清理老年代数据 3.如果有必要则FULL GC压缩老年代 当发生新生代回收 &#xff0c; 如果老年代没有足够的空间容纳晋升的对象则执行FULL GC,所有线程停…...

Oracle11G的表空间数据文件大小限制问题处理

1.表空间数据文件容量 oracle11g的表空间数据文件容量与DB_BLOCK_SIZE有关&#xff0c;在初始建库时&#xff0c;DB_BLOCK_SIZE要根据实际需要&#xff0c;设置为 4K,8K、16K、32K、64K等几种大小&#xff0c;ORACLE的物理文件最大只允许4194304个数据块&#xff08;由操作系统…...

计算机三级|网络技术|备考指南|网络系统结构与设计的基本原则|1

一、网络系统结构与设计的基本原则宽带城域网的关键技术p1 p2 p3设计一个宽带城域网涉及“三个平台一个出口”&#xff0c;即网络平台、业务平台、管理平台和城市宽带出口。宽带城域网&#xff1a;宽带城域网划分为三个层次&#xff1a;核心层、汇聚层、接入层。核心层承担高速…...

基于 TI Sitara系列 AM64x核心板——程序自启动说明

前 言 本文主要介绍AM64x的Cortex-A53、Cortex-M4F和Cortex-R5F核心程序自启动使用说明。默认使用AM6442进行测试演示,AM6412测试步骤与之类似。 本说明文档适用开发环境如下: Windows开发环境:Windows 7 64bit、Windows 10 64bit 虚拟机:VMware15.5.5 Linux开发环境:Ubun…...

自学5个月Java找到了9K的工作,我的方式值得大家借鉴 第一部分

我是去年9月22日才正式学习Java的&#xff0c;因为在国营单位工作了4年&#xff0c;在天津一个月工资只有5000块&#xff0c;而且看不到任何晋升的希望&#xff0c;如果想要往上走&#xff0c;那背后就一定要有关系才行。而且国营单位的气氛是你干的多了&#xff0c;领导觉得你…...

微电影广告的内容突破方案

微电影作为新媒体时代背景的产物&#xff0c;深受大众的欢迎&#xff0c;同时&#xff0c;微电影广告在微电影模式环境下应运而生&#xff0c;以自己独特的传播优势&#xff0c;俘获了大量企业主的青睐&#xff0c;也获得了广大青年群体的喜爱。微电影广告欲确保可持续发展&…...

茌平区为什么越来越多的企业由请高新技术企业?山东同邦科技分享

茌平区为什么越来越多的企业由请高新技术企业?山东同邦科技分享 近年来&#xff0c;越来越多的企业开始申报高新技术企业&#xff0c;认定为国家高新技术企业能获得非常多的好处&#xff0c;那么具体都有哪些呢? 一、国际高新技术企业认定的好处: 1、财政补贴: 获得高新企业…...

谷歌优化排名怎么做出来的?谷歌排名多久做上去?

本文主要分享谷歌排名的算法机制&#xff0c;让你很容易地用更短的时间把Google的自然排名做到首页。 本文由光算创作&#xff0c;有可能会被剽窃和修改&#xff0c;我们佛系对待这种行为吧。 谷歌优化排名怎么做出来的&#xff1f; 答案是&#xff1a;持续更新原创优质内容…...

字节跳动青训营--Webpack

文章目录前言一、为什么要学习Webpack&#xff1f;二、什么是Webpack&#xff1f;1. 产生背景2. 基础概念三、使用Webpack1. 安装2. 编辑配置文件3. 执行编译命令核心流程四、如何使用Webpack流程类配置配置总览五、理解Loader六、理解插件插件钩子课外关注资料前言 此文章仅用…...

微信多媒体文件speex格式转为mp3文件格式

1、安装speex环境 wget https://ftp.osuosl.org/pub/xiph/releases/speex/speex-1.2.0.tar.gz tar -zxvf speex-1.2.0.tar.gz -C /usr/local/ cd /usr/local/speex-1.2.0/ ./configure make make install 2、配置path到/usr/lib 因为安装的speex生成的可执行文件默认在/usr…...

IAP初探

IAP(In-Application Programming)在应用编程&#xff0c;浅显易懂&#xff0c;按照字面意思即是在程序不关闭情况下&#xff0c;对应用进行再次写入程序&#xff0c;对程序的写入需要传输数据&#xff0c;而传输数据的前提是通信&#xff0c; IAP对代码进行更新可以简要分为以…...

【组织架构】中国铁路兰州局集团有限公司

1 公司简介 中国铁路兰州局集团有限公司&#xff0c;是中国国家铁路集团有限公司管理的18个铁路局集团有限公司之一&#xff0c;简称“兰局”。经过59年的发展&#xff0c;现已成为西北地区最大的交通运输企业之一&#xff0c;形成了以兰州为枢纽&#xff0c;由陇海铁路、包兰铁…...

【计算机三级网络技术】 第四篇 路由设计技术基础

文章目录一、分组转发二、路由选择1.理想的路由算法的基本特征2.路由算法的度量标准3.路由算法分类&#xff1a;4.IP路由选择与路由汇聚(重点)三、自治系统与Internet的路由选择协议1.自治系统2.路由选择协议的分类四、内部网关协议1.RIP的基本概念2.RIP的原理3.RIP的运行过程五…...

嵌入式工程师进阶,基于AM64x开发板的IPC多核开发案例分享

前 言 本文档主要说明AM64x基于IPC的多核开发方法。默认使用AM6442进行测试演示,AM6412测试步骤与之类似。 适用开发环境如下: Windows开发环境:Windows 7 64bit、Windows 10 64bit 虚拟机:VMware15.5.5 Linux开发环境:Ubuntu 18.04.4 64bit Linux Processor SDK:ti-proc…...

腾讯安全与锐捷网络战略合作,威胁情报能力“被集成”

2月28日&#xff0c;腾讯安全和锐捷网络在北京联合举办“威胁情报”战略合作发布会。双方发布了一款集成了腾讯安全威胁情报的新一代防火墙&#xff0c;并举办战略合作签约仪式。会上&#xff0c;锐捷网络安全产品事业部总经理项小升、腾讯安全总经理陈龙代表双方签署战略合作协…...

接口自动化测试用例详解

phpunit 接口自动化测试系列 Post接口自动化测试用例 Post方式的接口是上传接口&#xff0c;需要对接口头部进行封装&#xff0c;所以没有办法在浏览器下直接调用&#xff0c;但是可以用Curl命令的-d参数传递接口需要的参数。当然我们还以众筹网的登录接口为例&#xff0c;讲…...

【数据库增删查改进阶版】保姆级教程带大家去学习更加复杂的sql语句,各种各样的约束以及各种各样的查询

前言&#xff1a; 大家好&#xff0c;我是良辰丫&#x1f345;&#x1f345;&#x1f345;&#xff0c;上一篇数据库我们一起学习了基础版本的增删查改&#xff0c;今天我们将接触更高级的增删查改&#xff0c;主要是学习一些约束条件&#xff0c;你们准备好了嘛&#xff1f;开…...

【C#基础】C# 正则表达式

序号系列文章7【C#基础】C# 常用数据结构8【C#基础】C# 面向对象编程9【C# 基础】C# 异常处理操作文章目录前言1&#xff0c;Regex 的概念2&#xff0c;Regex 的创建3&#xff0c;Regex 常用操作4&#xff0c;Regex 类的使用5&#xff0c;学习资源推荐结语前言 &#x1f33c; h…...

企业活动直播如何设置VIP观看席?

阿酷tony / 2023-2-28 / 长沙 / 多图内容企业活动直播如何设置VIP观看席&#xff1f;有意思吧&#xff0c;直播也能设vip席位。在直播间可以分设尊享嘉宾席、特邀VIP以及观众席三个区域&#xff0c;为企业提供多种用户接待模式&#xff0c;不仅能为嘉宾营造尊享VIP体验&#xf…...

线性代数学习-2

线性代数学习-2矩阵消元消元回代消元矩阵置换矩阵逆矩阵本文转载于https://herosunly.blog.csdn.net/article/details/88713747 该文章本人认为十分有用&#xff0c;便自己敲一遍笔记加固印象原文链接 原文这个笔记感觉比我老师讲的更加透彻&#xff0c;清晰。很好的展示了线性…...

Java 类

Java类是Java编程语言中的基本概念之一&#xff0c;用于描述对象的属性和方法。本文将详细介绍Java类的作用、定义和使用&#xff0c;以及在实际工作中的应用。 什么是Java类&#xff1f; Java类是一种用于描述对象的模板或蓝图。它定义了一个对象的属性和方法&#xff0c;以…...

GO中sync 包的 RWMutex 读写互斥锁

文章目录背景RWMutex 简介代码验证多个协程请求读锁 RLock() 和 RLock()读写交错 RLock() 和 Lock()写入的时候读取读取的时候写入请求多个写Lock() 和 Lock()背景 Mutex 互斥锁是严格锁定读和写&#xff0c;如果我们需要单独对读或者写添加锁需要使用 sync包的RWMutex 针对读…...

糖化学试剂55520-67-7,5-vinyl-2-deoxyuridine,5-乙烯基-2-脱氧尿苷特点分析说明

5-vinyl-2-deoxyuridine(5-VdU)&#xff0c;5-vinyl-2-deoxyuridine&#xff0c;5-Vinyldeoxyuridine5-乙烯基-2-脱氧尿苷 | CAS&#xff1a;55520-67-7 | 纯度&#xff1a;95%试剂信息&#xff1a;CAS&#xff1a;55520-67-7所属类别&#xff1a;糖化学分子量&#xff1a;C11H…...

五年携手共话,FISCO BCOS为数实相生注入新动能

2月24日&#xff0c;作为深圳国际金融科技节系列活动之一&#xff0c;由深圳市地方金融监督管理局指导&#xff0c;微众银行、金链盟主办的“2022产业区块链年度峰会暨FISCO BCOS五周年生态大会”&#xff08;下称“大会”&#xff09;在深圳顺利召开。本次大会以“数实相生&am…...

特征可视化技术t-SNE

特征可视化技术t-SNE 一、理论介绍 想要了解t-SNE的数学原理可以参考t-SNE完整笔记 关于t-SNE的使用过程中有以下几点需要注意&#xff1a; t-SNE算法并不是每次都能产生相似结果。 t-SNE算法使得距离的概念适应于数据集中的区域密度变化。因此&#xff0c;它自然而然地扩大…...

.NET 导入导出Project(mpp)以及发布后遇到的Com组件问题

最近公司项目有一个对Project导入导出的操作&#xff0c;现在市面上能同时对Project进行导入导出的除了微软自带的Microsoft.Office.Interop.MSProject&#xff0c;还有就是Aspose.Tasks for .NET。但因为后者是收费软件且破解版的现阶段只到18.11&#xff0c;只支持.net Frame…...

centos 8安装配置 yum/dnf镜像源 以及 docker相关操作

Docker简介 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 Docker组成部分&#xff1a; 镜…...

java基础之线程池

线程池1.线程池1.1 线程状态介绍1.2 线程池-基本原理1.3 线程池-Executors默认线程池1.4 线程池-Executors创建指定上限的线程池1.5 线程池-ThreadPoolExecutor1.6 线程池-参数详解1.7 线程池-非默认任务拒绝策略2. 原子性2.1 volatile-问题2.2 volatile解决2.3 synchronized解…...

Substrate 基础 -- 教程(Tutorials)

官网 github DOC 面向未来的区块链框架 Substrate 使开发人员能够快速、轻松地构建适合任何用例的未来 证明区块链(future proof blockchains)。 Substrate 文档包括区块链构建器&#xff08;blockchain builders&#xff09;和parachain 项目团队的概念、过程和参考信息。…...

一个线程两次调用start()方法会出现什么情况?

第17讲 | 一个线程两次调用start()方法会出现什么情况&#xff1f; 今天我们来深入聊聊线程&#xff0c;相信大家对于线程这个概念都不陌生&#xff0c;它是 Java 并发的基础元素&#xff0c;理解、操纵、诊断线程是 Java 工程师的必修课&#xff0c;但是你真的掌握线程了吗&am…...

看完再拿五分,软考高项时政提分必备

时事政治题作为软考信息系统项目管理师当中的必考题&#xff0c;每年都让不少考生头疼&#xff0c;主要吧&#xff0c;它一不在教材里&#xff0c;二考的又很随意&#xff0c;如果不是平时积累&#xff0c;专门注意去看&#xff0c;有时候很难答得对&#xff0c;弄得这几分就完…...

界面开发(1) --- PyQt5环境配置

PyQt5环境配置 第一步&#xff1a;首先安装社区版Pycharm 下载地址&#xff1a;https://www.jetbrains.com/pycharm/download/#sectionwindows 第二步&#xff1a;安装Anaconda3&#xff0c;配置虚拟环境 下载地址&#xff1a;https://www.anaconda.com/ 第三步&#xff1…...

shield分析

本文仅供学习交流&#xff0c;只提供关键思路不会给出完整代码&#xff0c;严禁用于非法用途&#xff0c;若有侵权请联系我删除&#xff01;技术交流合作请私信&#xff01; 熟练打开Fiddler设置好手机代理&#xff0c;摆弄半天一直抓不到包&#xff0c;应该是小红书监测到了F…...

Javaweb增删改查之【查】

Javaweb增删改查之【查】1.前端页面2.java链接数据库——集成mybatis2.1 建立层2.2 实体层entity2.3 mapper&#xff08;dao层&#xff09;2.4 mybatis配置文件2.5工具层util3.后台功能3.1servlet前几天跟着b站up主学javaweb登录&#xff0c;突然还是觉得这几年学了c是真的挺好…...

C++ STL:迭代器 Iterator

文章目录1、迭代器的类型2、traitsiterator_traitstype_traits泛化的指针&#xff0c;容器与算法的桥梁。提供一种方法&#xff0c;按照一定顺序访问一个聚合对象中各个元素&#xff0c;而又不暴露该对象的内部表示。既能对容器进行遍历&#xff0c;又可以对外隐藏容器的底层实…...

【C++】泛型编程——模板初阶

文章目录1. 泛型编程2. 函数模板2.1 函数模板的概念2.2 函数模板的使用2.3 函数模板的原理2.4 函数模板的实例化隐式实例化显式实例化2.5 模板参数的匹配原则3. 类模板1. 泛型编程 首先我们来思考一个问题&#xff1a;如何实现一个通用的交换函数呢&#xff1f; 即我们想交换两…...

数据结构入门--时间 空间复杂度

数据结构入门 时间 空间复杂度解析 目录 一. 算法效率 二. 时间复杂度 2.1 时间复杂度的概念 2.2 大O的渐进表示法 2.3 题目练习 题目一 题目二 题目三 题目四 题目五 题目六 题目七 三. 空间复杂度 3.1 题目练习 题目一 题目二 题目三 一. 算法效率 算法效率…...

计算机操作系统第一章

操作系统引论1.1操作系统的目标和作用定义&#xff1a;操作系统是控制管理计算机系统的硬软件&#xff0c;分配调度资源的系统软件。目标&#xff1a;方便性&#xff0c;有效性&#xff08;提高系统资源的利用率、提高系统的吞吐量&#xff09;&#xff0c;可扩充性&#xff0c…...

ARM LDREX/STREX指令以及独占监控器详解

一、目的Linux驱动开发中有一个特别重要的知识点必须掌握&#xff0c;即并发、竞态以及同步。什么是并发&#xff1f;多个执行单元&#xff08;进程、线程、中断&#xff09;同时对一个共享资源的进行访问&#xff1b;此处的共享资源可以是外设、内存或者软件层面的全局变量静态…...