1 熵
出现概率p越高的信息,编码长度L越短。这样的话,总的编码长度能够最小化。
L与p之间的关系可以用下图的二分搜索来展示。概率为p的实体,对应的编码长度为
log
2
1
/
p
\log_2{1/p}
log21/p能够将期望编码长度最小化。
熵则是编码长度的期望:
H
=
−
p
log
2
p
H = -p\log_2{p}
H=−plog2p
2 交叉熵和KL散度
交叉熵用来计算非最优分布的期望编码长度。
与最优编码之间的差值称为KL散度:
D
q
(
p
)
=
H
q
(
p
)
−
H
(
p
)
D_q(p)=H_q(p)-H(p)
Dq(p)=Hq(p)−H(p)
一般预测模型中会使用softmax函数将列表转化为概率分布,用来计算交叉熵。
3. 交叉熵损失
二分类问题:假设我们有一堆猫和不是猫的图片,我们用
[
p
猫
,
p
不
是
猫
]
[p_{猫}, p_{不是猫}]
[p猫,p不是猫]的onehot表示作为输出。
针对一张猫的图片,真实的onehot应该是
[
1
,
0
]
[1, 0]
[1,0],因此交叉熵为:
−
l
o
g
(
p
猫
)
-log (p_{猫})
−log(p猫)
针对一张不是猫的图片,真实的onehot应该是
[
0
,
1
]
[0, 1]
[0,1],因此交叉熵为:
−
l
o
g
(
1
−
p
猫
)
-log (1-p_{猫})
−log(1−p猫)
把所有图片求平均即可,可以表示为:
−
Σ
i
(
y
i
l
o
g
p
i
+
(
1
−
y
i
)
l
o
g
(
1
−
p
i
)
)
/
n
-\Sigma_i (y_ilogp_i+(1-y_i)log(1-p_i))/n
−Σi(yilogpi+(1−yi)log(1−pi))/n,其中
y
i
y_i
yi是标签(真的猫为1,假的猫为0)。
在二分类问题下的交叉熵损失又称为BCE-Loss。
我们来看下GAN中的判别损失:
第一步是训练判别器D,真实图片的损失为
−
E
(
l
o
g
D
)
-E(logD)
−E(logD),假图片的损失为
−
E
(
1
−
l
o
g
D
(
G
)
)
-E(1-logD(G))
−E(1−logD(G))
第二步是训练生成器G,目标是经过D后被判别为真的,因此损失为
−
E
(
l
o
g
(
D
(
G
)
)
)
-E(log(D(G)))
−E(log(D(G)))
4. InfoNCE
如果类别特别多,要计算softmax的话会非常耗时,因此改成NCE损失。抽象来说,就是:
原先要计算N分类的概率列表然后结合标签计算交叉熵,现在改成计算标签和预测结果是否匹配的2分类问题(负样本需要随机采样)。
InfoNCE则是将采样出来的k个负样本还是看做k个类,计算交叉熵。InfoNCE loss的任务是一个k+1类的分类任务,目的就是想把样本图片分到标签这个类里。