pytorch构建深度网络的基本概念——交叉熵

文章目录

  • 交叉熵
    • 什么是熵
    • 交叉熵
  • 举个例子

交叉熵

在上一篇讲梯度下降的文章中,那个例子提到了损失函数,那里用到的损失函数是均方误差,因为那个例子里的模型特别的简化。
而在一般的深度学习模型中,使用的损失计算函数一般是使用交叉熵。
在pytorch中是使用函数torch.nn.CrossEntropyLoss()来定义。

什么是熵

提到熵之前,我们要先提到一个信息学中的重要概念:信息量

  • 信息量是指一个事件的不确定性。一个事件发生的概率越大,不确定性越小,则它所携带的信息量就越小。也就是说概率越大,不确定性就越小,这个比较好理解,因为如果一件事情是一个大概率事件,也就没有什么好预测的,就没有信息量了。所以爆炸性,突发性,概率低的事情才会引起注意力,因为有足够的信息量。
  • 那离散型的随机变量来举例,毕竟图像里面不管是分类还是分割都是离散型的人物。假设一个事件 X = x 0 X=x_0 X=x0的概率是 p ( x 0 ) p(x_0) p(x0)
    那么这个事件的信息量定义就是:
    I ( x 0 ) = − l o g ( p ( x 0 ) I(x_0)=-log(p(x_0) I(x0)=log(p(x0)
    如果一件事情的发生概率是1,那么信息量就是0。

有了信息量的概率之后,就可以定义熵了。熵是用来衡量一个系统的混乱程度的,代表一个系统中信息量的总和;信息量总和越大,表明这个系统不确定性就越大。综合很好理解,如果一个离散变量里面总共有n种可能。那么对于一个随机变量,熵的定义就是:
H ( X ) = ∑ i = 1 n − l o g ( p ( x i ) ) = − ∑ i = 1 n l o g ( p ( x i ) ) H(X)=\sum_{i=1}^n{-log(p(x_i))}=-\sum_{i=1}^n{log(p(x_i))} H(X)=i=1nlog(p(xi))=i=1nlog(p(xi))

交叉熵

上面提到的信息熵的概念只针对一个随机变量。而交叉熵的定义是针对两个随机变量,用于描述实际输出(概率)与期望输出(概率)的距离。
假设期望输出(训练)用随机变量 P P P来表示,实际输出(模型的预测输出)用随机变量 Q Q Q来表示。
那么这个交叉熵的定义就是:
H ( P , Q ) = − ∑ i = 1 n p ( x ) l o g ( q ( x i ) ) H(P,Q)=-\sum_{i=1}^n{p(x)log(q(x_i))} H(P,Q)=i=1np(x)log(q(xi))

这个公式的物理含义就是:如果交叉熵越低,就表示两个分布信息量差距不大,就越接近。
所以,在深度学习模型训练中,损失函数定义为交叉熵,目标正好就是要降低交叉熵,也就是损失函数,从物理含义上来说就是要使预测分部更接近于真实的数据分布(训练数据集)。

举个例子

和梯度下降算法一样,在真实的模型训练中,都是通过一个batch的样本数据去进行训练的,假设这个batch的大小为 m m m

简单起见,假设模型是一个二分类的网络,我们来套一下上面的公式:
把公式中的n换成样本大小m:
H ( P , Q ) = − ∑ i = 1 m p ( x ) l o g ( q ( x i ) ) H(P,Q)=-\sum_{i=1}^m{p(x)log(q(x_i))} H(P,Q)=i=1mp(x)log(q(xi))

p ( P = p 0 ) = c n t ( P = p 0 ) / m p(P=p_0) = cnt(P=p_0)/m p(P=p0)=cnt(P=p0)/m
p ( P = p 1 ) = c n t ( P = p 1 ) / m p(P=p_1) = cnt(P=p_1)/m p(P=p1)=cnt(P=p1)/m
p ( Q = q 0 ) = c n t ( Q = q 0 ) / m p(Q=q_0) = cnt(Q=q_0)/m p(Q=q0)=cnt(Q=q0)/m
p ( Q = q 1 ) = c n t ( Q = q 1 ) / m p(Q=q_1) = cnt(Q=q_1)/m p(Q=q1)=cnt(Q=q1)/m

带入到公式中计算一下就可以了。
如果是多种分类,就一个一个算就行了。

你可能感兴趣的:(人工智能,pytorch,交叉熵,信息熵,信息量)