返回介绍

数学基础

统计学习

深度学习

工具

Scala

四、选择超参数

发布于 2023-07-17 23:38:23 字数 6985 浏览 0 评论 0 收藏 0

  1. 大部分深度学习算法都有许多超参数来控制不同方面的算法表现

    • 有的超参数会影响算法运行的时间和存储成本
    • 有的超参数会影响学习到的模型质量,以及在新输入上推断正确结果的能力
  2. 有两种选择超参数的方法:

    • 手动选择。手动选择超参数需要了解超参数做了些什么,以及机器学习模型如何才能取得良好的泛化
    • 自动选择。自动选择超参数算法不需要你了解超参数做了什么以及机器学习模型如何才能取得零号的泛化,但是它往往需要更高的计算成本

4.1 手动调整超参数

  1. 手动设置超参数:

    我们必须了解超参数、训练误差、泛化误差、计算资源(内存和运行时间) 之间的关系。这要求我们切实了解一个学习算法有效容量的基本概念

  2. 手动搜索超参数的任务是:在给定运行时间和内存预算范围的条件下,最小化泛化误差

    • 我们不讨论超参数对于运行时间和内存的影响,因为它们高度依赖于平台
  3. 手动搜索超参数的主要目标是:调整模型的有效容量以匹配任务的复杂性

    • 模型的有效容量受限于三个因素:

      • 模型的表示容量。更多的网络层、每层更多的隐单元的模型具有更大的容量(能表达更复杂的函数)
      • 学习算法成功最小化训练模型代价函数的能力
      • 训练过程正则化模型的程度
    • 模型的表示容量并不是越高越好。如果无法找到合适的代价函数来最小化训练代价、或者正则化项排除了某些合适的函数,那么即使模型的表达能力再强,也无法学习出合适的函数。

  4. 如果以超参数为自变量,泛化误差为因变量。那么会在的曲线通常会表现为 U 形

    • 在某个极端情况下,超参数对应着低容量(并不是超参数越小,模型容量越低;也可能是相反的情况)。此时泛化误差由于训练误差较大而很高。这就是欠拟合

    • 在另一个极端情况下,超参数对应着高容量,此时泛化误差也很大。这就是过拟合

      • 过拟合中,泛化误差较大的原因是:虽然此时训练误差较小,但是训练误差和测试误差之间的差距较大。
    • 最优的模型容量位于曲线中间的某个位置

  5. 对于某些超参数,当超参数值太大时,会发生过拟合。如中间层隐单元的数量,数量越大,模型容量越高,也更容易发生过拟合。

    对于某些超参数,当超参数值太小时,也会发生过拟合。如 $ MathJax-Element-9 $ 正则化的权重系数,系数为0,表示没有正则化,此时很容易过拟合。

  6. 并不是每个超参数都对应着完整的 U 形曲线

    • 很多超参数是离散的,如中间层隐单元的数量,或者 maxout单元中线性片段的数目
    • 有些超参数甚至是二值的。如是否决定对输入特征进行标准化这个布尔值的超参数
    • 有些超参数可能有最小值或者最大值
  7. 学习率可能是最重要的超参数

    • 如果你只有时间来调整一个超参数,那么就调整学习率

    • 相比其他超参数,学习率以一种更复杂的方式控制模型的有效容量:

      • 当学习率大小适当时,模型的有效容量最高
      • 当学习率过大时,梯度下降可能会不经意地增加而非减少训练误差。在理想的二次情况下,如果学习率是最佳值的两倍时,会发生这种情况
      • 当学习率太小时,训练不仅会很慢,还有可能永久停留在一个很高的训练误差。对于这种情况我们知之甚少(但是我们可以知道这种情况不会发生在一个凸损失函数中)
    • 学习率关于训练误差具有 U 形曲线。泛化误差也是类似的 U 形曲线,但是正则化作用在学习率过大或者过小处比较复杂

      man_search

  8. 调整学习率以外的其他参数时,需要同时监测训练误差和测试误差,从而判断模型是否过拟合或者欠拟合,然后适当调整其容量

    • 如果训练集错误率大于目标错误率(这个根据任务背景人工指定),那么只能增加模型容量以改进模型。但是这增加了模型的计算代价

    • 如果测试集错误率大于目标错误率,则有两个方法:

      • 如果训练误差较小(这说明模型容量较大),则表明测试误差取决于训练误差与测试误差之间的差距。要减少这个差距,我们可以改变正则化超参数,以减少有效的模型容量
      • 如果训练误差较大(者说明模型容量较小),那么也只能增加模型容量以改进模型
  9. 通常最佳性能来自于正则化很好的大规模模型,如使用Dropout的神经网络

  10. 大部分超参数可以推论出是否增加或者减少模型容量,部分示例如下:

    超参数容量何时增加原因注意事项
    隐单元数量增加增加隐单元数量会增加模型的表示能力几乎模型每个操作所需要的时间和内存代价都会随隐单元数量的增加而增加
    学习率调至最优不正确的学习率,不管是太高还是太低都会由于优化失败而导致低的有效容量的模型
    卷积核宽度增加增加卷积核宽度会增加模型的参数数量较宽的卷积核导致较窄的输出尺寸,除非使用隐式零填充来减少此影响,否则会降低模型容量。较宽的卷积核需要更多的内存来存储参数,并增加运行时间
    隐式零填充增加在卷积之前隐式添加零能保持较大尺寸的表示大多数操作的时间和内存代价会增加
    权重衰减系数降低降低权重衰减系数使得模型参数可以自由地变大
    dropout 比率降低较少地丢弃单元可能更多的让单元彼此“协力”来适应训练集
  11. 手动调整超参数时不要忘记最终目标:提升测试集性能

    • 加入正则化只是实现这个目标的一种方法
    • 如果训练误差很低,也可以通过收集更多的训练数据来减少泛化误差。如果训练误差太大,则收集更多的训练数据就没有意义。
    • 实践中的一种暴力方法是:不断提高模型容量和训练集的大小。这种方法增加了计算代价,只有在拥有充足的计算资源时才可行

4.2 自动超参数优化算法

  1. 理想的学习算法应该是只需要输入一个数据集,然后就可以输出学习的函数而不需要人工干预调整超参数

    • 一些流行的算法如逻辑回归、支持向量机,其流行的部分原因是:这类算法只需要调整一到两个超参数,而且性能也不错
    • 某些情况下,神经网络只需要调整少量的超参数就能达到不错的性能;但是大多数情况下需要调整更多的超参数
  2. 原则上可以开发出封装了学习算法的超参数优化算法,并自动选择其超参数

    • 超参数优化算法往往有自己的超参数(如每个超参数的取值范围),这将问题变得更复杂
    • 我们可以人工选择参数优化算法这一级的超参数,因为这一级的超参数通常更容易选择

4.3 网格搜索

  1. 当只有三个或者更少的超参数时,常见的超参数搜索方法是:网格搜索

    • 对于每个超参数,选择一个较小的有限值集合去搜索
    • 然后这些超参数笛卡尔乘积得到多组超参数
    • 网格搜索使用每一组超参数训练模型,挑选验证集误差最小的超参数作为最好的超参数
  2. 如何确定搜索集合的范围?

    • 如果超参数是数值,则搜索集合的最小、最大元素可以基于先前相似实验的经验保守地挑选出来
    • 如果超参数是离散的,则直接使用离散值
  3. 通常网格搜索会在对数尺度下挑选合适的值

  4. 通常重复进行网格搜索时,效果会更好。假设在集合 {-1,0,1}上网格搜索超参数 $ MathJax-Element-21 $

    • 如果找到的最佳值是 1,那么说明我们低估了 $ MathJax-Element-21 $ 的取值范围。此时重新在 {1,2,3} 上搜索
    • 如果找到的最佳值是 0,那么我们可以细化搜索范围以改进估计。此时重新在 {-0.1,0,0.1} 上搜索
  5. 网格搜索的一个明显问题时:计算代价随着超参数数量呈指数级增长。

    • 如果有 $ MathJax-Element-12 $ 个超参数,每个最多取 $ MathJax-Element-13 $ 个值,那么所需的试验数将是 $ MathJax-Element-14 $ 。虽然我们可以并行试验,但是指数级增长的计算代价仍然不可行

