选择超参数

参考  选择超参数 - 云+社区 - 腾讯云

目录

1、手动调整超参数

2、自动超参数优化算法

3、网格搜索

4、随机搜索

5、基于模型的超参数优化


大部分深度学习算法都有许多超参数来控制不同方面的算法表现。有些超参数会影响算法运行的时间和存储成本,有些超参数会影响学习到的模型质量以及在新输入上推断正确结果的能力。有两种选择超参数的基本方法,手动选择和自动选择。手动选择超参数需要了解超参数做了些什么,以及机器学习模型如何才能取得良好的范数。自动选择超参数算法大大减少了了解这些想法的需要,但它们往往需要更高的计算成本。

1、手动调整超参数

手动设置超参数,我们必须了解超参数、训练误差、泛化误差和计算资源(内存和运行时间)之间的关系。这需要了解一个学习算法有效容量的基础概念。手动搜索超参数的目标通常是最小化受限于运行时间和内存预算的泛化误差。我们不去探讨如何确定各种超参数对运行时间和内存的影响,因为这高度依赖于平台。

手动搜索超参数的主要目标是调整模型的有效容量以匹配任务的复杂性。有效容量受限于3个因素:模型的表示容量、学习算法成功最小化训练模型代建函数的能力,以及代价函数和训练过程正则化模型的程度。具有更多网络层、每层有更多隐藏单元的模型具有较高的表示能力------能够表示更复杂的函数。然而,如果训练算法不能找到某个合适函数来最小化训练代价,或者是正则化(如权重衰减)排除了这些合适的函数,那么即使模型的表示能力较高,也不能学习处合适的函数。

当泛化误差以某个超参数为变量,作为函数绘制出来时,通常会表现为U型曲线。在某个极端情况下,超参数对应着低容量,并且泛化误差由于训练误差较大而很高。这便是欠拟合的情况。另一个极端情况,超参数对应着高容量,并且泛化误差由于训练误差和测试误差之间的差距较大而很高。最优的模型容量位于曲线中间的某个位置,能够达到最低可能的泛化误差,由某个中等的泛化误差和某个中等的训练误差相加构成。

对于某些超参数,当超参数数值太大时,会发生过拟合。例如中间层隐藏单元的数量,增加数量能提高模型的容量,容易发生过拟合。对于某些超参数,当超参数数值太小时,也会发生过拟合。例如,最小的权重衰减系数允许为零,此时学习算法具有最大的有效容量,反而容易过拟合。

并非每个超参数都能对应着完整的U形曲线。很多超参数是离散的,如中间层单元数目或是maxout单元中线性元件的数目,这种情况只能沿曲线探索一些点。有些超参数是二值的。通常这些超参数用来指定是否学习算法中的一些可选部分,如预处理步骤减去均值并除以标准差来标准化输入特征。这些超阐述只能探索曲线上的亮点。其他一些超参数可能会有最小值或最大值,限制其探索曲线的某些部分。例如,权重衰减系数最下是零。这意味着,如果权重衰减系数为零时模型欠拟合,那么我们将无法通过修改权重衰减系数探索过拟合区域。换言之,有些超参数只能较少模型容量。

学习率可能是最重要的超参数。如果你只有时间调整一个超参数,那就调整学习率。相比其他超参数,它以一种更复杂的方式控制模型的有效容量------当学习率适合优化问题时,模型的有效容量最高,此时学习率是正确的,既不是特别大也不是特别小。学习率关于训练误差具有U形曲线。当学习过大时,梯度下降可能会不经意地增加而非减少训练误差。在理想的二次情况下,如果学习率是最佳值的两倍大时,则会发生这种情况。当学习率太小,训练不仅慢,还可能永久停留在一个很高的训练误差上。关于这种效应,我们知之甚少(不会发生于一个凸损失函数中)。

