use*_*092 5 machine-learning neural-network deep-learning hyperparameters tensorflow
我正在尝试调整一个基本的神经网络作为练习。(基于 coursera 课程中的一个示例:神经网络和深度学习 - DeepLearning.AI)我面临随机权重初始化的问题。假设我尝试调整网络中的层数。我有两个选择:
两个版本各有利弊。我最大的担忧是,如果我使用随机种子(例如:),tf.random.set_seed(1)那么确定的值可能会“过度拟合”到种子,如果没有种子或值发生更改(例如:tf.random.set_seed(1)-> tf.random.set_seed(2). On),则可能无法正常工作另一方面,如果我在没有随机种子的情况下多次运行我的实验,那么我可以检查更少的选项(由于计算能力有限)并且仍然只检查可能的随机权重初始化的一个子集。在这两种情况下,我觉得运气是一个强大的因素正在进行中。
是否有最佳实践来处理这个话题?
TensorFlow 是否为此内置了工具?我感谢任何描述或教程的来源。提前致谢!
你的问题没有绝对正确或错误的答案。你几乎已经回答了你自己的问题。不过,在下文中,我将尝试通过以下几点进行更多扩展:
\n\n\n...唯一完全确定的属性是\n初始参数需要\xe2\x80\x9c打破不同单元之间的对称性\xe2\x80\x9d。\n如果两个具有相同激活函数的隐藏单元连接到\n相同的输入,那么这些单元必须具有不同的初始参数。如果它们具有相同的初始参数,则\n应用于确定性成本和\n模型的确定性学习算法将以相同的方式不断更新这两个单元...\n深度学习(自适应计算和机器学习系列)
\n
因此,我们需要用不同的值来初始化神经网络组件(尤其是权重)。关于如何选择这些值有一些经验法则,例如Xavier初始化,它从均值为 0 的正态分布和基于网络层数的特殊方差进行采样。这是一篇读起来非常有趣的文章。
话虽如此,初始值很重要,但如果遵循适当的规则,则不是极其关键,如第 2 点所述。它们很重要,因为较大或不正确的初始值可能会导致梯度消失或爆炸问题。另一方面,不同的“适当”权重不会极大地改变最终结果,除非它们造成上述问题,或者使神经网络陷入某些局部最大值。但请注意,后者还取决于许多其他方面,例如学习率、使用的激活函数(有些比其他的爆炸/消失更多:这是一个很好的比较)、神经网络的架构(例如完全连接、卷积等:这是一篇很酷的论文)和优化器。
\n除了第 2 点之外,除了标准随机优化器之外,引入一个好的学习优化器在理论上不应让初始值的巨大影响明显地影响最终结果的质量。一个很好的例子是Adam,它提供了一种非常自适应的学习技术。
如果您仍然得到明显不同的结果,并且具有不同的“适当”初始化权重,则有一些方法“可能有助于”使神经网络更加稳定,例如:使用训练-测试分割,使用GridSearchCV最佳参数,并使用k-fold交叉验证...等。
最后,显然最好的场景是用不同的随机初始权重多次训练同一个网络,然后得到平均结果和方差,以便对整体性能进行更具体的判断。多少次?好吧,如果能做到数百次,那就更好了,但这显然几乎不切实际(除非你有一些 Googlish 硬件能力和容量)。因此,我们得出与您在问题中得出的相同结论:考虑到前面提到的一些经验法则,在使用种子的时间和空间复杂性与可靠性之间应该进行权衡。就我个人而言,我可以使用种子,因为我相信,“不是谁拥有最好的算法就能获胜。而是谁拥有最多的数据”。(班科和布里尔,2001)。因此,使用具有足够(足够定义:它是主观的,但越多越好)数据样本的种子,不会引起任何问题。
\n| 归档时间: |
|
| 查看次数: |
390 次 |
| 最近记录: |