Softmax

    softmax 的主要思想是为我们的神经网络定义一种新的输出层。跟之前的 sigmoid 层一样,它也是对加权输入z^L<em>j = \sum</em>{k} w^L<em>{jk} a^{L-1}_k + b^L_j进行计算。不一样的地方是,在获取输出结果的时候我们并不使用 sigmoid 函数。取而代之,在 softmax 层中我们使用 _softmax 函数应用到。根据这个函数,第个输出神经元的激活值是

    其中,分母是对所有的输出神经元求和。

    如果你对 softmax 函数不熟悉,那么公式(78)可能看上去很难理解。同时也不太能理解为什么我们想要用这个函数以及这个函数如何帮助我们解决学习速度衰退的问题。为了更好的理解公式(78),我们假设有一个包含 4 个输出神经元的神经网络,同时对应 4 个带权的输入,用表示。下面展示的是可调节的滑块,能够通过调整滑块来展示可能的带权输入以及相对应的输出激活值。我们可以通过逐步增加来开始我们的探索:

    点击前往原作观看交互式动画

    当你增加的时候,你会发现其对应的输出激活值也会增加。同样地,如果减少那么也会减少。实际上,如果你仔细观察,可以发现在增加或者减少的两种情况下,其它3个输出激活值得总体改变,补偿了的改变。原因是所有的输出激活值加起来必须为。我们可以使用公式(78)以及一点代数知识证明:

    所以,如果增加,那么其它的输出激活值肯定会总共下降相同的量,来保证 4 个激活值得和仍然为。当然,这个结论也对其它的激活值成立。

    softmax 层的输出是一个概率分布的这个结论是很有价值的。在许多问题中,我们可以很方便地将输出激活值看作是神经网络认为结果是的概率。比如,在 MNIST 分类问题中,我们可以将看作是神经网络认为这个数字是的概率估计。

    对比一下,如果输出层是 sigmoid 层,我们并不能假设这些激活值能够作为一个概率分布。我不会证明这个结论,但这个结论应该是正确的。所以如果使用 sigmoid 输出层,我们不能使用 softmax 的结论去解读。

    在描述 softmax 的时候,我们会频繁使用上一章介绍过的记号表示。你可能需要重新回顾一下上一章来加强对这些记号的印象。

    • 构造例子说明在使用 sigmoid 输出层的网络中,输出激活值a^L_j的和并不一定为1。
      我们现在开始体会到 softmax 函数及其 softmax 层的表现。回顾一下:公式(78)中的指数函数保证了所有的输出激活值都是正的。同时在公式(78)中的分母求和保证了 softmax 输出和为。现在这个式子应该不再像开始时候那么难以理解了,它用了一种很自然的方式来确保输出的激活值形成一个概率分布。你可以认为 softmax 对进行了重新调节、挤压收放,使得它们形成了一个概率分布。
    • softmax 的单调性 - 证明如果j = k,那么\partial a^L_j / \partial z^L_k是正的,如果j \neq k,那么\partial a^L_j / \partial z^L_k是负的。如果我们增加z^L_j能够保证增加相应的输出激活值a^L_j,同时会减少其它所有的输出激活值,我们已经通过滑块清楚地看到这个结论,但是现在需要一个严格的证明。

    • softmax 的非局部性 - sigmoid 层的一个好处是输出a^Lj是其对应输入的一个函数a^L_j = \sigma(z^L_j)。解释一下为什么对于 softmax 层并不是这样的情况:任何一个输出激活值a^L_j依赖于所有_的输入。

    举例来说,如果我们的训练数据是 MNIST 图像,输入是数字对应的一个图像,那么 log-likelihood 代价是。我们从直觉上来看一下其中的含义:当网络工作得很好时,也就是说对于输入为非常有自信。在这种情况下,它估计一个相应的概率会非常接近,所以代价就会很小。反之,如果网络工作得不是那么好,那么概率会变小,同时代价会变大。所以 log-likelihood 代价函数满足我们对代价函数表现形式的预期。

    我们得到了前面从交叉熵的分析中得到的类似的等式。比如等式(82)和等式(67)。尽管后者中我们对整个训练样本数据进行了平均,但是它们的确是同样的公式。同时,正如之前分析的那样,这些表达式确保了我们不会遇到学习速度衰退的问题。事实上,我们可以将 softmax 输出层与 log-likelihood 代价函数的搭配,类比成 sigmoid 输出层与交叉熵代价函数的搭配。

    考虑到这样的相似性,你是应该选择 sigmoid 输出层搭配交叉熵还是选择 softmax 输出层搭配 log-likelihood 呢?实际上,在许多情景下,两种方法的效果都不错,在本章的剩余部分,我们会使用 sigmoid 输出层搭配交叉熵。后续在第 6 章中,我们有时会使用 softmax 输出层搭配 log-likelihood 代价函数。切换的原因就是让我们后面的网络和一些有影响力的学术论文中的网络更加接近。通常来说,在任何你想要把输出激活值解读成概率的时候,softmax 加上 log-likelihood 总是不错的选择,至少对于没有交集的分类问题(例如 MNIST)来说是这样的。

    2 注意这里我对的使用和之前不太一样。之前的用来表示网络期望的输出,例如,如果输入的图片是则期望的输出是。但在下面的式子中,代表一个与相关的向量,意思是这个向量的第位是,其余位都是。

    • 推导等式(81)和(82)。

    • 「softmax」这个名字来源于哪里? - 假设我们改变一下 softmax 函数,使得输出激活值如下

    其中是一个正常数。注意对应到标准的 softmax 函数。但是如果我们使用不同的,我们会得到不同的函数,尽管如此,最后得到的结果也和 softmax 很相似。证明改变以后,也会像通常的 softmax 函数一样形成一个概率分布。假设我们允许非常大,比如,那么输出激活值的极限是什么?在解决了这个问题后,你应该能理解时的函数是一个最大化函数的「softened」版本。这就是术语「softmax」的来源。

    • 包含 softmax 和 log-likelihood 的反向传播 - 在上一章,我们推导了包含 sigmoid 层的网络的反向传播算法。为了把这个算法用到包含 softmax 层的网络中,我们需要算出最后一层的误差表达式\delta^L_j \equiv \partial C / \partial z^L_j。证明表达式如下: