超大规模分类(一):噪声对比估计(Noise Contrastive Estimation, NCE)

NCE损失对应的论文为《A fast and simple algorithm for training neural probabilistic language models》,发表于2012年的ICML会议。

背景

在2012年,语言模型一般采用n-gram的方法,统计单词/上下文间的共现关系,比神经概率语言模型(neural probabilistic language models, NPLMs)效果好。
现在主流的语言模型都是神经概率语言模 型,核心思想是已知上下文 h h h,预测下一个词为 w w w的概率,通过一定的解码方法(例如greedy search、beam search等),对概率做解码,得到下一个词。Greedy search可以理解为选择概率最大的那个词。
2012年神经概率语言模型效果不好的原因是难训练。一方面自然是硬件的制约,那一年英伟达刚发布GTX680,和现在的A100、H100完全没法比。当时老黄不给力,学术界也没办法;另一方面是算法效率不行,难以进行大规模的分类学习,将”已知上下文 h h h,预测下一个词为 w i w_i wi的概率“建模成分类学习任务,目的在于把下一个词分类到词表中的某个词上。
举个例子,已知上下文是“我想去”,需要预测下一个词。词表中有4个词,即['北京','上海','天津','广州'],需要把下一个词归类到词表的4个词里。如果词表有10万个词呢?训不动啊~
这就是当时面临的困境。NCE对分类算法做了优化,使得对大词表做分类任务成为可能。

原理

通俗的背景讲完了,接下来谈谈公式化的原理部分。

问题建模

已知上下文 h h h,预测下一次词为 w w w的概率为:
P θ h ( w ) = e x p ( s θ ( w , h ) ) ∑ w i e x p ( s θ ( w i , h ) ) (1) P_{\theta}^h(w)=\frac{exp(s_{\theta}(w,h))}{\sum_{w_i}{exp(s_{\theta}(w_i,h))}}\tag{1} Pθh(w)=wiexp(sθ(wi,h))exp(sθ(w,h))(1)
其中, s θ ( w , h ) s_{\theta}(w,h) sθ(w,h)表示已知上下文 h h h,下一个词为 w w w的预测得分; ∑ w i \sum_{w_i} wi表示词表内的所有词。
一般情况下, s θ ( w , h ) s_{\theta}(w,h) sθ(w,h)通过对上下文 h h h表征以及词类别 w w w表征添加多个全连接层计算得到。最简单的策略,仅对上下文 h h h表征 f h f_h fh用一个全连接层 W W W做一次映射,再和词类别 w w w表征 f w i f_{w_i} fwi做点积即可。
s θ ( w , h ) = ( f h W ) ⋅ f w s_{\theta}(w,h)=(f_h W) \cdot f_{w} sθ(w,h)=(fhW)fw

难度分析

对公式(1)进行分析,
分子部分 e x p ( s θ ( w , h ) ) exp(s_{\theta}(w,h)) exp(sθ(w,h))是好算的,针对单个 w w w,只需要计算一次。
分母部分KaTeX parse error: \tag works only in display equations不好算,针对单个 w w w,需要计算 e x p ( s θ ( w 1 , h ) ) , e x p ( s θ ( w 2 , h ) ) , . . . e x p ( s θ ( w n , h ) ) exp(s_{\theta}(w_1,h)), exp(s_{\theta}(w_2,h)), ...exp(s_{\theta}(w_n,h)) exp(sθ(w1,h)),exp(sθ(w2,h)),...exp(sθ(wn,h)),如果词表中词很多,计算量不小。

目前学术界、工业界对超大规模分类的优化基本上都聚焦在如何优化分母上,例如InfoNCE仅关注batch内的负类样本、KNN softmax对类别聚类,减少类别数目、partial FC对类别做采样以及显存均分来较少计算量、Inf-CL借助FlashAttention的思想,以空间换时间。

优化策略

既然对词表内n个词的大规模分类任务难做,难办,那就掀桌子不办了!!!
![[难办 1.jpg]]

将原多分类任务转换成一个更容易实现的任务——新二分类任务。
除了有正常的真实数据之外,从一个噪声分布里采样噪声数据,对真实数据和噪声数据做二分类,可以证明:随着噪声数据越多,转换后任务的优化目标和转换前任务越接近

新二分类任务

给定上下文 h h h后,现在有两个数据分布,一个是真实数据分布 P d h ( w ) P_d^h(w) Pdh(w)(实际应该写成 P d ( w ∣ h ) P_d(w|h) Pd(wh),简化形式写成 P d h ( w ) P_d^h(w) Pdh(w)),另一个是噪声数据分布 P n ( w ) P_n(w) Pn(w),真实数据和噪声数据的比例是1:k。所以,训练数据的完整分布是 P h ( w ) = 1 k + 1 P d h ( w ) + k k + 1 P n ( w ) P^h(w)=\frac{1}{k+1}P_d^h(w)+\frac{k}{k+1}P_n(w) Ph(w)=k+11Pdh(w)+k+1kPn(w),训练任务是 D = 1 D=1 D=1(分辨真实数据)和 D = 0 D=0 D=0(分辨噪声数据)。
我们希望优化神经网络参数 θ \theta θ,来拟合真实数据分布 P d h ( w ) = P θ h ( w ) P_d^h(w)=P^h_{\theta}(w) Pdh(w)=Pθh(w),后者就是我们学到的数据分布 P θ h ( w ) P^h_{\theta}(w) Pθh(w),于是,训练数据的完整分布写成 P h ( w , θ ) = 1 k + 1 P θ h ( w ) + k k + 1 P n ( w ) P^h(w,\theta)=\frac{1}{k+1}P^h_{\theta}(w)+\frac{k}{k+1}P_n(w) Ph(w,θ)=k+11Pθh(w)+k+1kPn(w)

