《神经网络和深度学习》系列文章三十一:其他技术
出处: Michael Nielsen的《Neural Network and Deep Learning》,点击末尾“阅读原文”即可查看英文原文。
声明:我们将在每周四连载该书的中文翻译。
本节译者:朱小虎 、张广宇。转载已获得译者授权,禁止二次转载。
使用神经网络识别手写数字
反向传播算法是如何工作的
改进神经网络的学习方法
改进神经网络的学习方式
交叉熵损失函数
用交叉熵解决手写数字识别问题
交叉熵意味着什么?它从哪里来?
Softmax
过拟合
正则化
为什么正则化能够降低过拟合?
其他正则化技术
权重初始化
重温手写数字识别:代码
如何选择神经网络的超参数
其他技术
神经网络能够计算任意函数的视觉证明
为什么深度神经网络的训练是困难的
深度学习
随机梯度下降的变化形式
通过反向传播进行的随机梯度下降已经在 MNIST 数字分类问题上有了很好的表现。然而,还有很多其他的观点来优化代价函数,有时候,这些方法能够带来比在小批量的随机梯度下降更好的效果。本节,我会介绍两种观点,Hessian 和 momentum 技术。
Hessian 技术:为了更好地讨论这个技术,我们先把神经网络放在一边。相反,我直接思考最小化代价函数
我们可以将其压缩为:
其中
第
使用微积分,我们可证明右式表达式可以进行最小化。严格地说,对此是一个最小值,而不仅仅是一个极值,我们需要假设 Hessian 矩阵是正定的。直观地说,这意味着函数
根据公式 是代价函数的比较好的近似表达式,我们期望从点
选择开始点,
; 更新
到新点 ,其中 Hessian 和
在处计算出来的; 更新
到新点 ,其中 Hessian 和 在 处计算出来的
实际应用中,公式 是唯一的近似,并且选择更小的步长会更好。我们通过重复地使用改变量
这个最小化代价函数的方法常常被称为Hessian 技术或者 Hessian 优化。在理论上和实践中的结果都表明 Hessian 方法比标准的梯度下降方法收敛速度更快。特别地,通过引入代价函数的二阶变化信息,可以让 Hessian 方法避免在梯度下降中常碰到的多路径(pathologies)问题。而且,反向传播算法的有些版本也可以用于计算 Hessian。
如果 Hessian 优化这么厉害,为何我们这里不使用它呢?不幸的是,尽管 Hessian 优化有很多可取的特性,它其实还有一个不好的地方:在实践中很难应用。这个问题的部分原因在于 Hessian 矩阵的太大了。假设你有一个
基于 momentum 的梯度下降: 直觉上看,Hessian 优化的优点是它不仅仅考虑了梯度,而且还包含梯度如何变化的信息。基于 momentum 的梯度下降就基于这个直觉,但是避免了二阶导数的矩阵的出现。为了理解 momentum 技术,想想我们关于梯度下降的原始图片,其中我们研究了一个球滚向山谷的场景。那时候,我们发现梯度下降,除了这个名字外,就类似于球滚向山谷的底部。momentum 技术修改了梯度下降的两处使之类似于这个物理场景。
首先,为我们想要优化的参数引入了一个称为速度(velocity)的概念。梯度的作用就是改变速度,而不是直接的改变位置,就如同物理学中的力改变速度,只会间接地影响位置。
第二,momentum 方法引入了一种摩擦力的项,用来逐步地减少速度。
让我们给出更加准确的数学描述。我们引入速度变量
在这些方程中,
每一步速度都不断增大,所以我们会越来越快地达到谷底。这样就能够确保 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 型函数。
这其实和 S 型神经元关系相当密切。回想一下
进行简单的代数运算,我们可以得到
也就是说,
这两个函数之间的一个差异就是
类似于 S 型神经元,基于 tanh 神经元的网络可以在理论上,计算任何将输入映射到
练习
– 证明公式~。
那么你应该在网络中使用什么类型的神经元呢,tanh 还是 S 型?实话讲,确实并没有先验的答案!然而,存在一些理论论点和实践证据表明 tanh 有时候表现更好。例如,看看Yann LeCun(1998),以及Xavier Glorot(2010)。让我简要介绍一下其中关于 tanh 的一个理论观点。假设我们使用 S 型神经元,所有激活值都是正数。让我们考虑一下权重
我们应当如何看待这个论点?尽管论点是建设性的,但它还只是一个启发式的规则,而非严格证明说 tanh 就一定超过 sigmoid 函数。可能 sigmoid 神经元还有其他的特性能够补偿这个问题?实际上,对很多任务,tanh 在实践中给出了微小的甚至没有性能提升。不幸的是,我们还没有快速准确的规则说哪种类型的神经元对某种特定的应用学习得更快,或者泛化能力最强。
另一个变化形式就是修正线性神经元(rectified linear neuron)或者修正线性单元(rectified linear unit),简记为 ReLU。输入为
图像上看,函数
显然,这样的神经元和 sigmoid 和 tanh 都不一样。然而,ReLU 也是能够用来计算任何函数的,也可以使用反向传播算法和随机梯度下降进行训练。
什么时候应该使用 ReLU 而非其他神经元呢?一些近期的图像识别上的研究工
作 Kevin(2009),Xavier Glorot(2011), 以及Alex Krizhevsky(2012)。 注意这些论文提供了关于如何设置输出层、代价函数、用修正线性单元规范化网络的重要细节。我在这简短的描述中敷衍地带过了这些细节。这些论文也详细讨论了使用修正线性单元的好处和缺点。另一篇提供有用信息的论文Vinod Nair(2010)。然而,就像 tanh 神经元那样,我们还没有一个关于什么时候 什么原因 ReLU 表现更好的深度的理解。为了让你感受一下这个问题,回想起 sigmoid 神经元在饱和时停止学习的问题,也就是输出接近
我已经给出了一些不确定性的描述,指出我们现在还没有一个坚实的理论来解释如何选择激活函数。实际上,这个问题比我已经讲过的还要困难,因为其实是有无穷多的可能的激活函数。所以对给定问题,什么激活函数最好?什么激活函数会导致学习最快?哪个能够给出最高的测试准确率?其实现在并没有太多真正深刻而系统的研究工作。理想中,我们会有一个理论告诉人们,准确细致地,如何选择我们的激活函数。另外,我们不应该让这种缺失阻碍我们学习和应用神经网络!我们已经有了一些强大的工作,可以使用它们完成很多的研究工作。本书剩下的部分中,我会继续使用 S 型神经元作为首选,因为他们其实是强大的也给出了具体关于神经网络核心思想的示例。但是你需要记住的是,这些同样的想法也都可以用在其他类型的神经元上,有时候的确会有一些性能的提升。
有关神经网络的故事
问题: 你怎么看那些全部由实验效果支撑(而非数学保证)的使用和研究机器学习技术呢?同样,在哪些场景中,你已经注意到这些技术失效了?
Yann LeCun 的回答: 你需要认识到,我们的理论工具的缺乏。有时候,我们有很好的关于某些特定的技术应该可行的数学直觉。有时候我们的直觉最终发现是错误的。这个问题其实是:我的方法在这个特定的问题的工作得多好,还有方法表现好的那些问题的范围有多大。
曾经我参加量子力学基础的会议时,我注意到让我最好奇的口头表达:在报告结束时,听众的问题通常是以“我对你的观点很赞同,但是…”开始。量子力学基础不是我的擅长领域,我注意到这种类型的质疑,因为在其他的科学会议上,我很少(或者说,从未)听到这种同情。那时候,我思考了这类问题存在的原因,实际上是因为这个领域中很少有重大的进展,人们都是停在原地。后来,我意识到,这个观念相当的尖刻。发言人正在尝试解决一些人们所遇到的一些最难的问题。进展当然会非常缓慢!但是,听听人们目前正在思考的方式也是非常有价值的,即使这些尝试不一定会有无可置疑的新进展。
你可能会注意到类似于“我对你的观点很赞同,但是…”的话语。为了解释我们已经看到的情况,我通常会使用“启发式地,…”或者“粗略地讲,…”,然后接上解释某个现象或者其他问题的故事。这些故事是可信的,但是实验性的证据常常是不够充分的。如果你通读研究文献,你会发现在神经网络研究中很多类似的表达,基本上都是没有太过充分的支撑证据的。所以我们应该怎样看待这样的故事呢?
在科学的很多分支——尤其是那些解决相当简单现象的领域——很容易会得到一些关于很一般的假说的非常扎实非常可靠的证据。但是在神经网络中,存在大量的参数和超参数及其间极其复杂的交互。在这样复杂系统中,构建出可靠的一般的论断就尤其困难。在完全一般性上理解神经网络实际上,和量子力学基础一样,都是对人类思维极限的挑战。实际上,我们通常是和一些一般的理论的具体的实例在打交道——找到正面或者反面的证据。所以,这些理论在有新的证据出现时,也需要进行调整甚至丢弃。
对这种情况的一种观点是——任何启发式的关于神经网络的论点会带来一个挑战。例如, Alex Krizhevsky在解释 dropout 工作原因的时候说到:“这个技术减少了复杂的神经元之间的互适应,因为一个神经元不能够依赖于特定其他神经元的存在。因此,这个就强制性地让我们学习更加健壮的在很多不同的神经元的随机子集的交集中起到作用的那些特征。”这是一个丰富而又争议的假说,我们可以根据这个观点发展出一系列的研究项目,搞清楚哪些部分真的,哪些是假的,那个需要变化和改良。实际上,有一小部分研究人员正在调查dropout(和其他变体)试着理解其工作的机制,还有 dropout 的极限所在。所以,这些研究也跟随着那些我们已经讨论过的启发式想法。每个启发式想法不仅仅是一个(潜在的)解释,同样也是一种更加细化地调查和理解的挑战。
当然,对某个单独的人去研究所有这些启发式想法其实在时间上是不允许的。需要神经网络的研究群体花费数十年(或者更多)来发展出一个相当强大,基于证据的关于神经网络工作的原理的理论。那么这是不是就意味着我们应当因为它的不严格和无法充分地证明而放弃启发式规则么?不!实际上,我们需要这样的启发式想法来启迪和指导我们的思考。这有点像大航海时代:早期的探险家在一种重要的指导方式都有错误的前提下有时候都进行了探索(并作出了新的发现)。后来,这些错误在我们对地理知识的清晰后而被纠正过来。当你对某件事理解不深时——就像探险家对地理的理解和我们现在对神经网络的理解——忽略一些相对严格的纠正每一步思考而胆大地探索若干问题显得更加重要。所以你应该将这些故事看成是一种关于我们如何思考神经网络的有用的指导,同时保留关于这些想法的能力极限的合理的关注,并细致地跟踪对任何一个推理的证据的强弱。换言之,我们需要很好的故事来不断地激励和启发自己去勇敢地探索,同时使用严格的深刻的调查来发现真理。
“哈工大SCIR”公众号
编辑部:郭江,李家琦,徐俊,李忠阳,俞霖霖
本期编辑:徐俊
长按下图并点击 “识别图中二维码”,即可关注哈尔滨工业大学社会计算与信息检索研究中心微信公共号:”哈工大SCIR” 。点击左下角“阅读原文”,即可查看原文。