《神经网络和深度学习》系列文章三十一:其他技术

文章出处: Michael Nielsen的《Neural Network and Deep Learning》,本节译者:朱小虎 、张广宇。


目录

1、使用神经网络识别手写数字

2、反向传播算法是如何工作的

3、改进神经网络的学习方法

  • 改进神经网络的学习方式
  • 交叉熵损失函数
  • 使用交叉熵损失来分类MNIST数字集
  • 交叉熵意味着什么?它从哪里来?
  • Softmax
  • 过拟合和正则化
  • 正则化
  • 为什么正则化能够降低过拟合?
  • 其他正则化技术
  • 参数初始化
  • 重温手写数字识别:代码
  • 如何选择神经网络的超参数
  • 其他技术

4、神经网络能够计算任意函数的视觉证明

5、为什么深度神经网络的训练是困难的

6、深度学习


随机梯度下降的变化形式


​通过反向传播进行的随机梯度下降已经在 MNIST 数字分类问题上有了很好的表现。然而,还有很多其他的观点来优化代价函数,有时候,这些方法能够带来比在小批量的随机梯度下降更好的效果。本节,我会介绍两种观点,Hessian 和 momentum 技术。


Hessian 技术:为了更好地讨论这个技术,我们先把神经网络放在一边。相反,我直接思考最小化代价函数  的抽象问题,其中  是多个参数的函数,,所以 。借助于泰勒展开式,代价函数可以在点  处被近似为:


(103)


我们可以将其压缩为:


  (104)


其中  是通常的梯度向量, 就是矩阵形式的Hessian 矩阵,其中第  项就是 。假设我们通过丢弃更高阶的项来近似 


  (105)


使用微积分,我们可证明右式表达式可以进行最小化。严格地说,对此是一个最小值,而不仅仅是一个极值,我们需要假设 Hessian 矩阵是正定的。直观地说,这意味着函数  看起来局部像一个山谷,而不是一座山或一个马鞍。,选择:


  (106)


根据公式105 是代价函数的比较好的近似表达式,我们期望从点  移动到  可以显著地降低代价函数的值。这就给出了一种优化代价函数的可能的算法:


  • 选择开始点,
  • 更新  到新点 ,其中 Hessian  和 在  处计算出来的;
  • 更新  到新点 ,其中 Hessian  和 在  处计算出来的


实际应用中,公式105 是唯一的近似,并且选择更小的步长会更好。我们通过重复地使用改变量  来 改变 ,其中  就是学习率。


这个最小化代价函数的方法常常被称为Hessian 技术或者 Hessian 优化。在理论上和实践中的结果都表明 Hessian 方法比标准的梯度下降方法收敛速度更快。特别地,通过引入代价函数的二阶变化信息,可以让 Hessian 方法避免在梯度下降中常碰到的多路径(pathologies)问题。而且,反向传播算法的有些版本也可以用于计算 Hessian。


如果 Hessian 优化这么厉害,为何我们这里不使用它呢?不幸的是,尽管 Hessian 优化有很多可取的特性,它其实还有一个不好的地方:在实践中很难应用。这个问题的部分原因在于 Hessian 矩阵的太大了。假设你有一个  个权重和偏置的网络。那么对应的Hessian 矩阵会有  个元素。这真的是太大了!所以在实践中,计算  就极其困难。不过,这并不表示学习理解它没有用了。实际上,有很多受到 Hessian 优化启发的梯度下降的变种,能避免产生太大矩阵的问题。让我们看看其中一个称为基于 momentum 梯度下降的方法。

基于 momentum 的梯度下降: 直觉上看,Hessian 优化的优点是它不仅仅考虑了梯度,而且还包含梯度如何变化的信息。基于 momentum 的梯度下降就基于这个直觉,但是避免了二阶导数的矩阵的出现。为了理解 momentum 技术,想想我们关于梯度下降的原始图片,其中我们研究了一个球滚向山谷的场景。那时候,我们发现梯度下降,除了这个名字外,就类似于球滚向山谷的底部。momentum 技术修改了梯度下降的两处使之类似于这个物理场景。


  • 首先,为我们想要优化的参数引入了一个称为速度(velocity)的概念。梯度的作用就是改变速度,而不是直接的改变位置,就如同物理学中的力改变速度,只会间接地影响位置。
  • 第二,momentum 方法引入了一种摩擦力的项,用来逐步地减少速度。


