softmax与交叉熵损失

文章作者:Tyan
博客:noahsnail.com  |  CSDN  |  简书

0. 测试环境

Python 3.6.9, PyTorch 1.5.0, Numpy 1.16.6

1. Softmax函数

1.1 数学中的Softmax函数

在数学上,尤其是在概率论和相关领域中,Softmax函数,也被称作归一化指数函数,是逻辑函数(Sigmoid函数)的一种推广。在机器学习和深度学习中,Softmax函数的应用非常广泛,常见于分类问题中。

Softmax函数能将一个含任意实数的$K$维向量$\mathbf {z}$“压缩”到另一个$K$维实向量$\sigma(\mathbf {z})$中,使得向量中每一个元素都在$(0,1)$之间,并且所有元素的和为1。Softmax函数的定义如下:$${\sigma (\mathbf {z})}_{j}={\frac {e^{z_j}} {\sum ^{K}_{k=1} e^{z_k}}} \tag{1}$$其中$j=1, …, K.$。假设$K=3$,向量$\mathbf {z}=[z_1, z_2, z_3]=[1, 2, 3]$,则:
$$\begin{array}{l}\
{\sigma (\mathbf {z})}_{1}={\frac {e^{1}} {e^1 + e^2 + e^3}}=\frac {2.72} {30.19}=0.09 \\
{\sigma (\mathbf {z})}_{2}={\frac {e^{2}} {e^1 + e^2 + e^3}}=\frac {7.39} {30.19}=0.24 \\
{\sigma (\mathbf {z})}_{3}={\frac {e^{3}} {e^1 + e^2 + e^3}}=\frac {20.09} {30.19}=0.67
\end{array}$$

上面的计算过程对应的代码实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import math
z = [1, 2, 3]
z_exp = [math.exp(val) for val in z]
print(z_exp)
# [2.718281828459045, 7.38905609893065, 20.085536923187668]
z_exp_sum = sum(z_exp)
print(z_exp_sum)
# 30.19287485057736
softmax = [round(val / z_exp_sum, 2) for val in z_exp]
print(softmax)
# [0.09, 0.24, 0.67]

import numpy as np
z = np.array([1, 2, 3])
print(np.round(np.exp(z) / sum(np.exp(z)), 2))
# [0.09 0.24 0.67]

1.2 神经网络中的Softmax

由于Softmax函数可以将分类输出标准化成各个分类的概率分布,且概率和为1。因此在多分类问题中,通常使用Softmax对神经网络的输出结果进行处理。

在卷积神经网络分类中,最后两层通常是全连接层,因此这里用简单的全连接神经网络来模拟网络的最后两层。如下图:

Softmax

假设问题为一个三分类问题,将图像分为猫、狗、车三类,输入向量$\mathbf{x}=[x_1, x_2, x_3]^T=[1, 2, 3]^T$,$\mathbf{x}$真实标签为车,其标签向量为$\mathbf{y}=[y_1,y_2,y_3]^T=[0, 0, 1]^T$,参数矩阵$$\mathbf{W}=\left [ \begin{array} {l}w_{11} & w_{12} & w_{13} \\ w_{21} & w_{22} & w_{23} \\ w_{31} & w_{32} & w_{33}\end{array} \right ]=\left [ \begin{array} {l}0.1 & 0.2 & 0.3 \\ 0.4 & 0.5 & 0.6 \\ 0.7 & 0.8 & 0.9\end{array} \right ]$$

输出$$\mathbf{a}=\mathbf{Wx}=\left[\begin{array}{l}w_{11}x_1 + w_{12}x_2 + w_{13}x_3 \\ w_{21}x_1 + w_{22}x_2 + w_{23}x_3 \\ w_{31}x_1 + w_{32}x_2 + w_{33}x_3 \end{array}\right]=\left [\begin{array}{l}a_1 \\ a_2 \\ a_3\end{array}\right]=[1.4, 3.2, 5.0]^T$$

对$\mathbf{a}$进行Softmax函数处理后,可得$\mathbf{x}$分类之后的概率输出$$\mathbf{p}=\left [\begin{array}{l} \frac {e^{a_{1}}} {e^{a_{1}} + e^{a_{2}} + e^{a_{3}}} \\ \frac {e^{a_{2}}} {e^{a_{1}} + e^{a_{2}} + e^{a_{3}}} \\ \frac {e^{a_{3}}} {e^{a_{1}} + e^{a_{2}} + e^{a_{3}}} \end{array}\right]=\left [\begin{array}{l}p_1 \\ p_2 \\ p_3\end{array}\right]=[0.02, 0.14, 0.84]^T$$

