原文:链接
    我们知道卷积神经网络(CNN)在图像领域的应用已经非常广泛了,一般一个 CNN 网络主要包含卷积层,池化层(pooling),全连接层,损失层等。虽然现在已经开源了很多深度学习框架(比如 MxNet,Caffe 等),训练一个模型变得非常简单,但是你对这些层具体是怎么实现的了解吗?你对 softmax,softmax loss,cross entropy 了解吗?相信很多人不一定清楚。虽然网上的资料很多,但是质量参差不齐,常常看得眼花缭乱。为了让大家少走弯路,特地整理了下这些知识点的来龙去脉,希望不仅帮助自己巩固知识,也能帮到他人理解这些内容。

    这一篇主要介绍全连接层和损失层的内容,算是网络里面比较基础的一块内容。先理清下从全连接层到损失层之间的计算。来看下面这张图,来自参考资料 1(自己实在懒得画图了)。
    CNN系列之softmax,softmax loss和cross entropy的讲解 - 图1

    这张图的等号左边部分就是全连接层做的事,W 是全连接层的参数,我们也称为权值,X 是全连接层的输入,也就是特征。从图上可以看出特征 X 是 N_1 的向量,这是怎么得到的呢?这个特征就是由全连接层前面多个卷积层和池化层处理后得到的,假设全连接层前面连接的是一个卷积层,这个卷积层的输出是 100 个特征(也就是我们常说的 feature map 的 channel 为 100),每个特征的大小是 4_4,那么在将这些特征输入给全连接层之前会将这些特征 flat 成 N1 的向量(这个时候 N 就是 1004*4=1600)。解释完 X,再来看 W,W 是全连接层的参数,是个 T_N 的矩阵,这个 N 和 X 的 N 对应,T 表示类别数,比如你是 7 分类,那么 T 就是 7。我们所说的训练一个网络,对于全连接层而言就是寻找最合适的 W 矩阵。因此全连接层就是执行 WX 得到一个 T1 的向量(也就是图中的 logits[T1]),这个向量里面的每个数都没有大小限制的,也就是从负无穷大到正无穷大。然后如果你是多分类问题,一般会在全连接层后面接一个 softmax 层, 这个 softmax 的输入是 T1 的向量,输出也是 T1 的向量(也就是图中的 prob[T_1],这个向量的每个值表示这个样本属于每个类的概率),只不过输出的向量的每个值的大小范围为 0 到 1。

    现在你知道 softmax 的输出向量是什么意思了,就是概率,该样本属于各个类的概率!

    那么 softmax 执行了什么操作可以得到 0 到 1 的概率呢?先来看看 softmax 的公式:

    CNN系列之softmax,softmax loss和cross entropy的讲解 - 图2

    公式非常简单,前面说过 softmax 的输入是 WX,假设模型的输入样本是 I,讨论一个 3 分类问题(类别用 1,2,3 表示),样本 I 的真实类别是 2,那么这个样本 I 经过网络所有层到达 softmax 层之前就得到了 WX,也就是说 WX 是一个 31 的向量,那么上面公式中的 aj 就表示这个 31 的向量中的第 j 个值(最后会得到 S1,S2,S3);而分母中的 ak 则表示 3_1 的向量中的 3 个值,所以会有个求和符号(这里求和是 k 从 1 到 T,T 和上面图中的 T 是对应相等的,也就是类别数的意思,j 的范围也是 1 到 T)。因为 e^x 恒大于 0,所以分子永远是正数,分母又是多个正数的和,所以分母也肯定是正数,因此 Sj 是正数,而且范围是 (0,1)。 如果现在不是在训练模型,而是在测试模型,那么当一个样本经过 softmax 层并输出一个 T_1 的向量时,就会取这个向量中值最大的那个数的 index 作为这个样本的预测标签。

    因此我们训练全连接层的 W 的目标就是使得其输出的 WX 在经过 softmax 层计算后其对应于真实标签的预测概率要最高。

    举个例子:假设你的 WX=[1,2,3],那么经过 softmax 层后就会得到[0.09,0.24,0.67],这三个数字表示这个样本属于第 1,2,3 类的概率分别是 0.09,0.24,0.67。

    ———————————–华丽的分割线——————————————

    弄懂了 softmax,就要来说说 softmax loss 了。
    那 softmax loss 是什么意思呢? 如下:

    CNN系列之softmax,softmax loss和cross entropy的讲解 - 图3

    首先 L 是损失。Sj 是 softmax 的输出向量 S 的第 j 个值,前面已经介绍过了,表示的是这个样本属于第 j 个类别的概率。yj 前面有个求和符号,j 的范围也是 1 到类别数 T,因此y 是一个 1*T 的向量,里面的 T 个值,而且只有 1 个值是 1,其他 T-1 个值都是 0。那么哪个位置的值是 1 呢?答案是真实标签对应的位置的那个值是 1,其他都是 0。所以这个公式其实有一个更简单的形式:

    CNN系列之softmax,softmax loss和cross entropy的讲解 - 图4

    当然此时要限定 j 是指向当前样本的真实标签。

    来举个例子吧。假设一个 5 分类问题,然后一个样本 I 的标签 y=[0,0,0,1,0],也就是说样本 I 的真实标签是 4,假设模型预测的结果概率(softmax 的输出)p=[0.1,0.15,0.05,0.6,0.1],可以看出这个预测是对的,那么对应的损失 L=-log(0.6),也就是当这个样本经过这样的网络参数产生这样的预测 p 时,它的损失是 - log(0.6)。那么假设 p=[0.15,0.2,0.4,0.1,0.15],这个预测结果就很离谱了,因为真实标签是 4,而你觉得这个样本是 4 的概率只有 0.1(远不如其他概率高,如果是在测试阶段,那么模型就会预测该样本属于类别 3),对应损失 L=-log(0.1)。那么假设 p=[0.05,0.15,0.4,0.3,0.1],这个预测结果虽然也错了,但是没有前面那个那么离谱,对应的损失 L=-log(0.3)。我们知道 log 函数在输入小于 1 的时候是个负数,而且log 函数是递增函数,所以 - log(0.6) < -log(0.3) < -log(0.1)。简单讲就是你预测错比预测对的损失要大,预测错得离谱比预测错得轻微的损失要大。

    ———————————–华丽的分割线———————————–

    理清了 softmax loss,就可以来看看 cross entropy 了。
    corss entropy 是交叉熵的意思,它的公式如下:

    CNN系列之softmax,softmax loss和cross entropy的讲解 - 图5

    是不是觉得和 softmax loss 的公式很像。当 cross entropy 的输入 P 是 softmax 的输出时,cross entropy 等于 softmax loss。Pj 是输入的概率向量 P 的第 j 个值,所以如果你的概率是通过 softmax 公式得到的,那么 cross entropy 就是 softmax loss。这是我自己的理解,如果有误请纠正。