调整学习率外的其他参数时,需要同时监测训练误差和测试误差,以判断模型是否过拟合或欠拟合,然后适当调整其容量。如果训练错误率大于目标错误率,那么只能增加模型容量以改进模型。如果没有使用正则化,并且确信优化算法正确运行,那么有必要添加更多的网络层或隐藏单元。然而,令人遗憾的是,这增加了模型的计算代价。如果测试集错误大于目标错误率,那么可以采取两个方法。测试误差是训练误差和测试误差之间差距与训练误差总和。寻找最佳的测试误差需要权衡这些数值。当训练误差较小(因此容量较大),测试误差主要取决于训练误差和测试误差之间的差距时,通常神经网络效果最好。此时目标是缩小这一差距,使训练误差的增长速度不快于差距减小的速率。要减少这个差距,我们可以改变正则化超参数,以减少有效的模型容量,如添加Dropout或权重衰减策略。通常,最佳性能来自正则化得很好的大规模模型,比如使用Dropout的神经网络。

超参数容量何时增加原因注意事项
隐藏单元数增加

增加隐藏单元数量会增加模型的

表示能力

几乎模型每个所需的时间和内存代价都会

随隐藏单元数量的增加而增加

学习率调至最优不正确的学习速率,不管是太高还是太低都会由于优化失败而导致低有效容量的模型
卷积核密度增加增加卷积核宽度会增加模型的参数数量较宽的卷积核导致较窄的输出尺寸,除非使用隐式零填充减少此影响,否则会降低模型的容量。较宽的卷积核需要更多的内存存储参数,并会增加运行时间,但较窄的输出会降低内存代价
隐式零填充增加在卷积之前隐式添加零能保持较大尺寸的表示大多数操作的时间和内存代价会增加
权重衰减系数降低降低权重衰减系数使得模型参数可以自由地变大
Dropout比率降低较少地丢弃单元可以更多地让单元彼此“协力”来适应训练集

手动调整超参数时,不要忘记最终目标,提升测试集性能。加入正则化只是实现这个目标的一种方法。只要训练误差低,随时都可以通过收集更多的训练数据来减少泛化误差。实践中能够确保有效的暴力方法就是不断提高模型容量和训练集的大小,直到解决问题。这种做法增加了训练和推断的计算代价,所以只有在拥有足够资源时才是可行的。原则上,这种方法可能会因为优化难度提高而失败,但对于许多问题而言。优化似乎并没有成为一个显著的障碍。当然,前提是选择了合适的模型。

2、自动超参数优化算法

理想的学习算法应该是只需输入一个数据集,就可以输出学习的函数,而不需要手动调试超参数。一些流行的学习算法,如逻辑回归和支持向量机,流行的部分原因是这类算法只有一到两个超参数需要调整,它们也能表现出不错的性能。有些情况下,所需的调整的超参数数量较少时,神经网络可以表现出不错的性能;但超参数数量有几十甚至更多时,效果会提升得更加明显。当使用者有一个很好的初始值,例如由在几个相同类型的应用和架构上具有经验的人确定初始值,或者使用者在相似问题上具有几个月甚至几年的神经网络超参数调试经验,那么手动调整超参数能有很好的效果。然而,对于很多应用而言,这些起点都不可用。在这些情况下,自动算法可以找到合适的超参数。

如果仔细想想使用者搜索学习算法合适超参数的方式,我们会意识到这其实是一种优化:我们在试图寻找超参数优化目标函数,例如验证误差,有时还会有一些约束(如训练时间、内存或识别时间的预算)。因此,原则上有可能开发出封装学习算法的超参数优化算法,并选择其超参数,从而使用者不需要指定学习算法的超参数。令人遗憾的是,超参数优化算法往往有自己的超参数,如学习算法应该被探索的值的范围。然而,这些次级超参数通常很容易选择,这就是说,相同的次级超参数能够在很多不同的问题上具有良好的性能。

3、网格搜索

当有3个或更少的超参数时,常见的超参数搜索方法是网格搜索(grid search)。对于每个超参数,使用者选择一个较小的有限值集去探索。然后,这些超参数笛卡尔乘积得到一组组超参数,网格搜索使用每组超参数训练模型。挑选验证集误差最小的超参数作为最好的超参数。

应该如何选择搜索集合的范围呢?在超参数是数值(有序)的情况下,每个列表的最小和最大的元素可以基于先前相似实验的经验保守的挑选出来,以确保最优解非常可能在所选范围内。通常,网格搜索大约会在对数尺度(logarithemic scale)下挑选合适的值,例如,一个学习率的取值集合是\{0.1,0.01,10^{-3},10^{-4},10^{-5}\},或者隐藏单元数目的取值集合\{50,100,200,500,1000,2000\}