最终结果如下表所示:

*
y(ground truth) 0 0 1
p(prediction) 0.02 0.14 0.84

这里的Softmax公式为:

2. 交叉熵损失

2.1 交叉熵(cross-entropy)

对于离散分布$p,q$,其交叉熵的定义如下:$$H(p,q)=-\sum ^n_{i=1} p(x_i)\,\log q(x_i) \tag{2}$$

交叉熵来自于信息论中的相对熵(relative entropy),相对熵在概率学和统计学上称为KL散度(Kullback-Leibler divergence),用来度量两个概率分布$p$和$q$的差别。公式如下:$$\begin {array} {l} D_{KL}(p||q)&=\sum ^n_{i=1} p(x_i)log\left(\frac {p(x_i)} {q(x_i)}\right)\\&= \sum ^n_{i=1} p(x_i)log(p(x_i)) - \sum ^n_{i=1} p(x_i)log(q(x_i))\\&=-H(p)+ H(p, q)\end{array}$$

$H(p)$为分布$p$的信息熵,其定义为:$$H(p) = -\sum ^n_{i=1} p(x_i)log(p(x_i))$$

从相对熵的公式上可以看出,其由两部分组成,前一部分为离散分布$p$的信息熵,后一部分为离散分布$p,q$的交叉熵。在图像分类问题中,$p$对应图像的实际分类,其熵是固定的,即KL散度中的$H(p)$不变,因此只需要关注交叉熵即可。

2.2 交叉熵损失函数

由于交叉熵可以度量预测分类和真实分类之间的相似度,因此深度学习中的图像分类经常会用到交叉熵损失函数,其来自交叉熵公式,损失$\mathbf{L}$对应$H(p,q)$,交叉熵的$p(x)$是真实图片类别的概率分布$\mathbf{y}$,即标签向量。$q(x)$是预测图片类别的概率分布,即softmax函数输出的类别概率$\mathbf{p}$。因此单张图片交叉熵损失函数为:$$L=-\sum ^K_{i=1}y_ilog(p_i)\tag{3}$$

$K$是类别数量。$n$张图片的交叉熵损失和为:$$L_{total}=\sum ^{n}_{i=1}L_i \tag{4}$$

在多类别分类问题中(不同于多标签分类),由于图像的实际类别只有一个,因此标签向量为one-hot向量,因此单张图像的交叉熵损失函数会变为:$$L=-y_jlog(p_j)\tag{5}$$

这里的$j$是图像的实际类别,其对应的one-hot向量的第$j$个元素为1,其它为0。代入1.2中的数据到公式3中,由于$y=[0, 0, 1]^T$,因此$\mathbf{x}$交叉熵损失变为:$$\begin {array} {l} L&=-\sum ^K_{i=1}y_ilog(p_i)\\&=-y_1log(p_1)-y_2log(p_2)-y_3log(p_3)\\&=-0*log(0.02) - 0*log(0.14) - 1*log(0.84)\\&=-log(0.84)\\&=0.17 \end {array}$$

这里以$e$为底。

2.3 反向传播

对公式3求偏导:$$\frac {\partial L} {\partial p_{i}} = - \frac {y_i} {p_i}$$

$$\frac {\partial L} {\partial w_{11}} = \frac {\partial L} {\partial p_{1}} \cdot \frac {\partial p_{1}} {\partial a_{1}} \cdot \frac {\partial a_{1}} {\partial w_{11}}$$

$$\frac {\partial L} {\partial p_{1}} = -frac{y_1} {p_1}$$

3. Softmax实现

4. Softmax应用

4.1 图像分类

References

  1. https://zh.wikipedia.org/wiki/Softmax%E5%87%BD%E6%95%B0

  2. https://blog.csdn.net/tsyccnh/article/details/79163834

  3. https://zh.wikipedia.org/wiki/%E4%BA%A4%E5%8F%89%E7%86%B5

  4. https://zh.wikipedia.org/wiki/%E7%9B%B8%E5%AF%B9%E7%86%B5

  5. https://www.zhihu.com/question/294679135

如果有收获,可以请我喝杯咖啡!