损失函数|交叉熵损失函数

  

1 交叉熵(Cross Entropy)

  考虑一种情况,对于一个样本集,存在两个概率分布 $p(x)$ 和 $q(x)$,其中 $p(x)$ 为真实分布$q(x)$ 为非真实分布。基于真实分布 $p(x)$ 我们可以计算这个样本集的信息熵也就是编码长度的期望为:
    $H(p)=-\sum \limits_{x}p(x)log \ p(x)$
  回顾一下负对数项表征了所含的信息量,如果我们用非真实分布 $q(x)$ 来代表样本集的信息量的话,那么:
    $H(p,q)=-\sum \limits_{x}p(x)log \ q(x)$
  因为其中表示信息量的项来自于非真实分布 $q(x)$ ,而对其期望值的计算采用的是真实分布 $p(x)$,所以称其为交叉熵 。
  Cross Entropy损失函数常用于分类问题中,但是为什么它会在分类问题中这么有效呢?先从一个简单的分类例子来入手。

2 预测政治倾向例子

  我们希望根据一个人的年龄、性别、年收入等相互独立的特征,来预测一个人的政治倾向,有三种可预测结果:民主党、共和党、其他党。假设我们当前有两个逻辑回归模型(参数不同),这两个模型都是通过 Sigmoid 的方式得到对于每个预测结果的概率值:
  模型1

  

  模型1对于样本1和样本2以非常微弱的优势判断正确,对于样本3的判断则彻底错误。
  模型2 

  

  模型2对于样本1和样本2判断非常准确,对于样本3判断错误,但是相对来说没有错得太离谱。
  有了模型之后,需要通过定义损失函数来判断模型在样本上的表现,那么可以定义哪些损失函数呢?

3 损失函数

3.1 分类错误率(Classification Error)

  分类错误率是最为直接的损失函数,定义为:
    ${\large  classification \quad error=\frac{count \quad of \quad error \quad items}{count\quad of\quad all\quad items }} $
  模型 1:${\large \text { classification error }=\frac{1}{3}} $
  模型 2:${\large \text { classification error }=\frac{1}{3}} $
  模型 1 和模型 2 虽然都是预测错了 1 个,但是相对来说模型 2 表现得更好,损失函数值照理来说应该更小。但是,$\text { classification error }$ 并不能判断出来,所以这种损失函数虽然好理解,但表现不太好。

3.2 均方误差 (Mean Squared Error)

  均方误差损失也是一种比较常见的损失函数,其定义为:$M S E=\frac{1}{n} \sum \limits_{i}^{n}\left(\hat{y}_{i}-y_{i}\right)^{2}$
  模型1:
    $\begin{array}{l} \text { sample } 1 \text { loss }=(0.3-0)^{2}+(0.3-0)^{2}+(0.4-1)^{2}=0.54 \\ \text { sample } 2 \operatorname{loss}=(0.3-0)^{2}+(0.4-1)^{2}+(0.3-0)^{2}=0.54 \\ \text { sample } 3 \text { loss }=(0.1-1)^{2}+(0.2-0)^{2}+(0.7-0)^{2}=1.34 \end{array}$
  对所有样本的 $loss$ 求平均:
    ${\large M S E=\frac{0.54+0.54+1.34}{3}=0.81} $
  模型2:
    $\begin{array}{l} \text { sample } 1 \text { loss }=(0.1-0)^{2}+(0.2-0)^{2}+(0.7-1)^{2}=0.14 \\ \text { sample } 2 \operatorname{loss}=(0.1-0)^{2}+(0.7-1)^{2}+(0.2-0)^{2}=0.14 \\ \text { sample } 3 \operatorname{loss}=(0.3-1)^{2}+(0.4-0)^{2}+(0.3-0)^{2}=0.74 \end{array}$
  对所有样本的 $loss$ 求平均:
    $M S E=\frac{0.14+0.14+0.74}{3}=0.34$
  显然 MSE 能够判断出来模型 2 优于模型 1,那为什么不采样这种损失函数呢?主要原因是逻辑回归配合 MSE 损失函数时,采用梯度下降法进行学习时,会出现模型一开始训练时,学习速率非常慢的情况(MSE损失函数)。
  有了上面的直观分析,可以清楚的看到,对于分类问题的损失函数来说,分类错误率和均方误差损失都不是很好的损失函数,下面我们来看一下交叉熵损失函数的表现情况。

