点击阅读原文
翻译:@左钊

前言:本文在翻译过程中,为了便于理解,某些句子可能和原文有一定的出入。但是整体上没有太大的改动,由于本人水平有限,翻译或者理解不对的地方,欢迎指正,不胜感激。

Softmax 分类函数

本例子包括以下内容:

上一个例子中,我们介绍了如何利用 logistic 函数来处理二分类问题。

对于多分类问题,在处理多项式 logistic 回归(multinomial logistic regression)中,用到 logistic 函数的一种扩展形式,叫做 softmax 函数。下面的内容将会介绍 softmax 函数及其求导方式。

首先,导入需要用到的 python 库函数。

  1. # Python imports
  2. import numpy as np # Matrix and vector computation package
  3. import matplotlib.pyplot as plt # Plotting library
  4. from matplotlib.colors import colorConverter, ListedColormap # some plotting functions
  5. from mpl_toolkits.mplot3d import Axes3D # 3D plots
  6. from matplotlib import cm # Colormaps
  7. # Allow matplotlib to plot inside this notebook
  8. %matplotlib inline

1. Softmax 函数

在上个例子中,我们介绍了logistic 函数 ,但是它只能用于处理二分类问题 $t=1$ 或者 $t=0$。现在我们来介绍它的一个推广的形式, softmax 函数,在多分类问题中它能够输出每个类别的预测概率。 softamx 函数 (译)神经网络基础(2):Softmax 分类函数 - 图1 的输入是一个 $C$-维的向量(译)神经网络基础(2):Softmax 分类函数 - 图2 ,输出也是一个 $C$-维的向量 (译)神经网络基础(2):Softmax 分类函数 - 图3 的每个元素都是介于$0$ 和 $1$ 的一个实数值。这个函数形式为归一化的指数函数,定义如下:

(译)神经网络基础(2):Softmax 分类函数 - 图4

其中,分母 (译)神经网络基础(2):Softmax 分类函数 - 图5 作为一个正则化矩阵,确保所有类别的概率值和为 1: (译)神经网络基础(2):Softmax 分类函数 - 图6.
在神经网络中,softmax 函数一般作为最后的输出层,所以 softmax 函数可以图形化地表示为一个拥有 $C$ 个节点的神经层。

对于给定输入 (译)神经网络基础(2):Softmax 分类函数 - 图7 ,我们可以按照下面的公式计算每个类别的概率:
(译)神经网络基础(2):Softmax 分类函数 - 图8

对于给定的输入 (译)神经网络基础(2):Softmax 分类函数 - 图9 就是该样本预测属于类别 $c$ 的概率。

以一个二分类问题为例:对于输入 (译)神经网络基础(2):Softmax 分类函数 - 图10, 输出预测属于类别 1 的概率(译)神经网络基础(2):Softmax 分类函数 - 图11 如下图所示。输出预测为另一个类别 (译)神经网络基础(2):Softmax 分类函数 - 图12 的概率值大小刚好和图中结果互补。

  1. # Define the softmax function
  2. def softmax(z):
  3. return np.exp(z) / np.sum(np.exp(z))
  1. # Plot the softmax output for 2 dimensions for both classes
  2. # Plot the output in function of the weights
  3. # Define a vector of weights for which we want to plot the ooutput
  4. nb_of_zs = 200
  5. zs = np.linspace(-10, 10, num=nb_of_zs) # input
  6. zs_1, zs_2 = np.meshgrid(zs, zs) # generate grid
  7. y = np.zeros((nb_of_zs, nb_of_zs, 2)) # initialize output
  8. # Fill the output matrix for each combination of input z's
  9. for i in range(nb_of_zs):
  10. for j in range(nb_of_zs):
  11. y[i,j,:] = softmax(np.asarray([zs_1[i,j], zs_2[i,j]]))
  12. # Plot the cost function surfaces for both classes
  13. fig = plt.figure()
  14. # Plot the cost function surface for t=1
  15. ax = fig.gca(projection='3d')
  16. surf = ax.plot_surface(zs_1, zs_2, y[:,:,0], linewidth=0, cmap=cm.coolwarm)
  17. ax.view_init(elev=30, azim=70)
  18. cbar = fig.colorbar(surf)
  19. ax.set_xlabel('$z_1$', fontsize=15)
  20. ax.set_ylabel('$z_2$', fontsize=15)
  21. ax.set_zlabel('$y_1$', fontsize=15)
  22. ax.set_title ('$P(t=1|\mathbf{z})$')
  23. cbar.ax.set_ylabel('$P(t=1|\mathbf{z})$', fontsize=15)
  24. plt.grid()
  25. plt.show()