让我们给出更加准确的数学描述。我们引入速度变量 ,其中每一个对应  变量(在一个神经网络中, 变量当然也包括所有的权重和偏置)。然后我们将梯度下降更新规则  改成

  (107)

  (108)


在这些方程中, 是用来控制阻碍或者摩擦力的量的超参数。为了理解这个公式,可以考虑一下当  的时候,对应于没有任何摩擦力。所以,此时你可以看到力  改变了速度,,速度随后再控制  变化率。直觉上看,我们通过重复地增加梯度项来构造速度。这表示,如果梯度在某些学习的过程中几乎在同样的方向,我们可以得到在那个方向上比较大的移动量。想想看,如果我们直接按坡度下降,会发生什么:



每一步速度都不断增大,所以我们会越来越快地达到谷底。这样就能够确保 momentum 技术比标准的梯度下降运行得更快。当然,这里也会有问题,一旦达到谷底,我们就会跨越过去。或者,如果梯度本该快速改变而没有改变,那么我们会发现自己在错误的方向上移动太多了。这就是在 公式107 中使用 这个超参数的原因了。前面提到, 可以控制系统中的摩擦力大小;更加准确地说,你应该将  看成是摩擦力的量。当 时,没有摩擦,速度完全由梯度  决定。相反,若是 ,就存在很大的摩擦,速度无法叠加,公式107 和公式108 就变成了通常的梯度下降,。在实践中,使用  和  之间的 值可以给我们避免过量而又能够叠加速度的好处。我们可以使用 hold out 验证数据集来选择合适的  值,就像我们之前选择 和  那样。


我到现在也没有把  看成是超参数。原因在于  的标准命名不大好:它叫做moment co-efficient。这其实很让人困惑,因为  并不是物理学那个叫做动量(momentum)的东西。并且,它更像摩擦力的概念。然而,现在这个术语已经被大家广泛使用了,所以我们继续使用它。

关于 momentum 技术的一个很好的特点是它基本上不需要改变太多梯度下降的代码就可以实现。我们可以继续使用反向传播来计算梯度,就和前面那样,使用随机选择的 minibatch的方法。这样的话,我们还是能够从 Hessian 技术中学到的优点的——使用梯度如何改变的信息。也仅仅需要进行微小的调整。实践中,momentum 技术很常见,也能够带来学习速度的提升。


练习

  • 如果我们使用  会有什么问题?
  • 如果我们使用会有什么问题?


问题

  • 增加基于 momentum 的随机梯度下降到 network2.py中。

其他优化代价函数的方法:很多其他的优化代价函数的方法也被提出来了,并没有关于哪种最好的统一意见。当你越来越深入了解神经网络时,值得去尝试其他的优化技术,理解他们工作的原理,优势劣势,以及在实践中如何应用。前面我提到的一篇论文Yann LeCun(1998),介绍并对比了这些技术,包含共轭梯度下降和 BFGS 方法(也可以看看 limited memory BFGS)。另一种近期效果很不错技术 Ilya(2012),是Nesterov 的加速梯度技术,这个技术对 momentum 技术进行了改进。然而,对很多问题,标准的随机梯度下降算法,特别当 momentum 用起来后就可以工作得很好了,所以我们会继续在本书后面使用随机梯度下算法。


人工神经元的其他模型


到现在,我们使用的神经元都是 S 型神经元。理论上讲,从这样类型的神经元构建起来的神经网络可以计算任何函数。实践中,使用其他模型的神经元有时候会超过 S 型网络。取决于不同的应用,基于其他类型的神经元的网络可能会学习得更快,更好地泛化到测试集上,或者可能两者都有。让我们给出一些其他的模型选择,便于了解常用的模型上的变化。可能最简单的变种就是 tanh(发音为 “tanch”)神经元,使用双曲正切(hyperbolic tangent)函数替换了 S 型函数。


  (109)


这其实和 S 型神经元关系相当密切。回想一下  函数的定义:


  (110)


进行简单的代数运算,我们可以得到


  (111)


也就是说, 仅仅是 S 型函数的按比例变化版本。我们同样也能用图像看看 的形状:


这两个函数之间的一个差异就是  神经元的输出的值域是  而非 。这意味着如果你构建基于  神经元,你可能需要正规化最终的输出(取决于应用的细节,还有你的输入),跟 sigmoid 网络略微不同。


类似于 S 型神经元,基于 tanh 神经元的网络可以在理论上,计算任何将输入映射到  的函数(对于 tanh 和 S 型神经元,以及下面要讨论的修正线性神经元,这个说法有一些技术上的预先声明。然而,非正式地,通常可以把神经网络看做可以以任意精度近似任何函数)。而且,诸如反向传播和随机梯度下降这样的想法也能够轻松地用在tanh 神经元构成的网络上的。

