如何分解大型网格搜索?

问题描述

我希望对不同的神经网络配置进行非常大的网格搜索。完整地说,使用我当前的硬件运行将是不切实际的。我知道,可能有比单纯的网格搜索更好的技术(例如,随机,贝叶斯优化),但是我的问题是,我们首先可以对要包含的内容做出合理的假设。具体来说,我希望在两者之间运行网格搜索

  • A:隐藏层数
  • B:隐藏层的大小
  • C:激活功能
  • D:L1
  • E:L2
  • F:辍学

我的一个想法是(1)通过在AC上运行网格搜索来识别网络配置c,(2)选择错误率最低(例如MSE)的c(针对测试)数据集),以及(3)通过在DF上进行单独的网格搜索以配置c来运行网络,以识别最合适的正则化策略。

这是在这种情况下采取的明智方法吗?或者,从理论上讲,我是否可以通过使用在第一次网格搜索(即AC)中显示较高误差的网络配置来获得较低的最终误差(即,在正则化之后)?

解决方法

您提到的是一种合理的方法。这类似于用于选择特征的所谓的贪婪前向特征选择方法。在您的情况下,它是模型参数而不是特征。

这个想法是正确的,并在实践中被广泛使用。无论您的硬件多么强大,它都永远不会足够强大,无法尝试可能的组合,而这种组合基本上是无限的。

但是,这种方法没有保证,第一个网格搜索中的最佳选择将总体上是最佳选择。如您所说,通过使用在第一次网格搜索中具有较高错误的netfork配置,您可以得到较低的最终错误。但实际上,差异应该不大。

我建议您从基本参数开始。例如学习率或优化器。它们的效果应该比其他参数(激活函数)和隐藏层数要多得多(如果您不是将单个层与非常深的网络进行比较,而是将1-2层的差异进行比较)。找到最佳配置时,应再次尝试重要的配置(lr,优化程序),同时保持找到的配置不变。

,

在您的情况下(A-C)主要涉及网络体系结构,而(D-F)是正则化。更深的网络(理论上)在提供足够数据的情况下将胜过较大的网络。当您在问题中未指定此内容时,请记住这一点。我的建议是:

  • 从一个小型网络开始,以relu作为激活功能,并且层数很少。
  • 使隐藏层的大小与输入大小保持一致:如果输入300暗,则执行300d-150d-输出大小之类的操作。
  • 使用辍学。
  • 从学习率的默认值开始,尝试在SGD,Adam,RMSProp之间进行优化。

使用其中一些参数来获得感觉。这将推动您进行进一步的搜索。

别忘了检查火车测试和验证测试之间的损失差异以及主要指标。另外,请不要在此步骤中使用测试集。测试集供您进行最终评估。最后意见:检查关于Learning Rate FinderCyclical learning rates等这类问题的流行方法,这些方法已证明表现良好。最后,不要忘记,虽然这些功能可以为您带来提振(大多数时候比预期的要小),但是功能工程可以让您走得很远。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...