参考视频:https://www.youtube.com/watch?v=ErfnhcEV1O8
信息论
Entropy
对于一个事件,每传输 1bit 可将不确定度降低一半
对于一个概率为p的事件,需要传递 xbit(编码长度) 的数据,有
p
=
1
2
x
p=\frac{1}{2^{x}}
p=2x1
故Entropy定义为:
H
(
p
)
=
−
Σ
i
p
i
log
2
(
p
i
)
H(p)=-\Sigma_{i} p_{i} \log _{2}\left(p_{i}\right)
H(p)=−Σipilog2(pi)
表示传递一个信息样本所需要的最小编码长度
Cross-Entropy:
假设现在有一个样本集中两个概率分布p,q,其中p为真实分布,q为非真实分布。
Cross-Entropy定义为:
H
(
p
,
q
)
=
−
Σ
i
p
i
log
2
(
q
i
)
H(p,q)=-\Sigma_{i} p_{i} \log _{2}\left(q_{i}\right)
H(p,q)=−Σipilog2(qi)
其中
log
2
(
1
q
i
)
\log _{2}\left(\frac{1}{q_{i}}\right)
log2(qi1)表示为实际编码长度
故交叉熵表示使用概率分布为q的编码方式传递信息的实际编码长度
深度学习
原理
做softmax后得到q,将label作为p,使用Cross-Entropy,并使该值最小
计算上使用自然对数,简化计算,即
H
(
p
,
q
)
=
−
Σ
i
p
i
log
(
q
i
)
H(p,q)=-\Sigma_{i} p_{i} \log\left(q_{i}\right)
H(p,q)=−Σipilog(qi)
在分类任务中,label为one-hot向量,假设
p
x
=
1
p_{x}=1
px=1,可化简为:
H
(
p
,
q
)
=
−
log
(
q
x
)
H(p,q)=- \log\left(q_{x}\right)
H(p,q)=−log(qx)
PyTorch
默认对一个batch中每个数据做Cross-Entropy后取平均值
import torch
import torch.nn as nn
input = torch.randn(3,3)
target = torch.tensor([0,2,1])
法一:NLLLoss
sm = nn.Softmax(dim=1)
loss = nn.NLLLoss()
loss(torch.log(sm(input)), target)
法一:CrossEntropyLoss = Softmax + NLLLoss
loss = nn.CrossEntropyLoss()
loss(input,target)