4.4 随机搜索

  1. 随机搜索是一种可以替代网格搜索的方法,它编程简单、使用方便、能更快收敛到超参数的良好取值:

    • 首先为每个超参数定义一个边缘分布,如伯努利分布(对应着二元超参数)或者对数尺度上的均匀分布(对应着正实值超参数)
    • 然后假设超参数之间相互独立,从各分布中抽样出一组超参数。
    • 使用这组超参数训练模型
    • 经过多次抽样 -> 训练过程,挑选验证集误差最小的超参数作为最好的超参数
  2. 随机搜索的优点:

    • 不需要离散化超参数的值,也不需要限定超参数的取值范围。这允许我们在一个更大的集合上进行搜索
    • 当某些超参数对于性能没有显著影响时,随机搜索相比于网格搜索指数级地高效,它能更快的减小验证集误差
  3. 与网格搜索一样,我们通常会基于前一次运行结果来重复运行下一个版本的随机搜索

  4. 随机搜索比网格搜索更快的找到良好超参数的原因是:没有浪费的实验

    • 在网格搜索中,两次实验之间只会改变一个超参数 (假设为 $ MathJax-Element-19 $ )的值,而其他超参数的值保持不变。如果这个超参数 $ MathJax-Element-19 $ 的值对于验证集误差没有明显区别,那么网格搜索相当于进行了两个重复的实验

    • 在随机搜索中,两次实验之间,所有的超参数值都不会相等(因为每个超参数的值都是从它们的分布函数中随机采样而来)。因此不大可能会出现两个重复的实验

    • 如果 $ MathJax-Element-19 $ 超参数与泛化误差无关,那么不同的 $ MathJax-Element-19 $ 值:

      • 在网格搜索中,不同 $ MathJax-Element-19 $ 值、相同的其他超参数值,会导致大量的重复实验
      • 在随机搜索中,其他超参数值每次也都不同,因此不大可能出现两个重复的实验(除非所有的超参数都与泛化误差无关)

4.5 基于模型的超参数优化

  1. 超参数搜索问题可以转化为一个优化问题:

    • 决策变量是超参数
    • 优化的代价是超参数训练出来的模型在验证集上的误差
    • 在简化的设定下,可以计算验证集上可导的误差函数关于超参数的梯度,然后基于这个梯度进行更新
  2. 实际上,大多数问题中,超参数的梯度是不可用的

    • 一方面可能是因为因为高额的计算代价和存储成本。因为你需要计算非常多的超参数才能获得一系列的超参数的导数(这就要求你运行非常多轮次的算法)
    • 另一方面可能是因为验证集误差在超参数上本质不可导(如超参数时离散值的情况)
  3. 为了弥补超参数梯度的缺失,我们可以使用贝叶斯回归模型来估计每个超参数的验证集误差的期望和该期望的不确定性(贝叶斯回归模型不需要使用梯度)

    • 目前无法明确的确定:贝叶斯超参数优化是否有效。实际上,它有时表现得像一个人类专家,但是有时候又发生灾难的失误。目前该方法还不够成熟或可靠
  4. 大部分超参数优化算法比随机搜索更复杂,并且具有一个共同的缺点:在获取任何有效的超参数信息之前,你必须完整运行整个训练过程

    • 这种做法是相当低效的。实际上人类手动搜索之前,可以很早就判断某些超参数组合是否是完全病态的

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文