练习

–  证明公式~111。


那么你应该在网络中使用什么类型的神经元呢,tanh 还是 S 型?实话讲,确实并没有先验的答案!然而,存在一些理论论点和实践证据表明 tanh 有时候表现更好。例如,看看Yann LeCun(1998),以及Xavier Glorot(2010)。让我简要介绍一下其中关于 tanh 的一个理论观点。假设我们使用 S 型神经元,所有激活值都是正数。让我们考虑一下权重  输入到第  层的第  个神经元上。反向传播的规则告诉我们相关的梯度是 。因为所有的激活值都是正数,所以梯度的符号就和  一致。这意味着如果  为正,那么所有的权重  都会在梯度下降时减少,而如果  为负,那么所有的权重  都会在梯度下降时增加。换言之,针对同一的神经元的所有权重都会或者一起增加或者一起减少。这就有问题了,因为某些权重可能需要有相反的变化。这样的话,只能是某些输入激活值有相反的符号才可能出现。所以,我们用 tanh 替换就能够达到这个目的。因此,因为 tanh 是关于 对称的,,我们甚至期望,大概地,隐藏层的激活值能够在正负间保持平衡。这样其实可以保证对权重更新没有系统化的单方面的偏置。


我们应当如何看待这个论点?尽管论点是建设性的,但它还只是一个启发式的规则,而非严格证明说 tanh 就一定超过 sigmoid 函数。可能 sigmoid 神经元还有其他的特性能够补偿这个问题?实际上,对很多任务,tanh 在实践中给出了微小的甚至没有性能提升。不幸的是,我们还没有快速准确的规则说哪种类型的神经元对某种特定的应用学习得更快,或者泛化能力最强。


另一个变化形式就是修正线性神经元(rectified linear neuron)或者修正线性单元(rectified linear unit),简记为 ReLU。输入为 ,权重向量为 ,偏置为  的 ReLU 神经元的输出是:

  (112)


图像上看,函数  是这样的:

显然,这样的神经元和 sigmoid 和 tanh 都不一样。然而,ReLU 也是能够用来计算任何函数的,也可以使用反向传播算法和随机梯度下降进行训练。


什么时候应该使用 ReLU 而非其他神经元呢?一些近期的图像识别上的研究工作 Kevin(2009),Xavier Glorot(2011), 以及Alex Krizhevsky(2012)。 注意这些论文提供了关于如何设置输出层、代价函数、用修正线性单元规范化网络的重要细节。我在这简短的描述中敷衍地带过了这些细节。这些论文也详细讨论了使用修正线性单元的好处和缺点。另一篇提供有用信息的论文Vinod Nair(2010)。然而,就像 tanh 神经元那样,我们还没有一个关于什么时候 什么原因 ReLU 表现更好的深度的理解。为了让你感受一下这个问题,回想起 sigmoid 神经元在饱和时停止学习的问题,也就是输出接近  或者  的时候。在这章我们也反复看到了问题就是  降低了梯度,减缓了学习。Tanh 神经元也有类似的问题。对比一下,提高 ReLU 的带权输入并不会导致其饱和,所以就不存在前面那样的学习速度下降。另外,当带权输入是负数的时候,梯度就消失了,所以神经元就完全停止了学习。这就是很多有关理解 ReLU 何时何故更优的问题中的两个。


我已经给出了一些不确定性的描述,指出我们现在还没有一个坚实的理论来解释如何选择激活函数。实际上,这个问题比我已经讲过的还要困难,因为其实是有无穷多的可能的激活函数。所以对给定问题,什么激活函数最好?什么激活函数会导致学习最快?哪个能够给出最高的测试准确率?其实现在并没有太多真正深刻而系统的研究工作。理想中,我们会有一个理论告诉人们,准确细致地,如何选择我们的激活函数。另外,我们不应该让这种缺失阻碍我们学习和应用神经网络!我们已经有了一些强大的工作,可以使用它们完成很多的研究工作。本书剩下的部分中,我会继续使用 S 型神经元作为首选,因为他们其实是强大的也给出了具体关于神经网络核心思想的示例。但是你需要记住的是,这些同样的想法也都可以用在其他类型的神经元上,有时候的确会有一些性能的提升。


有关神经网络的故事