训练目标一般是最大化后验概率 P h ( D ∣ w , θ ) P^h(D|w,\theta) Ph(Dw,θ)的对数似然期望 E [ l o g ( P h ( D ∣ w , θ ) ) ] E \left[log(P^h(D|w,\theta))\right] E[log(Ph(Dw,θ))],需要计算后验概率 P h ( D ∣ w , θ ) P^h(D|w,\theta) Ph(Dw,θ)
P h ( D ∣ w , θ ) = P h ( D = 1 ∣ w , θ ) + P h ( D = 0 ∣ w , θ ) (2) P^h(D|w,\theta)=P^h(D=1|w,\theta)+P^h(D=0|w,\theta)\tag{2} Ph(Dw,θ)=Ph(D=1∣w,θ)+Ph(D=0∣w,θ)(2)
真实数据分布的后验概率为:
P h ( D = 1 ∣ w , θ ) = P h ( w , θ ∣ D = 1 ) P h ( w , θ ) P h ( D = 1 ) = P θ h ( w ) 1 k + 1 P θ h ( w ) + k k + 1 P n ( w ) 1 k + 1 = P θ h ( w ) P θ h ( w ) + k P n ( w ) (3) \begin{equation}\begin{aligned} P^h(D=1|w,\theta) &= \frac{P^h(w,\theta|D=1)}{P^h(w,\theta)}P^h(D=1) \\ &=\frac{P_{\theta}^h(w)}{\frac{1}{k+1}P^h_{\theta}(w)+\frac{k}{k+1}P_n(w)}\frac{1}{k+1} \\ &=\frac{P_{\theta}^h(w)}{P_{\theta}^h(w)+kP_n(w)} \end{aligned} \end{equation} \tag{3} Ph(D=1∣w,θ)=Ph(w,θ)Ph(w,θD=1)Ph(D=1)=k+11Pθh(w)+k+1kPn(w)Pθh(w)k+11=Pθh(w)+kPn(w)Pθh(w)(3)
我们来看看等式为什么成立

  • 边缘概率 P h ( w , θ ) = 1 k + 1 P θ h ( w ) + k k + 1 P n ( w ) P^h(w,\theta)=\frac{1}{k+1}P^h_{\theta}(w)+\frac{k}{k+1}P_n(w) Ph(w,θ)=k+11Pθh(w)+k+1kPn(w)
  • 先验概率 P h ( D = 1 ) = 1 k + 1 P^h(D=1)=\frac{1}{k+1} Ph(D=1)=k+11,原因是真实数据和噪声数据的比例是1:k
  • 似然函数 P h ( w , θ ∣ D = 1 ) = P θ h ( w ) P^h(w,\theta|D=1)=P^h_{\theta}(w) Ph(w,θD=1)=Pθh(w),表明在真实数据分布下,从词表里预测下一个词为 w w w的概率是 P θ h ( w ) P^h_{\theta}(w) Pθh(w),这就是我们想拟合的函数。

类似的,噪声数据分布的后验概率为:
P h ( D = 0 ∣ w , θ ) = P h ( w , θ ∣ D = 0 ) P h ( w , θ ) P h ( D = 0 ) = P n ( w ) 1 k + 1 P θ h ( w ) + k k + 1 P n ( w ) k k + 1 = k P n ( w ) P θ h ( w ) + k P n ( w ) (4) \begin{equation}\begin{aligned} P^h(D=0|w,\theta) &= \frac{P^h(w,\theta|D=0)}{P^h(w,\theta)}P^h(D=0) \\ &=\frac{P_n(w)}{\frac{1}{k+1}P^h_{\theta}(w)+\frac{k}{k+1}P_n(w)}\frac{k}{k+1} \\ &=\frac{kP_n(w)}{P_{\theta}^h(w)+kP_n(w)} \end{aligned} \end{equation} \tag{4} Ph(D=0∣w,θ)=Ph(w,θ)Ph(w,θD=0)Ph(D=0)=k+11Pθh(w)+k+1kPn(w)Pn(w)k+1k=Pθh(w)+kPn(w)kPn(w)(4)

后验概率 P h ( D ∣ w i , θ ) P^h(D|w_i,\theta) Ph(Dwi,θ)的对数似然的期望 E [ l o g ( P h ( D ∣ w i , θ ) ) ] E \left[log(P^h(D|w_i,\theta))\right] E[log(Ph(Dwi,θ))]
J h ( θ ) = E [ l o g ( P h ( D ∣ w , θ ) ) ] = E P d h [ l o g P h ( D = 1 ∣ w , θ ) ] + E P n [ l o g P h ( D = 0 ∣ w , θ ) ] = E P d h [ l o g P θ h ( w ) P θ h ( w ) + k P n ( w ) ] + E P n [ l o g k P n ( w ) P θ h ( w ) + k P n ( w ) ] (5) \begin{equation}\begin{aligned} J^h(\theta)&=E \left[log(P^h(D|w,\theta))\right] \\ &= E_{P_d^h}\left[logP^h(D=1|w,\theta)\right] +E_{P_n}\left[logP^h(D=0|w,\theta)\right] \\ &= E_{P_d^h}\left[log\frac{P_{\theta}^h(w)}{P_{\theta}^h(w)+kP_n(w)}\right] +E_{P_n}\left[log\frac{kP_n(w)}{P_{\theta}^h(w)+kP_n(w)}\right] \\ \end{aligned} \end{equation} \tag{5} Jh(θ)=E[log(Ph(Dw,θ))]=EPdh[logPh(D=1∣w,θ)]+EPn[logPh(D=0∣w,θ)]=EPdh[logPθh(w)+kPn(w)Pθh(w)]+EPn[logPθh(w)+kPn(w)kPn(w)](5)
我们来算一下梯度,等于
∂ ∂ θ J h ( θ ) = E P d h [ k P n ( w ) P θ h ( w ) + k P n ( w ) ∂ ∂ θ l o g P θ h ( w ) ] − k E P n [ P θ h ( w ) P θ h ( w ) + k P n ( w ) ∂ ∂ θ l o g P θ h ( w ) ] (6) \begin{equation} \begin{aligned} \frac{\partial}{\partial{\theta}}{J^h(\theta)}&= E_{P_d^h}\left[\frac{kP_n(w)}{P_{\theta}^h(w)+kP_n(w)}\frac{\partial}{\partial\theta}logP_{\theta}^h(w)\right] -\\&kE_{P_n}\left[\frac{P_{\theta}^h(w)}{P_{\theta}^h(w)+kP_n(w)}\frac{\partial}{\partial\theta}logP_{\theta}^h(w)\right] \end{aligned} \end{equation} \tag{6} θJh(θ)=EPdh[Pθh(w)+kPn(w)kPn(w)θlogPθh(w)]kEPn[Pθh(w)+kPn(w)Pθh(w)θlogPθh(w)](6)

