1. 世上并无负样本

softmax的标签是一个向量,但是这个向量中只有一个值为1,所以损失函数中也只会有一项是有值的,其他都是0,所以值也都为0。但是交叉熵损失函数中,不管0还是1都是有只的,正样本的时候,值为 log p \text{log} p logp,负样本的时候值为 log ( 1 − p ) \text{log}(1-p) log(1p)。这就非常的奇怪,为什么负样本有值呢?
其实,我们只要把二分类写成一个向量就可以明白了,正样本有 [ 1 , 0 ] [1,0] [1,0],而负样本呢,则为 [ 0 , 1 ] [0,1] [0,1]。所以在计算损失函数的时候,负样本也是有值的。
出现这个错觉还有一个原因是,我们把正负样本和标签弄混淆了。

仔细想想,多分类的问题中有所谓的负样本吗?并没有,一个样本就是对应一个标签向量。当我们把二分类的标签也写成向量的时候,你就会发现没有所谓的负样本了。很有意思的是,当二分类的时候,我们说正负样本不均衡,当多分类的时候,我们说类别不均衡。

2. 绘制交叉熵函数

如何绘制交叉熵函数,我当时是一脸懵逼的,交叉熵的损失函数我是知道的
L = ∑ i y log  y ^ + ( 1 − y ) log  ( 1 − y ^ ) L=\sum_i y \text{log}\ \hat{y}+(1-y) \text{log}\ (1-\hat{y}) L=iylog y^+(1y)log (1y^)

计算每一个样本的损失值,所有样本的值进行累加,就可以得到一个batch样本的损失值,然后我们进行优化,使这个值最小。我的经验中,只会求损失值,并不会绘制函数图像。
当正样本的时候 y = 1 y=1 y=1,此时损失函数为 L = − log  y ^ L=-\text{log}\ \hat{y} L=log y^,可以看出这是一个log函数,当 y = 0 y=0 y=0时,此时损失函数为 L = − log  ( 1 − y ^ ) L=-\text{log}\ (1-\hat{y}) L=log (1y^),这是log函数进行了平移,并且 y ^ \hat{y} y^的定义域为 0 ∼ 1 0 \sim 1 01之间。
其实这就可以绘制出损失函数了,这样来了一个正样本,我们就可以通过这个函数计算出损失值,来了一个负样本,也可以计算出一个损失值,N个样本的损失值累计则为最终的loss。
当时很奇怪的一个点是,正负都合并到一个函数中了,为什么还会分0和1两种情况来绘制呢?其实y就相当于是一个超参数,只有确定了超参数才能确定最终的图像。举个例子
y = x 2 + 2 θ x + 1 y=x^2 + 2 \theta x +1 y=x2+2θx+1
我们假定 θ \theta θ只有-1和+1两种取值,现在要求你绘制 y y y的曲线,你会怎么做呢?肯定只有确定了 θ \theta θ才能绘制,因为 θ \theta θ就是一个超参数。

3.softmax求导

p ( w o ∣ w c ) p(w_o|w_c) p(wowc)是概率模型,给定中心词 w w w,输出每个词的概率值,我们的目标就是最大化MLE损失
MLE = 1 T ∑ t = 1 T ∑ − l ≤ j ≤ l , j ≠ 0 log  p ( w t + j ∣ w t ) \text{MLE} =\frac{1}{T} \sum_{t=1}^{T}\sum_{-l\leq j \leq l,j \neq 0 } \text{log}\ p(w_{t+j}|w_t) MLE=T1t=1Tljl,j=0log p(wt+jwt)

通常在最后一层会使用softmax来进行归一化
p θ ( o ∣ c ) = u θ ( o , c ) ∑ o ′ ∈ V u θ ( o ′ , c ) = u θ ( o , c ) Z θ ( c ) p_{\theta}(o|c)=\frac{u_{\theta}(o,c)}{\sum_{o'\in V}u_{\theta}(o',c)}=\frac{u_{\theta}(o,c)}{Z_\theta(c)} pθ(oc)=oVuθ(o,c)uθ(o,c)=Zθ(c)uθ(o,c)

