我们应该以什么顺序调整神经网络中的超参数?

时间:2016-05-26 17:38:31

标签: neural-network tensorflow hyperparameters

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

现在,我看到了许多不同的超参数,我必须调整:

  • 学习率:初始学习率,学习率衰减
  • AdamOptimizer需要4个参数(学习率,beta1,beta2,epsilon)所以我们需要调整它们 - 至少是epsilon
  • batch-size
  • nb of iterations
  • Lambda L2正则化参数
  • 神经元数量,层数
  • 隐藏图层的哪种激活功能,用于输出图层
  • dropout参数

我有两个问题:

1)你看到我可能忘记的任何其他超参数吗?

2)目前,我的调音非常“手动”,我不确定我是不是以正确的方式做所有事情。 是否有特殊的顺序来调整参数?首先是学习率,然后是批量大小,然后...... 我不确定所有这些参数是否独立 - 事实上,我很确定其中一些参数不是。哪些明显独立,哪些明显不独立?我们应该把它们调在一起吗? 是否有任何纸张或文章谈论正确调整特殊订单中的所有参数?

编辑: 以下是我获得的不同初始学习率,批量大小和正则化参数的图表。紫色曲线对我来说是完全奇怪的...因为成本随着其他方式慢慢下降,但它却以较低的准确率陷入困境。该模型是否可能陷入局部最小值?

Accuracy

Cost

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

感谢您的帮助! 保罗

5 个答案:

答案 0 :(得分:6)

我的一般订单是:

  1. 批量大小,因为它将在很大程度上影响未来实验的培训时间。
  2. 网络架构:
    • 网络中的神经元数量
    • 层数
  3. 休息(辍学,L2 reg等)
  4. <强>依赖关系:

    我假设

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

    强烈依赖彼此。我不是那个领域的专家。

    至于您的超参数:

    • 对于Adam优化器:&#34;本文中的推荐值为eps = 1e-8,beta1 = 0.9,beta2 = 0.999。&#34; (source
    • 对于Adam和RMSProp的学习率,我发现大约0.001的值对于大多数问题是最佳的。
    • 作为Adam的替代品,您还可以使用RMSProp,它可以将内存占用减少多达33%。有关详细信息,请参阅this answer
    • 您还可以调整初始权重值(请参阅All you need is a good init)。虽然,Xavier初始化器似乎是一种防止必须调整重量的好方法。
    • 我不会将迭代/纪元的数量调整为超参数。我训练网直到其验证错误收敛。但是,我给每次运行一个时间预算。

答案 1 :(得分:3)

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

答案 2 :(得分:2)

对于不那么重要的参数,您可以选择一个合理的值并坚持下去。

如你所说,这些参数的最佳值都相互依赖。最简单的方法是为每个超参数定义一个合理的值范围。然后从每个范围中随机采样参数并使用该设置训练模型。重复这一次,然后选择最好的模型。如果您很幸运,您将能够分析哪些超参数设置最有效,并从中得出一些结论。

答案 3 :(得分:0)

我不知道任何特定于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/

对于层数,我建议你做的是首先制作更小的网络并增加数据,在你有足够的数据后,增加模型的复杂性。

答案 4 :(得分:0)

开始之前:

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

然后,如果您想要一个接一个地做,我会这样:

  1. 大范围地调learning rate

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

  3. 调整音色(丢失,L2等)。

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