到目前为止,我还没有解释如何选择超参数的值-学习率η,正则化参数λ等。 我只是给了很好的工作价值。 在实践中,当您使用神经网络攻击问题时,可能很难找到好的超参数。 例如,想象一下,我们刚刚被告知有关MNIST问题的信息,然后我们就开始研究它,而对合适的超参数的值一无所知。 假设我们很幸运,在第一个实验中我们选择了本章已经介绍的许多超参数:30个隐藏的神经元,最小数据包大小为10,训练30个时代,以及使用交叉熵。 但是,我们选择学习率η= 10.0,正则化参数λ= 1000.0。 这是我看到的这样的结果:
>>> import mnist_loader >>> training_data, validation_data, test_data = \ ... mnist_loader.load_data_wrapper() >>> import network2 >>> net = network2.Network([784, 30, 10]) >>> net.SGD(training_data, 30, 10, 10.0, lmbda = 1000.0, ... evaluation_data=validation_data, monitor_evaluation_accuracy=True) Epoch 0 training complete Accuracy on evaluation data: 1030 / 10000 Epoch 1 training complete Accuracy on evaluation data: 990 / 10000 Epoch 2 training complete Accuracy on evaluation data: 1009 / 10000 ... Epoch 27 training complete Accuracy on evaluation data: 1009 / 10000 Epoch 28 training complete Accuracy on evaluation data: 983 / 10000 Epoch 29 training complete Accuracy on evaluation data: 967 / 10000
我们的分类不能比随机抽样更好! 我们的网络充当随机噪声发生器!
您可以说:“嗯,这很容易解决,只需减少超参数,例如学习速度和正则化。” 不幸的是,先验地您没有关于需要调整这些超参数的确切信息。 可能的主要问题是,无论如何选择其他超参数,我们的30个隐藏神经元都将永远无法工作? 也许我们至少需要100个隐藏的神经元? 还是300? 还是很多隐藏层? 还是其他输出编码的方法? 也许我们的网络正在学习,但是我们需要训练更多的时代吗? 迷你小包的尺寸可能太小了? 如果返回值的二次函数,也许我们会做得更好? 也许我们需要尝试另一种初始化权重的方法? 依此类推。 在超参数空间中,很容易迷失方向。 如果您的网络很大,或者使用了大量的培训数据,这确实会带来很多不便,并且您可以培训数小时,数天或数周而没有收到结果。 在这种情况下,您的信心开始减弱。 也许神经网络是解决您问题的错误方法? 也许你辞职了养蜂?
在本节中,我将解释一些启发式方法,可用于在神经网络中配置超参数。 目的是帮助您制定一个可以很好地配置超参数的工作流程。 当然,我无法涵盖超参数优化的整个主题。 这是一个很大的领域,这不是一个可以完全解决的问题,也不是根据达成普遍共识的正确解决战略来解决的。 总是有机会尝试其他技巧来从神经网络中挤出额外的结果。 但是本节中的启发式方法应该为您提供一个起点。
一般策略
当使用神经网络来攻击新问题时,第一个困难是要从网络中获得非平凡的结果,即超过随机概率。 这可能会令人惊讶地困难,特别是当您面对一类新的任务时。 让我们看一些可以解决这种困难的策略。
例如,假设您是第一个攻击MNIST任务的人。 您会以极大的热情开始,但是如上面的示例中所述,第一个网络的完全失败有点令人沮丧。 然后,您需要分部分分解问题。 您需要摆脱所有训练和支持图像,但零和一的图像除外。 然后尝试训练网络以区分0和1。该任务不仅比区分所有十位数字更容易,而且还减少了80%的训练数据量,将学习速度提高了5倍。 这使您可以更快地进行实验,并有机会快速了解如何创建良好的网络。
通过将网络缩小到可能经过有意义的训练的最小尺寸,可以进一步加速实验。 如果您认为网络[784,10]很有可能比随机样本更好地对MNIST数字进行分类,则可以开始进行实验。 它会比训练[784,30,10]快得多,您以后可以逐渐掌握它了。
通过增加跟踪频率可以获得实验的另一个加速。 在network2.py程序中,我们在每个时代结束时监视工作质量。 每个时代处理50,000张图像,我们必须等待相当长的时间-在网络培训期间,我的笔记本电脑上每个时代大约需要10秒[784,30,10]-才能获得有关网络培训质量的反馈。 当然,十秒钟不是那么长,但是如果您想尝试几十个不同的超参数,它就会很烦人,而如果您想尝试成百上千的选择,那只会毁灭性的。 通过更频繁地跟踪确认准确性(例如,每1000个训练图像),可以更快地接收反馈。 此外,我们可以不使用完整的10,000张确认图像,而仅使用100张确认图像就能更快地获得估算值。 最主要的是,网络看到了足够多的图像来真正学习,并获得了足够好的有效性估计。 当然,我们的network2.py还没有提供这种跟踪。 但是,为了达到说明目的而使用拐杖实现这一目的时,我们将训练数据裁剪为前1000个MNIST图像。 让我们尝试看看会发生什么(为了代码的简单起见,我没有使用仅保留图像0和1的想法-这也可以花费更多的精力来实现)。
>>> net = network2.Network([784, 10]) >>> net.SGD(training_data[:1000], 30, 10, 10.0, lmbda = 1000.0, \ ... evaluation_data=validation_data[:100], \ ... monitor_evaluation_accuracy=True) Epoch 0 training complete Accuracy on evaluation data: 10 / 100 Epoch 1 training complete Accuracy on evaluation data: 10 / 100 Epoch 2 training complete Accuracy on evaluation data: 10 / 100 ...
我们仍然会得到纯净的噪音,但是我们有一个很大的优势:反馈会在几分之一秒内更新,而不是每十秒钟更新一次。 这意味着您可以选择超参数更快地进行实验,甚至可以几乎同时尝试许多不同的超参数。
在上面的示例中,我像以前一样将λ的值保留为1000.0。 但是,由于我们更改了训练示例的数量,因此需要更改λ,以使权重的减弱程度相同。 这意味着我们将λ改变20.0。 在这种情况下,结果如下:
>>> net = network2.Network([784, 10]) >>> net.SGD(training_data[:1000], 30, 10, 10.0, lmbda = 20.0, \ ... evaluation_data=validation_data[:100], \ ... monitor_evaluation_accuracy=True) Epoch 0 training complete Accuracy on evaluation data: 12 / 100 Epoch 1 training complete Accuracy on evaluation data: 14 / 100 Epoch 2 training complete Accuracy on evaluation data: 25 / 100 Epoch 3 training complete Accuracy on evaluation data: 18 / 100 ...
是的 我们有一个信号。 不是特别好,但是有。 这已经可以作为起点,并更改超参数以尝试进一步改进。 假设我们决定需要提高学习速度(如您可能理解的那样,我们做出了错误的决定,原因是我们稍后将进行讨论,但是现在让我们尝试这样做)。 为了检验我们的猜测,我们将η扭曲为100.0:
>>> net = network2.Network([784, 10]) >>> net.SGD(training_data[:1000], 30, 10, 100.0, lmbda = 20.0, \ ... evaluation_data=validation_data[:100], \ ... monitor_evaluation_accuracy=True) Epoch 0 training complete Accuracy on evaluation data: 10 / 100 Epoch 1 training complete Accuracy on evaluation data: 10 / 100 Epoch 2 training complete Accuracy on evaluation data: 10 / 100 Epoch 3 training complete Accuracy on evaluation data: 10 / 100 ...
一切都不好! 显然,我们的猜测是不正确的,问题不在学习速度的极低值上。 我们尝试将η收窄到1.0的较小值:
>>> net = network2.Network([784, 10]) >>> net.SGD(training_data[:1000], 30, 10, 1.0, lmbda = 20.0, \ ... evaluation_data=validation_data[:100], \ ... monitor_evaluation_accuracy=True) Epoch 0 training complete Accuracy on evaluation data: 62 / 100 Epoch 1 training complete Accuracy on evaluation data: 42 / 100 Epoch 2 training complete Accuracy on evaluation data: 43 / 100 Epoch 3 training complete Accuracy on evaluation data: 61 / 100 ...
那更好! 因此,我们可以继续进行下去,扭曲每个超参数,并逐步提高效率。 在研究了这种情况并找到了η的改进值之后,我们开始寻找λ的合适值。 然后,我们将使用更复杂的架构(例如,由10个隐藏的神经元组成的网络)进行实验。 然后,我们再次微调η和λ的参数。 然后,我们将网络增加到20个隐藏的神经元。 稍微调整超参数。 依此类推,使用我们的部分支持数据评估每个步骤的有效性,并使用这些估计值选择所有最佳超参数。 在改进过程中,花越来越多的时间才能看到调整超参数的效果,因此可以逐渐降低跟踪频率。
从总体上看,这种方法很有希望。 但是,我想回到搜索超参数的第一步,以使网络至少能够以某种方式学习。 实际上,即使在上述示例中,情况也过于乐观。 使用不学任何东西的网络可能会非常烦人。 您可以调整超参数几天,而不会收到有意义的答案。 因此,我想再次强调,在早期阶段,您需要确保可以从实验中快速获得反馈。 直观地看,简化问题和简化体系结构只会使您慢下来。 实际上,这可以加快处理过程,因为您可以更快地找到具有有意义信号的网络。 收到这样的信号后,您通常可以在调整超参数时获得快速的改进。 在许多生活环境中,最困难的是开始这一过程。
好的,这是一般策略。 现在,让我们看一下开处方超参数的具体建议。 我将专注于学习速度η,正则化参数L2λ和迷你数据包的大小。 但是,许多注释将适用于其他超参数,包括与网络体系结构,其他形式的正则化以及某些超参数有关的注释,例如动量系数,这些我们稍后将在书中学习。
学习速度
假设我们启动了三个具有三种不同学习速度的MNIST网络,分别为η= 0.025,η= 0.25和η= 2.5。 我们将保留其余的超参数,就像之前的部分一样-30个时代,迷你数据包的大小为10,λ= 5.0。 我们还将返回使用所有50,000张训练图像。 这是一个图表,显示了培训费用的行为(由multiple_eta.py程序创建):

