InfoNCE Loss详解(上)

news2024/12/31 21:35:50

引言

InfoNCE对比学习损失是学习句嵌入绕不开的知识点,本文就从头开始来探讨一下它是怎么来的。

先验知识

数学期望与大数定律

期望(expectation,expected value,数学期望,mathematical expectation)是随机变量的平均值,即在概率意义下的“中心”。

对于离散型随机变量 X X X,其期望定义为:

E [ X ] = ∑ i x i P ( X = x i ) \Bbb E[X] = \sum_{i} x_i P(X = x_i) E[X]=ixiP(X=xi)

即随机变量 X X X 所有可能结果的加权平均值,其中权重由每个给定值的概率给出。

对于连续型随机变量 X X X,其期望定义为:

E [ X ] = ∫ − ∞ ∞ x f ( x ) d x \Bbb E[X] = \int_{-\infty}^{\infty} x f(x) dx E[X]=xf(x)dx

大数定律(Law of large numbers,大数法则大数律)是描述相当多次数重复实验的结果的定律。根据这个定律知道,样本数量越多,则其算术平均值就有越高的概率接近期望。

算术平均值即我们常说的均值、平均数,通过一组样本除以样本的个数计算。

大数定律主要有两种表现形式:弱大数定律强大数定律

定义样本均值为:

X ‾ n = 1 n ∑ i = 1 n X i \overline X_n = \frac{1}{n} \sum_{i=1}^n X_i Xn=n1i=1nXi

弱大数定律表明,当 n → ∞ n \rightarrow \infty n 时,样本均值 X ‾ n \overline X_n Xn 依概率收敛到期望 E [ X ] \Bbb E[X] E[X],对于任意正数 ϵ \epsilon ϵ

lim ⁡ n → ∞ p ( ∣ X ‾ n − E [ X ] ∣ > ϵ ) = 0 \lim_{n \rightarrow \infty} p( |\overline X_n - \Bbb E[X]| > \epsilon) = 0 nlimp(XnE[X]>ϵ)=0

强大数定律进一步指出,样本均值几乎必然(以概率1收敛)于期望:

p ( lim ⁡ n → ∞ X ‾ n = E [ X ] ) = 1 p(\lim_{n \rightarrow \infty} \overline X_n = \Bbb E[X]) = 1 p(nlimXn=E[X])=1

依概率收敛一个随机变量序列 ( X n ) n ≥ 1 (X_n)_{n \geq 1} (Xn)n1 依概率收敛到某一个随机变量 X X X ,指的是 X n X_n Xn X X X 之间存在一定差距的可能性将会随着 n n n 的增大而趋向于零。

大数定律证明了样本均值会逼近随机变量的期望,说明了期望是随机变量的一个稳定性特征,是大量观测的平均结果。

自信息

自信息(self-information,香农信息,information content)指的是当我们接收到一个消息时所获得的信息量。

对于一个事件,其自信息大小与该事件发生的概率相关。

自信息可以解释为量化特定结果的意外程度。

香农对自信息的定义为了满足几个公理:

  1. 概率为100%的事件完全不足为奇,不会产生任何信息。
  2. 事件发生的可能性越小,它就越令人惊讶,产生的信息就越多。
  3. 如果分别测量两个独立事件,信息总量是两个事件的自信息之和。

直观地说,从观察意外事件中可以获得更多的信息——它是“令人惊讶的”。比如,如果彩票中特等奖的概率是五百万分之一,那么你从得知你的朋友张三中奖中获得的信息比TA不中奖的信息多得多。

可以证明,满足这三个公理的概率函数是唯一的,且仅差一个乘法缩放因子。一般来说,给定一个实数 b > 1 b > 1 b>1和一个概率为 P P P 的事件 x x x,自信息定义如下:

I ( x ) : = − log ⁡ b [ Pr ( x ) ] = − log ⁡ b ( P ) \text{I}(x) := -\log_b [\text{Pr}(x)] = -\log_b (P) I(x):=logb[Pr(x)]=logb(P)

基数 b b b 对应上面的缩放因子,不同的选择对应不同的信息单位:当 b = 2 b = 2 b=2 时,单位是香农,通常称为”位“。

image.png

− log ⁡ 2 ( x ) -\log_2(x) log2(x)的图像如上图所示,在概率范围内是正数。

正式地,给定一个具有概率质量函数 p X ( x ) p_X(x) pX(x) 的离散随机变量,其自信息定义为:

I X ( x ) : = − log ⁡ [ p X ( x ) ] = log ⁡ ( 1 p X ( x ) ) \text{I}_X(x) := -\log[p_X(x)] = \log \left( \frac{1}{p_X(x)}\right) IX(x):=log[pX(x)]=log(pX(x)1)

与对数发生率的关系

对数发生率(logit, log-odds)定义为 p ( x ) 1 − p ( x ) \frac{p(x)}{1-p(x)} 1p(x)p(x),可以表示为两个自信息的差值:

log-odds ( x ) = log ⁡ p ( x ) p ( ¬ x ) = log ⁡ p ( x ) − log ⁡ ( p ( ¬ x ) ) = − I ( x ) + I ( ¬ x ) = I ( ¬ x ) − I ( x ) \begin{aligned} \text{log-odds}(x) &= \log \frac{p(x)}{ p(¬x)} \\ &= \log p(x) - \log (p(¬x)) \\ &= -\text{I}(x) + \text{I}(¬x) \\ &= \text{I}(¬x) -\text{I}(x) \end{aligned} log-odds(x)=logp(¬x)p(x)=logp(x)log(p(¬x))=I(x)+I(¬x)=I(¬x)I(x)

独立事件的可加性

第3条时候如果分别测量两个独立事件,信息总量是两个事件的自信息之和。

考虑两个独立随机变量,分别具有概率质量函数 p X ( x ) p_X(x) pX(x) p Y ( y ) p_Y(y) pY(y) ,联合概率质量函数为:

p X , Y ( x , y ) = P ( X = x , Y = y ) = p X ( x ) p Y ( y ) p_{X,Y}(x,y) = P(X=x,Y=y)=p_X(x)p_Y(y) pX,Y(x,y)=P(X=x,Y=y)=pX(x)pY(y)

因为 X X X Y Y Y 是独立的, ( x , y ) (x,y) (x,y) 的自信息为

I X , Y ( x , y ) = − log ⁡ [ p X , Y ( x , y ) ] = − log ⁡ [ p X ( x ) p Y ( y ) ] = − log ⁡ p X ( x ) − log ⁡ p Y ( y ) = I X ( x ) + I Y ( y ) \begin{aligned} \text{I}_{X,Y}(x,y) &= -\log[p_{X,Y}(x,y)] \\ &= -\log [p_X(x) p_Y(y)] \\ &= -\log p_X(x) - \log p_Y(y) \\ &= \text{I}_X(x) + \text{I}_Y(y) \end{aligned} IX,Y(x,y)=log[pX,Y(x,y)]=log[pX(x)pY(y)]=logpX(x)logpY(y)=IX(x)+IY(y)