通常重复进行网格搜索时,效果会最好。例如,假设我们在集合\{-1,0,1\}上网格搜索超参数\alpha。如果我们找到的最佳值是1,那么说明我们低估了最优值\alpha所在的范围,应该改变搜索格点,例如在集合\{1,2,3\}中搜索。如果最佳值是0,那么我们不妨通过细化搜索范围以改进估计,在集合\{-0.1,0,0.1\}上进行网格搜索。

4、随机搜索

幸运的是,有一个替代网格搜索的方法,并且编程简单,使用方便,能更快地收敛到超参数的良好取值------随机搜索。随机搜索过程如下。首先,我们为每个超参数定义一个边缘分布,例如,Bernoulli分布或范畴分布(分别对应着二元超参数或离散超参数),或者对数尺度上的均匀分布(分别对应着二元超参数或离散超参数),或者对数尺度上的均匀分布(对应着正实值超参数)。例如,

                                                        log\_ learning\_rate \sim u(-1,5)\\ learning\_rate=10^{log\_learning\_rate}

其中,u(a,b)表示区间(a,b)上均匀采样的样本。类似地,log_number_hidden_units可以从u(log(50),log(2000))上采样。与网格搜索不同,我们不需要离散化超参数的取值。这允许我们在一个更大集合上进行搜索,而不产生额外的计算代价。实际上,当有几个超参数对性能度量没有显著的影响时,随机搜索相比于网格搜索指数级地高效。与网格搜索一样,我们通常会重复运行不同版本的随机搜索,以基于前一次运行的结果改进下一次搜索。

随机搜索能比网格搜索更快的找到良好超参数的原因是,没有浪费的实验,不像网格搜索有时会对一个超参数的两个不同值(给定其他超参数值不变)给出相同的结果。在网格搜索中,其他超参数将在这两次实验中拥有相同的值看,而在随机搜索中,它们通常会具有不同的值。因此,如果这两个值的变化对应的验证集误差没有明显区别的话,网格搜索没有必要重复两个等价的实验,而随机搜索仍然会对其他超参数进行两次独立的探索。

5、基于模型的超参数优化

超参数搜索问题可以转化为一个优化问题,决策变量是超参数,优化的代价训练出来的模型在验证集上的误差。在简化的设定下,可以计算验证集上可导函数关于超参数的梯度,然后我们遵循这个梯度更新。令人遗憾的是,在大多数实际设定中,这个梯度是不可用的。这可能因为其高频的计算代价和存储成本,也可能是因为验证集误差在超参数上本质上不可导,例如超参数是离散值的情况。

为了弥补梯度的缺失,我们可以对验证集误差建模,然后通过优化该模型来提出新的超参数猜想。大部分基于模型的超参数搜索算法,都是使用贝叶斯回归模型来估计每个超参数的验证集误差期望和该期望的不确定性。因此,优化涉及探索(探索高度不确定的超参数,可能带显著的效果提升,也可能效果很差)和使用(使用已经却行效果不错的超参数------通常是先前见过的非常熟悉的超参数)之间的权衡。关于超参数优化的最前沿方法还包括Spearmint、TPE、SMAC。

目前,我们无法明确确定,贝叶斯超参数优化是否是一个能实现更好深度学习结果或是能够事半功倍的成熟工具。贝叶斯超参数优化有时表现得像人类专家,能够在有些问题上取得很好的效果,但有时又会在某些问题上发生灾难性的失误。看看它是否适用于一个特定的问题是值得尝试的,但目前该方法还不够成熟或可靠。就像所说的那样,超参数优化是一个重要的研究领域,通常只要受深度学习所需驱动,但是它不仅能贡献于整个机器学习领域,还能贡献于一般的工程学。

大部分超参数优化算法比随机搜索更复杂,并且有一个共同的缺点,在它们能够从实验中提取任何信息之前,它们需要运行完整的训练实验。相比于人类实践者手动搜索,考虑实验早期可以收集的信息量,这种方法是相当低效的,因为手工搜索通常可以很早判断出某组超参数是否是完全病态的。在不同的时间点,超参数优化算法可以选择开启一个新实验,“冻结”正在运行但希望不大的实验,或是“解除”并恢复早期被冻结的,但现在根据更多信息后有希望的实验。

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wanderer001

ROIAlign原理

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值