精华内容
下载资源
问答
  • 对机器学习的优化器与超参数理论研究进行了综述,回顾了超参数的一般搜索方法,对和优化器直接关联的批量大小、学习率超参数的设置方法进行了总结,对优化器和超参数需要进一步研究的问题进行了讨论。
  • 压缩包为贝叶斯优化在机器学习和深度学习中应用的小案例,里包含: (1)data:iris.csv和mnist.npz; (2)贝叶斯优化_ML.py; (3)贝叶斯优化_DL.py。
  • 超参数调整确定神经网络中隐藏层的数量
  • 深度学习模型优化 使用深度学习和贝叶斯优化进行超参数调整
  • 神经网络超参数

    2017-12-30 10:36:06
    深度学习网络的超参数学习论文,文中介绍了深度学习的超参数该根据什么因素进行选择
  • 机器学习算法的超参数优化 该代码为机器学习算法提供了超参数优化实现,如“关于机器学习算法的超参数优化:理论与实践”中所述。 为了使机器学习模型适应不同的问题,必须调整其超参数。 为机器学习模型选择最佳的...
  • 超参数

    千次阅读 2018-07-25 21:35:12
    一、什么是超参数? 普通参数都可以通过不断的学习(模型训练)而得到。 但是一般情况下,超参数是学习不来的。 它是提前定义好一系列值(一般在log范围均匀分布,如0.001 0.01 0.1 1 10 100 1000等),然后通过...

    一、什么是超参数?

    普通参数都可以通过不断的学习(模型训练)而得到。

    但是一般情况下,超参数是学习不来的。

    它是提前定义好一系列值(一般在log范围均匀分布,如0.001 0.01 0.1 1 10 100 1000等),然后通过迭代学习,得到最好的超参数,这个过程我们称为调参,其实就是优化求解的过程。

    二、正则化项

    λ权衡 模型复杂度和正则项。

    正则化越弱,说明模型更加关注样本点。但是这么做也容易造成过拟合。

    正则化强,容忍更多的错误。它更多的关心是防止过拟合(关心模型的复杂度,不关心每个样本的错误)

    展开全文
  • 选择超参数

    千次阅读 2019-11-05 14:24:44
    目录 1、手动调整超参数 2、自动超参数优化算法 3、网格搜索 4、随机搜索 5、基于模型的超参数优化 ...大部分深度学习算法都有许多...手动选择超参数需要了解超参数做了些什么,以及机器学习模型如何才能取得良...

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

    目录

    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。

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

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

    展开全文
  • 吴恩达深度学习——超参数调优

    千次阅读 2020-05-24 18:56:11
    本文主要介绍了如何进行超参数调优,包括如何选择合适的范围。其次介绍了Batch Norm批归一化以及Softmax回归,最后简单介绍了一下TensorFlow。

    引言

    本文是吴恩达深度学习第二课:改善深层网络的笔记。这次内容包括深度学习的实用技巧、提高算法运行效率、超参数调优。

    第二课有以下三个部分,本文是第二部分。

    1. 深度学习的实用指南
    2. 提高算法运行效率
    3. 超参数调优

    参数调优处理

    神经网络中有很多超参数,那要如何找到一套好点的参数设置呢。

    在这里插入图片描述
    比如上面的这些参数,如果要按重要程度来排序的话,红框里面的学习率是最重要的;其次是橙框框出的那些参数;再其次是紫框框出的那些;最后是没有框出的那些。

    那如果想调试一些参数值,要怎么做呢。

    在这里插入图片描述
    之前常见的做法是在网格中取样本点,比如上面有两个参数,每个样本点代表两个参数的值。然后尝试这25个点,看哪个选择效果最好。

    而在深度学习中,我们常用下面的做法。就是随机取点,比如也取25个点。
    在这里插入图片描述
    然后从中选出效果最好的点,这样做的原因是对于你要解决的问题而言,通常都不知道哪个超参数最重要。就像上面看到的一样,一些参数比其他参数更重要。

    举个例子,假设超参数一是学习率,超参数二是Adam算法中的 ε \varepsilon ε

    这种情况下,学习率的取值很重要,而 ε \varepsilon ε则相对无关紧要。

    如果在网络中取点,
    在这里插入图片描述
    用规整网格的方法试了5个学习率取值,你会发现无论 ε \varepsilon ε取什么,结果基本上都是一样的(在同一个学习率 α \alpha α下)。

    因为有25个样本值,但是只尝试了5个 α \alpha α取值。

    而随机取值,可以尝试25个独立的 α \alpha α值。

    在这里插入图片描述

    上面只是两个超参数,如果有三个的话,就会是一个立方体。

    在这里插入图片描述

    如果有更多的参数就无法画出来了。
    当给超参数取值时,一个惯例是采用由粗到细的策略。
    在这里插入图片描述
    假设有两个参数,并且你发现红线画出的那个取值效果较好,它附近的几个点也不错。接下来要做的是,放到这块小的区域,然后在里面更加密集地取值。
    在这里插入图片描述
    也就是在上面蓝色方格中取更多的点,再搜索哪个点效果最好。

    这种从粗到细的搜索经常使用。

    但超参数的搜索内容不止这些,下面我来介绍如何为超参数选择合适的范围。

    为超参数选择合适的范围

    上面我们已经知道了可以随机取值提升搜索效率,但是这里的随机取值并不是在有效值范围内的随机均匀取值,而是选择合适的范围,用来探究这些超参数哪个重要。

    在这里插入图片描述
    假设想知道网络的单元数多少合适,通常要预先设定一个范围,比如50到100,此时可以看到上面从50到100的数轴,我们可以随机在上面取点(这里要取整数),这是一个搜索特定超参数的很直观的方式。

    或者我们要选择神经网络的层数 L L L,或许可以定位2到4中的某个值。

    在这里插入图片描述
    上面都是取整数的例子,那如果取一些小数呢,比如学习率 α \alpha α的取值。

    假设我们将学习率最小值设为0.0001,最大值为1。

    在这里插入图片描述
    如果还是用类似前面的方法的话,即从0.0001到1中随机取值,可能90%的结果落到了0.1到1之间。(相当于按0.1将1分成了10份,取到0~0.1的概率只有10%)。

    这样看上去不对,此时考虑标尺搜索超参数的方式更合理。
    在这里插入图片描述
    即依次取0.0001、0.001、0.01、0.1、1。然后以幂次-4到0之间随机取值(要有小数),取到的值作为 10 10 10的幂次,就可以得到我们想要的随机值。

    在python中可以这么做:

    在这里插入图片描述
    上面 σ \sigma σ取值[-4,0]之间的随机数,然后取 1 0 σ 10^\sigma 10σ就可以得到我们想要的 α \alpha α

    >>> r = -4 * np.random.rand()
    >>> r
    -2.8480000821641887
    >>> 10 ** r
    0.001419057253217574
    

    最后另一个棘手的例子是给指数加权平均值的 β \beta β取值。

    假设我们认为 β \beta β的取值是0.9到0.999之间的某个值。

    在这里插入图片描述

    解决这个问题的最好方法是改成考虑 1 − β 1 -\beta 1β的取值,也就是0.1到0.001之间。这样就和我们上面考虑 α \alpha α的问题一样。

    在这里插入图片描述
    一旦我们得到了一个比较不错的值,我们还可以应用由粗到细的方法,在附近更加密集的随机取值。

    超参数训练的实践:Pandas VS Caviar

    你也许已经找到了一组好的超参数设置,并继续发展算法。但在几个月的过程中,你可以观察到你的数据逐渐发生改变,或许只是数据中心更新了服务器。

    正因为有这些原因,可能原来的超参数设定不再好用,所以建议每隔几个月至少重新评估一次设定的超参数。

    关于如何搜索超参数的问题,有两种主要的流派。
    一种是你像照顾婴儿一样照顾一个模型

    在这里插入图片描述
    可能第一天收敛效果不错,然后第二天你增大了学习率,然后过了几天,你发现学习率太大了,又把学习率改为之前的设置。可以说每天都花时间照顾此模型。

    这种情况通常是你机器的资源不够好,计算能力不强,不能再同一时间试验大量模型时才采取的办法。

    而另一种方法则显得财大气粗了一点,就是同时试验多种模型。

    在这里插入图片描述
    一般设定了一些超参数,然后让它自己运行,可能经过几周后得到这样的曲线;同时你可能有不同的模型,第二个模型可能会生成紫色曲线:

    在这里插入图片描述
    显然紫色曲线对应的模型更好一点,甚至同时试验了多种模型:
    在这里插入图片描述
    用这种方式可以同时试验许多不同的参数设定,到最后只要选择效果最好的那个即可。

    一般第一种方法叫做熊猫方式,因为熊猫的孩子比较少,一次通常只有一个,会花费很多精力抚养熊猫宝宝。

    而第二种方式就像鱼子酱一样,一次会产生上亿个鱼卵。
    在这里插入图片描述

    所以这两种方法取决于你的计算机资源。

    归一化网络的激活函数

    在深度学习兴起后,最重要的一个思想之一就是批归一化(Batch Normalization),批归一化会使参数搜索问题变得很容易,使神经网络对超参数的选择更加稳定,超参数的范围也可以更庞大,工作效果也很好。重要的是会使我们很容易的训练深层网络。

    当训练一个模型,比如逻辑回归时,我们知道归一化输入特征可以加速学习过程。

    在这里插入图片描述

    那更深层的网络呢,不仅有输入特征,每层还有激活值。

    在这里插入图片描述
    如果你想训练这些参数,比如 W [ 3 ] , b [ 3 ] W^{[3]},b^{[3]} W[3],b[3],那若能归一化 a [ 2 ] a^{[2]} a[2]岂不是美滋滋。

    在逻辑回归中,我们看到如果归一化输入特征 x 1 , x 2 , x 3 x_1,x_2,x_3 x1,x2,x3,会帮助我们更有效的训练 w , b w,b w,b

    现在的问题是,我们能否归一化每层的输出值 a a a。严格来说是归一化 z z z值。

    下面看如何实现批归一化。

    假设你有一些隐藏单元值,从 z ( 1 ) z^{(1)} z(1) z ( m ) z^{(m)} z(m),这些来自隐藏层 l l l,精确的写法应该是 z [ l ] ( i ) z^{[l](i)} z[l](i),这里为了方便简化了 l l l符号。

    已知这些值,先要计算平均值,然后计算方差。
    在这里插入图片描述
    接着归一化每个 z ( i ) z^{(i)} z(i)值。

    在这里插入图片描述
    同样防止分母为零,加上了一个很小的值。

    这样就把这些 z z z值归一化为均值为0方差为1的值,但是我们不想让隐藏单元总是含有均值0方差1分布的值,也许有不同的分布更有意义。

    因此要计算 z ∼ ( i ) \overset{\sim}{z}^{(i)} z(i)

    z ∼ ( i ) = γ z n o r m ( i ) + β \overset{\sim}{z}^{(i)} = \gamma z^{(i)}_{norm}+ \beta z(i)=γznorm(i)+β

    γ \gamma γ β \beta β是模型的学习参数,不是超参数。

    这里 γ \gamma γ β \beta β的作用是可以随意设置 z ∼ \overset{\sim}{z} z的平均值。

    如果 γ = σ 2 + ε \gamma = \sqrt{\sigma^2 + \varepsilon} γ=σ2+ε ,而 β = μ \beta = \mu β=μ

    那么 z ∼ ( i ) = z ( i ) \overset{\sim}{z}^{(i)} = z^{(i)} z(i)=z(i)

    通过给 γ \gamma γ β \beta β赋其他值,就可以使你构造含其他平均值和方差的隐藏单元值。

    所以现在用 z ∼ ( i ) \overset{\sim}{z}^{(i)} z(i)取代 z ( i ) z^{(i)} z(i)来参与神经网络的后续计算。

    我们从这小节学到的是,批归一化的作用是它适用的归一化过程不只是输入层,同样适用于神经网络中的深层隐藏神经元。

    不过训练输入和这些隐藏单元值的一个区别是,我们不想隐藏单元值必须是均值0方差1的标准正态分布,以便利用激活函数的非线性部分。

    所以批归一化的真正作用是使隐藏单元值的均值和方差归一化,使它们有固定的均值和方差。

    将Batch Norm拟合进神经网络

    在这里插入图片描述
    假设我们有一个这样的神经网络,对于上面这些记号应该很熟悉了吧。那我们要如何加入Batch Norm(简称BN)呢,

    在这里插入图片描述
    如果没有Batch Norm,下一步就是代入激活函数得到激活值了,但是我们今天要在这一步加入Batch Norm。

    在这里插入图片描述
    如上节所说的,我们加入BN,通过参数 β [ 1 ] , γ [ 1 ] \beta^{[1]},\gamma^{[1]} β[1],γ[1] 计算得到 z ∼ [ 1 ] \overset{\sim}{z}^{[1]} z[1]。然后再代入激活函数,得到 a [ 1 ] = g [ 1 ] ( z ∼ [ 1 ] ) a^{[1]} = g^{[1]}(\overset{\sim}{z}^{[1]}) a[1]=g[1](z[1])。这样就计算完第一层的结果。

    在这里插入图片描述
    BN发生在 Z Z Z a a a的计算过程之间。接下来通过这个 a [ 1 ] a^{[1]} a[1]来计算 z [ 2 ] z^{[2]} z[2],和第一层一样,我们对 z [ 2 ] z^{[2]} z[2]进行BN。

    在这里插入图片描述
    这里要强调的是BN发生在计算 z z z a a a之间的。
    这里我们(每个隐藏层)引入了两个参数 γ , β \gamma,\beta γ,β,所有现在网络的参数是:

    在这里插入图片描述
    这些参数都可以通过模型自己学习的,

    在这里插入图片描述
    更新的公式和参数 W , b W,b W,b一样,同时也可以应用Adam或RMSprop。

    在实践中,BN通常和mini-batch一起使用。

    在这里插入图片描述
    这里要指出的是
    在这里插入图片描述
    在应用BN时,我们要先将 z [ l ] z^{[l]} z[l]归一化,结果为均值0方差1的分布,然后再通过 β \beta β γ \gamma γ进行缩放。 这意味着,无论 b [ l ] b^{[l]} b[l]的值是多少,都会将均值设成0的过程中被减掉,因此在这里增加的任何常数的数值都不会发生改变,因为它们会被均值减法所抵消。 也就是使用BN,可以消除 b [ l ] b^{[l]} b[l]这个参数,或者说将它设为零即可。

    在这里插入图片描述
    z [ l ] z^{[l]} z[l]的式子中可以直接去掉 b b b
    在这里插入图片描述

    变成由 β [ l ] \beta^{[l]} β[l]控制转移或偏置条件。

    在这里插入图片描述
    下面来看下这些参数的维度, z [ l ] z^{[l]} z[l]的维度是 ( n [ l ] , 1 ) (n^{[l]},1) (n[l],1) β [ l ] \beta^{[l]} β[l] γ [ l ] \gamma^{[l]} γ[l]的维度也是 ( n [ l ] , 1 ) (n^{[l]},1) (n[l],1)

    因为这是隐藏单元的数量,要与 z [ l ] z^{[l]} z[l]的维度匹配才能对其进行转换。

    下面总结一下如何用BN来应用梯度下降法。

    在这里插入图片描述

    Batch Norm为什么奏效

    我们知道对输入特征进行归一化可以加速学习,而BN做的和输入特征归一化类似的事情。

    BN有用的第二个原因是它可以使权重比你的网络更加深。

    下面以一个例子说明。

    在这里插入图片描述
    比如我们有一个网络,假设已经在所有黑猫的图像上训练了数据集,如果现在要把这个网络应用于其他颜色的猫
    在这里插入图片描述
    此时可能你的模型适用的不会很好。
    在这里插入图片描述
    如果黑猫图像中的训练集是上图左边那样分布的,而其他颜色猫训练集分布是右边那样的,那么无法期待在左边训练好的模型能同样在右边也表现的很好。

    训练集的数据分布和预测集的数据分布不一致的问题就叫做“covariate shift”问题(或者可以想成输入值改变的问题就是covariate shift)。

    如果你已经学习了 x x x y y y的映射,此时若 x x x的分布改变了,那么你可能需要重新训练你的模型。

    还是以一个例子说明下,考虑下面这个神经网络:
    在这里插入图片描述
    我们从第三个隐藏来看看学习过程,假设已经学习了参数 W [ 3 ] , b [ 3 ] W^{[3]},b^{[3]} W[3],b[3]。从该层来看的话,它从上一层得到一些输入值,接下来它要做些事情希望使输出值 y ^ \hat y y^更接近于真实值 y y y

    在这里插入图片描述

    我们先遮住左边部分,从该层来看,它得到了4个输入值,用 a [ 2 ] a^{[2]} a[2]来表示,但这些值也可能是输入特征值。

    该层的工作是找到一种方式,使这些值映射到 y ^ \hat y y^。也许现在做得不错。

    在这里插入图片描述
    现在把遮罩打开,这个网络还有参数 W [ 2 ] , b [ 2 ] W^{[2]},b^{[2]} W[2],b[2] W [ 1 ] , b [ 1 ] W^{[1]},b^{[1]} W[1],b[1]。如果这些参数发生改变,那么第三层得到的输入也会发生改变。

    因此也就有了covariate shift问题,所以BN的作用是减少这些输入值改变的程度。
    如果绘制出来的话(这里取两个输入来绘制),BN说的是, z 1 [ 2 ] , z 2 [ 2 ] z^{[2]}_1,z^{[2]}_2 z1[2],z2[2]的值可以改变,
    在这里插入图片描述
    但是无论怎么变化,它们的均值和方差是一样的,由 γ [ 2 ] \gamma^{[2]} γ[2] β [ 2 ] \beta^{[2]} β[2]决定均值和方差具体是多少。

    这在一定程度上限制了上一层的参数更新能影响数据分布的程度,因此说BN减少了输入值改变的问题。

    也可以这样想,BN减弱了前层参数的作用与后层参数的作用之间的联系,它使得网络每层可以自己学习,稍微独立于其他层,这有助于加速整个网络的学习。

    BN还有一个作用是有一点正则化效果。

    • 每个小批次都被该小批次上计算的均值和方差所缩放(假设每个小批次大小为像64或128这种相对少的大小)。
    • 因为没有在整个数据集上计算均值和方差,因此均值和方差会有一点噪音。类似dropout,为每层激活值增加了噪音。
    • 类似dropout,BN有一点正则化效果。因为给隐藏单元增加了噪音,迫使后面的隐藏单元不会过分依赖于任何一个隐藏单元。

    因为正则化效果比较小,所以还是可以和dropout一起使用。

    因为BN一次只能处理一个mini-batch数据,它在mini-batch上计算均值和方差。因为测试时没有mini-batch样本,所以需要做一些不同的东西以确保预测有意义。

    测试时的Batch Norm

    BN将你的数据以mini-batch的形式逐一处理,但在测试时,你可能需要对每个样本逐一处理。

    在这里插入图片描述
    上面是在训练时用到的BN式子,在训练是都是应用于mini-batch的。但在测试时需要用其他方式来得到 μ , σ 2 \mu,\sigma^2 μ,σ2

    典型的做法是用一个指数加权平均来估算 μ , σ 2 \mu,\sigma^2 μ,σ2,这个指数加权平均涵盖了所有mini-batch。

    在这里插入图片描述
    假设在 l l l层得到很多小批次的均值,对这些均值做指数加权平均就得到了这一隐藏层的 μ \mu μ估计,同样地也可以对小批次的 σ 2 \sigma^2 σ2进行估计。
    在这里插入图片描述
    最后在测试时,对应于下面这个等式

    在这里插入图片描述
    只要用估计的 μ , σ 2 \mu,\sigma^2 μ,σ2来计算即可, z z z值是计算出来的, γ , β \gamma,\beta γ,β直接用训练时学到的。

    多分类问题-Softmax 回归

    我们之前的例子都是二分类问题,今天我们来了解下多分类问题。

    有一种逻辑回归的一般形式叫Softmax回归,能预测多个类别的概率。

    假设现在不是要识别是否为猫,而是要识别猫(类1)、狗(类2)和鸡(类3),如果不属于任何一类,则分为其他(类0)。

    在这里插入图片描述

    我们用 C C C表示类别的总数,这里有4种。

    在这里插入图片描述

    因此我们可以构建一个神经网络,它的输出层有4个单元。我们想要输出单元的值告诉我们属于这4种类型中每一种的概率有多大。

    这里的 y ^ \hat y y^会是一个 ( 4 , 1 ) (4,1) (4,1)维度的向量,并且因为输出的是概率,这4个概率加起来应该等于1。

    要做到这一点通常要使用Softmax层。

    在这里插入图片描述
    在计算出最后一层的 Z [ L ] Z^{[L]} Z[L]后,要应用Softmax激活函数。

    它的做法是这样的,首先要计算临时变量 t = e z [ L ] t =e ^{z^{[L]}} t=ez[L],它的维度这个例子中也是 ( 4 , 1 ) (4,1) (4,1)

    然后计算 a [ L ] a^{[L]} a[L]为向量 t t t的归一化,使得 a [ L ] a^{[L]} a[L]中元素和为1,它的维度这个例子中也是 ( 4 , 1 ) (4,1) (4,1)

    在这里插入图片描述
    这里取指数 e e e的目的是使得所有的值都为正数,满足了概率为正的定义,同时让每个值除以总和,这样所得的值加起来就为 1 1 1。然后可以根据值的大小得出属于哪个类别的概率最大。

    下面以一个例子说明,
    在这里插入图片描述
    这里是类别0的值最大,也就是属于类别0的概率最大。最后用紫线框出来的四个值就是 y ^ \hat y y^的输出。

    在这里插入图片描述
    这里的激活函数是Softmax函数。

    在这里插入图片描述
    上面是Softmax的三个例子,这里输入为 x 1 , x 2 x_1,x_2 x1,x2,把它们直接接入Softmax层,这里这里有3个类别,就会得到3个输出。上面相当于是一个没有隐藏层的神经网络。

    从决策边界可以直觉的感受到,这些决策边界都是线性的。

    当然,深度网络会有更多的层和神经元,因为用的激活函数都是非线性的,我们就可以学习到更复杂的非线性决策边界。

    训练一个Softmax分类器

    本小节我们来看下如何训练一个使用了Softmax层的模型。
    在这里插入图片描述
    先来回顾下上小节的内容,上面是Softmax函数的计算过程,最后由输入值5变成了0.842。这里的softmax说的是和hardmax对应的, hardmax是
    在这里插入图片描述
    hardmax会把最大元素的位置上放1,其他放0。这种比较适用于手写数字识别的one-hot向量。

    接下来我们看下如何训练带有softmax输出层的神经网络。

    先来看下损失函数的定义,下面是真实标签 y y y和输出标签 y ^ \hat y y^

    在这里插入图片描述
    从上面的例子看到,这个结果不太好。因为这实际上是一只猫,但是只给了猫20%的概率。

    那么如果用损失函数来表示这种差别呢,对应了两个向量的差别第一个想到的应该就是交叉熵了吧。损失函数的定义如下:

    在这里插入图片描述
    这个例子中只有 y 2 = 1 y_2 =1 y2=1,其他都是 0 0 0,因此上面的项可以简化为:
    在这里插入图片描述
    因此
    在这里插入图片描述
    要最小化损失函数,就变成要最小化 − log ⁡ y ^ 2 -\log \hat y_2 logy^2,即最大化 y ^ 2 \hat y_2 y^2,由softmax的公式可以值,最大也不会超过 1 1 1

    上面是单个样本的损失函数,那整个训练集的成本函数 J J J要如何计算呢

    在这里插入图片描述
    就是对每个样本的损失函数值取个平均即可。

    最后说一下代码实现细节,因为 C = 4 C=4 C=4 y y y y ^ \hat y y^都是一个 ( 4 , 1 ) (4,1) (4,1)向量

    所以向量化实现的话,对于 m m m个样本, Y Y Y写成:

    在这里插入图片描述
    Y ^ \hat Y Y^也这样表示:
    在这里插入图片描述
    最后看一下有softmax输出层时如何实现梯度下降法。

    在这里插入图片描述
    我们上面讲了前向传播,那反向传播呢
    在这里插入图片描述
    关键是 d z dz dz的表达式。

    在这里插入图片描述
    d z dz dz表达式可参考:吴恩达深度学习——神经网络基础

    下面介绍一下深度学习框架,从这次课程开始就可以不用自己实现深度神经网络了。

    深度学习框架


    如今又这么的深度学习框架(教程录制的时候可能还没有PyTorch和TensorFlow2)

    这里分享一下选择框架的标准:

    • 便于编程(包括开发和发布)
    • 运行高效
    • 完全开放(不仅需要开源,还需要良好的管理)

    TensorFlow

    (本小节介绍的是TensorFlow1,这还是博主第一次学习TensorFlow1)。

    假设现在有一个简单损失函数 J J J需要最小化,

    在这里插入图片描述
    我们来看怎样利用TensorFlow将其最小化。

    # 定义参数w
    w = tf.Variable(0,dtype=tf.float32)
    # 定义损失函数
    cost = tf.add(tf.add(w**2,tf.multiply(-10.,w)),25)# w^2  - 10w + 25
    # 学习算法 用0.01的学习率来最小化损失函数 
    train = tf.train.GradientDescentOptimizer(0.01).minimize(cost)
    
    
    init = tf.global_variables_initializer()
    session = tf.Session()
    session.run(init)
    print(session.run(w)) # 初始为0
    
    session.run(train)
    print(session.run(w)) # 运行一次梯度下降后,得到的w是0.099999994
    

    在这里插入图片描述
    下面我们运行梯度下降1000次迭代。

    for i in range(1000):
        session.run(train)
    print(session.run(w))
    

    在这里插入图片描述
    运行1000次梯度下降后,得到的w变成了4.9999,此时已经很接近最优值了。

    基本上用tf只要实现前向传播,它能弄明白如何做反向传播和梯度计算。

    #cost = tf.add(tf.add(w**2,tf.multiply(-10.,w)),25)# w^2  - 10w + 25
    cost = w**2 - 10*w +25
    

    tf还重载了运行符,这样上面的代码可以简写。

    上面我们最小化的是固定参数的损失函数。

    如果你想要最小化的函数是训练集函数又该怎么办呢,如果把训练数据加入TensorFlow程序呢

    # 定义参数w
    w = tf.Variable(0,dtype=tf.float32)
    # 把x定义成一个3x1的矩阵
    x = tf.placeholder(tf.float32,[3,1])
    # 定义损失函数
    #cost = tf.add(tf.add(w**2,tf.multiply(-10.,w)),25)# w^2  - 10w + 25
    # cost = w**2 - 10*w +25
    cost = x[0][0]*w**2 + x[1][0]*w + x[2][0]
    

    现在x变成了控制这个二次函数系数的数据,这个placeholder说的是后面会为x提供值。

    # 模拟x的数据
    cofficients = np.array([[1.],[-10.],[25.]])
    
    
    # 定义参数w
    w = tf.Variable(0,dtype=tf.float32)
    # 把x定义成一个3x1的矩阵
    x = tf.placeholder(tf.float32,[3,1])
    # 定义损失函数
    #cost = tf.add(tf.add(w**2,tf.multiply(-10.,w)),25)# w^2  - 10w + 25
    # cost = w**2 - 10*w +25
    cost = x[0][0]*w**2 + x[1][0]*w + x[2][0]
    
    # 学习算法 用0.01的学习率来最小化损失函数 
    train = tf.train.GradientDescentOptimizer(0.01).minimize(cost)
    
    
    init = tf.global_variables_initializer()
    session = tf.Session()
    session.run(init)
    print(session.run(w)) # 初始为0
    
    session.run(train,feed_dict={x:cofficients})
    print(session.run(w)) 
    
    for i in range(1000):
        session.run(train,feed_dict={x:cofficients})
    print(session.run(w))
    

    在这里插入图片描述

    session = tf.Session()
    session.run(init)
    print(session.run(w)) # 初始为0
    

    这三行代码在tf里面是符合表达习惯的,

    with tf.Session() as sessioin:
        session.run(init)
        print(session.run(w)) # 初始为0
    

    有些程序员习惯上面这么写。

    这段代码cost = x[0][0]*w**2 + x[1][0]*w + x[2][0]的作用是让tf建立计算图
    在这里插入图片描述

    参考

    1. 吴恩达深度学习 专项课程
    展开全文
  • 使用Optuna进行超参数优化

    千次阅读 2021-11-03 10:36:27
    超参数优化是一项艰巨的任务。 但是使用 Optuna 等工具可以轻松应对。 在这篇文章中,我将展示如何使用 Optuna 调整 CatBoost 模型的超参数。 Optuna 的超参数调整可视化 超参数 常规参数是在训练期间通过机器学习...

    超参数优化是一项艰巨的任务。 但是使用 Optuna 等工具可以轻松应对。

    在这篇文章中,我将展示如何使用 Optuna 调整 CatBoost 模型的超参数。

    Optuna 的超参数调整可视化

    超参数

    常规参数是在训练期间通过机器学习算法学习的参数。而超参数是设置如何训练模型的参数,它们有助于训练出更好的模型。

    以线性回归模型为例,线性回归通过训练参数来确定每个特征的权重。在构建模型时我们可以向模型添加正则化并附带一个超参数来控制正则化项的权重。这个带有超参数的附加项会改变模型的整体预测方式。所以更改这个超参数可以使模型变得更好或者更差,所以超参数的调整是非常重要并且必要的。

    超参数可以改变模型的行为在树型模型中更为突出,例如树型模型超参数可以控制树的深度、叶的数量、如何分割以及许多其他选项。这些选项中的每一个的改变都会对模型的结构以及它如何做出决策产生巨大的影响。虽然都是决策树,但树的类型可能会有很大的不同。

    对于更复杂集成模型来说,这些复杂的模型建立在许多不同的模型上,每个模型都有其超参数所以影响就更加的大了。需要为每个模型选择合适的超参数,如果人工来做工作量就会成倍增长,并且训练时间也会变得很长。

    超参数优化

    在超参数优化方面有多种选择。最常用的方法是Grid Search和它的一些改进的方法。

    Grid Search

    Grid Search是一种简单的暴力方法,它对输入到搜索空间的每个超参数进行组合。为每个组合创建一个模型并进行比较。虽然听着没有任何问题,但有几个关键方面需要注意。

    首先,确定最优超参数是一个NP-Hard问题,因为需要处理的是超参数的组合。就复杂性而言,暴力搜索的成本是无法接受的。

    第二个需要注意的方面是,训练的模型在很大一部分搜索中性能一直表现得很差。但Grid Search的还是会继续建立和训练这些模型。

    假设我们正在构建一棵决策树并使用Grid Search进行超参数的优化,在我们的超参数中包含了的“基尼系数”和”熵”的超参数设置。假设我们在训练时发前几个测试中,“基尼系数”的性能要优越得多。Grid Search还需会继续使用搜索空间中带有”熵”的参数进行训练。

    Random Search

    Grid Search的替代方法是Random Search。从名字看这似乎是比Grid Search更糟糕的选择。但是其实事实已经证明Random Search比Grid Search性能更好。

    非常简单的基本原理是随机搜索避免了Grid Search执行的许多冗余操作。Random Search通过以不均匀的间隔搜索超参数空间,更有可能找到局部最优的超参数。

    替代方案

    由于前面的两种方法都没有包含任何结构化的方法来搜索最优超参数集,所以我们这里将要介绍新的包来优化他们的问题提高效率。scikit-optimization和Optuna这样的包为我们提供了超参数搜索的新方法。

    Optuna

    Optuna是一个超参数的优化工具,对基于树的超参数搜索进行了优化,它使用被称为TPESampler“Tree-structured Parzen Estimator”的方法,这种方法依靠贝叶斯概率来确定哪些超参数选择是最有希望的并迭代调整搜索。

    无论使用的模型是什么,使用Optuna优化超参数都遵循类似的过程。第一步是建立一个学习函数。这个函数规定了每个超参数的样本分布。

    最常见的可用选项是categorical、integer、float或log uniform。想要检查 0.001、0.01 和 0.1 范围内的值时,可以使用log uniform,因为其中每个值都有相同的被选中概率。

    Optuna的另一个优点是能够设置条件超参数。因为许多超参数只有在与其他超参数组合使用时才更加有效。单独改变它们可能不会产生预期的效果。

    为了说明Optuna,我选择优化一个CatBoost模型。这个模型拥有数量惊人的超参数。虽然这篇文章只展示了其中的一部分,但是Optuna的许多特性,比如条件超参数都会被展示出来。

    Catboost

    Catboost 是一种基于树的集成方法。 这是一个非常强大的模型。

    与其他预测模型相比,CatBoost 的直接好处之一是可以直接处理分类变量。 因此,“cat”这个名字是 categorical 的缩写。

    CatBoost 的这一特性使其成为懒惰数据科学家的理想选择。 将分类变量转换为数值变量可能需要一些时间,并且还需要在验证、测试和推理时做相同的事情。使用 CatBoost只需定义分类参数,然后调整超参数即可处理这些分类特征。

    超参数“cat_features”设置哪些特征是分类的。 如果没有指定分类特征,CatBoost 将抛出一个错误,因为模型通常的输入必须是数字。

    Catboost 超参数

    loss_function — 训练损失函数,对于回归可以使用 RMSE 或 MAE。

    iterations — 设置迭代限制树的数量。其他超参数也可能会限制树的数量,从而导致总次数少于迭代次数。

    learning_rate — 在优化期间使用学习率。

    l2_leaf_reg— 指定正则化项的系数。这一项是 将L2 添加到成本函数中。

    depth— 树的深度。

    min_data_in_leaf— 指定何时停止分裂。当实例数低于此值时,该节点将变为叶子。

    one_hot_max_size— 唯一值小于或等于该值的参数的 One-Hot 编码。

    boosting_type — “Ordered”或“Plain” 。“Ordered”在较小的数据集上更好,但比普通方案慢。对于较大的数据集,建议使用“Plain”。

    rsm— ‘Alias: colsample_bylevel’定义用于在分割时选择特征以及随机再次选择特征时使用的百分比。

    bootstrap_type— 权重采样方法,‘Bayesian’, ‘Bernoulli’, ‘MVS’, ‘Poisson’, ‘No’

    bagging_temperature — 定义贝叶斯采样的设置。当参数设置为 1 时,根据指数分布添加权重。

    subsample— 当‘Poisson’、‘Bernoulli’或‘MVS’用于采样方法时,使用bagging的采样率。

    Optuna示例

    在这个例子中,我们使用使用钻石数据集。 该数据集旨在根据其他属性预测钻石的价格。 一些变量是分类的这通常需要一些预处理。

    https://www.kaggle.com/shivam2503/diamonds

    使用 CatBoost无需任何预处理即可生成模型,甚至可以处理缺失值,所以使它是一个非常强大且易于使用的模型。

    from sklearn.model_selection import train_test_split
    from sklearn.metrics import r2_score
    from catboost import CatBoostRegressor
    import optuna
    
    def objective(trial):
        X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
        param = {
            "loss_function": trial.suggest_categorical("loss_function", ["RMSE", "MAE"]),
            "learning_rate": trial.suggest_loguniform("learning_rate", 1e-5, 1e0),
            "l2_leaf_reg": trial.suggest_loguniform("l2_leaf_reg", 1e-2, 1e0),
            "colsample_bylevel": trial.suggest_float("colsample_bylevel", 0.01, 0.1),
            "depth": trial.suggest_int("depth", 1, 10),
            "boosting_type": trial.suggest_categorical("boosting_type", ["Ordered", "Plain"]),
            "bootstrap_type": trial.suggest_categorical("bootstrap_type", ["Bayesian", "Bernoulli", "MVS"]),
            "min_data_in_leaf": trial.suggest_int("min_data_in_leaf", 2, 20),
            "one_hot_max_size": trial.suggest_int("one_hot_max_size", 2, 20),  
        }
        # Conditional Hyper-Parameters
        if param["bootstrap_type"] == "Bayesian":
            param["bagging_temperature"] = trial.suggest_float("bagging_temperature", 0, 10)
        elif param["bootstrap_type"] == "Bernoulli":
            param["subsample"] = trial.suggest_float("subsample", 0.1, 1)
    
        reg = CatBoostRegressor(**param, cat_features=categorical_features_indices)
        reg.fit(X_train, y_train, eval_set=[(X_test, y_test)], verbose=0, early_stopping_rounds=100)
        y_pred = reg.predict(X_test)
        score = r2_score(y_test, y_pred)
        return score
    

    以上代码已经可以创建模型,但是如果使用Optuna还有一些参数需要设置,首先是采样器,需要使用前面讨论过的 TPESampler。 这种选择确保搜索将更加结构化和定向,而不是标准的Grid Search。

    需要注意的其他一些选项是direction、n_trials 和timeout。

    direction决定了优化的执行方式。 这个需要与正在使用的损失函数的预期优化相匹配。

    接下来,n_trials 控制将执行多少个超参数空间的样本。 结合timeout,这两个因素会影响最终的运行时间。 如果发现训练的时间紧张,则需要设置这两个参数。

    搜索的最终状态将都会被保存(并且稍后重新启动后可以加载),我们可以将长时间的训练任务分段执行。

    import numpy as np
    import pandas as pd
    from optuna.samplers import TPESampler
    
    df = pd.read_csv('diamonds.csv').drop(['index'],axis=1)
    X = df.drop(['price'],axis=1)
    y = df['price']
    categorical_features_indices = np.where(X.dtypes != np.float)[0]
    
    study = optuna.create_study(sampler=TPESampler(), direction="maximize")
    study.optimize(objective, n_trials=10, timeout=600) # Run for 10 minutes
    print("Number of completed trials: {}".format(len(study.trials)))
    print("Best trial:")
    trial = study.best_trial
    
    print("\tBest Score: {}".format(trial.value))
    print("\tBest Params: ")
    for key, value in trial.params.items():
        print("    {}: {}".format(key, value))
    

    超参数搜索的可视化

    一旦训练完成(无论是在达到最终迭代还是达到超时限制后)下一步是对结果进行可视化。

    上面的脚本将输出最优的模型性能和使用的超参数。我们还可以使用Optuna内置的可视化功能查看搜索进

    Hyper-Parameter重要性:确定哪些参数对模型的整体性能有最显著的影响。

    optuna.visualization.plot_param_importances(study)
    

    多次迭代的性能:模型在多次迭代中的性能。

    optuna.visualization.plot_optimization_history(study)
    

    单个超参数的性能:不同超参数在多次试验中的进展情况。

    optuna.visualization.plot_slice(study, params=['depth', 'learning_rate', 'bootstrap_type'])
    

    总结

    如果不适当调整超参数模型的性能可能会受到很大影响,如果人工调整产参数则会产生很大的工作量。像 Optuna 这样的工具可以帮助我们将超参数过程变得简单而有效。

    Optuna 提供了一种基于贝叶斯的方法来进行超参数优化和有效的搜索结构化,为模型的实际超参数调整提供了理想的解决方案。

    作者:Zachary Warnes

    展开全文
  • 在本文中,我们将介绍超参数优化,然后使用TensorBoard显示超参数优化的结果。 深度神经网络的超参数是什么? 深度学习神经网络的目标是找到节点的权重,这将帮助我们理解图像、文本或语音中的数据模式。 要做到这...
  •  在神经网络中有许多参数,而超参数就是神经网络训练过程中不变的参数,也就是在训练之前设置好的参数,  而不是训练  得到的参数。比如说,神经网络结构:层数,宽度,激活函数、训练参数:batch_size,学习率,...
  • 使用TensorBoard进行超参数优化

    千次阅读 2020-07-04 09:08:07
    在本文中,我们将介绍超参数优化,然后使用TensorBoard显示超参数优化的结果。 深度神经网络的超参数是什么? 深度学习神经网络的目标是找到节点的权重,这将帮助我们理解图像、文本或语音中的数据模式。 要做到这...
  • 超参数调整

    千次阅读 2019-08-18 22:35:32
    文章目录14.1 写在前面14.2 超参数概念14.2.1 什么是超参数,参数和超参数的区别?14.2.2 神经网络中包含哪些超参数?14.2.3 为什么要进行超参数调优?14.2.4 超参数的重要性顺序14.2.5 部分超参数如何影响模型性能...
  • 深度学习超参数介绍及调参

    万次阅读 多人点赞 2019-07-16 09:42:38
    文章目录超参数概念什么是超参数,参数和超参数的区别?神经网络中包含哪些超参数?为什么要进行超参数调优?超参数的重要性顺序部分超参数如何影响模型性能?部分超参数合适的范围网络训练中的超参调整策略如何调试...
  • 基于遗传算法超参数优化 超参数调整| AutoML | 随机搜索和网格搜索 (Hyper-parameter Tuning | AutoML | RandomSearch & GridSearch) Most Professional Machine Learning practitioners follow the ML Pipeline...
  • 机器学习模型的超参数优化

    千次阅读 2020-06-06 16:55:14
    机器学习中的超参数优化旨在寻找使得机器学习算法在验证数据集上表现性能最佳的超参数超参数与一般模型参数不同,超参数是在训练前提前设置的。举例来说,随机森林算法中树的数量就是一个超参数,而神经网络中的...
  • 【寻优算法】量子粒子群算法(QPSO) 参数寻优的python实现一、粒子群算法的缺点二、量子粒子群算法三、QPSO算法的python实现参考资料 一、粒子群算法的缺点 本人之前的博文(参考资料【1】)已经详细介绍了PSO...
  •   本文详细介绍基于Python的随机森林(Random Forest)回归算法代码与模型超参数(包括决策树个数与最大深度、最小分离样本数、最小叶子节点样本数、最大分离特征数等等)自动优化代码。   本文是在上一篇博客1...
  • 算法模型自动超参数优化方法!

    千次阅读 2020-12-22 19:57:32
    什么是超参数?学习器模型中一般有两类参数,一类是可以从数据中学习估计得到,我们称为参数(Parameter)。还有一类参数时无法从数据中估计,只能靠人的经验进行设计指定,我们称为超参数(...
  • 超参数调优方法整理大全

    千次阅读 2019-11-06 19:08:21
    机器学习中总是会碰见调...一、随机森林超参数优化- RandomSearch和GridSearch (1)RandomSearch 原理: 超参数优化也就是常说的调参,python-sklearn里常用的有GridSearchCV和RandomizedSearchCV可以用。其中Gr...
  • 自动化机器学习就是能够自动建立机器学习模型的方法,其主要包含三个方面:方面一,超参数优化;方面二,自动特征工程与机器学习算法自动选择;方面三,神经网络结构搜索。本文侧重于方面一,如何对超参数进行自动...
  •   在深度学习中有很多参数是我们在训练模型之前自己设定的,我们把这些参数就称为——超参数。其中主要超参数包括了:学习率、batch_size、梯度下降法循环的数量、隐藏层数目、隐藏层单元数目、激活函数的选择等。 ...
  • 公众号标题:神经网络中的优化方法之学习率衰减和动态梯度方向 引言 神经网络中的网络优化和正则化问题介绍主要分为一,二...无论是神经网络还是机器学习都会存在很多的超参数,在神经网络中,常见的超参数有: 网...
  • 如何应对可能的过拟合和欠拟合问题,还有超参数的调优,如何更好更快找到最优的参数呢? 本文会一一介绍上述的问题和解决方法。 2. 模型评估的方法 2.1 泛化能力 泛化能力 :指模型对 未知的、新鲜的...
  • automl-超参数优化(HPO)-综述

    千次阅读 多人点赞 2020-03-14 19:30:01
    超参数优化方法分类: 超参数优化方法分类 超参数优化的难题 当面对大模型、大数据集、复杂的机器学习时,功能函数的评估非常昂贵 配置空间非常复杂且是高维的 我们通常不能得到关于超参数的损失函数的梯度。此外...
  • 深度学习笔记(11) 超参数调试

    万次阅读 2019-06-06 08:31:12
    选择合适的范围、超参数调试实践
  • 在这篇文章中,我们将首先看看Lasso和Ridge回归中一些常见的错误,然后我将描述我通常采取的步骤来优化超参数。代码是用Python编写的,我们主要依赖scikit-learn。本文章主要关注Lasso的例子,但其基本理论与Ridge...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 501,926
精华内容 200,770
关键字:

超参数