在η= 0.025时,成本平稳下降至上一个时代。 当η= 0.25时,成本最初会降低,但在20个时期后达到饱和,因此大多数变化都很小,而且显然是随机波动。 η= 2.5时,成本从一开始就变化很大。 为了解这些波动的原因,我们记得随机梯度下降应逐渐将我们降低到成本函数的最低点:

此图片有助于直观地想象正在发生的事情,但不是完整而全面的解释。 更精确但简短地说,梯度下降对成本函数使用一阶近似来了解如何降低成本。 对于较大的η,较高阶成本函数的成员变得更加重要,并且它们可以通过打破梯度下降来控制行为。 当接近成本函数的最小值和局部最小值时,这尤其可能,因为在这些点附近,梯度变小,这使高阶成员更容易支配。
但是,如果η太大,则步长将太大,以至于它们可以跳到最小,因此算法将从谷底爬升。 这可能是导致价格在η= 2.5处波动的原因。 η= 0.25的选择导致一个事实,即初始步骤确实使我们朝着成本函数的最小值迈进,只有当我们达到这一点时,我们才开始遇到跳跃的困难。 当我们选择η= 0.025时,我们在前30个时期中不会遇到这种困难。 当然,选择如此小的η值会带来另一个困难-即,它会降低随机梯度下降的速度。 最好的方法是从η= 0.25开始,学习20个时代,然后转到η= 0.025。 稍后我们将讨论这种可变的学习率。 同时,让我们集中讨论为学习速度η找到一个合适的值的问题。
考虑到这一点,我们可以如下选择η。 首先,我们评估阈值η,在该阈值η处,训练数据的成本立即开始降低,但没有波动也没有增加。 此估计不必是准确的。 可以从η= 0.01开始估算阶数。 如果成本在前几个时代下降,那么值得尝试η= 0.1,然后是1.0,依此类推,直到找到一个值,该值在第一个时代波动或增加。 反之亦然,如果在第一个时期该值波动或增加,且η= 0.01,则尝试η= 0.001,η= 0.0001,直到找到在前几个时代成本降低的值。 此过程将为您提供阈值η的顺序。 如果愿意,可以通过选择η的最大值来优化评估,在第一个时期成本会降低,例如η= 0.5或η= 0.2(此处不需要超精密度)。 这给了我们阈值η的估计。
η的实际值显然不应超过所选的阈值。 实际上,为了使η值在许多时代仍然有用,您最好使用比阈值小两倍的值。 这样的选择通常可以让您学习很多时代,而不会大大减慢您的学习速度。
对于MNIST数据,遵循该策略将导致η的阈值阶数估计为0.1。 经过细化后,我们得到的值η= 0.5。 按照上面的配方,我们的学习速度应使用η= 0.25。 但实际上,我发现η= 0.5在30个时代都行之有效,因此我并不担心降低它。
所有这些看起来非常简单。 但是,使用训练费用来选择η似乎与我之前说的相矛盾-我们选择超参数,然后使用选定的验证性数据评估网络的有效性。 实际上,我们将使用确认的准确性来选择正则化超参数,微型数据包的大小以及诸如层数和隐藏神经元之类的网络参数,等等。 为什么我们的学习速度与众不同? 老实说,这种选择是由于我个人的审美偏好,并且可能有偏见。 有观点认为其他超参数应该提高测试集的最终分类精度,因此根据确认的准确性选择它们是有意义的。 但是,学习率仅间接影响最终分类的准确性。 其主要目标是控制梯度下降的步长,并以最佳方式跟踪训练成本,以识别太大的步长。 但这仍然是个人审美偏好。 在培训的早期阶段,通常只有在确认的准确性提高的情况下,培训的成本才会降低,因此在实践中,使用哪种标准并不重要。
尽早确定训练时代的数目
正如我们在本章中提到的,尽早停止意味着在每个时代结束时,我们需要根据支持数据计算分类的准确性。 当它停止改善时,我们将停止工作。 结果,设置时代数变得简单。 特别是,这意味着我们不需要专门弄清楚历元数如何取决于其他超参数。 这会自动发生。 此外,尽早停止也会自动阻止我们进行再培训。 当然,这很好,尽管在实验的早期关闭早期停止可能很有用,以便您可以看到再培训的迹象并使用它们来微调正则化方法。
为了实施RO,我们需要更具体地描述“停止提高分类准确性”的含义。 正如我们所看到的,即使总体趋势正在改善,准确性也可能会来回跳跃。 如果我们第一次停下来,那么当精度降低时,我们几乎可以肯定将无法实现进一步的改进。 最好的方法是,如果最好的分类精度长期未提高,则停止学习。 例如,假设我们从事MNIST。 然后,如果过去10年来分类的准确性没有提高,我们可以决定停止该过程。 这样可以确保我们不会因培训失败而过早停止工作,但是我们不会永远等待不会发生的任何改进。
这种“十个时代没有改善”的规则非常适合最初的MNIST研究。 但是,网络有时可以达到一定分类精度附近的平稳状态,在此停留相当长的时间,然后再次开始改善。 如果您需要获得非常好的性能,那么“十个时代没有进步”的规则可能就太过激进了。 因此,我建议对主要实验使用“十个世纪没有改善”规则,并在开始更好地了解网络行为时逐渐采用更柔和的规则:“二十个世纪没有改善”,“五十个世纪没有改善”等等。进一步。 当然,这为我们提供了另一个用于优化的超参数! 但是实际上,此超参数通常易于调整以获得良好结果。 对于除MNIST以外的任务,“取决于十个时代的改进”规则可能过于激进,或者不够激进,这取决于特定任务的具体情况。
但是,经过一些实验,通常很容易找到合适的提前停止策略。在MNIST的实验中,我们还没有尽早停止。这是由于我们对许多不同的学习方法进行了比较。对于此类比较,在所有情况下使用相同数量的纪元是有用的。但是,值得通过将RO引入程序来更改network2.py。任务
- 修改network2.py,以使PO根据“ n个纪元不变”规则出现在其中,其中n是可配置的参数。
- 除了“ n时代不变”以外,还可以考虑提前停止规则。理想情况下,该规则应在获得高度确认的准确性和较短的培训时间之间寻求一种折衷。在network2.py中添加一个规则,然后运行三个实验,将验证准确性和训练纪元数与“ 10个纪元不变”规则进行比较。
学习速度改变计划
同时我们保持学习速度η恒定。但是,修改它通常很有用。在训练过程的早期阶段,权重分配很可能是完全错误的。因此,最好使用高速训练,这将导致权重变化更快。然后,您可以降低训练速度,以更好地调整音阶。我们如何概述改变学习速度的计划?在这里您可以应用许多方法。一种自然的选择是使用与RO中相同的基本思想。我们保持学习速度恒定,直到确认的准确性开始下降。然后,我们将CO降低一定的数量,例如减少2到10倍。我们重复多次,直到CO小于初始值的1024(或1000)倍。并完成培训。改变学习速度的计划可以提高效率,也为选择计划提供了很大的机会。这可能会令人头疼-您可以永远花时间优化计划。对于第一个实验,我建议使用一个恒定的CO值。这将为您提供良好的第一近似。后来,如果您想从网络中获取最佳效率,就值得尝试一下我描述的改变学习速度的计划。2010年相当容易阅读的科学著作展示了攻击MNIST时学习速度可变的优势。锻炼身体
- 修改network2.py,以便它实施以下更改学习速度的计划:每次确认精度满足“ 10个周期无变化”规则时,将CR减半;当学习速度从初始速度降至1/128时停止学习。
正则化参数λ
我建议完全不使用正则化(λ= 0,0),并确定η的值,如上所述。使用选定的η值,我们便可以使用支持数据选择一个合适的λ值。从λ= 1.0开始(我没有很好的理由支持这种选择),然后将其增加或减少10倍,以提高确认数据的效率。找到正确的数量级后,我们可以更精确地微调λ的值。此后,有必要再次返回优化η。锻炼身体
如果使用本节中的建议,您将看到所选的η和λ值并不总是与我之前使用的值完全对应。仅仅因为这本书有文字限制,有时使优化超参数变得不切实际。记住我们一直在研究的不同训练方法的所有比较-比较二次成本函数和交叉熵,权重初始化的新方法和新方法,有无正则化开始,等等。为了使这些比较有意义,我尝试不更改比较方法之间的超参数(或正确缩放它们)。当然,对于所有不同的学习方法,没有理由使相同的超参数最优,因此我使用的超参数是折衷的结果。作为替代方案,我可以尝试针对每种学习方法优化所有超级参数,以最大程度地学习。这将是一种更好,更诚实的方法,因为我们将从每种方法中汲取最大的努力来学习。但是,我们进行了数十次比较,实际上,这在计算上会过于昂贵。因此,我决定妥协,使用足够好的(但不一定是最佳的)超参数选项。迷你包装尺寸
如何选择迷你包装的尺寸?为了回答这个问题,我们首先假设我们正在从事在线培训,即我们使用的是1号微型包装。在线学习的明显问题是,使用由单个培训示例组成的微型软件包将在估计梯度时导致严重错误。但是实际上,这些错误不会带来如此严重的问题。原因是各个梯度估计值不必非常准确。我们只需要获得足够准确的估算,即可降低成本函数。就像您要到达北极一样,但您的指南针不可靠,每次测量都会误认为10-20度。如果您经常检查指南针,并且平均而言它会指示正确的方向,那么您最终将能够到达北极。鉴于这种说法,似乎我们应该使用在线学习。但实际上情况要复杂一些。在上一章的任务中,我指出了要计算迷你包装中所有示例的梯度更新,您可以同时使用矩阵技术,而不是循环。根据您的硬件和线性代数库的详细信息,计算100个微型数据包的估计可能比计算100个训练示例的周期中微型数据包的梯度估计要快得多。例如,这可能只会慢50倍,而不是100倍。起初,这似乎对我们没有多大帮助。迷你数据包大小为100时,权重的训练规则如下:瓦特→ 瓦特' = 瓦特- η 1100 ΣX∇ÇX
汇总总结了微型包装中的培训示例。与...比较瓦特→ 瓦特' = 瓦特- η ▿ C ^ X
用于在线学习。即使更新迷你软件包的时间花费了50倍以上,但在线培训仍然是最好的选择,因为我们将更频繁地进行更新。但是,假设在微型软件包的情况下,我们将学习速度提高了100倍,则更新规则变为:w→w′=w−η∑x∇Cx
100 - η. - 50 . , 100 -, - ∇C
x , , -. , - .
考虑到所有这些因素,选择最佳的迷你包装尺寸是一个折衷方案。选择得太小,不能充分获得针对快速硬件优化的良好矩阵库的全部好处。选择太大,将不会足够频繁地更新权重。您需要选择一个折衷的值,以最大程度地提高学习速度。幸运的是,最大化速度的微型数据包大小的选择相对独立于其他超参数(通用体系结构除外),因此,要找到一个合适的微型数据包大小,无需对其进行优化。因此,对于其他超参数使用可接受的值(不一定是最佳值)就足够了,然后尝试如上所述按比例缩放η的几种不同大小的微型数据包。建立确认准确度与时间(实际经过的时间,而不是时代!)的关系图,并选择能够最大程度提高性能的微型数据包大小。使用选定的最小数据包大小,您可以继续优化其他超参数。当然,正如您已经毫无疑问地理解的那样,在我们的工作中我没有进行这种优化。在我们执行国民议会的过程中,根本没有使用更新迷你包装的快速方法。在几乎所有示例中,我只是使用10号迷你数据包,而没有评论或解释。一般而言,我们可以通过减小迷你包装的尺寸来加快学习速度。我之所以没有这样做,尤其是因为我的初步实验表明,加速度会相当适中。但是在实际实现中,我们绝对希望采用最快的方法来更新迷你包装,并尝试优化它们的大小以最大化整体速度。自动化技术
我将这些启发式方法描述为需要手动调整的东西。手动优化是了解NS如何工作的好方法。但是,顺便说一句,在此项目的自动化方面已经进行了大量工作也就不足为奇了。一种常见的技术是网格搜索,它可以在超参数空间中系统地筛选网格。有关该技术的成就和局限性的概述(以及有关易于实施的替代方法的建议)可在2012年找到。已经提出了许多复杂的技术。我不会复习所有内容,但我想指出2012年使用贝叶斯超参数优化进行的有希望的工作。工作中的代码向所有人开放 ,并获得了其他研究人员的成功。总结一下
使用我描述的实践规则,您将不可能从PS中获得最好的结果。但是它们很可能为您提供进一步改进的良好起点和基础。特别是,我基本上独立地描述了超参数。实际上,它们之间存在联系。您可以尝试η,确定找到了正确的值,然后开始优化λ,然后发现它违反了η优化。在实践中,朝着不同的方向发展,逐渐接近良好的价值很有用。最重要的是,请记住,我描述的启发式方法是简单的实践规则,而不是刻在石头上的东西。您需要寻找迹象表明某些东西不起作用,并且希望进行实验。特别是仔细监视神经网络的行为,尤其是确认的准确性。, , . , ( ). , .
2012 , . . , . –
1998年,Yanna Lekuna等人,这两本书都出现在极为有用的2012年书中,其中包含了国民议会经常使用的许多技巧:“ 神经网络:技巧”。这本书价格昂贵,但许多文章都是由其作者在互联网上发布的,可以在搜索引擎中找到它们。从这些文章,特别是从我们自己的实验,可以清楚地看出一件事:不能完全解决优化超参数的问题。总是有另一个技巧可以尝试提高效率。作家有句谚语:一本书无法完成,只能丢弃。 NS优化也是如此:超参数的空间太大,以至于优化无法完成,只能停止,NS留给后代。因此,您的目标是开发一个工作流程,使您可以快速进行良好的优化,同时在必要时还可以尝试更多详细的优化选项。选择超参数的困难使一些人抱怨说,与其他MO技术相比,NS需要付出更多的努力。我听到过许多投诉的变体,例如:“是的,经过良好调整的NS可以在解决问题时提供最佳效率。但是,另一方面,我可以尝试使用随机森林(或SVM,或您喜欢的任何其他技术),它就可以正常工作。我没有时间弄清楚哪个NA适合我。”当然,从实际的角度来看,最好在朋友的陪伴下使用易于使用的技术。当您刚开始处理任务时,这尤其好,并且尚不清楚MO是否可以帮助解决该问题。另一方面,如果获得最佳结果对您很重要,则可能需要尝试一些需要更多专业知识的方法。那就太好了如果MO总是很容易,但是没有理由为什么它应该是先验的。其他技巧
本章中开发的每种技术本身都是有价值的,但这并不是我描述它们的唯一原因。熟悉NA领域中可能出现的一些问题以及有助于克服这些问题的分析风格,这一点更为重要。在某种程度上,我们正在学习如何思考NS。在本章的其余部分,我将简要介绍一组其他技术。他们的描述不会像以前那样深入,但是他们应该传达有关NA领域遇到的各种技术的一些感觉。随机梯度下降的变化
通过反向传播的随机梯度下降在解决MNIST的手写体数字分类问题时非常有用。但是,还有许多其他方法可以优化成本函数,有时它们的效率要优于采用小型封装的随机梯度下降法。在本节中,我简要描述了两种这样的方法:Hessian和动量。黑森州
首先,让我们搁置国民议会。取而代之的是,我们仅考虑使许多变量w = w1,w2,...,即C = C(w)最小化成本函数C的抽象问题。根据泰勒定理,在点w处的成本函数可以近似为:Ç (瓦特+ Δ 瓦特)= c ^ (瓦特)+ Σ Ĵ ∂ Ç∂ 瓦特的Ĵ增量的瓦特Ĵ+ 12 ΣĴķΔ瓦特Ĵ∂2Ç∂ W的Ĵ ∂ W的第k三角洲w的第k+...
我们可以更紧凑地重写它为Ç (瓦特+ Δ 瓦特)= c ^ (瓦特)+ ∇ Ç ·&Δ 瓦特+ 12ΔwTHΔw+…
∇C – , H – , ,
, jk ∂
2 C/∂w
j ∂w
k . , C, , :
C(w+Δw)≈C(w)+∇C⋅Δw+12ΔwTHΔw
使用代数,可以显示出可以通过选择以下方式最小化右侧的表达式:Δ 瓦特= - ħ - 1 ∇ Ç
严格来说,为了使该最小值成为最小值,而不仅仅是极值,我们必须假定Hessian矩阵更确定为正。直观地讲,这意味着函数C就像山谷,而不是山脉或马鞍。如果(105)是成本函数的一个很好的近似值,则可以预期从点w到点w +Δw= w-H-1 -C的过渡将大大降低成本函数。这提供了一种可能的成本最小化算法:- 选择起点w。
- 更新到新的点W,W“= W-H -1 ∇C,其中所述的Hessian H的计算和∇C瓦特
- w' , w′′=w′−H′ −1 ∇′C, H ∇C w'.
- ...
实际上,(105)只是一个近似值,最好采用较小的步长。我们将通过不断更新wΔw=-ηH-1∇C来做到这一点,其中η是学习速度。最小化成本函数的这种方法称为Hessian优化。理论和经验结果表明,与标准梯度下降法相比,Hessian方法的收敛步数最小。特别是,通过在成本函数中包含有关二阶变化的信息,可以避免Hessian方法在梯度下降中遇到的许多病理情况。此外,还有一些反向传播算法可用于计算Hessian。如果Hessian优化是如此酷,那为什么不在NS中使用它呢?不幸的是,尽管它具有许多令人希望的特性,但有一个非常不希望的特性:它很难付诸实践。问题的一部分是黑森州矩阵的巨大规模。假设我们有一个具有10 7个权重和偏移量的NS 。然后在相应的Hessian矩阵中将有10 7 ×10 7 = 10 14个元素。太多了!其结果是,计算ħ -1 ∇C获得在实践中是非常困难的。但这并不意味着了解她是没有用的。许多梯度下降选项均受到Hessian优化的启发,它们只是避免了矩阵过大的问题。我们来看看一种这样的技术,即脉冲梯度下降。基于脉冲的梯度下降
直观上,Hessian优化的优点在于它不仅包含有关梯度的信息,还包含有关其变化的信息。基于脉冲的梯度下降基于相似的直觉,但避免了来自二阶导数的大矩阵。为了了解脉冲技术,让我们回想一下第一张梯度下降图片,其中我们检查了一个滚下山谷的球。然后我们看到,与它的名字相反,梯度下降只是有点像一个跌落到底部的球。脉冲技术可在两个位置改变梯度下降,这使其更像一幅物理图片。首先,她介绍了我们要优化的参数的“速度”概念。梯度试图改变速度,而不是直接改变“位置”,类似于物理力如何改变速度,并且仅间接影响位置。其次,脉冲法是一种逐渐降低速度的摩擦项。让我们给出一个更精确的数学定义。我们为每个对应的变量w j引入速度变量v = v1,v2,... (在神经网络中,这些变量自然包括所有权重和位移)。然后我们将梯度下降更新规则w→w′= w-η∇C更改为v → v ' = μ v - η ▿ C ^
w → w ' = w + v '
在方程式中,μ是控制系统的制动或摩擦量的超参数。为了理解等式的含义,首先考虑μ= 1的情况,即没有摩擦时是有用的。在这种情况下,对方程的研究表明,现在“力”∇C改变了速度v,而速度控制了改变率w。直观地讲,可以通过不断向其中添加渐变成员来提高速度。这意味着,如果在训练的多个阶段中,渐变沿大约一个方向移动,我们可以在该方向上获得足够高的移动速度。例如,想象一下,下坡时会发生什么:
随着斜坡的每一步下降,速度增加,并且我们越来越快地到达山谷的底部。这使速度技术的运行速度比标准梯度下降快得多。当然,问题在于,到达山谷底部之后,我们将滑过山谷。或者,如果梯度变化太快,则可能表明我们正在朝相反的方向移动。这就是在(107)中引入超参数μ的要点。我之前说过,μ控制系统中的摩擦力;更确切地说,必须将摩擦量想象为1-μ。如我们所见,当μ= 1时,没有摩擦,并且速度完全由梯度∇C决定。反之亦然,当μ= 0时,摩擦很大,没有速度获得,方程(107)和(108)简化为通常的梯度下降方程w→w'= w-η∇C。实际上在0到1之间的间隔中使用μ的值可以使我们获得提高速度的优势,而不会出现滑移最小值的危险。我们可以使用待定的确认数据为μ选择这样的值,与选择η和λ的方法几乎相同。到目前为止,我避免为超参数μ命名。事实是,μ的标准名称选择不当:它被称为动量系数。这可能会造成混淆,因为μ根本不像物理学中的动量概念。它与摩擦密切相关。但是,术语“动量系数”被广泛使用,因此我们也将继续使用它。脉冲技术的一个很好的特点是几乎不需要做任何事情就可以改变梯度下降的实现,以将其包括在内。我们仍然可以像以前一样使用反向传播来计算梯度,并使用诸如检查随机选择的迷你包装之类的想法。在这种情况下,我们可以使用有关梯度变化的信息来获得Hessian优化的一些好处。但是,所有这些操作都没有缺陷,只需要很小的代码更改即可。在实践中,脉冲技术被广泛使用,通常有助于加快学习速度。练习题
- 如果在脉冲技术中使用μ> 1,会出什么问题?
- 如果在脉冲技术中使用μ<0,会出什么问题?
挑战赛
- 将基于动量的随机梯度下降添加到network2.py。
最小化成本函数的其他方法
已经开发出许多其他方法来最小化成本函数,并且就最佳方法尚未达成共识。深入探讨神经网络主题,深入研究其他技术,了解它们的工作原理,优点和缺点以及如何将它们付诸实践是很有用的。在我前面提到的工作中,介绍了几种这样的技术并进行了比较,包括成对的梯度下降法和BFGS方法(并且还研究了与内存限制密切相关的BFGS方法或L-BFGS)。最近又显示出令人鼓舞的结果的另一项技术。,这是Nesterov的加速梯度,改进了脉冲技术。但是,简单的梯度下降法可以很好地完成许多任务,特别是在使用动量时,因此我们将坚持随机梯度下降法,直到本书结束。其他模型的人工神经元
到目前为止,我们已经使用了S型神经元来创建我们的NS。原则上,基于乙状神经元的NS可以计算任何功能。但是实际上,建立在其他神经元模型上的网络有时要比乙状结肠模型更先进。根据应用的不同,基于此类替代模型的网络可以更快地学习,更好地归纳为验证数据,或同时执行这两种操作。让我提到几个神经元的替代模型,以使您了解一些常用的选项。也许最简单的变化是用双曲线切线代替S形函数的Tang神经元。具有输入x,权重向量w和偏移b的tang神经元的输出指定为的tanh (瓦特⋅ X + b )
tanh是自然的双曲正切值。事实证明,他与乙状结肠神经元紧密相连。要看到这一点,请记住tanh被定义为的tanh (Ž )≡ ë ž - ë - že z + e - z
使用一点代数,很容易看到σ (z )= 1 + tanh (z / 2 )2
也就是说,tanh只是在缩放S形。在图形上,您还可以看到tanh函数具有与S形相同的形状:
tang神经元和S形神经元之间的一个区别是,第一个神经元的输出从-1扩展到1,而不是从0扩展到1。这意味着在基于tang神经元创建网络时,您可能需要对输出(以及取决于应用程序的详细信息,可能是输入)进行标准化,与在S型网络中有所不同。像S型神经元一样,Tang神经元原则上可以计算任何函数(尽管有一些技巧),将输入从-1标记为1。此外,反向传播和随机梯度下降的思想也很容易应用于tang -神经元,以及乙状结肠。锻炼身体
在网络中,应使用哪种类型的神经元(tang或sigmoid)?坦率地说,答案并不明显!但是,有一些 理论论据和一些经验证据表明,唐氏神经元有时效果更好。让我们简要地介绍一下支持唐神经元的理论论证之一。假设我们使用乙状神经元,并且网络上的所有激活都是正的。考虑第l + 1层神经元j包含的权重w l + 1 jk。反向传播规则(BP4)告诉我们,相关联的梯度是一个升 第k增量L + 1, Ĵ。由于激活为正,因此该梯度的符号将与δl + 1 j的符号相同。这意味着,如果δl + 1 j为正,则所有权重w l + 1 jk将在梯度下降期间减小;如果δl + 1 j为负,则所有权重w l + 1 jk在梯度下降时会增加。换句话说,与同一神经元相关的所有权重将一起增加或减少。这是一个问题,因为您可能需要增加一些权重,同时减少其他权重。但这只有在某些输入激活具有不同符号的情况下才会发生。这表明需要用另一种激活函数(例如双曲线正切)来代替乙状结肠,从而使激活既可以是正的,也可以是负的。实际上,由于tanh相对于零是对称的,tanh(-z)= -tanh(z),因此可以大致预期,隐藏层中的激活将在正负之间平均分布。这将有助于确保在一个方向或另一个方向上的音阶更新没有系统上的偏差。应该多认真考虑这个论点?毕竟,它是启发式的,没有提供严格的证据证明唐神经元优于乙状神经元。乙状结肠神经元也许有一些特性可以弥补这一问题?确实,在许多情况下,tanh功能与S型相比显示出从最小到没有的优势。不幸的是,我们没有简单,快速实施的方法来检查哪种类型的神经元学习得更快,或者将证明在特定情况下更有效。乙状神经元的另一个变体是整流线性神经元或整流线性单元ReLU。具有输入x,权重w和偏移b的向量的输出ReLU如下指定:最大值(0 ,瓦特⋅ X + b )
图形上的拉直函数max(0,z)看起来像这样:
这种神经元显然与S型和tang神经元有很大不同。但是,它们的相似之处在于它们还可以用于计算任何函数,并且可以使用反向传播和随机梯度下降进行训练。什么时候应该使用ReLU代替乙状结肠或tang神经元?在最近的关于识别图像(研究1,2,3,4)在几乎整个网络中都发现了使用ReLU的巨大优势。但是,与tang神经元一样,我们还没有真正确切地了解什么时候应该使用ReLU以及为什么会这样。为了对一些问题有所了解,请记住,当饱和时(即输出接近0或1时),乙状神经元会停止学习。正如我们在本章中多次看到的那样,问题在于σ'成员会减小梯度这减慢了学习速度。唐神经元饱受类似困难的困扰。同时,ReLU上加权输入的增加将永远不会使其饱和,因此,不会发生相应的训练减慢。另一方面,当ReLU上的加权输入为负时,梯度消失,神经元完全停止学习。这只是使理解ReLU何时以及如何比S型或tang神经元表现更好的许多问题中的几个。我画了一幅不确定性的图画,强调我们对激活函数的选择还没有扎实的理论。确实,这个问题比我描述的还要复杂,因为存在无限多种可能的激活功能。哪一个将为我们提供最快的学习网络?哪个将在测试中提供最大的准确性?令我惊讶的是,对这些问题进行的真正深入和系统的研究很少。理想情况下,我们应该有一种理论,可以详细告诉我们如何选择(并可能随时更改)激活函数。另一方面,我们不应因缺乏完整的理论而停下来!我们已经拥有强大的工具,在他们的帮助下,我们可以取得重大进展。在本书结束之前,我将使用乙状结肠神经元作为主要神经元,因为它们运作良好,并给出了与国民议会有关的主要思想的具体例证。但是请记住,相同的想法可以应用于其他神经元,并且这些选择都有其优势。: , , ? ?
: , . , . . : , , ?
—
在一次有关量子力学基础的会议上,我注意到了一种似乎很有趣的演讲习惯:在报告的末尾,观众的问题通常以以下短语开头:“我真的很喜欢你的观点,但是……”量子基础知识并不是我通常的工作领域,我提请注意这种提问方式,因为在其他科学会议上,我几乎没有遇到提问者表示同情演讲者观点的问题。当时,我认为这些问题的普遍性表明,量子基本原理已经取得了相当大的进步,而且人们才刚刚开始获得动力。后来我意识到这个评估太苛刻了。演讲者为人类思想中遇到的一些最困难的问题而苦苦挣扎。当然,进度很慢!但是,即使人们几乎一无所获,听到有关人们对这一领域的想法的新闻仍然有价值。在这本书中,您可能已经注意到“神经tick”,类似于“我印象深刻”。为了解释我们所拥有的东西,我经常诉诸于“启发式”或“粗略地说”之类的词语,然后解释特定现象。这些故事是可信的,但是经验证据通常是很肤浅的。如果您研究研究文献,您会发现在许多有关神经网络的研究论文中都出现了这种故事,通常是在有少量证据支持的情况下。我们如何与这样的故事联系起来?在许多科学领域中-特别是在考虑简单现象的情况下-人们可以找到非常严格且可靠的非常笼统的假设证据。但是在国民议会中,有大量的参数和超参数,它们之间的关系极为复杂。在如此难以置信的复杂系统中,做出可靠的一般性陈述非常困难。对NS的完整理解,例如量子基础,检验了人类思维的极限。通常,我们不得不放弃赞成或反对一般性声明的几个特定特定案例的证据。结果,随着新证据的出现,有时有时需要更改或放弃这些陈述。解决这种情况的方法之一是考虑有关NS的任何启发式故事都意味着一定的挑战。例如,考虑一下我引用的有关2012年工作异常(退学)为何起作用的解释。:“这种技术减少了神经元的复杂关节适应性,因为神经元不能依赖某些邻居的存在。最后,他必须学习更可靠的特征,这些特征可以与神经元的许多不同随机子集一起工作。”一个丰富而富挑衅性的陈述,您可以在此基础上构建一个完整的研究计划,在其中您需要找出什么是正确的,什么地方是错误的,以及需要澄清和更改的内容。现在确实有整个研究人员研究异常(及其许多变体),试图了解异常的工作方式和限制。因此,我们讨论了许多其他启发式方法。他们每个人都不只是一个潜在的解释,也是研究的挑战和更详细的理解。当然,没有一个人有足够的时间来足够深入地研究所有这些启发式解释。整个NS研究人员社区将花费数十年的时间来开发基于证据的强大的NS训练理论。这是否意味着值得将启发式解释视为松懈和缺乏证据?不行我们需要启发我们思维的启发式方法。这类似于伟大的地理发现时代:早期学者经常基于严重错误的信念采取行动(并做出发现)。后来,我们纠正了这些错误,补充了我们的地理知识。当您对某些事物了解得很差时(正如研究人员了解地理信息一样,以及当今我们对NS的了解),大胆研究未知事物就变得尤为重要而不是在推理的每一步上都一丝不苟。因此,您应该将这些故事视为有关如何反思NS,保持健康认识其局限性以及仔细监视每种情况下证据可靠性的有用指导。换句话说,我们需要良好的故事来激发动力和灵感,并需要进行彻底的调查以揭示真实的事实。