对(6)式做化简,有
∂ ∂ θ J h ( θ ) = E P d h [ k P n ( w ) P θ h ( w ) + k P n ( w i ) ∂ ∂ θ l o g P θ h ( w ) ] − k E P n [ P θ h ( w ) P θ h ( w ) + k P n ( w ) ∂ ∂ θ l o g P θ h ( w ) ] = ∑ w [ P d h ⋅ k P n ( w ) P θ h ( w ) + k P n ( w ) ∂ ∂ θ l o g P θ h ( w ) − k P n ⋅ P θ h ( w ) P θ h ( w ) + k P n ( w ) ∂ ∂ θ l o g P θ h ( w ) ] = ∑ w [ k P n ( w ) P θ h ( w ) + k P n ( w ) × ( P d h ( w ) − P θ h ( w ) ) ∂ ∂ θ l o g P θ h ( w ) ] (7) \begin{equation} \begin{aligned} \frac{\partial}{\partial{\theta}}{J^h(\theta)}&= E_{P_d^h}\left[\frac{kP_n(w)}{P_{\theta}^h(w)+kP_n(w_i)}\frac{\partial}{\partial\theta}logP_{\theta}^h(w)\right] -\\&kE_{P_n}\left[\frac{P_{\theta}^h(w)}{P_{\theta}^h(w)+kP_n(w)}\frac{\partial}{\partial\theta}logP_{\theta}^h(w)\right]\\ &=\sum_w\left[P_d^h\cdot\frac{kP_n(w)}{P_{\theta}^h(w)+kP_n(w)}\frac{\partial}{\partial\theta}logP_{\theta}^h(w)-\right.\\ &\left. kP_{n}\cdot\frac{P_{\theta}^h(w)}{P_{\theta}^h(w)+kP_n(w)}\frac{\partial}{\partial\theta}logP_{\theta}^h(w) \right]\\ &=\sum_w\left[\frac{kP_n(w)}{P_{\theta}^h(w)+kP_n(w)}\times\right.\\ &\left. (P_d^h(w)-P_{\theta}^h(w))\frac{\partial}{\partial\theta}logP_{\theta}^h(w) \right] \end{aligned} \end{equation} \tag{7} θJh(θ)=EPdh[Pθh(w)+kPn(wi)kPn(w)θlogPθh(w)]kEPn[Pθh(w)+kPn(w)Pθh(w)θlogPθh(w)]=w[PdhPθh(w)+kPn(w)kPn(w)θlogPθh(w)kPnPθh(w)+kPn(w)Pθh(w)θlogPθh(w)]=w[Pθh(w)+kPn(w)kPn(w)×(Pdh(w)Pθh(w))θlogPθh(w)](7)

当噪声数据量级巨大, k → ∞ k\to \infty k k P n ( w ) P θ h ( w ) + k P n ( w ) → 1 \frac{kP_n(w)}{P_{\theta}^h(w)+kP_n(w)}\to1 Pθh(w)+kPn(w)kPn(w)1 ,有
∂ ∂ θ J h ( θ ) = ∑ w [ k P n ( w ) P θ h ( w ) + k P n ( w ) × ( P d h ( w ) − P θ h ( w ) ) ∂ ∂ θ l o g P θ h ( w ) ] → ∑ w [ ( P d h ( w ) − P θ h ( w ) ) ∂ ∂ θ l o g P θ h ( w ) ] (8) \begin{equation} \begin{aligned} \frac{\partial}{\partial{\theta}}{J^h(\theta)}&= \sum_w\left[\frac{kP_n(w)}{P_{\theta}^h(w)+kP_n(w)}\times\right.\\ &\left. (P_d^h(w)-P_{\theta}^h(w))\frac{\partial}{\partial\theta}logP_{\theta}^h(w) \right]\\ &\to \sum_w\left[(P_d^h(w)-P_{\theta}^h(w))\frac{\partial}{\partial\theta}logP_{\theta}^h(w) \right] \end{aligned} \end{equation} \tag{8} θJh(θ)=w[Pθh(w)+kPn(w)kPn(w)×(Pdh(w)Pθh(w))θlogPθh(w)]w[(Pdh(w)Pθh(w))θlogPθh(w)](8)

原多分类任务

