神经网络中的超参数调整

机器算法验证 机器学习 神经网络 深度学习
2022-03-25 19:23:59

我试图为多标签分类问题微调神经网络模型。我也在阅读 Jason Brownlee 的 文章根据文章,有许多参数需要优化,它们是:

  1. 批量大小和训练时期
  2. 优化算法
  3. 学习率和动量
  4. 网络权重初始化
  5. 隐藏层的激活函数
  6. 辍学正则化
  7. 隐藏层中的神经元数量

代码片段如下。

model = KerasClassifier(build_fn=create_model, verbose=1)
# define the grid search parameters
batch_size = [10, 20, 40, 60, 80, 100]
epochs = [10, 50, 100]
learn_rate = [0.001, 0.01, 0.1, 0.2, 0.3]
momentum = [0.0, 0.2, 0.4, 0.6, 0.8, 0.9]
weight_constraint = [1, 2, 3, 4, 5]
dropout_rate = [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]
neurons = [1, 5, 10, 15, 20, 25, 30]

param_grid = dict(neurons=neurons, batch_size=batch_size, epochs=epochs, learn_rate=learn_rate, 
                 momentum=momentum, dropout_rate=dropout_rate, weight_constraint=weight_constraint)
grid = GridSearchCV(estimator=model, param_grid=param_grid, n_jobs=1)
grid_result = grid.fit(X_train, y_train, validation_split=0.2)

除此之外,网络中隐藏层的数量也是另一个参数。

我正在进行数据分区和网格搜索以进行微调。但即使在 GPU 机器中,计算也需要大量时间。

在这里,我在同一个网格中指定了所有这些参数。我想知道我们是否可以通过分别查找每个参数来简化这一点?例如,先找到最佳神经元数量,然后找到批量大小等。还有哪些其他方法可以减少搜索时间?

我也在阅读 Bengio 的论文Practical Recommendations for Gradient-Based Training of Deep Architectures但没有得到太多。

1个回答

@itdxer 评论中提供链接很棒。基于这个链接,我正在写这个答案。超参数优化是神经网络是一项繁琐的工作,因为它包含许多参数集。

寻找最佳参数的可能方法是:

  1. 手动调整(试错) -@Sycorax 的评论提供了手动调整的示例。在这里,基于试错实验和用户的经验,选择参数。
  2. 网格搜索- 此处基于参数值创建网格。然后尝试所有可能的参数组合,并选择最好的一个。
  3. 随机搜索- 在这里,不是像在网格搜索中那样尝试所有可能的组合,而是只尝试随机选择的参数子集并选择最好的。
  4. 贝叶斯优化(高斯过程) - 高斯过程使用一组先前评估的参数和结果精度来对未观察到的参数做出假设。使用此信息的采集函数建议下一组参数。不太明白,摘自此链接
  5. 树结构 Parzen 估计器 (TPE) - 每次迭代 TPE 都会收集新的观察结果,并在迭代结束时,算法决定接下来应该尝试哪组参数。不太明白,摘自此链接)。

现在按照这个链接

贝叶斯优化和 TPE 算法比经典的超参数优化方法有了很大的改进。它们允许从训练历史中学习,并为下一组参数提供越来越好的估计。

现在好消息是有一个名为hyperopt的 Python 库来执行这些操作。

以下页面中的更多详细信息:

http://neupy.com/2016/12/17/hyperparameter_optimization_for_neural_networks.html

https://jaberg.github.io/hyperopt/

https://github.com/jaberg/hyperopt/wiki

https://github.com/wenyangfu/hyperparam-search-guides/blob/master/hyperopt-guide.md

https://www.youtube.com/watch?v=Mp1xnPfE4PY