信息熵

信息论的核心思想是,所传达消息的“信息量”取决于消息内容的令人惊讶程度。如果发生极有可能的事件,则消息携带的信息非常少。另一方面,如果发生极不可能的事件,则消息提供的信息要多得多。这是上面介绍的自信息概念。

而信息熵(entropy,简称熵,又称信息熵、香农熵、平均自信息量)是接收的每条消息中包含的信息的平均量。这里的“消息”代表来自分布或数据流中的事件、样本或特征。熵量化了与变量的潜在状态或可能结果相关的不确定性或**(自)信息**的平均值(期望)。

离散型随机变量 X X X ,其值 x ∈ X x \in \mathcal X xX ,其熵定义如下:

H ( X ) = E [ I ( X ) ] = E [ − log ⁡ p ( X ) ] = − ∑ x ∈ X p ( x ) log ⁡ b p ( x ) H(X) = \Bbb E[\text{I}(X)] = \Bbb E[-\log p(X)] = -\sum_{x \in \mathcal X} p(x) \log_b p(x) H(X)=E[I(X)]=E[logp(X)]=xXp(x)logbp(x)

再来看联合熵和条件熵。

联合熵

对于两个离散随机变量 X X X Y Y Y,定义域分别为 X \mathcal X X Y \mathcal Y Y ,联合熵 H ( X , Y ) H(X, Y) H(X,Y) 表示 X X X Y Y Y 一起的不确定性,其定义为:

H ( X , Y ) = − ∑ x ∈ X ∑ y ∈ Y p ( x , y ) log ⁡ p ( x , y ) H(X, Y) = - \sum_{x \in \mathcal X} \sum_{y \in \mathcal Y} p(x, y) \log p(x, y) H(X,Y)=xXyYp(x,y)logp(x,y)

其中, p ( x , y ) p(x,y) p(x,y) X X X Y Y Y 同时取值为 x x x y y y 的联合概率。

条件熵

还可以定义两个随机变量的条件熵,条件熵描述了已知随机变量 X X X 的前提下, 随机变量 Y Y Y 的信息熵还有多少。基于 X X X 条件的 Y Y Y 的信息熵,用 H ( Y ∣ X ) H(Y|X) H(YX) 表示。

如果 H ( Y ∣ X = x ) H(Y|X=x) H(YX=x) 为变量 Y Y Y 在变量 X X X 取特定值 x x x 条件下的熵,那么 H ( Y ∣ X ) H(Y|X) H(YX) 就是 H ( Y ∣ X = x ) H(Y|X=x) H(YX=x) X X X 取遍所有可能的 x x x 后取平均的结果。

给定随机变量 X X X Y Y Y ,定义域分别为 X \mathcal X X Y \mathcal Y Y ,在给定 X X X 条件下 Y Y Y 的条件熵定义为:

H ( Y ∣ X ) = ∑ x ∈ X p ( x ) H ( Y ∣ X = x ) = − ∑ x ∈ X p ( x ) ∑ y ∈ Y p ( y ∣ x ) log ⁡ p ( y ∣ x ) = − ∑ x ∈ X ∑ y ∈ Y p ( x , y ) log ⁡ p ( y ∣ x ) = − ∑ x ∈ X , y ∈ Y p ( x , y ) log ⁡ p ( x , y ) p ( x ) \begin{aligned} H(Y|X) &= \sum_{x \in \mathcal X} p(x) H(Y|X=x) \\ &= - \sum_{x \in \mathcal X} p(x)\sum_{y \in \mathcal Y} p(y|x) \log p(y|x) \\ &= - \sum_{x \in \mathcal X} \sum_{y \in \mathcal Y} p(x,y) \log p(y|x) \\ &= - \sum_{x \in \mathcal X, y \in \mathcal Y}p(x,y) \log \frac{p(x,y)}{p(x)} \end{aligned} H(YX)=xXp(x)H(YX=x)=xXp(x)yYp(yx)logp(yx)=xXyYp(x,y)logp(yx)=xX,yYp(x,y)logp(x)p(x,y)

还可由上述条件熵的定义得出条件熵的链式法则

H ( Y ∣ X ) = − ∑ x ∈ X , y ∈ Y p ( x , y ) log ⁡ p ( x , y ) p ( x ) = − ∑ x ∈ X , y ∈ Y p ( x , y ) ( log ⁡ p ( x , y ) − log ⁡ p ( x ) ) = − ∑ x ∈ X , y ∈ Y p ( x , y ) log ⁡ p ( x , y ) + ∑ x ∈ X , y ∈ Y p ( x , y ) log ⁡ p ( x ) = H ( X , Y ) + ∑ x ∈ X , y ∈ Y p ( x , y ) log ⁡ p ( x ) = H ( X , Y ) + ∑ x ∈ X p ( x ) log ⁡ p ( x ) = H ( X , Y ) − H ( X ) \begin{aligned} H(Y|X) &= - \sum_{x \in \mathcal X, y \in \mathcal Y}p(x,y) \log \frac{p(x,y)}{p(x)} \\ &= - \sum_{x \in \mathcal X, y \in \mathcal Y}p(x,y)( \log p(x,y) - \log p(x)) \\ &=- \sum_{x \in \mathcal X, y \in \mathcal Y} p(x,y)\log p(x,y) + \sum_{x \in \mathcal X, y \in \mathcal Y} p(x,y) \log p(x) \\ &= H(X,Y) + \sum_{x \in \mathcal X, y \in \mathcal Y} p(x,y) \log p(x) \\ &= H(X,Y) + \sum_{x \in \mathcal X} p(x) \log p(x) \\ &= H(X,Y) - H(X) \end{aligned} H(YX)=xX,yYp(x,y)logp(x)p(x,y)=xX,yYp(x,y)(logp(x,y)logp(x))=xX,yYp(x,y)logp(x,y)+xX,yYp(x,y)logp(x)=H(X,Y)+xX,yYp(x,y)logp(x)=H(X,Y)+xXp(x)logp(x)=H(X,Y)H(X)

H ( Y ∣ X ) = H ( X , Y ) − H ( X ) H(Y|X) = H(X,Y) - H(X) H(YX)=H(X,Y)H(X)

假设两个随机变量 X X X Y Y Y 确定的组合系统的联合熵为 H ( X , Y ) H(X,Y) H(X,Y),即我们需要 H ( X , Y ) H(X,Y) H(X,Y) bit的信息来描述它的确切状态。 现在,若我们先学习 X X X 的值,我们得到了 H ( X ) H(X) H(X) bit的信息。 一旦知道了 X X X,我们只需 H ( X , Y ) − H ( X ) H(X,Y)−H(X) H(X,Y)H(X)bits来描述整个系统的状态。

交叉熵

分布 Q Q Q 相对于分布 P P P 在给定集合 X \mathcal X X 上的交叉熵 H ( P , Q ) H(P,Q) H(P,Q) 定义如下:

H ( P , Q ) = − E P ( log ⁡ Q ) = − ∑ x ∈ X P ( x ) log ⁡ Q ( x ) H(P,Q) = -\Bbb E_P(\log Q) = -\sum_{x \in \mathcal X} P(x) \log Q(x) H(P,Q)=EP(logQ)=xXP(x)logQ(x)

其中 P P P是真实分布, Q Q Q 是估计分布。

交叉熵衡量的是 在真实分布 P P P 下,使用估计分布 Q Q Q 描述所带来的平均信息量,直观上,它可以理解为如果用 Q Q Q 代替 P P P 来描述事件,会带来多大的偏差。

相对熵

相对熵又称为 KL散度(Kullback-Leibler divergence,简称KLD), 是两个概率分布 P P P Q Q Q 差别的非对称性的度量。KL散度是用来度量使用基于 Q Q Q 的分布来编码服从 P P P 的分布的样本所需的额外的平均比特数,通常 P P P 表示数据的真实分布, Q Q Q 表示它的近似分布。

真实分布 P P P 的平均信息量为:

H ( P ) = − ∑ x P ( x ) log ⁡ P ( x ) H(P) = -\sum_x P(x) \log P(x) H(P)=xP(x)logP(x)

假设我们并不知道真实分布 P P P ,而是用近似分布 Q Q Q 来描述事件的发生。此时每次观测事件 x x x 的信息量为 − log ⁡ Q ( x ) -\log Q(x) logQ(x) 。这种情况下,分布 P P P 的平均信息量变为:

− ∑ x P ( x ) log ⁡ Q ( x ) -\sum_x P(x) \log Q(x) xP(x)logQ(x)

表示在真实分布 P P P 下,使用近似分布 Q Q Q 计算的信息量。

现在,我们想知道由于使用 Q Q Q 而不是 P P P 所产生的额外信息量有多少?KL散度就是这个差异的量化,记为 D K L ( P ∣ ∣ Q ) D_{KL}(P||Q) DKL(P∣∣Q)

D K L ( P ∣ ∣ Q ) = 使用近似分布的期望信息量 − 真实分布期望信息量 D_{KL}(P||Q) = \text{使用近似分布的期望信息量} - \text{真实分布期望信息量} DKL(P∣∣Q)=使用近似分布的期望信息量真实分布期望信息量

代入可得:

D K L ( P ∣ ∣ Q ) = − ∑ x P ( x ) log ⁡ Q ( x ) + ∑ x P ( x ) log ⁡ P ( x ) + = ∑ x P ( x ) ( log ⁡ P ( x ) − log ⁡ Q ( x ) ) = ∑ x P ( x ) log ⁡ P ( x ) Q ( x ) \begin{aligned} D_{KL}(P||Q) &= -\sum_x P(x) \log Q(x) + \sum_x P(x) \log P(x) + \\ &= \sum_x P(x) \left( \log P(x) - \log Q(x) \right) \\ &= \sum_x P(x) \log \frac{P(x)}{Q(x)} \end{aligned} DKL(P∣∣Q)=xP(x)logQ(x)+xP(x)logP(x)+=xP(x)(logP(x)logQ(x))=xP(x)logQ(x)P(x)

这样我们就得到了KL散度的定义。其中 真实分布期望信息量 就是信息熵;近似分布的期望信息量就是交叉熵。

还可以写成:

D K L ( P ∣ ∣ Q ) = − ∑ x P ( x ) log ⁡ Q ( x ) P ( x ) D_{KL}(P||Q) = -\sum_x P(x) \log \frac{Q(x)}{P(x)} DKL(P∣∣Q)=xP(x)logP(x)Q(x)

注意KL散度不是一个度量或距离。因为KL散度不具有对称性:从分布PQ的距离通常并不等于从QP的距离:

D K L ( P ∣ ∣ Q ) ≠ D K L ( Q ∣ ∣ P ) D_{KL}(P||Q) \neq D_{KL}(Q||P) DKL(P∣∣Q)=DKL(Q∣∣P)

吉布斯不等式可知**,** D K L ( P ∣ ∣ Q ) ≥ 0 D_{KL}(P||Q) \geq 0 DKL(P∣∣Q)0 ,当且仅当 P = Q P=Q P=Q 时,取零。

互信息

互信息(mutual Information,MI)度量了两个变量之间相互依赖的程度。它通过观察一个随机变量来量化关于另一个随机变量的信息量。

X X X Y Y Y 为一对随机变量,其值在空间 X × Y \mathcal X \times \mathcal Y X×Y 上。联合分布为 P ( X , Y ) P(X,Y) P(X,Y)且边缘分布为 P X P_X PX P Y P_Y PY ,那么互信息定义为:

I ( X ; Y ) = D K L ( P ( X , Y ) ∣ ∣ P X ⊗ P Y ) I(X;Y) = D_{KL}(P(X,Y) || P_X \otimes P_Y) I(X;Y)=DKL(P(X,Y)∣∣PXPY)

根据KL散度的性质,当联合分布与边缘分布的乘积一致时,及当 X X X Y Y Y 是相互独立时,它恰好等于零。

互信息其实就是 X X X 的不确定性(熵 H ( X ) H(X) H(X)),以及在知道 Y Y Y 下的不确定性 (条件熵 H ( X ∣ Y ) H(X|Y) H(XY) )之间的差异:

I ( X ; Y ) = H ( X ) − H ( X ∣ Y ) I(X;Y) = H(X) - H(X|Y) I(X;Y)=H(X)H(XY)

直观地说,互信息衡量的是 X X X Y Y Y 共享 的信息:了解其中一个变量在多大程度上减少了对另一个变量的不确定性。 例如,如果 X X X Y Y Y 是独立的,那么知道 Y Y Y 不会给出任何关于 X X X 的信息,反之亦然,所以它们的互信息为零。

逻辑回归

odds指某个事件发生与不发生的概率比值。对于事件 A A A,假设其发生的概率为 p p p ,那么odds可以表示为:

odds ( A ) = p 1 − p \text{odds} (A) = \frac{p}{1-p} odds(A)=1pp

而log-odds就是odds的对数,通常取自然对数,即 ln ⁡ \ln ln

log-odds ( A ) = ln ⁡ ( p 1 − p ) \text{log-odds}(A) = \ln \left(\frac{p}{1-p} \right) log-odds(A)=ln(1pp)

逻辑(斯蒂)回归是用于二分类任务的统计模型,它试图预测某个事件发生的概率 p p p 。逻辑回归的目标是学习一个函数,将输入的特征映射到事件发生的概率 p p p

逻辑回归通过将事件对数发生率(log-odds即logit,又称为对数几率,对数赔率)建模为一个或多个自变量的线性组合。将对数发生率转换为概率的函数就是逻辑(斯蒂)函数。

由上文可知,定义 log-odds z z z 如下:

z = ln ⁡ ( p 1 − p ) z = \ln \left(\frac{p}{1-p} \right) z=ln(1pp)

然后对两边取指数:

e z = p 1 − p e^z = \frac{p}{1-p} ez=1pp

整理这个式子,得到:

p = e z 1 + e z p = \frac{e^z}{1+e^z} p=1+ezez

这个式子就是一个关于log-odds z z z 的逻辑函数(就是sigmoid函数),输入是log-odds,输出是一个取值为0到1之间的概率。标准的逻辑函数定义为:

σ ( z ) = e z e z + 1 = 1 1 + e − z \sigma(z) = \frac{e^z}{e^z +1 } = \frac{1}{1+e^{-z}} σ(z)=ez+1ez=1+ez1

我们可假设 z z z 是单个自变量 x x x 的线性函数,那么我们可以表达如下:

z = β 0 + β 1 x z = \beta_0 + \beta_1 x z=β0+β1x

通用的逻辑函数可以写成:

p ( x ) = σ ( z ) = 1 1 + e − ( β 0 + β 1 x ) p(x) = \sigma(z) = \frac{1}{1 + e^{-(\beta_0 + \beta_1 x)}} p(x)=σ(z)=1+e(β0+β1x)1

换句话说,逻辑回归的线性组合就是log-odds。注意这同样适用于多个自变量:

z = β 0 + β 1 x 1 + β 2 x 2 + ⋯ + β m x m = β 0 + ∑ i = 1 m β i x i z = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \cdots +\beta_m x_m = \beta_0 + \sum_{i=1}^m \beta_i x_i z=β0+β1x1+β2x2++βmxm=β0+i=1mβixi

现在考虑损失函数,逻辑回归模型是一个经典的分类模型。预测时我们的目标是让预测的标签和真实标签越接近越好。假设令 y = 1 y=1 y=1 表示标签为正,那么预测 x x x 为正的概率可以写成:

y ^ = p ( y = 1 ∣ x ) \hat y = p(y=1|x) y^=p(y=1∣x)

预测 x x x 为负 y = 0 y=0 y=0 的概率可以表示为 1 − y ^ 1-\hat y 1y^,即:

1 − y ^ = p ( y = 0 ∣ x ) 1 - \hat y = p(y=0|x) 1y^=p(y=0∣x)

上面两个式子可以统一写成:

p ( y ∣ x ) = y ^ y ⋅ ( 1 − y ^ ) 1 − y p(y|x) = \hat y^y \cdot (1-\hat y)^{1-y} p(yx)=y^y(1y^)1y

即对于正样本 y = 1 y=1 y=1,我们希望预测概率越大越好;对于负样本 y = 0 y=0 y=0 ,我们希望预测概率越小越好,这正是最大似然法的思想。若为上式加上对数,就得到对数最大似然:

log ⁡ p ( y ∣ x ) = log ⁡ ( y ^ y ⋅ ( 1 − y ^ ) 1 − y ) = y log ⁡ y ^ + ( 1 − y ) log ⁡ ( 1 − y ^ ) \log p(y|x) = \log(\hat y^y \cdot (1-\hat y)^{1-y}) =y\log \hat y + (1- y) \log (1-\hat y) logp(yx)=log(y^y(1y^)1y)=ylogy^+(1y)log(1y^)

最大似然希望越大越好,而一般损失越小越好,只要在上式添加一个负号就可以得到损失函数:

L o s s = − [ y log ⁡ y ^ + ( 1 − y ) log ⁡ ( 1 − y ^ ) ] \mathcal{Loss} = - \left[y\log \hat y + (1- y) \log (1-\hat y)\right] Loss=[ylogy^+(1y)log(1y^)]

这是单个样本的损失函数,如果考虑 m m m 个样本则有:

L o s s = − 1 m ∑ i = 1 m [ y ( i ) log ⁡ y ^ ( i ) + ( 1 − y ( i ) ) log ⁡ ( 1 − y ^ ( i ) ) ] \mathcal {Loss} = -\frac{1}{m}\sum_{i=1}^m \left[y^{(i)}\log \hat y^{(i)} + (1- y^{(i)}) \log (1-\hat y^{(i)})\right] Loss=m1i=1m[y(i)logy^(i)+(1y(i))log(1y^(i))]

NCE

NCE(Noise Contrastive Estimation, 噪声对比估计)由 论文 Noise-contrastive estimation: A new estimation principle for unnormalized statistical models 提出。

假设观察到一个随机向量 x ∈ R n \pmb x \in \R^n xRn 的数据,该数据遵循未知的概率密度函数(probability density funciton, pdf) p d ( ⋅ ) p_d(\cdot) pd() 。假设我们想通过一个模型来估计这个数据分布:

p d ( ⋅ ) ≈ p θ ( ⋅ ) p_d(\cdot) \approx p_\theta(\cdot) pd()pθ()

该模型的参数是 θ \theta θ 。通过神经网络建模我们可以直接预测给定输入的概率。

现在无论是数据密度函数还是模型密度函数(分布函数),该分布函数或密度函数必须满足的一个属性是积分为 1 1 1

∫ p θ ( u ) d u = 1 \int p_\theta(u)du = 1 pθ(u)du=1

该属性由归一化常数保证。这本质上定义了优化问题的一个约束。原则上可以通过重新定义pdf来始终满足该约束,如:

p θ ( ⋅ ) = p ^ θ ( ⋅ ) Z θ (1) p_\theta(\cdot) = \frac{\hat p_\theta(\cdot)}{Z_\theta} \tag 1 pθ()=Zθp^θ()(1)

其中 p ^ θ ( ⋅ ) \hat p_\theta(\cdot) p^θ() 指定了pdf的函数形式,不需要积分到 1 1 1 。然而归一化常数(配分函数) Z θ Z_\theta Zθ 的计算非常困难,积分很少能解析地求解,如果数据是高维的,数值积分也很困难。

在NLP中,给定一组单词(上下文)我们可能需要基于该上下文来预测下一个单词(目标词)。通常我们会把它转换为一个分类问题,即应用Softmax预测目标词在词表空间中的概率。

给定上下文 h h h,要预测目标词 w w w ,我们可以建模如下:

p θ ( w ∣ h ) = exp ⁡ ( s θ ( w , h ) ∑ w ′ ∈ V exp ⁡ s θ ( w ′ , h ) (2) \begin{aligned} p_\theta(w|h) = \frac{\exp(s_\theta(w,h)}{\sum_{w^\prime \in \mathcal V} \exp s_\theta(w^\prime, h)} \end{aligned} \tag 2 pθ(wh)=wVexpsθ(w,h)exp(sθ(w,h)(2)

这里 V \mathcal V V 表示词表。分母就是归一化常数,计算分母 Z θ = ∑ w ∈ V exp ⁡ s θ ( w , c ) Z_\theta = \sum_{w \in \mathcal V} \exp s_\theta (w,c) Zθ=wVexpsθ(w,c) 是一个麻烦的事情,因为词表通常是庞大的,这里不仅要对整个词表中所有的单词进行求和,每个单词还需要先经过一个包含指数的操作。同时还需要在分母上求导。

这正是NCE要解决的问题之一。NCE首先通过学习一个参数来估计 Z θ Z_\theta Zθ 。我们考虑对数的情况下,(1)式可以写成:

log ⁡ p θ ( ⋅ ) = log ⁡ p ^ θ ( ⋅ ) − log ⁡ Z θ = log ⁡ p ^ θ ( ⋅ ) + c (3) \log p_\theta(\cdot) = \log \hat p_\theta(\cdot) - \log Z_\theta = \log \hat p_\theta(\cdot ) +c \tag 3 logpθ()=logp^θ()logZθ=logp^θ()+c(3)

这里 c c c 是归一化常数 Z θ Z_\theta Zθ 的负对数估计。但NCE不是简单地通过一个可学习的额外参数来估计 Z θ Z_\theta Zθ ,因为这种方法对于最大似然估计 (MLE) 来说是不可行的。原因是通过使 Z θ Z_\theta Zθ 趋于零,似然可以任意地变大。

NCE它是通过最大化同一个目标函数来估计模型参数 θ \theta θ 和 归一化常数。

基本思想是通过学习参数区分数据分布样本 p d p_d pd 和噪声分布样本 p n p_n pn ,即判断一个数据是来自数据分布还是噪声分布,其依赖于与数据对比的噪声,因此这种方法称为“噪声对比估计”。

由于我们这里在比较两个分布,因此这可以视为二分类问题。二分类问题我们可以想到逻辑回归模型。

在工作A fast and simple algorithm for training neural probabilistic language models中将NCE带到了NLP中,并且作者发现将归一化常数固定为 1 1 1而不是学习它,并不会影响所得模型的性能。

我们从得分函数 Δ s θ ( w + , h ) \Delta s_\theta(w^+,h) Δsθ(w+,h)开始,该函数计算一个分数,量化了输入和其上下文的关系, w + w^+ w+ 表示来自数据分布; h h h 表示上下文。该分数可以看成是分类层的logits,我们可以对它应用sigmoid转换为概率 σ ( Δ s θ ( w + , h ) ) \sigma(\Delta s_\theta(w^+,h)) σ(Δsθ(w+,h)) 。通常我们感兴趣的是对数概率 log ⁡ σ ( Δ s θ ( w + , h ) ) \log \sigma(\Delta s_\theta(w^+,h)) logσ(Δsθ(w+,h)),若我们同时考虑 k k k 个 噪音样本 w − w^- w 我们可以得到下式:

log ⁡ σ ( Δ s θ ( w + , h ) ) + ∑ i = 1 k log ⁡ σ ( − Δ s θ ( w i − , h ) ) \log \sigma(\Delta s_\theta(w^+,h)) + \sum_{i=1}^k \log \sigma(-\Delta s_\theta(w^-_i,h)) logσ(Δsθ(w+,h))+i=1klogσ(Δsθ(wi,h))

可以看到这本质上是一个逻辑回归, 每个正样本(来自数据分布)有 k k k 个负样本(来自噪声分布)。

因此我们就得到了NCE要最大化的损失函数:

L NCE ( θ ) = log ⁡ σ ( Δ s θ ( w + , h ) ) + ∑ i = 1 k log ⁡ σ ( − Δ s θ ( w i − , h ) ) (4) \mathcal L_\text{NCE}(\theta) = \log \sigma(\Delta s_\theta(w^+,h)) + \sum_{i=1}^k \log \sigma(-\Delta s_\theta(w^-_i,h)) \tag 4 LNCE(θ)=logσ(Δsθ(w+,h))+i=1klogσ(Δsθ(wi,h))(4)

由于我们这里讨论的是逻辑回归,我们可以把得分函数看成是一个log-odds:

Δ s θ ( w + , h ) = log ⁡ p θ ( w + ∣ h ) k ⋅ p n ( w + ) Δ s θ ( w − , h ) = log ⁡ p θ ( w − ∣ h ) k ⋅ p n ( w − ) \Delta s_\theta(w^+,h) = \log \frac{p_\theta(w^+|h)}{k\cdot p_n(w^+)} \quad\quad \Delta s_\theta(w^-,h) = \log \frac{p_\theta(w^-|h)}{k\cdot p_n(w^-)} Δsθ(w+,h)=logkpn(w+)pθ(w+h)Δsθ(w,h)=logkpn(w)pθ(wh)

然后对它们应用sigmoid得到:

σ ( Δ s θ ( w + , h ) ) = 1 1 + e − Δ s θ ( w + , h ) = 1 1 + e − log ⁡ p θ ( w + ∣ h ) k ⋅ p n ( w + ) = 1 1 + e log ⁡ k ⋅ p n ( w + ) p θ ( w + ∣ h ) = 1 1 + k ⋅ p n ( w + ) p θ ( w + ∣ h ) = p θ ( w + ∣ h ) p θ ( w + ∣ h ) + k ⋅ p n ( w + ) (5) \begin{aligned} \sigma (\Delta s_\theta(w^+,h)) &= \frac{1}{1+e^{-\Delta s_\theta(w^+, h)}} \\ &= \frac{1}{1+e^{-\log \frac{p_\theta(w^+|h)}{k\cdot p_n(w^+)}}} \\ &= \frac{1}{1+e^{\log \frac{k\cdot p_n(w^+)}{ p_\theta(w^+|h)}}} \\ &= \frac{1}{1 +\frac{k\cdot p_n(w^+)}{ p_\theta(w^+|h)} } \\ &= \frac{p_\theta(w^+|h)}{p_\theta(w^+|h) + k\cdot p_n(w^+)} \end{aligned} \tag 5 σ(Δsθ(w+,h))=1+eΔsθ(w+,h)1=1+elogkpn(w+)pθ(w+h)1=1+elogpθ(w+h)kpn(w+)1=1+pθ(w+h)kpn(w+)1=pθ(w+h)+kpn(w+)pθ(w+h)(5)

最终得到这样一个简化形式。

同理,对于 Δ s θ ( w − , h ) \Delta s_\theta(w^-,h) Δsθ(w,h) 我们也能得到这样的简化形式:

σ ( Δ s θ ( w − , h ) ) = k ⋅ p n ( w − ) p θ ( w − ∣ h ) + k ⋅ p n ( w − ) \sigma(\Delta s_\theta(w^-,h))= \frac{k\cdot p_n(w^-)}{p_\theta(w^-|h) + k\cdot p_n(w^-)} σ(Δsθ(w,h))=pθ(wh)+kpn(w)kpn(w)

这样我们可以重写(4)中的损失函数:

L NCE ( θ ) = log ⁡ ( p θ ( w + ∣ h ) p θ ( w + ∣ h ) + k ⋅ p n ( w + ) ) + ∑ i = 1 k log ⁡ ( k ⋅ p n ( w i − ) p θ ( w i − ∣ h ) + k ⋅ p n ( w i − ) ) (6) \mathcal L_\text{NCE}(\theta) = \log \left(\frac{p_\theta(w^+|h)}{p_\theta(w^+|h) + k\cdot p_n(w^+)}\right) + \sum_{i=1}^k \log \left(\frac{k\cdot p_n(w^-_i)}{p_\theta(w^-_i|h) + k\cdot p_n(w^-_i)}\right) \tag 6 LNCE(θ)=log(pθ(w+h)+kpn(w+)pθ(w+h))+i=1klog(pθ(wih)+kpn(wi)kpn(wi))(6)

但是由于归一化常数的存在, p θ p_\theta pθ 的计算仍然很困难,但考虑到引用3中把归一化常数设为 1 1 1 的做法,我们只需要计算(2)式的分子。

下面我们从数学角度来证明它确实有用。我们针对上式计算微分,考虑

∂ L NCE ( θ ) ∂ θ = ∂ ∂ θ log ⁡ ( p θ ( w + ∣ h ) p θ ( w + ∣ h ) + k ⋅ p n ( w + ) ) + ∂ ∂ θ ∑ i = 1 k log ⁡ ( k ⋅ p n ( w i − ) p θ ( w i − ∣ h ) + k ⋅ p n ( w i − ) ) = ∂ ∂ θ [ log ⁡ p θ ( w + ∣ h ) − log ⁡ ( p θ ( w + ∣ h ) + k ⋅ p n ( w + ) ) ] + ∂ ∂ θ ∑ i = 1 k [ log ⁡ k p n ( w i − ) − log ⁡ ( p θ ( w i − ∣ h ) + k ⋅ p n ( w i − ) ) ] = ∂ ∂ θ [ log ⁡ p θ ( w + ∣ h ) − log ⁡ ( p θ ( w + ∣ h ) + k ⋅ p n ( w + ) ) ] + ∑ i = 1 k ∂ ∂ θ [ log ⁡ k p n ( w i − ) − log ⁡ ( p θ ( w i − ∣ h ) + k ⋅ p n ( w i − ) ) ] \begin{aligned} \frac{\partial \mathcal L_\text{NCE}(\theta)}{\partial \theta} &= \frac{\partial}{\partial \theta}\log \left(\frac{p_\theta(w^+|h)}{p_\theta(w^+|h) + k\cdot p_n(w^+)}\right) \\&+\frac{\partial}{\partial \theta} \sum_{i=1}^k \log \left(\frac{k\cdot p_n(w^-_i)}{p_\theta(w^-_i|h) + k\cdot p_n(w^-_i)}\right) \\ &= \frac{\partial}{\partial \theta} \left[ \log p_\theta(w^+|h) - \log \left( p_\theta(w^+|h) + k\cdot p_n(w^+)\right) \right] \\ &+ \frac{\partial}{\partial \theta} \sum_{i=1}^k \left[ \log kp_n(w_i^-) - \log \left( p_\theta(w_i^-|h) + k\cdot p_n(w_i^-) \right)\right] \\ &= \frac{\partial}{\partial \theta} \left[ \log p_\theta(w^+|h) - \log \left( p_\theta(w^+|h) + k\cdot p_n(w^+)\right) \right] \\ &+ \sum_{i=1}^k\frac{\partial}{\partial \theta} \left[ \log kp_n(w_i^-) - \log \left( p_\theta(w_i^-|h) + k\cdot p_n(w_i^-) \right)\right] \end{aligned} θLNCE(θ)=θlog(pθ(w+h)+kpn(w+)pθ(w+h))+θi=1klog(pθ(wih)+kpn(wi)kpn(wi))=θ[logpθ(w+h)log(pθ(w+h)+kpn(w+))]+θi=1k[logkpn(wi)log(pθ(wih)+kpn(wi))]=θ[logpθ(w+h)log(pθ(w+h)+kpn(w+))]+i=1kθ[logkpn(wi)log(pθ(wih)+kpn(wi))]

整个式子太长了 ,我们分别对上面两项进行求导。

item1 = ∂ ∂ θ log ⁡ p θ ( w + ∣ h ) − ∂ ∂ θ log ⁡ ( p θ ( w + ∣ h ) + k ⋅ p n ( w + ) ) = ∂ ∂ θ log ⁡ p θ ( w + ∣ h ) − 1 p θ ( w + ∣ h ) + k ⋅ p n ( w + ) ∂ ∂ θ ( p θ ( w + ∣ h ) + k ⋅ p n ( w + ) ) = ∂ ∂ θ log ⁡ p θ ( w + ∣ h ) − 1 p θ ( w + ∣ h ) + k ⋅ p n ( w + ) ∂ ∂ θ p θ ( w + ∣ h ) = ∂ ∂ θ log ⁡ p θ ( w + ∣ h ) − p θ ( w + ∣ h ) p θ ( w + ∣ h ) + k ⋅ p n ( w + ) ∂ ∂ θ log ⁡ p θ ( w + ∣ h ) = ( k ⋅ p n ( w + ) p θ ( w + ∣ h ) + k ⋅ p n ( w + ) ) ∂ ∂ θ log ⁡ p θ ( w + ∣ h ) \begin{aligned} \text{item1} &= \frac{\partial}{\partial \theta} \log p_\theta(w^+|h) - \frac{\partial}{\partial \theta}\log \left( p_\theta(w^+|h) + k\cdot p_n(w^+)\right) \\ &= \frac{\partial}{\partial \theta} \log p_\theta(w^+|h) - \frac{1}{p_\theta(w^+|h) + k\cdot p_n(w^+)} \frac{\partial}{\partial \theta} \left( p_\theta(w^+|h) + k\cdot p_n(w^+) \right) \\ &= \frac{\partial}{\partial \theta} \log p_\theta(w^+|h) - \frac{1}{p_\theta(w^+|h) + k\cdot p_n(w^+)} \frac{\partial}{\partial \theta} p_\theta(w^+|h) \\ &= \frac{\partial}{\partial \theta} \log p_\theta(w^+|h) - \frac{p_\theta(w^+|h)}{p_\theta(w^+|h) + k\cdot p_n(w^+)} \frac{\partial}{\partial \theta} \log p_\theta(w^+|h) \\ &= \left( \frac{k\cdot p_n(w^+)}{p_\theta(w^+|h) + k\cdot p_n(w^+)} \right)\frac{\partial}{\partial \theta} \log p_\theta(w^+|h) \end{aligned} item1=θlogpθ(w+h)θlog(pθ(w+h)+kpn(w+))=θlogpθ(w+h)pθ(w+h)+kpn(w+)1θ(pθ(w+h)+kpn(w+))=θlogpθ(w+h)pθ(w+h)+kpn(w+)1θpθ(w+h)=θlogpθ(w+h)pθ(w+h)+kpn(w+)pθ(w+h)θlogpθ(w+h)=(pθ(w+h)+kpn(w+)kpn(w+))θlogpθ(w+h)

这里 p n ( w + ) p_n(w^+) pn(w+) θ \theta θ 无关,对其偏导为零,因此可以移除。

item2 = ∂ ∂ θ [ log ⁡ k p n ( w i − ) − log ⁡ ( p θ ( w i − ∣ h ) + k ⋅ p n ( w i − ) ) ] = − p θ ( w i − ∣ h ) p θ ( w i − ∣ h ) + k ⋅ p n ( w i − ) ∂ ∂ θ log ⁡ p θ ( w i − ∣ h ) \begin{aligned} \text{item2} &= \frac{\partial}{\partial \theta} \left[ \log kp_n(w_i^-) - \log \left( p_\theta(w_i^-|h) + k\cdot p_n(w_i^-) \right)\right] \\ &= - \frac{p_\theta(w^-_i|h)}{p_\theta(w^-_i|h) + k\cdot p_n(w^-_i)} \frac{\partial}{\partial \theta} \log p_\theta(w^-_i|h) \end{aligned} item2=θ[logkpn(wi)log(pθ(wih)+kpn(wi))]=pθ(wih)+kpn(wi)pθ(wih)θlogpθ(wih)

我们现在可以得到整个式子的最终表达式:

∂ L NCE ( θ ) ∂ θ = k ⋅ p n ( w + ) p θ ( w + ∣ h ) + k ⋅ p n ( w + ) ∂ ∂ θ log ⁡ p θ ( w + ∣ h ) − ∑ i = 1 k p θ ( w i − ∣ h ) p θ ( w i − ∣ h ) + k ⋅ p n ( w i − ) ∂ ∂ θ log ⁡ p θ ( w i − ∣ h ) \frac{\partial \mathcal L_\text{NCE}(\theta)}{\partial \theta} = \frac{k\cdot p_n(w^+)}{p_\theta(w^+|h) + k\cdot p_n(w^+)} \frac{\partial}{\partial \theta} \log p_\theta(w^+|h) - \sum_{i=1}^k \frac{p_\theta(w^-_i|h)}{p_\theta(w^-_i|h) + k\cdot p_n(w^-_i)} \frac{\partial}{\partial \theta} \log p_\theta(w^-_i|h) θLNCE(θ)=pθ(w+h)+kpn(w+)kpn(w+)θlogpθ(w+h)i=1kpθ(wih)+kpn(wi)pθ(wih)θlogpθ(wih)

k k k 趋于无穷大时:

lim ⁡ k → ∞ ∂ L NCE ( θ ) ∂ θ = lim ⁡ k → ∞ [ k ⋅ p n ( w + ) p θ ( w + ∣ h ) + k ⋅ p n ( w + ) ∂ ∂ θ log ⁡ p θ ( w + ∣ h ) − ∑ i = 1 k p θ ( w i − ∣ h ) p θ ( w i − ∣ h ) + k ⋅ p n ( w i − ) ∂ ∂ θ log ⁡ p θ ( w i − ∣ h ) ] = ∂ ∂ θ log ⁡ p θ ( w + ∣ h ) (7) \begin{aligned} \lim_{k \rightarrow \infty}\frac{\partial \mathcal L_\text{NCE}(\theta)}{\partial \theta} &= \lim_{k \rightarrow \infty} \left[\frac{k\cdot p_n(w^+)}{p_\theta(w^+|h) + k\cdot p_n(w^+)} \frac{\partial}{\partial \theta} \log p_\theta(w^+|h) - \sum_{i=1}^k \frac{p_\theta(w^-_i|h)}{p_\theta(w^-_i|h) + k\cdot p_n(w^-_i)} \frac{\partial}{\partial \theta} \log p_\theta(w^-_i|h) \right] \\ &= \frac{\partial}{\partial \theta} \log p_\theta(w^+|h) \end{aligned} \tag 7 klimθLNCE(θ)=klim[pθ(w+h)+kpn(w+)kpn(w+)θlogpθ(w+h)i=1kpθ(wih)+kpn(wi)pθ(wih)θlogpθ(wih)]=θlogpθ(w+h)(7)

这个梯度和对数似然的梯度相同,证明了这个目标函数是有效的。

回顾下对数似然梯度。

对于给定的语言模型参数 θ \theta θ,预测句子 s = { w 1 , w 2 , … , w n } s = \{w_1, w_2, \ldots, w_n\} s={w1,w2,,wn}的出现概率,即建模 p θ ( w 1 , w 2 , … , w n ) p_\theta(w_1, w_2, \ldots, w_n) pθ(w1,w2,,wn)

基于链式法则可以表示为每个单词出现的条件概率的乘积,将每个单词 w i w_i wi 的上下文 ( w 1 , w 2 , … , w i − 1 ) (w_1,w_2,\ldots,w_{i-1}) (w1,w2,,wi1) c i c_i ci 表示。那么可以写成

p θ ( w 1 , w 2 , … , w n ) = p θ ( w 1 )   p θ ( w 2 ∣ w 1 ) p θ ( w 3 ∣ w 1 , w 2 ) … p ( w n ∣ w 1 , … , w n − 1 ) = ∏ i = 1 n p θ ( w i ∣ w 1 , w 2 , … , w i − 1 ) = ∏ i = 1 n p θ ( w i ∣ c i ) \begin{aligned} p_\theta(w_1,w_2,\ldots,w_n) &= p_\theta(w_1)\ p_\theta(w_2|w_1)p_\theta(w_3|w_1,w_2)\ldots p(w_n|w_1,\ldots,w_{n-1}) \\ &=\prod_{i=1}^n p_\theta (w_i|w_1,w_2,\ldots,w_{i-1}) \\ &= \prod_{i=1}^n p_\theta (w_i|c_i) \end{aligned} pθ(w1,w2,,wn)=pθ(w1) pθ(w2w1)pθ(w3w1,w2)p(wnw1,,wn1)=i=1npθ(wiw1,w2,,wi1)=i=1npθ(wici)

n n n 很大时,通常还要引入马尔科夫假设。我们为上式添加对数,并且期望这个句子概率最大化,就是对数最大似然估计,可以写出对数似然函数为:

L M L E = ∑ i log ⁡ p θ ( w i ∣ c i ) \mathcal L _{MLE} = \sum_i \log p_\theta (w_i|c_i) LMLE=ilogpθ(wici)

θ \theta θ 求导得到

∑ i ∂ ∂ θ log ⁡ p θ ( w i ∣ c i ) (8) \sum_i \frac{\partial}{\partial \theta} \log p_\theta (w_i|c_i) \tag 8 iθlogpθ(wici)(8)

考虑单个单词,(7)和(8)其实是一样的。所以说NCE本质上是极大似然估计的一种近似,NCE损失是可以工作的。

参考

  1. 维基百科
  2. Noise-contrastive estimation: A new estimation principle for unnormalized statistical models
  3. A fast and simple algorithm for training neural probabilistic language models
  4. Noise-Contrastive Estimation - CLEARLY EXPLAINED!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2267649.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器人C++开源库The Robotics Library (RL)使用手册(一)

强大的、完整的C机器人开源库 1、是否可以免费商用?2、支持什么平台?3、下载地址4、开始! 1、是否可以免费商用? Robotics Library(RL)是一个独立的C库,用于机器人运动学、运动规划和控制。它涵…

超快速的路径优化IKD-SWOpt:SHIFT Planner 中增量 KD 树滑动窗口优化算法详解

IKD-SWOpt:SHIFT Planner 中增量 KD 树滑动窗口优化算法详解 今天本博主王婆卖瓜自卖自夸😄,介绍自己paper中的算法,本算法已经持续开源中(部分关键内容)Github,之前很多读者朋友一直说要详细讲讲路径优化算法&#x…

meshy的文本到3d的使用

Meshy官方网站: 中文官网: Meshy官网中文站 ​编辑 Opens in a new window ​编辑www.meshycn.com Meshy AI 中文官网首页 英文官网: Meshy目前似乎还没有单独的英文官网,但您可以在中文官网上找到英文界面或相关英文资料。 链…

浅谈某平台多场景下反爬虫与风控业务

文章目录 1. 写在前面2. 内容反爬3. 账号风控3. 接口验签 【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致…

UI页面布局分析(4)- 贵族 特权分页列表

引言 在现在移动应用中,展示用户特权的UI设计不仅是吸引用户的关键手段,更是提升产品体验的重要部分。特别是在直播场景中,贵族特权作为一种高价值用户身份的象征,通常需要通过精致的页面和流程的交互来突出其重要性和独特性。 …

计算机网络实验室建设方案

一、计算机网络实验室拓扑结构 计算机网络综合实验室解决方案,是面向高校网络相关专业开展教学实训的综合实训基地解决方案。教学实训系统采用 B/S架构,通过公有云教学实训平台在线学习模式,轻松实现网络系统建设与运维技术的教学…

D类音频应用EMI管理

1、前言 对于EMI,首先需要理解天线。频率和波长之间的关系,如下图所示。   作为有效天线所需的最短长度是λ/4。在空气中,介电常数是1,但是在FR4或玻璃环氧PCB的情况下,介电常数大约4.8。这种效应会导致信号在FR4材…

若依框架之简历pdf文档预览功能

一、前端 (1)安装插件vue-pdf:npm install vue-pdf (2)引入方式:import pdf from "vue-pdf"; (3)components注入方式:components:{pdf} (4&…

lua-debug for Sublime

目标 Sublime 也支持 lua-debug,操作体验与 VSCode 一致。 优势 执行效率高,不掉帧 可随时开启 配置简单,一份配置兼容 VSCode 和 Sublime 安装 要求 Sublime 4 的版本(注:从 Sublime 3 升到 4 的不算,…

手机h5加桌面图标

手机h5应用1&#xff0c;网址浏览器添加到桌面&#xff0c;修改图标 关键代码 <!-- 手机h5加桌面图标 --> <!-- 安卓平台 chrome --> <link relapple-touch-icon-precomposed href<% BASE_URL %>logonew.png> <meta name"mobile-web-app-capab…

开发场景中Java 集合的最佳选择

在 Java 开发中&#xff0c;集合类是处理数据的核心工具。合理选择集合&#xff0c;不仅可以提高代码效率&#xff0c;还能让代码更简洁。本篇文章将重点探讨 List、Set 和 Map 的适用场景及优缺点&#xff0c;帮助你在实际开发中找到最佳解决方案。 一、List&#xff1a;有序存…

acitvemq AMQP:因为消息映射策略配置导致的MQTT接收JMS消息乱码问题 x-opt-jms-dest x-opt-jms-msg-type

使用ActiveMQ&#xff08;5.14.5&#xff09;作消息系统服务的场景下&#xff0c; 当我用Apache Qpid Proton发送消息(使用AMQP协议)发送JMS消息&#xff0c;用Paho MQTT接收消息的时候&#xff0c; 收到的消息前面总是有一串乱码&#xff0c;大概就是这样&#xff1a; 4Sp?AS…

apisix的hmac-auth认证

目录 1、apisix的hmac认证Authorization头信息 2、signature的lua生成源码 3、java生成签证的简单示例 4、postman调用如下 apisix的hmac-auth认证&#xff0c;介绍可以看官方文档 hmac-auth | Apache APISIX -- Cloud-Native API Gateway 照着官方文档&#xff0c;发现生…

Webpack在Vue CLI中的应用

webpack 作为目前最流行的项目打包工具&#xff0c;被广泛使用于项目的构建和开发过程中&#xff0c;其实说它是打包工具有点大材小用了&#xff0c;我个人认为它是一个集前端自动化、模块化、组件化于一体的可拓展系统&#xff0c;你可以根据自己的需要来进行一系列的配置和安…

uniapp 前端解决精度丢失的问题 (后端返回分布式id)

原因&#xff1a; 后端使用分布式id, id为19位数&#xff0c;导致精度丢失 &#xff0c;前端解决方法 这个是通过浏览器请求回来的数据&#xff0c;这个时候id 数据已经丢失了&#xff0c;在数据库查询不到&#xff0c;在调获详情接口的时候会有问题 实际的&#xff1a; 解决…

外网访问 Docker 容器的可视化管理工具 DockerUI

DockerUI 是一个 docker 容器镜像的可视化图形化管理工具&#xff0c;DockerUI 可以用来轻松构建、管理和维护 docker 环境。让用户维护起来更方便。 本文就介绍如何安装使用 DockerUI 并结合路由侠内网穿透来访问 DockerUI。 第一步&#xff0c;安装 DockerUI 1&#xff0c;…

Docker安装和使用RabbitMQ

Docker安装和使用RabbitMQ 1、拉取镜像2、运行Docker容器3、控制台界面 1、拉取镜像 docker pull rabbitmq:3-management2、运行Docker容器 docker run \-e RABBITMQ_DEFAULT_USERjagochan \-e RABBITMQ_DEFAULT_PASSjagochan \--name mq \--hostname mq \-p 15672:15672 \-p…

STM32F103RCT6学习之五:ADC

1.ADC基础 ADC&#xff08;Analog-Digital Converter&#xff09;模拟-数字转换器ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量&#xff0c;建立模拟电路到数字电路的桥梁12位逐次逼近型ADC&#xff0c;1us转换时间 输入电压范围&#xff1a;0~3.3V&#xff…

Python学习(2):注释、数字、文本、列表

1 关于注释 Python 使用井号#作为单行注释的符号&#xff0c; 使用三个连续的单引号’’或者三个连续的双引号"""注释多行内容。 2 数字 2.1 基本运算 解释器像一个简单的计算器&#xff1a;你可以输入一个表达式&#xff0c;它将给出结果值。 表达式语法很直观…

【Maven_bugs】The project main artifact does not exist

背景&#xff1a;我想使用 maven-shade-plugin 打一个 fat jar 时报了标题中的错误&#xff0c;使用的命令是&#xff1a;org.apache.maven.plugins:maven-shade-plugin:shade -pl :shade-project。项目结构如下图&#xff0c;我想把子模块 shade-project 打成一个 fat jar&…