交叉熵的来龙去脉
这个链接是一个很好的交叉熵的使用的连接,建议阅读前,先学习这一篇中的内容。
https://blog.csdn.net/tsyccnh/article/details/79163834
首先,我们要明了一下,什么是信息量,信息量一般用什么表示?
−
l
o
g
(
p
(
x
i
)
)
-log(p(x_i))
−log(p(xi))
其过程是将log进行了一个倒置。
当
p
(
x
i
)
p(x_i)
p(xi)越小,就越小,就越说明这个事情代表的意义越大,发生少的事情突然发生了,就能带来比较大的信息量。
用-log曲线,恰巧能将这个过程扭曲一下。
其次,信息熵是什么东西呢?
信息熵是当前这个变量的期望。
它的计算方式是
−
p
(
x
i
)
l
o
g
(
p
(
x
i
)
)
-p(x_i)log(p(x_i))
−p(xi)log(p(xi))
当然
x
i
x_i
xi不可能只有一个,那么就要考虑到求和问题:
∑
i
n
−
p
(
x
i
)
l
o
g
(
p
(
x
i
)
)
\sum^n_i-p(x_i)log(p(x_i))
∑in−p(xi)log(p(xi))
之所以这样相加,是要解决所有信息熵的问题
最后,KL散度是什么东西呢?
KL散度是衡量在做什么呢?
D
K
L
(
p
∣
∣
q
)
=
∑
i
=
1
n
p
(
x
i
)
l
o
g
(
p
(
x
i
)
q
(
x
i
)
)
D_{KL}(p||q) = \displaystyle\sum_{i=1}^np(x_{i})log(\frac{p(x_{i})}{q(x_{i})})
DKL(p∣∣q)=i=1∑np(xi)log(q(xi)p(xi))
其中
p
(
x
i
)
p(x_i)
p(xi)是真正的分布,而
q
(
x
i
)
q(x_{i})
q(xi)可以理解问用算法学习出来的分布。
那么,在这个过程中,我们可以意识到,当分布越接近,就p/q越接近1,因而其值理论上也就越小。
接下来,可以对KL散度进行一个变形,那KL散度就发生了变形。
它会做什么呢?
D
K
L
(
p
∣
∣
q
)
=
∑
i
=
1
n
p
(
x
i
)
l
o
g
(
p
(
x
i
)
)
−
∑
x
i
n
p
(
x
i
)
l
o
g
(
q
(
x
i
)
)
D_{KL}(p||q)=\displaystyle\sum^{n}_{i=1}p(x_i)log(p(x_i)) -\displaystyle\sum^{n}_{x_i}p(x_i)log(q(x_i))
DKL(p∣∣q)=i=1∑np(xi)log(p(xi))−xi∑np(xi)log(q(xi))
这个时候,我们可以发现前半部分,
∑
i
=
1
n
p
(
x
i
)
l
o
g
(
p
(
x
i
)
)
\displaystyle\sum^{n}_{i=1}p(x_i)log(p(x_i))
i=1∑np(xi)log(p(xi))其实就是熵。
由于对于原始分布来说,这部分的熵是肯定不变的,所以我们不再考虑这部分的信息。
而后者的信息就足为珍贵了,所以我们只要关注式子的后半部分就行。
∑
x
i
n
p
(
x
i
)
l
o
g
(
q
(
x
i
)
)
\displaystyle\sum^{n}_{x_i}p(x_i)log(q(x_i))
xi∑np(xi)log(q(xi))
在线型回归问题中,一般用 l o s s = 1 2 m ∑ i = 1 m ( y i − y ‾ ) 2 loss = \frac{1}{2m}\displaystyle\sum^{m}_{i=1}(y_i-\overline{y})^2 loss=2m1i=1∑m(yi−y)2,也就是平均方差误差做loss.
那对于分类问题呢?
对于分类问题,其实只分为两类。
l
o
s
s
=
−
∑
i
=
1
n
y
i
l
o
g
(
y
^
i
)
loss = - \sum^{n}_{i=1}y_ilog(\hat y_i)
loss=−∑i=1nyilog(y^i)
对于一个batch来说,,
l
o
s
s
=
−
1
m
∑
j
=
1
m
∑
i
=
1
n
y
i
j
l
o
g
(
y
i
j
^
)
loss = -\frac{1}{m} \sum_{j=1}^{m} \sum_{i=1}^{n}y_{ij} log( \hat {y_{ij}})
loss=−m1∑j=1m∑i=1nyijlog(yij^)
其中m代表每个batch的数量,而n代表所有种类的数量。
其逻辑是,针对某一值,计算其关于所有种类的期望,希望这个值尽可能的小。
多分类中的交叉熵的使用
有的分类任务被叫做多分类,因为一张图片可能会归属于好几个类。
那个时候,其实pred已经不能通过softmax来计算了。
而是针对于每个label用pred来计算,再进行计算简化。
则
l
o
s
s
=
−
y
l
o
g
(
y
^
)
−
(
1
−
y
)
l
o
g
(
l
−
y
^
)
loss = -ylog(\hat{y})-(1-y)log(l-\hat{y})
loss=−ylog(y^)−(1−y)log(l−y^)
这种情况只针对一一个logistic输出的类别,而最后还是要考虑到总共的数量和总共的batch的数量。
那么什么是softmax函数呢?
就是这个玩意儿。
其中softmax的用法就是
S
i
=
e
i
∑
j
e
j
S_i=\frac{e^i}{\sum_je^j}
Si=∑jejei
如上图所示,就是一个很普通的softmax的使用过程。
接下来进行softmax的反向梯度求导
这部分简易参考[手打例子,一步一步带你去softmax]中的softmax部分(https://www.jianshu.com/p/ffa51250ba2e)
假设经过logits后,进入了一个