我们计算下原多分类任务的对数似然期望和梯度,看看 k → ∞ k\to \infty k 时的新二分类任务和原多分类任务有什么关系。原多分类任务的优化目标为
J h ( θ ) = E P d h [ l o g ( P θ h ( w ) ] = E P d h [ l o g ( e x p ( s θ ( w , h ) ) ∑ w e x p ( s θ ( w , h ) ) ) ] = E P d h [ s θ ( w , h ) ] − E P d h [ l o g ( ∑ w e x p ( s θ ( w , h ) ) ) ] = E P d h [ s θ ( w , h ) ] − l o g ( ∑ w e x p ( s θ ( w , h ) ) ) (9) \begin{equation}\begin{aligned} J^h(\theta)&=E_{P_d^h} \left[log(P_{\theta}^h(w)\right] \\ &= E_{P_d^h} \left[log\left(\frac{exp(s_{\theta}(w,h))}{\sum_w{exp(s_{\theta}(w,h))}}\right)\right]\\ &=E_{P_d^h}\left[s_{\theta}(w,h)\right]-E_{P_d^h}\left[log\left(\sum_w{exp\left(s_{\theta}(w,h)\right)}\right)\right]\\ &=E_{P_d^h}\left[s_{\theta}(w,h)\right]-log\left(\sum_w{exp\left(s_{\theta}(w,h)\right)}\right) \end{aligned} \end{equation} \tag{9} Jh(θ)=EPdh[log(Pθh(w)]=EPdh[log(wexp(sθ(w,h))exp(sθ(w,h)))]=EPdh[sθ(w,h)]EPdh[log(wexp(sθ(w,h)))]=EPdh[sθ(w,h)]log(wexp(sθ(w,h)))(9)
等式最后一步成立的原因是 [ l o g ( ∑ w e x p ( s θ ( w , h ) ) ) ] \left[log\left(\sum_w{exp\left(s_{\theta}(w,h)\right)}\right)\right] [log(wexp(sθ(w,h)))]仅和模型预测分布 P θ h P_{\theta}^h Pθh有关,和真实数据分布 P d h P_d^h Pdh无关。
对(9)式求梯度,有 ∂ ∂ θ J h ( θ ) = E P d h [ ∂ ∂ θ s θ ( w , h ) ] − ∂ ∂ θ l o g ( ∑ w e x p ( s θ ( w , h ) ) ) = E P d h [ ∂ ∂ θ s θ ( w , h ) ] − 1 ∑ w e x p ( s θ ( w , h ) ) ∂ ∂ θ ∑ w e x p ( s θ ( w , h ) ) = E P d h [ ∂ ∂ θ s θ ( w , h ) ] − 1 ∑ w e x p ( s θ ( w , h ) ) ∑ w ( s θ ( w , h ) ∂ ∂ θ s θ ( w , h ) ) = E P d h [ ∂ ∂ θ s θ ( w , h ) ] − ∑ w s θ ( w , h ) ∑ w e x p ( s θ ( w , h ) ) ∂ ∂ θ s θ ( w , h ) = E P d h [ ∂ ∂ θ s θ ( w , h ) ] − ∑ w P θ h ( w ) ∂ ∂ θ s θ ( w , h ) = E P d h [ ∂ ∂ θ s θ ( w , h ) ] − ∑ w P θ h ( w ) ∂ ∂ θ s θ ( w , h ) = ∑ w P d h ∂ ∂ θ s θ ( w , h ) − ∑ w P θ h ( w ) ∂ ∂ θ s θ ( w , h ) = ∑ w ( P d h ( w ) − P θ h ( w ) ) ∂ ∂ θ s θ ( w , h ) (10) \begin{equation}\begin{aligned} \frac{\partial}{\partial\theta}J^h(\theta)&=E_{P_d^h}\left[\frac{\partial}{\partial\theta}s_{\theta}(w,h)\right]-\frac{\partial}{\partial\theta}log\left(\sum_w{exp\left(s_{\theta}(w,h)\right)}\right)\\ &=E_{P_d^h}\left[\frac{\partial}{\partial\theta}s_{\theta}(w,h)\right]-\frac{1}{\sum_w{exp\left(s_{\theta}(w,h)\right)}}\frac{\partial}{\partial\theta}\sum_w{exp\left(s_{\theta}(w,h)\right)}\\ &=E_{P_d^h}\left[\frac{\partial}{\partial\theta}s_{\theta}(w,h)\right]-\frac{1}{\sum_w{exp\left(s_{\theta}(w,h)\right)}}\sum_w\left(s_{\theta}(w,h)\frac{\partial}{\partial\theta}s_{\theta}(w,h)\right)\\ &=E_{P_d^h}\left[\frac{\partial}{\partial\theta}s_{\theta}(w,h)\right]-\sum_w\frac{s_{\theta}(w,h)}{\sum_w{exp\left(s_{\theta}(w,h)\right)}}\frac{\partial}{\partial\theta}s_{\theta}(w,h)\\ &=E_{P_d^h}\left[\frac{\partial}{\partial\theta}s_{\theta}(w,h)\right]-\sum_wP_{\theta}^h(w)\frac{\partial}{\partial\theta}s_{\theta}(w,h)\\ &=E_{P_d^h}\left[\frac{\partial}{\partial\theta}s_{\theta}(w,h)\right]-\sum_wP_{\theta}^h(w)\frac{\partial}{\partial\theta}s_{\theta}(w,h)\\ &=\sum_wP_d^h\frac{\partial}{\partial\theta}s_{\theta}(w,h)-\sum_wP_{\theta}^h(w)\frac{\partial}{\partial\theta}s_{\theta}(w,h)\\ &=\sum_w(P_d^h(w)-P_{\theta}^h(w))\frac{\partial}{\partial\theta}s_{\theta}(w,h)\\ \end{aligned} \end{equation} \tag{10} θJh(θ)=EPdh[θsθ(w,h)]θlog(wexp(sθ(w,h)))=EPdh[θsθ(w,h)]wexp(sθ(w,h))1θwexp(sθ(w,h))=EPdh[θsθ(w,h)]wexp(sθ(w,h))1w(sθ(w,h)θsθ(w,h))=EPdh[θsθ(w,h)]wwexp(sθ(w,h))sθ(w,h)θsθ(w,h)=EPdh[θsθ(w,h)]wPθh(w)θsθ(w,h)=EPdh[θsθ(w,h)]wPθh(w)θsθ(w,h)=wPdhθsθ(w,h)wPθh(w)θsθ(w,h)=w(Pdh(w)Pθh(w))θsθ(w,h)(10)对比公式(8)和公式(10),很像,但不一样。公式(8)最后是 ∂ ∂ θ l o g P θ h ( w ) \frac{\partial}{\partial\theta}logP_{\theta}^h(w) θlogPθh(w),公式(10)最后是 ∂ ∂ θ s θ ( w , h ) \frac{\partial}{\partial\theta}s_{\theta}(w,h) θsθ(w,h),咋回事?

不一样就对了,在NCE中,我们可以将 ∑ w e x p ( s θ ( w , h ) ) \sum_w{exp\left(s_{\theta}(w,h)\right)} wexp(sθ(w,h))等价成1,那公式(8)和公式(10)就一样了。那为什么可以等价呢?论文的说辞是: 模型参数较多,把正则项当做常数,公式中其他项,比如 s θ ,能学到正则项。 \textcolor{red}{{模型参数较多,把正则项当做常数,公式中其他项,比如s_{\theta},能学到正则项。}} 模型参数较多,把正则项当做常数,公式中其他项,比如sθ,能学到正则项。(正则项可以理解为 ∑ w e x p ( s θ ( w , h ) ) \sum_w{exp\left(s_{\theta}(w,h)\right)} wexp(sθ(w,h))),那么 ∑ w e x p ( s θ ( w , h ) ) \sum_w{exp\left(s_{\theta}(w,h)\right)} wexp(sθ(w,h))是1也好,100也好,都不会对模型收敛有影响。简单起见,当做1就行。
![[Pasted image 20241227090010.png]]

这段说辞还是太抽象了,有没有形象一点的解释?

两个任务为什么可以等价

原多分类任务

J h ( θ ) = E P d h [ l o g ( P θ h ( w ) ] = E P d h [ l o g ( e x p ( s θ ( w , h ) ) ∑ w e x p ( s θ ( w , h ) ) ) ] (11) \begin{equation}\begin{aligned} J^h(\theta)&=E_{P_d^h} \left[log(P_{\theta}^h(w)\right] \\ &= E_{P_d^h} \left[log\left(\frac{exp(s_{\theta}(w,h))}{\sum_w{exp(s_{\theta}(w,h))}}\right)\right] \end{aligned} \end{equation} \tag{11} Jh(θ)=EPdh[log(Pθh(w)]=EPdh[log(wexp(sθ(w,h))exp(sθ(w,h)))](11)
该任务的对数似然期望见公式(11), l o g log log函数曲线如下:
![[Pasted image 20241229144020.png]]

如果 l o g ( P θ h ( w ) = e x p ( s θ ( w , h ) ) ∈ [ 0 , + ∞ ] log(P_{\theta}^h(w)=exp(s_{\theta}(w,h))\in[0,+\infty] log(Pθh(w)=exp(sθ(w,h))[0,+] J h ( θ ) = E P d h [ l o g ( P θ h ( w ) ] J^h(\theta)=E_{P_d^h} \left[log(P_{\theta}^h(w)\right] Jh(θ)=EPdh[log(Pθh(w)]不存在极值,无法收敛。
如果对 l o g ( P θ h ( w ) = e x p ( s θ ( w , h ) ) ∈ [ 0 , + ∞ ] log(P_{\theta}^h(w)=exp(s_{\theta}(w,h))\in[0,+\infty] log(Pθh(w)=exp(sθ(w,h))[0,+]进行归一化, l o g ( P θ h ( w ) = [ l o g ( e x p ( s θ ( w , h ) ) ∑ w e x p ( s θ ( w , h ) ) ) ] ∈ ( 0 , 1 ) log(P_{\theta}^h(w)=\left[log\left(\frac{exp(s_{\theta}(w,h))}{\sum_w{exp(s_{\theta}(w,h))}}\right)\right]\in(0,1) log(Pθh(w)=[log(wexp(sθ(w,h))exp(sθ(w,h)))](0,1) J h ( θ ) = E P d h [ l o g ( P θ h ( w ) ] J^h(\theta)=E_{P_d^h} \left[log(P_{\theta}^h(w)\right] Jh(θ)=EPdh[log(Pθh(w)]存在极值,具备收敛条件。

现二分类任务

从公式(5)可知,
J h ( θ ) = E [ l o g ( P h ( D ∣ w , θ ) ) ] = E P d h [ l o g P h ( D = 1 ∣ w , θ ) ] + E P n [ l o g P h ( D = 0 ∣ w , θ ) ] = E P d h [ l o g P θ h ( w ) P θ h ( w ) + k P n ( w ) ] + E P n [ l o g k P n ( w ) P θ h ( w ) + k P n ( w ) ] = E P d h [ l o g ( σ ( Δ ) ) ] + k E P n [ l o g ( 1 − σ ( Δ ) ) ] \begin{equation}\begin{aligned} J^h(\theta)&=E \left[log(P^h(D|w,\theta))\right] \\ &= E_{P_d^h}\left[logP^h(D=1|w,\theta)\right] +E_{P_n}\left[logP^h(D=0|w,\theta)\right] \\ &= E_{P_d^h}\left[log\frac{P_{\theta}^h(w)}{P_{\theta}^h(w)+kP_n(w)}\right] +E_{P_n}\left[log\frac{kP_n(w)}{P_{\theta}^h(w)+kP_n(w)}\right] \\ &= E_{P_d^h}\left[log(\sigma({\Delta}))\right] +kE_{P_n}\left[log(1-\sigma({\Delta}))\right] \\ \end{aligned} \tag{12}\end{equation} Jh(θ)=E[log(Ph(Dw,θ))]=EPdh[logPh(D=1∣w,θ)]+EPn[logPh(D=0∣w,θ)]=EPdh[logPθh(w)+kPn(w)Pθh(w)]+EPn[logPθh(w)+kPn(w)kPn(w)]=EPdh[log(σ(Δ))]+kEPn[log(1σ(Δ))](12)
,其中 Δ = l o g P θ h ( w ) − l o g k P n ( w ) \Delta=logP_{\theta}^h(w)-logkP_n(w) Δ=logPθh(w)logkPn(w),将公式(5)推导成具备 σ \sigma σ的公式(12),原因在于求导方便, ∂ ∂ x σ ( x ) = σ ( x ) ( 1 − σ ( x ) ) \frac{\partial}{\partial x}\sigma(x)=\sigma(x)(1-\sigma(x)) xσ(x)=σ(x)(1σ(x)),将公式(5)推导成公式(12)的过程是:
P θ h ( w ) P θ h ( w ) + k P n ( w ) = 1 1 + k P n ( w ) P θ h ( w ) = 1 1 + e x p ( l o g ( k P n ( w ) P θ h ( w ) ) ) = 1 1 + e x p ( l o g k P n ( w ) − l o g P θ h ( w ) ) = 1 1 + e x p ( − ( l o g P θ h ( w ) − l o g k P n ( w ) ) ) = σ ( l o g P θ h ( w ) − l o g k P n ( w ) ) \begin{equation}\begin{aligned} \frac{P_{\theta}^h(w)}{P_{\theta}^h(w)+kP_n(w)}&=\frac{1}{1+\frac{kP_n(w)}{P_{\theta}^h(w)}}\\ &=\frac{1}{1+exp(log(\frac{kP_n(w)}{P_{\theta}^h(w)}))}\\ &=\frac{1}{1+exp(logkP_n(w)-logP_{\theta}^h(w))}\\ &=\frac{1}{1+exp(-(logP_{\theta}^h(w)-logkP_n(w)))}\\ &=\sigma(logP_{\theta}^h(w)-logkP_n(w))\\ \end{aligned} \tag{12}\end{equation} Pθh(w)+kPn(w)Pθh(w)=1+Pθh(w)kPn(w)1=1+exp(log(Pθh(w)kPn(w)))1=1+exp(logkPn(w)logPθh(w))1=1+exp((logPθh(w)logkPn(w)))1=σ(logPθh(w)logkPn(w))(12)
k P n ( w ) P θ h ( w ) + k P n ( w ) = 1 − P θ h ( w ) P θ h ( w ) + k P n ( w ) = 1 − σ ( l o g P θ h ( w ) − l o g k P n ( w ) ) \begin{equation}\begin{aligned} \frac{kP_n(w)}{P_{\theta}^h(w)+kP_n(w)}&=1-\frac{P_{\theta}^h(w)}{P_{\theta}^h(w)+kP_n(w)}\\ &=1-\sigma(logP_{\theta}^h(w)-logkP_n(w))\\ \end{aligned} \tag{13}\end{equation} Pθh(w)+kPn(w)kPn(w)=1Pθh(w)+kPn(w)Pθh(w)=1σ(logPθh(w)logkPn(w))(13)
于是,计算对数似然均值(公式(12))对 l o g P θ h ( w ) logP_{\theta}^h(w) logPθh(w)的一阶导,有
∂ J h ( θ ) ∂ l o g P θ h ( w ) = ∂ J h ( θ ) ∂ Δ ∂ Δ ∂ l o g P θ h ( w ) = ∂ J h ( θ ) ∂ Δ = ∂ ∂ Δ { E P d h [ l o g ( σ ( Δ ) ) ] + k E P n [ l o g ( 1 − σ ( Δ ) ) ] } = E P d h [ ∂ ∂ Δ l o g ( σ ( Δ ) ) ] + k E P n [ ∂ ∂ Δ l o g ( 1 − σ ( Δ ) ) ] = E P d h [ 1 − σ ( Δ ) ] + k E P n [ − σ ( Δ ) ] = ∑ w P θ h ( w ) ( 1 − σ ( Δ ) ) − k P n ( w ) σ ( Δ ) \begin{equation}\begin{aligned} \frac{\partial J^h(\theta)}{\partial logP_{\theta}^h(w)} &=\frac{\partial J^h(\theta)}{\partial \Delta}\frac{\partial \Delta}{\partial logP_{\theta}^h(w)}\\ &=\frac{\partial J^h(\theta)}{\partial \Delta}\\ &=\frac{\partial }{\partial \Delta}\left\{E_{P_d^h}\left[log(\sigma({\Delta}))\right] +kE_{P_n}\left[log(1-\sigma({\Delta}))\right]\right\}\\ &=E_{P_d^h}\left[\frac{\partial }{\partial \Delta}log(\sigma({\Delta}))\right] +kE_{P_n}\left[\frac{\partial }{\partial \Delta}log(1-\sigma({\Delta}))\right]\\ &=E_{P_d^h}\left[1-\sigma({\Delta})\right] +kE_{P_n}\left[-\sigma({\Delta})\right]\\ &=\sum_wP_{\theta}^h(w)(1-\sigma({\Delta}))-kP_n(w)\sigma({\Delta})\\ \end{aligned} \tag{14}\end{equation} logPθh(w)Jh(θ)=ΔJh(θ)logPθh(w)Δ=ΔJh(θ)=Δ{EPdh[log(σ(Δ))]+kEPn[log(1σ(Δ))]}=EPdh[Δlog(σ(Δ))]+kEPn[Δlog(1σ(Δ))]=EPdh[1σ(Δ)]+kEPn[σ(Δ)]=wPθh(w)(1σ(Δ))kPn(w)σ(Δ)(14)
如果 P θ h ( w ) = P d h ( w ) P_{\theta}^h(w)=P_d^h(w) Pθh(w)=Pdh(w),对数似然均值达到极大值(这个是废话,因为训练目标就是希望 P θ h ( w ) → P d h ( w ) P_{\theta}^h(w)\to P_d^h(w) Pθh(w)Pdh(w),并且在优化策略章节开始部分,我们就让 P θ h ( w ) = P d h ( w ) P_{\theta}^h(w)= P_d^h(w) Pθh(w)=Pdh(w))其中 P d h ( w ) P_d^h(w) Pdh(w)表示真实分布。
我们再计算对数似然均值(公式(12))对 l o g P θ h ( w ) logP_{\theta}^h(w) logPθh(w)的二阶导,有:
∂ 2 J h ( θ ) ∂ l o g 2 P θ h ( w ) = ∂ 2 J ( θ ) ∂ Δ 2 = ∂ ∂ Δ { E P d h [ 1 − σ ( Δ ) ] + k E P n [ − σ ( Δ ) ] } = E P d h ∂ ∂ Δ [ 1 − σ ( Δ ) ] + k E P n ∂ ∂ Δ [ − σ ( Δ ) ] = E P d h [ − σ ( Δ ) ( 1 − σ ( Δ ) ) ] + k E P n [ − σ ( Δ ) ( 1 − σ ( Δ ) ) ] \begin{equation}\begin{aligned} \frac{\partial^2 J^h(\theta)}{\partial log^2P_{\theta}^h(w)} &=\frac{\partial^2J(\theta)}{\partial \Delta^2}\\ &=\frac{\partial}{\partial \Delta} \left\{E_{P_d^h}\left[1-\sigma({\Delta})\right] +kE_{P_n}\left[-\sigma({\Delta})\right] \right\} \\ &= E_{P_d^h}\frac{\partial}{\partial \Delta}\left[1- \sigma({\Delta})\right] +kE_{P_n}\frac{\partial}{\partial \Delta}\left[-\sigma({\Delta})\right] \\ &= E_{P_d^h}[-\sigma(\Delta)(1-\sigma(\Delta))] +kE_{P_n}[-\sigma(\Delta)(1-\sigma(\Delta))] \\ \end{aligned} \tag{14}\end{equation} log2Pθh(w)2Jh(θ)=Δ22J(θ)=Δ{EPdh[1σ(Δ)]+kEPn[σ(Δ)]}=EPdhΔ[1σ(Δ)]+kEPnΔ[σ(Δ)]=EPdh[σ(Δ)(1σ(Δ))]+kEPn[σ(Δ)(1σ(Δ))](14)
因为 [ − σ ( Δ ) ( 1 − σ ( Δ ) ) ] [-\sigma(\Delta)(1-\sigma(\Delta))] [σ(Δ)(1σ(Δ))]始终小于0,所以二阶导始终小于0,说明新二分类任务的对数似然均值是关于 l o g P θ h ( w ) logP_{\theta}^h(w) logPθh(w)的凸函数,有唯一极大值。所以极大值一定是 P θ h ( w ) = P h ( w ) P_{\theta}^h(w)=P^h(w) Pθh(w)=Ph(w)
最重要的是,整个推导过程对是否需要归一化没有要求,既然没有要求,直接让 ∑ w e x p ( s θ ( w , h ) ) = 1 \sum_w{exp\left(s_{\theta}(w,h)\right)}=1 wexp(sθ(w,h))=1

代码实现

从公式(12),我们可以知道: Δ = l o g P θ h ( w ) − l o g k P n ( w ) \Delta=logP_{\theta}^h(w)-logkP_n(w) Δ=logPθh(w)logkPn(w)
J h ( θ ) = E [ l o g ( P h ( D ∣ w , θ ) ) ] = E P d h [ l o g σ ( Δ ) ] + k E P n [ l o g ( 1 − σ ( Δ ) ) ] = E P d h [ l o g σ ( l o g P θ h ( w ) − l o g k P n ( w ) ) ] + k E P n [ l o g ( 1 − σ ( l o g P θ h ( w ) − l o g k P n ( w ) ) ) ] = ∑ w { P d h [ l o g σ ( l o g P θ h ( w ) − l o g k P n ( w ) ) ] } + k ∑ w { P n [ l o g ( 1 − σ ( l o g P θ h ( w ) − l o g k P n ( w ) ) ) ] } → l o g ( σ ( l o g P θ h ( w 0 ) − l o g k P n ( w 0 ) ) + ∑ i = 1 k [ l o g ( 1 − σ ( l o g P θ h ( w i ) − l o g k P n ( w i ) ) ) ] = l o g ( σ ( s θ ( w 0 , h ) − l o g k P n ( w 0 ) ) + ∑ i = 1 k [ l o g ( 1 − σ ( s θ ( w i , h ) − l o g k P n ( w i ) ) ) ] \begin{equation}\begin{aligned} J^h(\theta)&=E \left[log(P^h(D|w,\theta))\right] \\ &= E_{P_d^h}\left[log\sigma({\Delta})\right] +kE_{P_n}\left[log(1-\sigma({\Delta}))\right] \\ &= E_{P_d^h}\left[log\sigma(logP_{\theta}^h(w)-logkP_n(w))\right] +\\ &\quad\quad\quad\quad\quad\quad kE_{P_n}\left[log(1-\sigma(logP_{\theta}^h(w)-logkP_n(w)))\right] \\ &= \sum_w\left\{P_d^h\left[log\sigma(logP_{\theta}^h(w)-logkP_n(w))\right] \right\}+\\ &\quad\quad\quad\quad\quad\quad k\sum_w\left\{P_n\left[log(1-\sigma(logP_{\theta}^h(w)-logkP_n(w)))\right]\right\} \\ &\to log(\sigma(logP_{\theta}^h(w_0)-logkP_n(w_0)) +\\ &\quad\quad\quad\quad\quad\quad\sum_{i=1}^k\left[log(1-\sigma(logP_{\theta}^h(w_i)-logkP_n(w_i)))\right] \\ &=log(\sigma(s_{\theta}(w_0,h)-logkP_n(w_0)) +\\ &\quad\quad\quad\quad\quad\quad\sum_{i=1}^k\left[log(1-\sigma(s_{\theta}(w_i,h)-logkP_n(w_i)))\right] \\ \end{aligned} \tag{15}\end{equation} Jh(θ)=E[log(Ph(Dw,θ))]=EPdh[logσ(Δ)]+kEPn[log(1σ(Δ))]=EPdh[logσ(logPθh(w)logkPn(w))]+kEPn[log(1σ(logPθh(w)logkPn(w)))]=w{Pdh[logσ(logPθh(w)logkPn(w))]}+kw{Pn[log(1σ(logPθh(w)logkPn(w)))]}log(σ(logPθh(w0)logkPn(w0))+i=1k[log(1σ(logPθh(wi)logkPn(wi)))]=log(σ(sθ(w0,h)logkPn(w0))+i=1k[log(1σ(sθ(wi,h)logkPn(wi)))](15)
具体实现时,正样本项仅考虑目标class,负样本项随机选择k个样本,通过蒙特卡洛来模拟抽样。
那最终损失函数代码应该怎么写呢?

l o s s = − J h ( θ ) = − l o g ( σ ( s θ ( w 0 , h ) − l o g k P n ( w 0 ) ) ) − ∑ i = 1 k [ l o g ( 1 − σ ( s θ ( w i , h ) − l o g k P n ( w i ) ) ) ] \begin{equation}\begin{aligned} loss &= -J^h(\theta) \\ &=-log(\sigma(s_{\theta}(w_0,h)-logkP_n(w_0))) - \\ &\quad\quad\quad\quad\quad\quad\sum_{i=1}^k\left[log(1-\sigma(s_{\theta}(w_i,h)-logkP_n(w_i)))\right] \\ \end{aligned} \tag{16}\end{equation} loss=Jh(θ)=log(σ(sθ(w0,h)logkPn(w0)))i=1k[log(1σ(sθ(wi,h)logkPn(wi)))](16)

公式(16)中有四个项输入,分别是

  • s θ ( w 0 , h ) s_{\theta}(w_0,h) sθ(w0,h),目标class的logit
  • P n ( w 0 ) P_n(w_0) Pn(w0),目标class的噪声分布
  • s θ ( w i , h ) s_{\theta}(w_i,h) sθ(wi,h),噪声class的logit
  • P n ( w i ) P_n(w_i) Pn(wi),噪声class的噪声分布
from torch import randn, tensor, log, multinomial
import torch.nn.functional as F
from einops import repeat
import torch
import mathbs,k=2,8
num_classes=16#构造噪声:按照类别的频率采样
#(噪声分布约等于实际数据分布,两个分布越接近,nce效果越好)
classes=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
class_freq=tensor([20,10,30,5,45,56,76,43,23,11,34,5,6,54,23,7])
class_probs=class_freq/class_freq.sum()
noise_classes=multinomial(class_probs, num_classes)#模型预测的logits
logits=randn(bs, num_classes)
#2个样本的标签
labels=tensor([2, 4])#目标class的logit
true_class_logits=logits.take_along_dim(labels[:, None], dim=1)#目标class的噪声分布
true_class_noise=class_probs[labels]
#噪声class的logit
logits_k = repeat(logits, '(b 1) h -> (b k) h', k=k)
noise_class_logits = logits_k.take_along_dim(noise_classes.reshape(bs * k, -1), dim=1)
#噪声class的噪声分布
noise_class_noise=class_probs[noise_classes]#nce loss计算
true_class_loss = -torch.log( F.sigmoid(true_class_logits - torch.log(k*true_class_noise))).mean()
noise_class_loss = -torch.log( 1-F.sigmoid(noise_class_logits - torch.log(k*noise_class_noise))).mean()loss = true_class_loss+noise_class_loss
print("nce loss is {:.4f}".format(loss))

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

latex 尖括号怎么写 编译出来是问号

首先引入\usepackage{amsmath}使用\langle \range, 如下: These knowledge graphs represent real-world facts in the form of triples of \(\langle entity, relationship, entity \rangle \)编译展示出来如下:

永磁同步电机控制算法--最大转矩电流比控制(牛顿迭代法)

一、原理介绍 搭建了基于牛顿迭代法的MTPA双闭环矢量控制系统 二、仿真验证 在MATLAB/simulink里面验证所提算法,采用和实验中一致的控制周期1e-4,电机部分计算周期为1e-6。仿真模型如下所示: 对直接公式计算法和牛顿迭代法进行仿真对比验…

[Win32/ATL]_[初级]_[处理WM_PAINT消息注意事项]

场景 在开发Win32/WTL程序时,遇到了使用CFolderDialog(atldlgs.h)打不开目录选择对话框的情况。具体表现是执行了窗口的DoModal,却没有窗口弹出来。 可以确定执行操作是在主线程,并不是工作线程。调试时暂停看堆栈,知道到DoModal方法里的SHB…

华为配置 之 RIP

简介: RIP(路由信息协议)是一种广泛使用的内部网关协议,基于距离向量算法来决定路径。它通过向全网广播路由控制信息来动态交换网络拓扑信息,从而计算出最佳路由路径。RIP易于配置和理解,非常适用于小型网络…

RCE-PLUS (学习记录)

源码 <?php error_reporting(0); highlight_file(__FILE__); function strCheck($cmd) {if(!preg_match("/\;|\&|\\$|\x09|\x26|more|less|head|sort|tail|sed|cut|awk|strings|od|php|ping|flag/i", $cmd)){return($cmd);}else{die("i hate this"…

Unity Mesh生成Cube

1. 配置一个Cube的每个面的数据 一共是6个面&#xff0c;每个面包含的数据包括4个顶点的相对顶点坐标&#xff08;Cube的中心为原点&#xff09;&#xff0c;法线方向&#xff0c;UV坐标&#xff0c;顶点渲染顺序&#xff0c;以及这个面用到的材质&#xff0c;因为这里是Top&am…

【YOLO算法改进】ALSS-YOLO:无人机热红外图像|野生动物小目标检测

目录 论文信息 论文创新点 1.自适应轻量通道分割和洗牌&#xff08;ALSS&#xff09;模块 2.轻量坐标注意力&#xff08;LCA&#xff09;模块 3.单通道聚焦模块 4.FineSIOU损失函数 摘要 架构设计 轻量高效网络架构 - ALSS模块 LCA模块 单通道聚焦模块 损失函数优…

【亚马逊云】基于Amazon EC2实例部署 NextCloud 云网盘并使用 Docker-compose 搭建 ONLYOFFICE 企业在线办公应用软件

文章目录 1. 部署EC2实例2. 安装 Docker 服务3. 安装docker-compose4. 创建Docker-compose文件5. 创建nginx.conf文件6. 运行docker-compose命令开始部署7. 访问ONLYOFFICE插件8. 访问NextCloud云盘9. 下载并启用ONLYOFFICE插件10. 上传文件测试11. 所遇问题12. 参考链接 1. 部…

使用爬虫技术获取网页中的半结构化数据

目录 前言1. 半结构化数据与爬虫技术简介1.1 半结构化数据的定义与特性1.2 爬虫技术的基本原理 2. 爬取半结构化数据的实现过程2.1 明确目标与准备2.2 发送HTTP请求2.3 解析网页内容2.4 动态内容的处理2.5 数据存储与清洗 3. 技术挑战与应对策略3.1 处理反爬机制3.2 提高爬取效…

win10、win11-鼠标右键还原、暂停更新

系统优化 win 10jihuo win 11jihuo鼠标右键还原暂停更新 update 2024.12.28win 10 jihuo winx&#xff0c;打开powershell管理员&#xff0c;输入以下命令,选择1并等待 irm https://get.activated.win | iex参考&#xff1a;https://www.bilibili.com/video/BV1TN411M72J/?sp…

【蓝桥杯选拔赛真题87】python输出字符串 第十五届青少年组蓝桥杯python选拔赛真题 算法思维真题解析

目录 python输出字符串 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python输出字符串 第十五届蓝桥杯青少年组python比赛选拔赛真题详细解析…

有什么AI辅助阅读文献工具推荐?

AI的发展速度非常快&#xff0c;在很多方面都已经可以提供货真价实的辅助能力。 比如AI辅助阅读方面&#xff0c;可以获取、分析和理解大量文献资料。这可以帮助我们快速浏览和理解PDF文件和其他文档&#xff0c;提高我们的工作效率和学习效率&#xff0c;达到降本增效。 作为…

各个Spring Cloud版本有何主要差异

Spring Cloud 的各个版本之间确实存在一些关键差异&#xff0c;这些差异主要体现在功能更新、性能优化、对新技术的支持以及对旧有技术的替代等方面。 1. Spring Cloud Dalston 这是 Spring Cloud 的一个早期版本&#xff0c;它提供了微服务架构所需的基本组件&#xff0c;如服…

【翻译】审慎对齐:推理使更安全的语言模型成为可能

原文&#xff1a;https://arxiv.org/abs/2412.16339 出自OpenAI 摘要 随着大规模语言模型对安全关键领域的影响越来越大&#xff0c;确保它们可靠地遵守定义良好的原则仍然是一个基本挑战。本文提出慎思校准&#xff0c;一种新的范式&#xff0c;直接教模型安全规范&#xff…

1、ELK的架构和安装

ELK简介 elk&#xff1a;elasticsearch logstash kibana&#xff0c;统一日志收集系统。 elasticsearch&#xff1a;分布式的全文索引引擎的非关系数据库&#xff0c;json格式&#xff0c;在elk中存储所有的日志信息&#xff0c;架构有主和从&#xff0c;最少需要2台。 …

使用连字符容易出错,尽量使用驼峰式的

在<Select>组件中&#xff0c;存在一个拼写错误。在option - value属性中&#xff0c;正确的写法应该是option - value&#xff08;使用连字符&#xff09;或者optionValue&#xff08;如果是按照Vue组件属性的驼峰命名法&#xff09;&#xff0c;这里写成了option - val…

CentOS7 解决ping:www.baidu.com 未知的名称或服务

CentOS7 解决ping&#xff1a;www.baidu.com“未知的名称或服务 在VM查看网络配置 查看虚拟网络编辑器 编辑网络配置文件 vi /etc/sysconfig/network-scripts/ifcfg-ens33注意&#xff1a;不同机器的配置文件名可能不相同&#xff0c;通过 ip addr 命令查看 将 ONBOOT 从 no 改…

QT----------文件系统操作和文件读写

一、输入输出设备类 功能&#xff1a; Qt 提供了一系列的输入输出设备类&#xff0c;用于处理不同类型的 I/O 操作&#xff0c;如文件、网络等。 二、文件读写操作类 QFile 类&#xff1a; 提供了对文件的读写操作&#xff0c;可以打开、读取、写入和关闭文件。示例&#x…

Android14 CTS-R6和GTS-12-R2不能同时测试的解决方法

背景 Android14 CTS r6和GTS 12-r1之后&#xff0c;tf-console默认会带起OLC Server&#xff0c;看起来olc server可能是想适配ATS(android-test-station)&#xff0c;一种网页版可视化、可配置的跑XTS的方式。这种网页版ATS对测试人员是比较友好的&#xff0c;网页上简单配置下…