文章出处: Michael Nielsen的《Neural Network and Deep Learning》,本节译者:哈工大SCIR本科生 冷海涛 。
目录
1、使用神经网络识别手写数字
2、反向传播算法是如何工作的
3、改进神经网络的学习方法
- 改进神经网络的学习方式
- 交叉熵损失函数
- 使用交叉熵损失来分类MNIST数字集
- 交叉熵意味着什么?它从哪里来?
- Softmax
- 过拟合和正则化
- 正则化
- 为什么正则化能够降低过拟合?
- 其他正则化技术
- 参数初始化
- 重温手写数字识别:代码
- 如何选择神经网络的超参数
- 其他技术
4、神经网络能够计算任意函数的视觉证明
5、为什么深度神经网络的训练是困难的
6、深度学习
在本章中我们主要使用交叉熵代价函数来解决学习速度衰退的问题。不过,我想首先简要的介绍一下解决这个问题的另一种方法,这种方法是基于神经元中所谓的 softmax 层。我们并不打算在本章余下的部分使用 softmax 层,所以,如果你很心急,你可以跳过本节直接进入下一节的阅读。然而,softmax 还是很值得理解一下,一方面因为 softmax 在本质上很有趣,另一方面因为我们将要在第六章使用 softmax 层,那时候我们要讨论深度神经网络。
softmax 的主要思想是为我们的神经网络定义一种新的输出层。跟之前的 sigmoid 层一样,它也是对加权输入[1] 进行计算。不一样的地方是,在获取输出结果的时候我们并不使用 sigmoid 函数。取而代之,在 softmax 层中我们使用 softmax 函数 应用到。根据这个函数,第个输出神经元的激活值是
(78)
其中,分母是对所有的输出神经元求和。
如果你对 softmax 函数不熟悉,那么公式(78)可能看上去很难理解。同时也不太能理解为什么我们想要用这个函数以及这个函数如何帮助我们解决学习速度衰退的问题。为了更好的理解公式(78),我们假设有一个包含 4 个输出神经元的神经网络,同时对应 4 个带权的输入,用 表示。下面展示的是可调节的滑块,能够通过调整滑块来展示可能的带权输入以及相对应的输出激活值。我们可以通过逐步增加 来开始我们的探索:
当你增加的时候,你会发现其对应的输出激活值也会增加。同样地,如果减少 那么 也会减少。实际上,如果你仔细观察,可以发现在 增加或者减少的两种情况下,其它3个输出激活值得总体改变,补偿了 的改变。原因是所有的输出激活值加起来必须为。我们可以使用公式(78)以及一点代数知识证明:
(79)
所以,如果 增加,那么其它的输出激活值肯定会总共下降相同的量,来保证 4 个激活值得和仍然为。当然,这个结论也对其它的激活值成立。
公式(78)也表明所有的输出激活值是正的,因为指数函数肯定是正的。结合这点以及上一段的结论,我们可以知道,从 softmax 层得到的输出是一系列相加和为的正数。换言之,从 softmax 层得到的输出可以看做是一个概率分布。
softmax 层的输出是一个概率分布的这个结论是很有价值的。在许多问题中,我们可以很方便地将输出激活值看作是神经网络认为结果是的概率。比如,在 MNIST 分类问题中,我们可以将看作是神经网络认为这个数字是的概率估计。
对比一下,如果输出层是 sigmoid 层,我们并不能假设这些激活值能够作为一个概率分布。我不会证明这个结论,但这个结论应该是合理的。所以如果使用 sigmoid 输出层,我们不能使用 softmax 的结论去解读。
[1]在描述 softmax 的时候,我们会频繁使用上一章介绍过的记号表示。你可能需要重新回顾一下上一章来加强对这些记号的印象。
练习1
构造例子说明在使用 sigmoid 输出层的网络中,输出激活值的和并不一定为。
我们现在开始体会到 softmax 函数及其 softmax 层的表现。回顾一下:公式(78)中的指数函数保证了所有的输出激活值都是正的。同时在公式(78)中的分母求和保证了 softmax 输出和为。现在这个式子应该不再像开始时候那么难以理解了,它用了一种很自然的方式来确保输出的激活值形成一个概率分布。你可以认为 softmax 对进行了重新调节、挤压收放,使得它们形成了一个概率分布。
练习2
softmax 的单调性 – 证明如果,那么是正的,如果,那么是负的。如果我们增加能够保证增加相应的输出激活值,同时会减少其它所有的输出激活值,我们已经通过滑块清楚地看到这个结论,但是现在需要一个严格的证明。
softmax 的非局部性 – sigmoid 层的一个好处是输出是其对应输入的一个函数。解释一下为什么对于 softmax 层并不是这样的情况:任何一个输出激活值依赖于所有的输入。
问题1
反转 softmax 层 – 假设我们有一个带有 softmax 输出层的神经网络,同时已知激活值。证明对应的带权输入的形式为,其中常数是不依赖于的。
学习速度衰退的问题:我们现在已经对神经元的 softmax 层有了一定的认识。但是我们还没有看到 softmax 层如何解决学习速率衰退的问题。为了理解这点,我们先要定义 log-likelihood 代价函数。我们用表示输入网络的训练数据,用表示相应的期待输出。然后对应这个输入的 log-likelihood 代价是
(80)
举例来说,如果我们的训练数据是 MNIST 图像,输入是数字对应的一个图像,那么 log-likelihood 代价是。我们从直觉上来看一下其中的含义:当网络工作得很好时,也就是说对于输入为非常有自信。在这种情况下,它估计一个相应的概率会非常接近,所以代价就会很小。反之,如果网络工作得不是那么好,那么概率会变小,同时代价会变大。所以 log-likelihood 代价函数满足我们对代价函数表现形式的预期。那么关于学习速度衰退的问题呢?为了分析它,回忆一下学习速度衰退的关键因素是数量和的表现情况。我不会完整地推导整个过程——请你们自己完成推导过程——通过一些推导,你可以证明[^2]
(81) (82)
我们得到了前面从交叉熵的分析中得到的类似的等式。比如等式(82)和等式(67)。尽管后者中我们对整个训练样本数据进行了平均,但是它们的确是同样的公式。同时,正如之前分析的那样,这些表达式确保了我们不会遇到学习速度衰退的问题。事实上,我们可以将 softmax 输出层与 log-likelihood 代价函数的搭配,类比成 sigmoid 输出层与交叉熵代价函数的搭配。
考虑到这样的相似性,你是应该选择 sigmoid 输出层搭配交叉熵还是选择 softmax 输出层搭配 log-likelihood 呢?实际上,在许多情景下,两种方法的效果都不错,在本章的剩余部分,我们会使用 sigmoid 输出层搭配交叉熵。后续在第 6 章中,我们有时会使用 softmax 输出层搭配 log-likelihood 代价函数。切换的原因就是让我们后面的网络和一些有影响力的学术论文中的网络更加接近。通常来说,在任何你想要把输出激活值解读成概率的时候,softmax 加上 log-likelihood 总是不错的选择,至少对于没有交集的分类问题(例如 MNIST)来说是这样的。
注意这里我对的使用和之前不太一样。之前的用来表示网络期望的输出,例如,如果输入的图片是则期望的输出是。但在下面的式子中,代表一个与相关的向量,意思是这个向量的第位是,其余位都是。
问题2
- 推导等式(81)和(82)。
- 「softmax」这个名字来源于哪里? – 假设我们改变一下 softmax 函数,使得输出激活值如下
(83)
其中是一个正常数。注意对应到标准的 softmax 函数。但是如果我们使用不同的,我们会得到不同的函数,尽管如此,最后得到的结果也和 softmax 很相似。证明改变以后,也会像通常的 softmax 函数一样形成一个概率分布。假设我们允许非常大,比如,那么输出激活值的极限是什么?在解决了这个问题后,你应该能理解时的函数是一个最大化函数的「softened」版本。这就是术语「softmax」的来源。
- 包含 softmax 和 log-likelihood 的反向传播 – 在上一章,我们推导了包含 sigmoid 层的网络的反向传播算法。为了把这个算法用到包含 softmax 层的网络中,我们需要算出最后一层的误差表达式。证明表达式如下:
(84)
使用这个表达式以后,我们就可以在包含 softmax 输出层和 log-likelihood 代价函数的网络中应用反向传播算法了。
本文来源于哈工大SCIR