超参数,例如学习率($ \alpha $)、正则化强度($ \lambda $)、dropout 率或批量大小,需要仔细调整以优化模型性能。为这些参数确定有效值是一项重大挑战。手动尝试各种数值效率低下,并且不太可能得到最佳结果,因此需要系统化的方法。查找超参数空间的两种常用策略是网格搜索和随机搜索。网格搜索:穷尽式但成本高昂网格搜索可能是最直观的方法。你为每个超参数定义一组要尝试的特定值,从而创建一个包含所有可能组合的“网格”。算法随后会训练并评估该网格上每一个组合的模型。例如,假设你要调整学习率 $ \alpha $ 和 L2 正则化强度 $ \lambda $。你可能会定义以下离散值集合:学习率:[0.1, 0.01, 0.001]正则化强度:[0.0, 0.01, 0.1]网格搜索将训练并评估所有 $ 3 \times 3 = 9 $ 种组合的模型:($ \alpha=0.1, \lambda=0.0 $)($ \alpha=0.1, \lambda=0.01 $)($ \alpha=0.1, \lambda=0.1 $)($ \alpha=0.01, \lambda=0.0 $)($ \alpha=0.01, \lambda=0.01 $)($ \alpha=0.01, \lambda=0.1 $)($ \alpha=0.001, \lambda=0.0 $)($ \alpha=0.001, \lambda=0.01 $)($ \alpha=0.001, \lambda=0.1 $)评估所有组合后(通常使用在验证集上的表现),你会选择产生最佳结果的组合。优点:系统性: 它穷尽地检查了定义网格内的所有指定组合。缺点:维度灾难: 组合的数量随着超参数的数量呈指数级增长。如果你有 $ k $ 个超参数,并且每个选择 $ n $ 个值,你需要训练 $ n^k $ 个模型。这对于超过少数几个超参数或每个参数的值较多的情况,很快就会变得计算上不可行。资源分配效率低下: 网格搜索花费同等精力来查找每个参数维度。然而,通常只有少数几个超参数对模型性能有很大影响。网格搜索可能会浪费计算资源来测试不重要参数的许多值,而对非常重要的参数只测试少数几个值。考虑在我们示例中,如果 $ \lambda $ 影响很小;在改变 $ \alpha $ 的同时测试 $ \lambda $ 的 3 个级别,不如测试更多 $ \alpha $ 值有用。随机搜索:高效查找随机搜索采用不同的方法。你不是定义一个离散的网格值,而是为每个超参数定义一个分布或范围(例如,学习率在 $10^{-4}$ 到 $10^{-1}$ 之间均匀分布,或正则化强度在 $10^{-5}$ 到 $10^0$ 之间对数均匀分布)。然后你指定一个固定预算,例如要训练的模型总数(尝试次数)。对于每次尝试,随机搜索会从其定义的分布中随机采样每个超参数的值,并用该组合训练/评估模型。例如,在调整 $ \alpha $ 和 $ \lambda $ 时,如果预算是 9 次尝试,随机搜索可能会从各自的范围中随机采样 9 个不同的 ($ \alpha, \lambda $) 对。优点:更高效: 研究(特别是 Bergstra 和 Bengio,2012 年的研究)表明,随机搜索通常比网格搜索更高效,尤其是在超参数数量较多时。它不会在不重要维度上卡住,持续查找多个值。通过随机采样,在相同预算内更有可能找到重要参数的优良值。灵活的预算: 你可以决定运行多少次尝试(组合),这使其更容易适应计算限制。简单性: 易于实现;只需定义范围并进行采样。缺点:非穷尽性: 它不保证在离散化网格中找到绝对最佳组合,因为它依赖于随机采样。可能出现聚集: 随机采样偶尔可能导致点在搜索空间的某一区域聚集,而在其他区域采样稀疏,尽管这比网格搜索在高维度中的系统性低效问题要小。网格搜索与随机搜索的比较让我们可视化这两种方法如何查找一个二维超参数空间(例如,学习率对比正则化强度)。{"layout": {"title": "网格搜索与随机搜索查找示意", "xaxis": {"title": "学习率(对数尺度)", "range": [-4, 0], "tickvals": [-4, -3, -2, -1, 0], "ticktext": ["0.0001", "0.001", "0.01", "0.1", "1.0"]}, "yaxis": {"title": "正则化强度(对数尺度)", "range": [-5, 0], "tickvals": [-5, -4, -3, -2, -1, 0], "ticktext": ["1e-5", "1e-4", "0.001", "0.01", "0.1", "1.0"]}, "legend": {"title": {"text": "搜索方法"}}, "width": 600, "height": 450}, "data": [{"x": [-3, -3, -3, -2, -2, -2, -1, -1, -1], "y": [-4, -2, 0, -4, -2, 0, -4, -2, 0], "mode": "markers", "type": "scatter", "name": "网格搜索", "marker": {"color": "#228be6", "size": 10}}, {"x": [-2.5, -1.8, -3.5, -1.1, -2.9, -3.8, -1.5, -2.2, -3.1], "y": [-1.5, -4.5, -2.0, -3.8, -0.5, -3.2, -2.8, -1.0, -4.8], "mode": "markers", "type": "scatter", "name": "随机搜索", "marker": {"color": "#f06595", "size": 10, "symbol": "x"}}]}网格搜索在固定的网格上采样,为每个参数测试有限的唯一值。随机搜索在定义的范围内自由采样点,在相同数量的尝试中可能会查找更多样的每个参数值。注意网格搜索(蓝色点)只测试了学习率的 3 个不同值和正则化强度的 3 个不同值。如果学习率的影响大得多,我们却只尝试了 3 种选项。随机搜索(粉色叉),在相同 9 次尝试的预算下,测试了 9 个不同的学习率和 9 个不同的正则化强度。在每个维度上进行更广泛的查找,使其更有可能为影响更大的参数找到更好的设置。实际考量与建议对于训练成本高昂且超参数空间可能很大很复杂的深度学习模型:优先使用随机搜索: 在相同的计算预算下,它通常比网格搜索更高效,特别是在处理超过 2-3 个超参数时。定义合理的范围: 为你的超参数选择合适的范围。学习率和正则化强度通常在对数尺度上采样(例如,学习率在 $10^{-4}$ 到 $10^{-1}$ 之间均匀采样),因为它们的影响通常是乘法性的。对于像 dropout 率或单元数量这样的参数,均匀尺度可能适合(例如,dropout 在 0.1 到 0.5 之间)。使用验证数据: 始终使用单独的验证集(而非测试集)评估超参数组合,以避免超参数过拟合到测试数据。迭代式优化: 你可以从一次广泛的随机搜索开始,以识别超参数空间中有希望的区域,然后围绕最初发现的最佳表现点进行更窄范围的搜索(无论是随机搜索还是网格搜索)。尽管网格搜索和随机搜索是基本方法,但存在更高级的技术,如贝叶斯优化、Hyperband 和基于群体的训练。这些方法尝试从过去的评估中学习,以更智能地指导未来的搜索,通常以更少的尝试次数取得更好的结果。然而,随机搜索仍然是一个强大的基准,并且在大多数深度学习场景中明显优于手动调整或穷尽式网格搜索。