我们应该按啥顺序调整神经网络中的超参数?

Posted

技术标签:

【中文标题】我们应该按啥顺序调整神经网络中的超参数?【英文标题】:In what order should we tune hyperparameters in Neural Networks?我们应该按什么顺序调整神经网络中的超参数? 【发布时间】:2016-09-24 20:36:48 【问题描述】:

我有一个非常简单的 ANN,它使用 Tensorflow 和 AdamOptimizer 来解决回归问题,我现在可以调整所有超参数。

目前,我看到了许多需要调整的不同超参数:

学习率:初始学习率、学习率衰减 AdamOptimizer 需要 4 个参数(学习率、beta1、beta2、epsilon),因此我们需要调整它们 - 至少是 epsilon 批量大小 nb 次迭代 Lambda L2-正则化参数 神经元数量,层数 对于输出层,隐藏层使用什么样的激活函数 辍学参数

我有两个问题:

1) 你有没有看到我可能忘记的其他超参数?

2) 目前,我的调音是相当“手动”的,我不确定我是否以正确的方式进行所有操作。 是否有特殊的顺序来调整参数?例如,首先是学习率,然后是批量大小,然后...... 我不确定所有这些参数都是独立的——事实上,我很确定其中一些不是。哪些明显独立,哪些明显不独立?然后我们应该把它们调到一起吗? 是否有任何论文或文章讨论以特殊顺序正确调整所有参数?

编辑: 这是我得到的不同初始学习率、批量大小和正则化参数的图表。紫色曲线对我来说完全很奇怪......因为成本下降的速度比其他曲线慢,但它被困在较低的准确率上。模型是否有可能陷入局部最小值?

Accuracy

Cost

对于学习率,我使用了衰减: LR(t) = LRI/sqrt(epoch)

感谢您的帮助! 保罗

【问题讨论】:

嗨,保罗,我想知道你为什么使用LRI/sqrt(epoch) 作为学习率衰减?我正在使用LRI/max(epoch_0, epoch),我已将epoch_0 设置为我希望衰减开始的时期,但如果你像你一样取分母的平方根,也许你会得到更快的收敛。您对学习率衰减有任何参考,还是您自己或多或少地想出了它? 嗨@HelloGoodbye!在介绍 Adam 优化器 (arxiv.org/pdf/1412.6980.pdf) 的文章中,他们使用学习率的平方根衰减来证明定理 4.1 的收敛性。 【参考方案1】:

我的一般顺序是:

    批量大小,因为它将在很大程度上影响未来实验的训练时间。 网络架构: 网络中的神经元数量 层数 休息(辍学、L2 reg 等)

依赖关系:

我假设

的最佳值 学习率和批量大小 学习率和神经元数量 神经元数量和层数

相互依赖。不过,我不是该领域的专家。

至于你的超参数:

对于 Adam 优化器:“论文中的推荐值为 eps = 1e-8, beta1 = 0.9, beta2 = 0.999。” (source) 对于 Adam 和 RMSProp 的学习率,我发现 0.001 左右的值对于大多数问题来说是最佳的。 作为 Adam 的替代方案,您还可以使用 RMSProp,它可以将内存占用减少多达 33%。有关详细信息,请参阅this answer。 您还可以调整初始权重值(请参阅All you need is a good init)。虽然,Xavier 初始化器似乎是避免调整权重初始化的好方法。 我没有将迭代/时期的数量调整为超参数。我训练网络直到其验证误差收敛。不过,我会给每次运行一个时间预算。

【讨论】:

RMSprop 几乎等同于带有 beta1=0 的 AdamOptimizer。 (AdamOptimizer 最初会校正 RMS 项中的偏差,但经过足够的训练步骤后,偏差和校正均接近零。) @CharlesStaats 感谢您的意见!在寻找 Adam 和 RMSprop 之间的区别时,我发现了这个:cs231n.github.io/neural-networks-3/#ada“请注意,更新看起来与 RMSProp 更新完全一样,除了使用“平滑”版本的梯度 m 而不是原始(可能是嘈杂的)梯度向量dx。论文中的推荐值是 eps = 1e-8, beta1 = 0.9, beta2 = 0.999。实际上,目前建议使用 Adam 作为默认算法,并且通常比 RMSProp 效果略好。”所以你是对的。从现在开始我将使用 Adam。【参考方案2】:

让 Tensorboard 运行起来。在那里绘制错误。您需要在 TB 查找要绘制的数据的路径中创建子目录。我在脚本中创建子目录。所以我改变了脚本中的一个参数,在那里给试验命名,运行它,然后在同一个图表中绘制所有试验。您很快就会对图表和数据的最有效设置有所了解。

【讨论】:

谢谢!我不知道我们可以在同一个 Tensorboard 窗口中显示不同的图表。看起来会这样,即使它不能完全回答我最初的问题。【参考方案3】:

对于不太重要的参数,您可能只需选择一个合理的值并坚持下去。

就像你说的,这些参数的最优值都相互依赖。最简单的做法是为每个超参数定义一个合理的值范围。然后从每个范围内随机抽取一个参数,并使用该设置训练一个模型。重复这一系列,然后选择最好的模型。如果幸运的话,您将能够分析哪些超参数设置效果最好,并从中得出一些结论。

【讨论】:

感谢您的回答!因此,最好为所有超参数随机选择值并一起调整它们,而不是单独调整每个超参数? 是的。除非有一些你知道的超参数并不重要。对于那些你可以选择一个值并优化其余部分。例如,人们可能会随意决定使用两层和 sigmoid 激活,然后优化每一层的大小。 谢谢!我添加了从初始学习率、正则化参数和批量大小的值的随机化选择中获得的图表。我不明白为什么模型会以如此低的精度卡住......【参考方案4】:

我不知道任何特定于 tensorflow 的工具,但最好的策略是首先从基本的超参数开始,例如学习率 0.01、0.001、weight_decay 0.005、0.0005。然后调整它们。如果您使用的是 caffe,手动执行此操作将花费大量时间,以下是从一组输入值中获取超参数并为您提供最佳设置的最佳选项。

https://github.com/kuz/caffe-with-spearmint

有关更多信息,您也可以按照本教程进行操作:

http://fastml.com/optimizing-hyperparams-with-hyperopt/

对于层数,我建议你先做小网络,增加数据,等你有足够的数据后,再增加模型复杂度。

【讨论】:

【参考方案5】:

开始之前:

batch size 设置为适用于您的硬件的最大值(或2 的最大幂)。只需增加它,直到出现 CUDA 错误(或系统 RAM 使用率 > 90%)。 将正则化设置为低值。 神经元和层的架构和确切数量 - 使用已知架构作为灵感,并根据您的特定性能要求对其进行调整:更多层和神经元 -> 可能是更强大但更慢的模型。

那么,如果你想一个一个地做,我会这样:

    在大范围内调整learning rate

    调整优化器的其他参数。

    调整正则化(dropout、L2 等)。

    微调learning rate - 这是最重要的超参数。

【讨论】:

以上是关于我们应该按啥顺序调整神经网络中的超参数?的主要内容,如果未能解决你的问题,请参考以下文章

深层神经网络的超参数调试、正则化及优化

在 R 中使用神经网络方法进行超参数调整

应该按啥顺序添加浮点数以获得最精确的结果?

您应该按啥顺序将一组已知键插入 B-Tree 以获得最小高度?

在 C++ 中应该按啥顺序声明类? [关闭]

神经网络参数hyper-parameters选择