(译)神经网络基础(2):Softmax 分类函数 - 图13

2. softmax 函数求导

为了在神经网络中使用 softmax 函数,我们需要对它进行求导。假设我们定义 $\SigmaC = \sum{d=1}^C e^{z_d} 。\text{for} ; c = 1 \cdots C$ ,预测属于类别 $c$ 的概率值 $y_c = e^{z_c} / \Sigma_C$, 那么输出 $\mathbf{y}$ 对输入 $\mathbf{z}$ 的导数 ${\partial y_i}/{\partial z_j}$ 可以写成下面形式:

(译)神经网络基础(2):Softmax 分类函数 - 图14

注意,若 $i = j$ ,那么求导结果和 logistic 函数是一样的。

3. softmax 函数的交叉熵损失函数

首先我们看一下似然函数: 和 logistic 回归的损失函数一样,似然函数表示对于给定的模型参数集 $\theta$ ,模型能够正确预测输入样本的可能性。最大化似然函数可以写成下面的形式:

(译)神经网络基础(2):Softmax 分类函数 - 图15

根据似然函数的定义,(译)神经网络基础(2):Softmax 分类函数 - 图16可以写成联合概率 的方式,在给定参数 $\theta$ 时,模型产生 $t$ 和 $z$ 的概率: (译)神经网络基础(2):Softmax 分类函数 - 图17 ,这个又可以写成下面形式:

(译)神经网络基础(2):Softmax 分类函数 - 图18

由于我们并不需要关心 $\mathbf{z}$ 的概率,上式可以简化为:
(译)神经网络基础(2):Softmax 分类函数 - 图19. 所以对于给定的 $\theta$ ,可以写成 (译)神经网络基础(2):Softmax 分类函数 - 图20.

由于每个样本的类别 $t_i$ 都是和整个输入 $\mathbf{z}$ 相关的,而且 $\mathbf{t}$ 中有且只有一个类别会激活该函数,所以可以将上面的概率函数写成下面的形式:

(译)神经网络基础(2):Softmax 分类函数 - 图21

译者注:原文没有提到,但是我认为作者说的只有一个类别会激活 cross-entropy 损失函数的意思是指, $\mathbf{t}$ 是一个 one-hot 向量,只有真实类别所对应的那个元素取值为1, 其他元素取值为0。

和之前在 logistic 函数中提到的那样,最大化似然函数等价于最小化负的对数似然函数:

(译)神经网络基础(2):Softmax 分类函数 - 图22

译者注:原文中的交叉熵损失函数的公式和我上面写的是不一样的,原文中是这样: (译)神经网络基础(2):Softmax 分类函数 - 图23
但我不太理解下面从 $i=c$ 开始是什么意思。我认为应该是我上面写的 类别 $c$ 从 1 到 $C$,不知道是作者笔误还是我理解错了。

这就是我们所说的交叉熵损失函数 $\xi$.

对于二分类问题 $t_2 = 1 - t_1$,这个结果和之前在 logistic 回归中的损失函数是一样的:
(译)神经网络基础(2):Softmax 分类函数 - 图24

那么对于一批数量为 $n$ 的样本集,交叉熵损失函数计算如下:

(译)神经网络基础(2):Softmax 分类函数 - 图25

其中当样本 $i$ 属于类别 $c$ 的时候, $t{ic}$ 取值为 1(否则为0)。$y{ic}$ 表示对于输入样本 $i$ ,模型输出属于类别 $c$ 的概率大小。

4. softmax 函数的交叉熵损失函数求导

损失函数对 softmax 函数的输入 $z_i$ 进行求导: (译)神经网络基础(2):Softmax 分类函数 - 图26 ,推导如下:

译者注:注意下标的含义,在上面我们用 $i$ 表示第 $i$ 个样本,用 $c$ 表示类别。但是这里下标 $j$ 表示预测的类别, $i$ 表示样本的真实类别。

(译)神经网络基础(2):Softmax 分类函数 - 图27

注意,前面我们已经推导过 (译)神经网络基础(2):Softmax 分类函数 - 图28 .

从上面结果可以看出,和 logistic 回归中一样,交叉熵损失函数对所有类别 $i \in C$ 的样本求导结果都是一样的: (译)神经网络基础(2):Softmax 分类函数 - 图29

This post at peterroelants.github.io is generated from an IPython notebook file. Link to the full IPython notebook file