sklearn:通过梯度下降调整超参数?

Hin*_*ton 10 python parameters optimization scikit-learn

有没有办法通过梯度下降来执行scikit中的超参数调整?虽然可能难以计算超参数梯度的公式,但通过评估超参数空间中的两个关闭点来对超参数梯度进行数值计算应该相当容易.这种方法是否存在实施?为什么这种方法或不是一个好主意?

sas*_*cha 19

梯度的计算是最少的问题.至少在先进的自动分化软件中.(当然,对所有sklearn分类器实现这一点并不容易)

虽然有些人使用过这种想法,但他们只是针对一些特定且精心设计的问题(例如SVM调整).此外,可能有很多假设,因为:

为什么这不是一个好主意

  • 超参数优化通常是:非平滑的
    • GD非常喜欢平滑函数,因为零度梯度没有帮助
    • (每个超参数由一些离散集定义(例如l1对l2惩罚的选择)引入非光滑表面)
  • 超参数优化通常是:非凸的
    • GD的整个收敛理论假设,潜在的问题是凸的
      • 好的情况:你获得一些本地最小(可以是任意坏)
      • 最糟糕的情况:GD甚至没有收敛到某些本地最小值

我可以补充一点,你的一般问题是可以考虑的最糟糕的优化问题,因为它是:

  • 不光滑,不凸
  • 由于大多数基础算法都是启发式近似,并且在最终输出方面存在一些差异(通常甚至是基于PRNG的随机行为),因此甚至是随机/噪声.

最后一部分是为什么sklearn中提供的方法如此简单:

  • 随机搜索:
    • 如果我们因为问题太难而无法推断,只需尝试很多实例并选择最佳实例
  • 网格搜索:
    • 让我们假设有某种平滑
      • 而不是随机抽样,我们对平滑度假设进行抽样
        • (和其他假设一样:param可能很大 - > np.logspace分析更多大数字)

虽然有很多贝叶斯方法,包括像hyperopt留兰香等可用的python软件,很多人都认为,随机搜索一般来说是最好的方法(可能会令人惊讶,但强调上述问题).

  • 这个答案具有误导性。有关基于梯度的超参数优化的示例,请参阅[此处](https://arxiv.org/abs/1502.03492)和[此处](https://arxiv.org/abs/1703.01785)。 (3认同)

use*_*284 7

以下是一些描述基于梯度的超参数优化的论文:

我们通过在整个训练过程中向后链接导数来计算所有超参数的交叉验证性能的精确梯度。这些梯度使我们能够优化数千个超参数,包括步长和动量计划、权重初始化分布、丰富的参数化正则化方案和神经网络架构。我们通过用动量精确地反转随机梯度下降的动力学来计算超参数梯度。

我们研究了两种过程(反向模式和正向模式),用于计算相对于任何迭代学习算法(例如随机梯度下降)的超参数的验证误差的梯度。这些过程反映了计算循环神经网络梯度的两种方法,并且在运行时间和空间要求方面具有不同的权衡。我们对反向模式程序的制定与 Maclaurin 等人之前的工作相关。[2015]但不需要可逆动力学。前向模式过程适用于实时超参数更新,这可以显着加快大型数据集上的超参数优化速度。

使用任何基于梯度的机器学习算法都涉及调整优化器超参数(例如学习率)的繁琐任务。存在许多用于自动超参数优化的技术,但它们通常引入更多的超参数来控制超参数优化过程。我们建议通过梯度下降来学习超参数本身,并且还通过梯度下降来学习超超参数,如此下去。随着这些基于梯度的优化器塔的增长,它们对顶级超参数的选择变得越来越不敏感,从而减轻了用户搜索最佳值的负担。