机器学习:交叉熵损失函数
1. 世上并无负样本
softmax的标签是一个向量,但是这个向量中只有一个值为1,所以损失函数中也只会有一项是有值的,其他都是0,所以值也都为0。但是交叉熵损失函数中,不管0还是1都是有只的,正样本的时候,值为
log
p
\text{log} p
logp,负样本的时候值为
log
(
1
−
p
)
\text{log}(1-p)
log(1−p)。这就非常的奇怪,为什么负样本有值呢?
其实,我们只要把二分类写成一个向量就可以明白了,正样本有
[
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=i∑ylog y^+(1−y)log (1−y^)
计算每一个样本的损失值,所有样本的值进行累加,就可以得到一个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 (1−y^),这是log函数进行了平移,并且
y
^
\hat{y}
y^的定义域为
0
∼
1
0 \sim 1
0∼1之间。
其实这就可以绘制出损失函数了,这样来了一个正样本,我们就可以通过这个函数计算出损失值,来了一个负样本,也可以计算出一个损失值,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(wo∣wc)是概率模型,给定中心词
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=1∑T−l≤j≤l,j=0∑log p(wt+j∣wt)
通常在最后一层会使用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θ(o∣c)=∑o′∈Vuθ(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θ(o∣c)=∇θlog uθ(o,c)−∇θlog∑uθ(o′,c)=∇θsθ(uo,vc)−∑uθ(o′,c)1∑uθ(o′,c)∇θsθ(uo′,vc)=∇θsθ(uo,vc)−−l≤o≤l∑∑uθ(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(o′∣c)=∑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θ(o∣c)=∇θsθ(uo,vc)−∑p(o′∣c)∇θsθ(uo,vc)=∇θsθ(uo,vc)−Eo′∼p[∇θ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(w∣c)采样出正样本
P
(
w
∣
C
=
1
,
c
)
=
p
‾
(
w
∣
c
)
P(w | C=1,c)=\overline{p}(w|c)
P(w∣C=1,c)=p(w∣c)
然后从
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(w∣C=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(w∣c)表示的是正样本中,给定中心词
c
c
c输出单词
w
w
w的概率,而
P
(
w
∣
c
)
P(w|c)
P(w∣c)表示为正负样本混合后,给定中心词
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(w∣c)=P(w∣C=1,c)P(C=1)+P(w∣C=0,c)P(C=0)=1+k1p(w∣c)+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(w∣C=1)P(C=1)=1+k1p(w∣c)+1+kkq(w)1+k1p(w∣c)=p(w∣c)+kq(w)p(w∣c)
同理可以得到
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(w∣c)+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θ(w∣c)−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(w∣c)1=1+kexp[logpθ(w∣c)−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=1∏PP(C=0∣wp)⋅n=1∏NP(C=1∣wn)=Ew∼p(w∣c)logP(C=1∣w,c)+kEw′∼qlogP(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(w∣c)−logq(w)=logZθexp(c⋅w)−logq(w)=c⋅w−logZθ−log q(w)
式子中依然包含
Z
θ
Z_\theta
Zθ,这跟softmax完全没有差别吗,我感觉就像是换了方式来估计概率,但是依然没有解决核心的问题。所以,NCE就做了两个强假设
- 使用一个参数 z z z来学习 Z θ Z_\theta Zθ,即 Z θ = z Z_\theta=z Zθ=z
- 神经网络中,因为有许多的参数,所以设定 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(w∣c)=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)
Ew∼q(w)logP(C=0∣w,c)=k1i=1∑klogP(C=0∣w,c)
5. Negative Sampling
如果
k
=
∣
V
∣
k=|V|
k=∣V∣且
q
q
q是均匀采样,那么就有
k
⋅
q
=
1
k\cdot q=1
k⋅q=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(w∣c)+11=exp(c⋅w)+11P(C=1∣w,c)=p(w∣c)+1p(w∣c)=exp(c⋅w)+1exp(c⋅w)
对于设置的噪声分布 q ( w ) q(w) q(w),我们实际上是希望它尽量接近数据分布 p ‾ ( w ∣ c ) \overline{p}(w|c) p(w∣c) ,否则这个二分类任务就过于简单了,也就无法很好的学到数据特性。而作者通过实验和推导证明,当负样本和正样本数量之比 [公式] 越大,那么我们的 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
更多推荐
所有评论(0)