3.3 交叉熵损失函数(Cross Entropy Loss Function)

  (1) 二分类
  在二分的情况下,模型最后需要预测的结果只有两种情况,对于每个类别我们的预测得到的概率为 $p$ 和 $1-p$ ,此时表达式为:
    $L=\frac{1}{N} \sum \limits _{i} L_{i}=\frac{1}{N} \sum \limits_{i}-\left[y_{i} \cdot \log \left( \ p_{i}\right)+\left(1-y_{i}\right) \cdot \log \left(1-p_{i}\right)\right]$
  其中:
    -$y_{i}$ 表示样本 $i$ 的 $label$, 正类为 $1$ , 负类为 $0$。
    -$p_{i} $ 表示样本 $i $ 预测为正类的概率。
  (2) 多分类
  多分类的情况实际上就是对二分类的扩展:
    $L=\frac{1}{N} \sum \limits _{i} L_{i}=\frac{1}{N} \sum \limits _{i}-\sum \limits _{c=1}^{M} y_{i c} \log \left(p_{i c}\right)$
  其中:
    -$M $ 一一 类别的数量
    -$y_{i c}$ 一一符号函数 $ (0\   或 \ 1 )$,如果样本 $ i $ 的真实类别等于 $c $ 取 $1$ , 否则取 $0$。
    -$p_{i c} $ 一一观测样本 $i$ 属于类别 $c$ 的预测概率
  现在我们利用这个表达式计算上面例子中的损失函数值:
  模型1:
    $\begin{array}{l} \text { sample } 1 \text { loss }=-(0 \times \log 0.3+0 \times \log 0.3+1 \times \log 0.4)=0.91 \\ \text { sample } 2 \text { loss }=-(0 \times \log 0.3+1 \times \log 0.4+0 \times \log 0.3)=0.91 \\ \text { sample } 3 \text { loss }=-(1 \times \log 0.1+0 \times \log 0.2+0 \times \log 0.7)=2.30 \end{array}$
  对所有样本的 $loss$ 求平均:
   ${\large L=\frac{0.91+0.91+2.3}{3}=1.37} $
  模型2:
    $\begin{array}{l} \text { sample } 1 \text { loss }=-(0 \times \log 0.1+0 \times \log 0.2+1 \times \log 0.7)=0.35 \\ \text { sample } 2 \text { loss }=-(0 \times \log 0.1+1 \times \log 0.7+0 \times \log 0.2)=0.35 \\ \text { sample } 3 \text { loss }=-(1 \times \log 0.3+0 \times \log 0.4+0 \times \log 0.4)=1.20 \end{array}$
  对所有样本的 $loss$ 求平均:
    ${\large L=\frac{0.35+0.35+1.2}{3}=0.63} $
  可以发现,交叉熵损失函数可以捕捉到模型 1 和模型 2 预测效果的差异。

4 函数性质
  
  可以看出,该函数是凸函数,求导时能够得到全局最优值。

5 学习过程

  交叉熵损失函数经常用于分类问题中,特别是在神经网络做分类问题时,也经常使用交叉熵作为损失函数,此外,由于交叉熵涉及到计算每个类别的概率,所以交叉熵几乎每次都和 Sigmoid(或 Softmax )函数一起出现。
  我们用神经网络最后一层输出的情况,来看一眼整个模型预测、获得损失和学习的流程:

  1. 神经网络最后一层得到每个类别的得分 scores(也叫logits);
  2. 该得分经过 Sigmoid( 或 Softmax ) 函数获得概率输出;
  3. 模型预测的类别概率输出与真实类别的 one hot 形式进行交叉熵损失函数的计算。

  学习任务分为二分类和多分类情况,我们分别讨论这两种情况的学习过程。

