神经网络超参数调整——设置随机种子是个好主意吗?

Neural network hyperparameter tuning - is setting random seed a good idea?

我正在尝试调整一个基本的神经网络作为练习。 (基于 coursera 课程的示例:神经网络和深度学习 - DeepLearning.AI) 我面临随机权重初始化的问题。假设我尝试调整网络中的层数。 我有两个选择:

两个版本各有利弊。 我最大的担忧是,如果我使用随机种子(例如:tf.random.set_seed(1)),那么确定的值可能会“过度拟合”到种子,并且在没有种子的情况下或如果值发生变化(例如: tf.random.set_seed(1) -> tf.random.set_seed(2)。另一方面,如果我在没有随机种子的情况下 运行 我的实验更多次,那么我可以检查更少的选项(由于计算能力有限)并且仍然只检查可能的随机权重初始化的子集。 在这两种情况下,我都觉得运气是这个过程中的一个重要因素。

是否有处理该主题的最佳实践?

TensorFlow 是否为此内置了工具?我感谢任何描述或教程的来源。提前致谢!

在深度学习(通常在机器学习)中调整超参数是一个常见问题。将随机种子设置为固定数可确保 可重复性 公平比较 。重复相同的实验会导致相同的结果。您可能知道,避免过度拟合的最佳做法是对数据进行训练测试拆分,然后使用 k 折 cross-validation 到 select 最佳超参数。如果您测试一个超参数的多个值,您希望确保可能影响模型性能的其他情况(例如训练-测试-拆分或权重初始化)对于每个超参数都是相同的,以便公平地比较表现。因此我总是建议修复种子。

现在,问题是,正如您已经指出的那样,每个模型的性能仍将取决于随机种子,例如您的情况下的特定数据拆分或权重初始化。为避免这种情况,可以进行 repeated k 折交叉验证。这意味着您多次重复 k 折交叉验证,每次使用不同的种子,select 那个 运行 的最佳参数,测试测试数据并对最终结果取平均值以获得良好的估计性能+方差,因此消除了种子在验证过程中的影响。 或者,您可以执行一次 k 折交叉验证,并使用不同的随机种子训练每个拆分 n 次 (消除权重初始化的影响,但仍然具有训练的效果-测试拆分).

最后,TensorFlow 没有用于此目的的内置工具。各位修炼者一定要注意。

您的问题没有绝对正确或错误的答案。您几乎已经回答了自己的问题。然而,在接下来的内容中,我将尝试通过以下几点进行更多扩展:

  1. 随机初始化的目的是打破对称性导致神经网络无法学习:

... the only property known with complete certainty is that the initial parameters need to “break symmetry” between different units. If two hidden units with the same activation function are connected to the same inputs, then these units must have different initial parameters. If they have the same initial parameters, then a deterministic learning algorithm applied to a deterministic cost and model will constantly update both of these units in the same way... Deep Learning (Adaptive Computation and Machine Learning series)

  1. 因此,我们需要用不同的值来初始化神经网络组件(尤其是权重)。关于如何选择这些值有一些经验法则,例如 Xavier 初始化,它从均值为 0 的正态分布和基于网络层数的特殊方差中采样。 This is a very interesting article to read.

  2. 话虽如此,初始值很重要但不是非常关键,“如果”遵循第 2 点中提到的适当规则。它们很重要,因为较大或不适当的值可能会导致消失或爆炸梯度问题。另一方面,不同的“适当”权重不应 巨大地 改变最终结果,除非它们造成上述问题,或使神经网络卡在某个局部最大值处。但是请注意,后者还取决于许多其他方面,例如学习率、使用的激活函数(一些 explode/vanish 比其他 this is a great comparison), the architecture of the neural network (e.g. fully connected, convolutional ..etc: this is a cool paper 多)和优化器。

  3. 除了第 2 点之外,除了标准的随机优化器之外,在交易中引入一个好的学习优化器,理论上应该不会让初始值的巨大影响影响最终结果质量,很明显。一个很好的例子是 Adam,它提供了一种非常自适应的学习技术。

  4. 如果你仍然得到明显不同的结果,使用不同的“适当”初始化权重,有一些方法“可能有助于”使神经网络更稳定,例如:使用训练-测试拆分,使用 GridSearchCV 以获得最佳参数,并使用 k-fold 交叉验证...等

  5. 最后,显然最好的场景是用不同的随机初始权重多次训练同一个网络,然后得到平均结果和方差,以更具体地判断整体性能。多少次?好吧,如果能做几百次,那就更好了,但这显然几乎不切实际(除非你有一些 Googlish 硬件能力和容量)。因此,我们得出与您在问题中得出的相同结论:考虑到前面提到的一些经验法则,使用种子时应该在时间和 space 复杂性和可靠性之间进行权衡点。就个人而言,我可以使用种子,因为我 believe 认为,“获胜的不是算法最好的人,而是拥有最多数据的人”。 (Banko 和 Brill,2001 年)。因此,使用足够(定义足够:它是主观的,但越多越好)数据样本的种子,不应引起任何担忧。