问题: 你怎么看那些全部由实验效果支撑(而非数学保证)的使用和研究机器学习技术呢?同样,在哪些场景中,你已经注意到这些技术失效了?Yann LeCun 的回答: 你需要认识到,我们的理论工具的缺乏。有时候,我们有很好的关于某些特定的技术应该可行的数学直觉。有时候我们的直觉最终发现是错误的。这个问题其实是:我的方法在这个特定的问题的工作得多好,还有方法表现好的那些问题的范围有多大。


曾经我参加量子力学基础的会议时,我注意到让我最好奇的口头表达:在报告结束时,听众的问题通常是以“我对你的观点很赞同,但是…”开始。量子力学基础不是我的擅长领域,我注意到这种类型的质疑,因为在其他的科学会议上,我很少(或者说,从未)听到这种同情。那时候,我思考了这类问题存在的原因,实际上是因为这个领域中很少有重大的进展,人们都是停在原地。后来,我意识到,这个观念相当的尖刻。发言人正在尝试解决一些人们所遇到的一些最难的问题。进展当然会非常缓慢!但是,听听人们目前正在思考的方式也是非常有价值的,即使这些尝试不一定会有无可置疑的新进展。


你可能会注意到类似于“我对你的观点很赞同,但是…”的话语。为了解释我们已经看到的情况,我通常会使用“启发式地,…”或者“粗略地讲,…”,然后接上解释某个现象或者其他问题的故事。这些故事是可信的,但是实验性的证据常常是不够充分的。如果你通读研究文献,你会发现在神经网络研究中很多类似的表达,基本上都是没有太过充分的支撑证据的。所以我们应该怎样看待这样的故事呢?


在科学的很多分支——尤其是那些解决相当简单现象的领域——很容易会得到一些关于很一般的假说的非常扎实非常可靠的证据。但是在神经网络中,存在大量的参数和超参数及其间极其复杂的交互。在这样复杂系统中,构建出可靠的一般的论断就尤其困难。在完全一般性上理解神经网络实际上,和量子力学基础一样,都是对人类思维极限的挑战。实际上,我们通常是和一些一般的理论的具体的实例在打交道——找到正面或者反面的证据。所以,这些理论在有新的证据出现时,也需要进行调整甚至丢弃。


对这种情况的一种观点是——任何启发式的关于神经网络的论点会带来一个挑战。例如, Alex Krizhevsky在解释 dropout 工作原因的时候说到:“这个技术减少了复杂的神经元之间的互适应,因为一个神经元不能够依赖于特定其他神经元的存在。因此,这个就强制性地让我们学习更加健壮的在很多不同的神经元的随机子集的交集中起到作用的那些特征。”这是一个丰富而又争议的假说,我们可以根据这个观点发展出一系列的研究项目,搞清楚哪些部分真的,哪些是假的,那个需要变化和改良。实际上,有一小部分研究人员正在调查dropout(和其他变体)试着理解其工作的机制,还有 dropout 的极限所在。所以,这些研究也跟随着那些我们已经讨论过的启发式想法。每个启发式想法不仅仅是一个(潜在的)解释,同样也是一种更加细化地调查和理解的挑战。


当然,对某个单独的人去研究所有这些启发式想法其实在时间上是不允许的。需要神经网络的研究群体花费数十年(或者更多)来发展出一个相当强大,基于证据的关于神经网络工作的原理的理论。那么这是不是就意味着我们应当因为它的不严格和无法充分地证明而放弃启发式规则么?不!实际上,我们需要这样的启发式想法来启迪和指导我们的思考。这有点像大航海时代:早期的探险家在一种重要的指导方式都有错误的前提下有时候都进行了探索(并作出了新的发现)。后来,这些错误在我们对地理知识的清晰后而被纠正过来。当你对某件事理解不深时——就像探险家对地理的理解和我们现在对神经网络的理解——忽略一些相对严格的纠正每一步思考而胆大地探索若干问题显得更加重要。所以你应该将这些故事看成是一种关于我们如何思考神经网络的有用的指导,同时保留关于这些想法的能力极限的合理的关注,并细致地跟踪对任何一个推理的证据的强弱。换言之,我们需要很好的故事来不断地激励和启发自己去勇敢地探索,同时使用严格的深刻的调查来发现真理。


本文来源于哈工大SCIR

原文链接点击即可跳转


哈工大SCIR
哈工大SCIR

哈尔滨工业大学社会计算与信息检索研究中心

入门理论神经网络深度学习反向传播DNNMNISTsoftmaxSGD交叉熵哈工大Michael Nielsen
暂无评论
暂无评论~