5.1 二分类情况

  

  二分类交叉熵损失函数学习过程
  如上图所示,求导过程可分成三个子过程,即拆成三项偏导的乘积:
    ${\large \frac{\partial L_{i}}{\partial w_{i}}=\frac{1}{N} \frac{\partial L_{i}}{\partial w_{i}}=\frac{1}{N} \frac{\partial L_{i}}{\partial p_{i}} \cdot \frac{\partial p_{i}}{\partial s_{i}} \cdot \frac{\partial s_{i}}{\partial w_{i}}} $
  计算第一项:${\large \frac{\partial L_{i}}{\partial p_{i}}} $
    ${\large L_{i}=-\left[y_{i} \cdot \log \left(\ p_{i}\right)+\left(1-y_{i}\right) \cdot \log \left(1-p_{i}\right)\right]} $
  其中:
    -$y_{i}$ 表示样本 $i$ 的 $label$, 正类为 $1$ , 负类为 $0$。
    -$p_{i} $ 表示样本 $i $ 预测为正类的概率。
    ${\large \begin{aligned} \frac{\partial L_{i}}{\partial p_{i}} &=\frac{\partial-\left[y_{i} \cdot \log \left(p_{i}\right)+\left(1-y_{i}\right) \cdot \log \left(1-p_{i}\right)\right]}{\partial p_{i}} \\ &=-\frac{y_{i}}{p_{i}}-\left[\left(1-y_{i}\right) \cdot \frac{1}{1-p_{i}} \cdot(-1)\right] \\ &=-\frac{y_{i}}{p_{i}}+\frac{1-y_{i}}{1-p_{i}} \end{aligned}} $
  计算第二项:${\large \frac{\partial p_{i}}{\partial s_{i}}} $
  这一项要计算的是 Sigmoid 函数对于 score 的导数,我们先回顾一下 Sigmoid 函数和分数求导的公式:

    ${\large p=\sigma(s)=\frac{e^{s}}{1+e^{s}}} $
    ${\large f^{\prime}(x)=\frac{g(x)}{h(x)}=\frac{g^{\prime}(x) h(x)-g(x) h^{\prime}(x)}{h^{2}(x)}} $
    ${\large \begin{aligned} \frac{\partial p_{i}}{\partial s_{i}} &=\frac{\left(e^{s_{i}}\right)^{\prime} \cdot\left(1+e^{s_{i}}\right)-e^{s_{i}} \cdot\left(1+e^{s_{i}}\right)^{\prime}}{\left(1+e^{s_ {i}}\right)^{2}} \\ &=\frac{e^{s_{i}} \cdot\left(1+e^{s_{i}}\right)-e^{s_{i}} \cdot e^{s_{i}}}{\left(1+e^{s_{i}}\right)^{2}} \\ &=\frac{e^{s_{i}}}{\left(1+e^{s_{i}}\right)^{2}} \\ &=\frac{e^{s_{i}}}{1+e^{s_{i}}} \cdot \frac{1}{1+e^{s_{i}}} \\ &=\sigma\left(s_{i}\right) \cdot\left[1-\sigma\left(s_{i}\right)\right] \end{aligned}} $

  计算第三项:${\large\frac{\partial s_{i}}{\partial w_{i}}}$
  一般来说,scores 是输入的线性函数作用的结果,所以有:
    ${\large \frac{\partial s_{i}}{\partial w_{i}}=x_{i}} $
  计算结果 ${\large\frac{\partial L_{i}}{\partial w_{i}}} $
    ${\large \begin{aligned} \frac{\partial L_{i}}{\partial w_{i}} &=\frac{\partial L_{i}}{\partial p_{i}} \cdot \frac{\partial p_{i}}{\partial s_{i}} \cdot \frac{\partial s_{i}}{\partial w_{i}} \\ &=\left[-\frac{y_{i}}{p_{i}}+\frac{1-y_{i}}{1-p_{i}}\right] \cdot \sigma\left(s_{i}\right) \cdot\left[1-\sigma\left(s_{i}\right)\right] \cdot x_{i} \\ &=\left[-\frac{y_{i}}{\sigma\left(s_{i}\right)}+\frac{1-y_{i}}{1-\sigma\left(s_{i}\right)}\right] \cdot \sigma\left(s_{i}\right) \cdot\left[1-\sigma\left(s_{i}\right)\right] \cdot x_{i} \\ &=\left[-\frac{y_{i}}{\sigma\left(s_{i}\right)} \cdot \sigma\left(s_{i}\right) \cdot\left(1-\sigma\left(s_{i}\right)\right)+\frac{1-y_{i}}{1-\sigma\left(s_{i}\right)} \cdot \sigma\left(s_{i}\right) \cdot\left(1-\sigma\left(s_{i}\right)\right)\right] \cdot x_{i} \\ &=\left[-y_{i}+y_{i} \cdot \sigma\left(s_{i}\right)+\sigma\left(s_{i}\right)-y_{i} \cdot \sigma\left(s_{i}\right)\right] \cdot x_{i} \\ &=\left[\sigma\left(s_{i}\right)-y_{i}\right] \cdot x_{i} \end{aligned}} $
  可以看到,我们得到了一个非常漂亮的结果,所以,使用交叉熵损失函数,不仅可以很好的衡量模型的效果,又可以很容易的的进行求导计算。

6 优缺点  

  优点
  在用梯度下降法做参数更新的时候,模型学习的速度取决于两个值:一、学习率;二、偏导值。其中,学习率是我们需要设置的超参数,所以我们重点关注偏导值。从上面的式子中,我们发现,偏导值的大小取决于$x_i$和 $[\sigma(s)-y]$,我们重点关注后者,后者的大小值反映了我们模型的错误程度,该值越大,说明模型效果越差,但是该值越大同时也会使得偏导值越大,从而模型学习速度更快。所以,使用逻辑函数得到概率,并结合交叉熵当损失函数时,在模型效果差的时候学习速度比较快,在模型效果好的时候学习速度变慢。
  缺点
  Deng [4]在2019年提出了ArcFace Loss,并在论文里说了Softmax Loss的两个缺点:1、随着分类数目的增大,分类层的线性变化矩阵参数也随着增大;2、对于封闭集分类问题,学习到的特征是可分离的,但对于开放集人脸识别问题,所学特征却没有足够的区分性。对于人脸识别问题,首先人脸数目(对应分类数目)是很多的,而且会不断有新的人脸进来,不是一个封闭集分类问题。
  另外,sigmoid(softmax)+cross-entropy loss 擅长于学习类间的信息,因为它采用了类间竞争机制,它只关心对于正确标签预测概率的准确性,忽略了其他非正确标签的差异,导致学习到的特征比较散。基于这个问题的优化有很多,比如对softmax进行改进,如L-Softmax、SM-Softmax、AM-Softmax等。

 

参考文献

1:损失函数|交叉熵损失函数

 

posted @ 2021-07-20 15:52  图神经网络  阅读(1668)  评论(0编辑  收藏  举报
Live2D