其中 u θ ( o , c ) = e s θ ( o , c ) u_{\theta}(o,c)=e^{s_{\theta}(o,c)} uθ(o,c)=esθ(o,c),如果我们使用神经网络,我们用 v c ⃗ \vec{v_c} vc 表示中心词向量,使用 u o ⃗ \vec{u_o} uo 表示输出词向量。这两个向量的点积表征了两个词的相似度, s θ ( o , c ) = u o ⃗ ⋅ v c ⃗ s_{\theta}(o,c)=\vec{u_o}\cdot \vec{v_c} sθ(o,c)=uo vc

但是这就有一个问题,我们的损失函数中包含了一个复杂的 Z θ Z_{\theta} Zθ,这求导起来非常的麻烦,也仅仅是麻烦而已
∇ θ  log  p θ ( o ∣ c ) = ∇ θ log  u θ ( o , c ) − ∇ θ l o g ∑ u θ ( o ′ , c ) = ∇ θ s θ ( u o ⃗ , v c ⃗ ) − 1 ∑ u θ ( o ′ , c ) ∑ u θ ( o ′ , c ) ∇ θ s θ ( u o ′ ⃗ , v c ⃗ ) = ∇ θ s θ ( u o ⃗ , v c ⃗ ) − ∑ − l ≤ o ≤ l u θ ( o ′ , c ) ∑ u θ ( o ′ , c ) ⋅ ∇ θ s θ ( u o ′ ⃗ , v c ⃗ ) \begin{aligned} \nabla_{\theta}\ \text{log}\ p_{\theta}(o|c)&=\nabla_{\theta} \text{log}\ u_\theta(o,c)-\nabla _{\theta}log\sum u_\theta(o',c)\\ &=\nabla_{\theta} s_{\theta} (\vec{u_o},\vec{v_c})-\frac{1}{\sum u_\theta(o',c)}\sum u_\theta(o',c) \nabla_{\theta} s_{\theta} (\vec{u_{o'}},\vec{v_c})\\ &=\nabla_{\theta} s_{\theta} (\vec{u_o},\vec{v_c})-\sum_{-l \leq o \leq l} \frac{u_\theta(o',c)}{\sum u_\theta(o',c)} \cdot \nabla_{\theta} s_{\theta} (\vec{u_{o'}},\vec{v_c})\\ \end{aligned} θ log pθ(oc)=θlog uθ(o,c)θloguθ(o,c)=θsθ(uo ,vc )uθ(o,c)1uθ(o,c)θsθ(uo ,vc )=θsθ(uo ,vc )loluθ(o,c)uθ(o,c)θsθ(uo ,vc )
非常的神奇,恰好又变成了softmax的归一化函数
p ( o ′ ∣ c ) = u θ ( o ′ , c ) ∑ u θ ( o ′ , c ) p(o'|c)=\frac{u_\theta(o',c)}{\sum u_\theta(o',c)} p(oc)=uθ(o,c)uθ(o,c)

因此有
∇ θ  log  p θ ( o ∣ c ) = ∇ θ s θ ( u o ⃗ , v c ⃗ ) − ∑ p ( o ′ ∣ c ) ∇ θ s θ ( u o ⃗ , v c ⃗ ) = ∇ θ s θ ( u o ⃗ , v c ⃗ ) − E o ′ ∼ p [ ∇ θ s θ ( u o ⃗ , v c ⃗ ) ] \begin{aligned} \nabla_{\theta}\ \text{log}\ p_{\theta}(o|c)&=\nabla_{\theta} s_{\theta} (\vec{u_o},\vec{v_c})-\sum p(o'|c)\nabla_{\theta} s_{\theta} (\vec{u_o},\vec{v_c})\\ &=\nabla_{\theta} s_{\theta} (\vec{u_o},\vec{v_c})-E_{o' \sim p}[\nabla_{\theta} s_{\theta} (\vec{u_o},\vec{v_c})] \end{aligned} θ log pθ(oc)=θsθ(uo ,vc )p(oc)θsθ(uo ,vc )=θsθ(uo ,vc )Eop[θsθ(uo ,vc )]

最后出来了一个期望,真的是非常的有趣。有了这个期望,其实就是使用mc的方式来做。但是估计起来依然非常的困难,因为要更新参数的话,需要便利所有的单词 o ′ o' o,每个都要进行更新。

4. NCE loss

NCE的思想非常的巧妙,是将softmax的问题转化为二分类。
后面会一直使用概率$p(w|c)$,为什么是条件概率呢?这是因为我们实际上是给定了输入$c$,然后预测输出单词$w$的概率,所以都是条件概率,当然,我们也可以认为是求$p(w,c)$的联合概率,只不过每次联合的单词都有$c,所以使用条件概率会更合理。
首先根据经验分布 p ‾ ( w ∣ c ) \overline{p}(w|c) p(wc)采样出正样本
P ( w ∣ C = 1 , c ) = p ‾ ( w ∣ c ) P(w | C=1,c)=\overline{p}(w|c) P(wC=1,c)=p(wc)
然后从 q ( w ) q(w) q(w)中采样出 k k k个负样本。这里就很有意思了,可以看到q(w)中是没有c的,这是因为产生的负样本是从全部单词中随机采样的,而正样本是跟c同时出现的句子中采样的,所以有p(w|c)
P ( w ∣ C = 0 , c ) = q ( w ) P(w | C=0,c)=q(w) P(wC=0,c)=q(w)

也就是说,当前有一个正样本, k k k个负样本,整体来说正负样本比例为 1 : k 1:k 1:k,可以得到先验分布为
P ( C = 1 ) = 1 1 + k P ( C = 0 ) = k 1 + k \begin{aligned} P(C=1)&=\frac{1}{1+k}\\ P(C=0)&=\frac{k}{1+k} \end{aligned} P(C=1)P(C=0)=1+k1=1+kk
p ‾ ( w ∣ c ) \overline{p}(w|c) p(wc)表示的是正样本中,给定中心词 c c c输出单词 w w w的概率,而 P ( w ∣ c ) P(w|c) P(wc)表示为正负样本混合后,给定中心词 c c c,输出单词 w w w的概率是多少,这两个是有差别的。全概率公式有

P ( w ∣ c ) = P ( w ∣ C = 1 , c ) P ( C = 1 ) + P ( w ∣ C = 0 , c ) P ( C = 0 ) = 1 1 + k p ‾ ( w ∣ c ) + k 1 + k q ( w ) \begin{aligned} P(w|c)&=P(w|C=1,c)P(C=1)+P(w|C=0,c)P(C=0)\\ &=\frac{1}{1+k}\overline{p}(w|c)+\frac{k}{1+k}q(w) \end{aligned} P(wc)=P(wC=1,c)P(C=1)+P(wC=0,c)P(C=0)=1+k1p(wc)+1+kkq(w)

由此我们可以得到后验概率
P ( C = 1 ∣ w , c ) = P ( w ∣ C = 1 ) P ( C = 1 ) P ( w ) = 1 1 + k p ‾ ( w ∣ c ) 1 1 + k p ‾ ( w ∣ c ) + k 1 + k q ( w ) = p ‾ ( w ∣ c ) p ‾ ( w ∣ c ) + k q ( w ) \begin{aligned} P(C=1|w,c)&=\frac{P(w|C=1)P(C=1)}{P(w)}\\ &=\frac{\frac{1}{1+k}\overline{p}(w|c)}{\frac{1}{1+k}\overline{p}(w|c)+\frac{k}{1+k}q(w)}\\ &=\frac{\overline{p}(w|c)}{\overline{p}(w|c)+kq(w)} \end{aligned} P(C=1∣w,c)=P(w)P(wC=1)P(C=1)=1+k1p(wc)+1+kkq(w)1+k1p(wc)=p(wc)+kq(w)p(wc)

同理可以得到
P ( C = 0 ∣ w , c ) = k q ‾ ( w ) p ‾ ( w ∣ c ) + k q ( w ) P(C=0|w,c)=\frac{k\overline{q}(w)}{\overline{p}(w|c)+kq(w)} P(C=0∣w,c)=p(wc)+kq(w)kq(w)

如果记为
G ( w ; θ ) = log p θ ( w ∣ c ) − log q ( w ) σ ( w ; θ ) = 1 1 + e x p ( − G ( w ; θ ) ) \begin{aligned} G(w;\theta)&=\text{log}p_\theta(w|c)-\text{log}q(w)\\ \sigma(w;\theta)&=\frac{1}{1+exp(-G(w;\theta))} \end{aligned} G(w;θ)σ(w;θ)=logpθ(wc)logq(w)=1+exp(G(w;θ))1
则有
P ( C = 1 ∣ w , c ) = 1 1 + k p ( w ∣ c ) q ( w ) = 1 1 + k e x p [ log p θ ( w ∣ c ) − log q ( w ) ] = 1 1 + e x p ( − G ( w ; θ ) ) = σ ( w ; θ ) P ( C = 0 ∣ w , c ) = 1 − σ ( w ; θ ) \begin{aligned} P(C=1|w,c)&=\frac{1}{1+k\frac{p(w|c)}{q(w)}}\\ &=\frac{1}{1+kexp[\text{log}p_\theta(w|c)-\text{log}q(w)]}\\ &=\frac{1}{1+exp(-G(w;\theta))}\\ &=\sigma(w;\theta)\\ P(C=0|w,c)&=1-\sigma(w;\theta) \end{aligned} P(C=1∣w,c)P(C=0∣w,c)=1+kq(w)p(wc)1=1+kexp[logpθ(wc)logq(w)]1=1+exp(G(w;θ))1=σ(w;θ)=1σ(w;θ)

此时, C C C是伯努利分布,通过最大似然可以得到
L M L E = ∏ p = 1 P P ( C = 0 ∣ w p ) ⋅ ∏ n = 1 N P ( C = 1 ∣ w n ) = E w ∼ p ‾ ( w ∣ c ) log P ( C = 1 ∣ w , c ) + k E w ′ ∼ q log P ( D = 0 ∣ w ′ , c ) \begin{aligned} L_{MLE}&=\prod_{p=1}^{P}P(C=0|w_p)\cdot \prod_{n=1}^{N}P(C=1|w_n)\\ &=E_{w\sim \overline{p}(w|c)} \text{log}P(C=1|w,c)+kE_{w'\sim q}\text{log}P(D=0|w',c)\\ \end{aligned} LMLE=p=1PP(C=0∣wp)n=1NP(C=1∣wn)=Ewp(wc)logP(C=1∣w,c)+kEwqlogP(D=0∣w,c)

但是现在依然无法避免求解 Z θ Z_\theta Zθ的问题,因为
G ( w ; θ ) = log p ( w ∣ c ) − log q ( w ) = log e x p ( c ⃗ ⋅ w ⃗ ) Z θ − log q ( w ) = c ⃗ ⋅ w ⃗ − log Z θ − log  q ( w ) \begin{aligned} G(w;\theta)&=\text{log} p(w|c)-\text{log} q(w)\\ &=\text{log}\frac{exp(\vec{c} \cdot \vec{w})}{Z_\theta} -\text{log} q(w)\\ &=\vec{c} \cdot \vec{w}-\text{log}Z_\theta-\text{log}\ q(w) \end{aligned} G(w;θ)=logp(wc)logq(w)=logZθexp(c w )logq(w)=c w logZθlog q(w)
式子中依然包含 Z θ Z_\theta Zθ,这跟softmax完全没有差别吗,我感觉就像是换了方式来估计概率,但是依然没有解决核心的问题。所以,NCE就做了两个强假设

  1. 使用一个参数 z z z来学习 Z θ Z_\theta Zθ,即 Z θ = z Z_\theta=z Zθ=z
  2. 神经网络中,因为有许多的参数,所以设定 Z θ = 1 Z_\theta=1 Zθ=1也是有效的。

p ( w ∣ c ) = e x p ( c ⃗ ⋅ w ⃗ ) p(w|c)=exp(\vec{c} \cdot \vec{w}) p(wc)=exp(c w )
我依然是非常好奇的,如果这样的话为什么不直接使用softmax

公式中是包含了期望函数,实际使用时我们可以使用MC采样的方式获取负样本,如果使用随机采样的话,即每个单词采样的概率相同此时有
E w ∼ q ( w ) log P ( C = 0 ∣ w , c ) = 1 k ∑ i = 1 k log P ( C = 0 ∣ w , c ) E_{w\sim q(w)}\text{log}P(C=0|w,c)=\frac{1}{k}\sum_{i=1}^{k}\text{log}P(C=0|w,c) Ewq(w)logP(C=0∣w,c)=k1i=1klogP(C=0∣w,c)

5. Negative Sampling

如果 k = ∣ V ∣ k=|V| k=V q q q是均匀采样,那么就有 k ⋅ q = 1 k\cdot q=1 kq=1,此时 q ( w ) = 1 k q(w)=\frac{1}{k} q(w)=k1,因此有
P ( C = 0 ∣ w , c ) = 1 p ‾ ( w ∣ c ) + 1 = 1 e x p ( c ⃗ ⋅ w ⃗ ) + 1 P ( C = 1 ∣ w , c ) = p ‾ ( w ∣ c ) p ‾ ( w ∣ c ) + 1 = e x p ( c ⃗ ⋅ w ⃗ ) e x p ( c ⃗ ⋅ w ⃗ ) + 1 \begin{aligned} P(C=0|w,c)=\frac{1}{\overline{p}(w|c)+1}=\frac{1}{exp(\vec{c} \cdot \vec{w})+1}\\ P(C=1|w,c)=\frac{\overline{p}(w|c)}{\overline{p}(w|c)+1}=\frac{exp(\vec{c} \cdot \vec{w})}{exp(\vec{c} \cdot \vec{w})+1} \end{aligned} P(C=0∣w,c)=p(wc)+11=exp(c w )+11P(C=1∣w,c)=p(wc)+1p(wc)=exp(c w )+1exp(c w )

对于设置的噪声分布 q ( w ) q(w) q(w),我们实际上是希望它尽量接近数据分布 p ‾ ( w ∣ c ) \overline{p}(w|c) p(wc) ,否则这个二分类任务就过于简单了,也就无法很好的学到数据特性。而作者通过实验和推导证明,当负样本和正样本数量之比 [公式] 越大,那么我们的 NCE 对于噪声分布好坏的依赖程度也就越小。换句话说,作者建议我们在计算能力运行的条件下,尽可能的增大比值 k k k 。也许这也就是大家都默认将正样本数量设置为 1 的原因:正样本至少取要 1 个,所以最大化比值 k k k,也就是尽可能取更多负样本的同时,将正样本数量取最小值 1。

看很多博客在说,NCE的思想是说最大化区分正负样本,但是我觉得使用softmax其实也是这样的,尽可能的将正负样本区分开来,并没有什么差异。个人觉得,NCE像是把多分类变成了二分类,使用传统的二分类来处理多分类,只不过又了神经网络这种方法可以更好的做拟合。尤其是当NCE把 Z θ Z_\theta Zθ设置为常数的时候,我更加觉得并没有解决这个问题。
在这里插入图片描述


Notes on Noise Contrastive Estimation and Negative Sampling
Noise Contrastive Estimation 前世今生——从 NCE 到 InfoNCE

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