【问题标题】: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 的收敛性。

标签: neural-network tensorflow hyperparameters


【解决方案1】:

我的一般顺序是:

  1. 批量大小,因为它将在很大程度上影响未来实验的训练时间。
  2. 网络架构:
    • 网络中的神经元数量
    • 层数
  3. 休息(辍学、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%)。
    • 将正则化设置为低值。
    • 神经元和层的架构和确切数量 - 使用已知架构作为灵感,并根据您的特定性能要求对其进行调整:更多层和神经元 -> 可能是更强大但更慢的模型。

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

    1. 在大范围内调整learning rate

    2. 调整优化器的其他参数。

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

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

    【讨论】:

      猜你喜欢
      • 2020-09-29
      • 2020-02-01
      • 2020-06-29
      • 2022-01-23
      • 2018-05-22
      • 2013-09-22
      • 2021-06-15
      • 2020-05-19
      • 2017-05-06
      相关资源
      最近更新 更多