趋近智
为超参数选择合适的值是优化深度学习模型的一个重要方面。与在训练过程中学习到的模型参数(如权重 wi 和偏置 b)不同,超参数是在训练开始前指定的配置设定。它们决定了网络的整体结构和训练过程本身。
你接触过的超参数示例包括:
找到好的超参数组合可以显著影响模型表现。学习率选择不当可能会阻碍收敛,而不合适的网络架构可能难以学习数据中的潜在模式。系统地搜索最佳超参数组合的过程称为超参数调优或超参数优化。
手动凭直觉调整超参数既耗时又常不够理想。需要更结构化的方法。在此,我们介绍两种超参数搜索的基本策略:网格搜索和随机搜索。
网格搜索或许是超参数调优最直接的方法。它通过为每个要调优的超参数定义一个具体的列表或值范围来工作。然后,该算法穷举评估这些值的每个可能组合。
假设你想调优两个超参数:学习率和单个隐藏层中的单元数量。你可能会指定以下离散值进行测试:
[0.1, 0.01, 0.001][32, 64, 128]然后,网格搜索将为每个组合训练并评估一个独立的模型:
每个模型配置通常使用独立的验证数据集上的性能指标(如准确率或损失)进行评估。产生最佳验证表现的组合被选为搜索到的最佳超参数组合。
网格搜索在超参数值的交点定义的每个点上评估性能。
优点:
缺点:
网格搜索最实用是在只调优少量(通常是 2 或 3 个)超参数时,或者当你拥有强大的先验知识表明可能存在一个狭窄的最佳值范围时。
随机搜索提供了一种不同的方法。它不是定义离散的值网格,而是为每个超参数定义一个分布或范围(例如,学习率为 0.0001 到 0.01 之间的均匀分布,或隐藏单元从 [32, 64, 128, 256] 中选择)。然后,该算法从这些分布中随机抽取预定数量的组合并评估它们。
例如,与其像网格搜索示例那样测试 9 个特定组合,你可能决定运行随机搜索 9 次迭代。在每次迭代中,它将:
[32, 64, 128, 256] 中均匀选择)。在 9 次迭代后,它会选择在测试过的组合中产生最佳验证表现的组合。
随机搜索从超参数空间中采样点,在固定预算内可能比网格搜索更有效地发现有希望的区域。
Bergstra 和 Bengio 的研究(《超参数优化的随机搜索》,2012)表明,随机搜索通常比网格搜索更高效,特别是当某些超参数远比其他超参数更有影响力时(这在深度学习中很常见)。网格搜索花费相同的精力评估所有组合,包括那些不重要的超参数被改变而重要的超参数保持不变的组合。随机搜索通过独立采样,在有限的评估预算内更有可能找到重要超参数的良好值。
优点:
缺点:
在实际中,随机搜索在调优深度学习模型时通常优于网格搜索,特别是在处理超过几个超参数或调优的计算预算有限时。
GridSearchCV、RandomizedSearchCV)提供方便的实现。Optuna、Ray Tune 或 KerasTuner 等专门库提供了比简单网格和随机搜索更高级的算法(例如,贝叶斯优化),它们可以更高效,但超出了本介绍的范围。Here's a Python snippet illustrating the difference in iteration logic:
# --- 网格搜索 ---
learning_rates = [0.1, 0.01, 0.001]
hidden_unit_options = [32, 64, 128]
results = {}
print("开始网格搜索...")
for lr in learning_rates:
for hidden_units in hidden_unit_options:
config = {'lr': lr, 'hidden': hidden_units}
print(f" 测试配置: {config}")
# performance = train_and_evaluate(config) # 占位符
# results[tuple(config.items())] = performance
print("网格搜索完成。")
# --- 随机搜索 ---
import random
import math
num_iterations = 9 # 与网格搜索的组合数量匹配
results_random = {}
print("\n开始随机搜索...")
for i in range(num_iterations):
# Sample learning rate log-uniformly between 1e-3 and 1e-1
log_lr = random.uniform(math.log10(0.001), math.log10(0.1))
lr = 10**log_lr
# Sample hidden units uniformly from choices
hidden_units = random.choice([32, 64, 128, 256])
config = {'lr': lr, 'hidden': hidden_units}
print(f" 第 {i+1}/{num_iterations} 次迭代: 测试配置: {config}")
# performance = train_and_evaluate(config) # 占位符
# results_random[tuple(config.items())] = performance
print("随机搜索完成。")
# 在实际情况中,你会比较 'results' 或 'results_random'
# 以找到表现最佳的配置。
找到好的超参数通常是一个迭代过程,它将这些结构化搜索方法与从监控训练和评估模型表现中获得的见解结合起来。尽管不是万能药,但系统化的超参数调优是提升深度学习模型性能上限的重要工具。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造