精华内容
下载资源
问答
  • 超参数调优
    2021-12-13 17:37:22

    概述

    对于很多算法工程师来说, 超参数调优是件非常头疼的事。除了根据经验设定所谓的“合 理值”之外, 一般很难找到合理的方法去寻找超参数的最优取值。 而与此同时,超参数对于模型效果的影响又至关重要。 高没有一些可行的办法去进行超参数的调优呢?

    为了进行超参数调优,我们一般会采用网格搜索、 随机搜索、贝叶斯优化等算法。 在具体介绍算法之前,需要明确超参数搜索算法一般包括哪几个要素。一是目标函数,即算法需要最大化/最小化的目标;二是搜索范围,一般通过上限和下限来确定 ; 三是算法的其他参数, 如搜索步长。

    网格搜索

    网格搜索可能是最简单、应用最广泛的超参数搜索算法, 色通过查找搜索范围内的所有的点来确定最优值。 如果采用较大的搜索范围以及较小的步长,网恪搜索高很大概率找到全局最优值。 然而,这种搜索方案十分消耗计算资源和时间,特别是需要调优的超参数比较多的时候。因此, 在实际应用中,网格搜索法一般会先使用较广的搜索范围和较大的步长,来寻找全局最优值可能的位置;然后会逐渐缩小搜索范围和步长,来寻找更精确的最优值。 这种操作方案可以降低所需的时间和计算量, 但由于目标函数一般是非凸的, 所以很可能会错过全局最优值。

    随机搜索

    随机搜索的思想与网格搜索比较相似 , 只是不再测试上界和下界之间的所有值,而是在搜索范围中随机选取样本点。 它的理论依据是,如果样本点集足够大,那么通过随机采样也能大概率地找到全局最优值, 或其近似值。随机搜索一般会比网格搜索要快一些,但是和网格搜索的快速版一样,它的结果也是没法保证的。

    贝叶斯优化算法

    贝叶斯优化算法在寻找最优值参数时,采用了与网格搜索、随机搜索完全不同的方法。网格搜索和随机搜索在测试一个新点时,会忽略前一 个点的信息,而贝叶斯优化算法则充分利用了之前的信息。贝叶斯优化算法通过对目标函数形状进行学习,找到使目标函数向全局最优值提升的参数。具体来说,它学习目标函数形状的方法是,首先根据先验分布,假设 一个搜集函数,然后,每一次使用新的采样点来测试目标函数时,利用这个信息来更新目标函数的先验分布;最后,算法测试由后验分布给出的全局最值最可能出现的位置的点。对于贝叶斯优化算法,有一个需要注意的地方,一旦找到了一个局部最优值,它会在该区域不断采样,所以很容易陷入局部最优值。为了弥补这个缺陷,贝叶斯优化算法会在探索和利用之 间找到一个平衡点,“探索”就是在还未取样的区域获取采样点;而“利用”则是根据后验分布在最可能出现全局最值的区域进行采样。

    更多相关内容
  • 为此,提出了一种基于稳健设计的超参数调优方法(称为稳健调优法)。具体地,以SGNS算法中的超参数调优为例,在词语推断任务上实验并得出:经方差分析得到SGNS算法中的七个超参数中的五个对算法预测性能有显著影响,...
  • 超参数调优的方法

    2022-03-20 22:31:21
    GridSearchCV,它存在的意义就是自动调参,只要把参数输进去,就能给出最优化的结果和参数。但是这个方法适合于小数据集,一旦数据的量级上去了,很难得出结果。这个时候就是需要动脑筋了。数据量比较大的时候可以...

    目录

    1 gridSearchCV(网格搜索)

    2 随机搜索 

    3 贝叶斯优化算法 


    1 gridSearchCV(网格搜索)

            sklearn.model_selection.GridSearchCV — scikit-learn 1.0.2 documentation

            GridSearchCV,它存在的意义就是自动调参,只要把参数输进去,就能给出最优化的结果和参数。但是这个方法适合于小数据集,一旦数据的量级上去了,很难得出结果。这个时候就是需要动脑筋了。数据量比较大的时候可以使用一个快速调优的方法——坐标下降。它其实是一种贪心算法:拿当前对模型影响最大的参数调优,直到最优化;再拿下一个影响最大的参数调优,如此下去,直到所有的参数调整完毕。这个方法的缺点就是可能会调到局部最优而不是全局最优,但是省时间省力,巨大的优势面前,还是试一试吧,后续可以再拿bagging再优化。

            网格搜索可能是最简单、应用最广泛的超参数搜索算法,它通过查找搜索范围内的所有的点来确定最优值。如果采用较大的搜索范围以及较小的步长,网格搜索有很大概率找到全局最优值。然而,这种搜索方案十分消耗计算资源和时间,特别是需要调优的超参数比较多的时候。因此,在实际应用中,网格搜索一般会先使用较广的搜索范围和较大的步长,来寻找全局最优值可能的位置;然后会逐渐缩小搜索范围和步长,来寻找更精确的最优值。这种操作方案可以降低所需的时间和计算量,但由于目标函数一般是非凸的,所以很可能会错过全局最优值。

            通常算法不够好,需要调试参数时必不可少。比如SVM的惩罚因子C,核函数kernel,gamma参数等,对于不同的数据使用不同的参数,结果效果可能差1-5个点,sklearn为我们提供专门调试参数的函数GridSearchCV。

    示例:

    from sklearn import svm, datasets
    from sklearn.model_selection import GridSearchCV, train_test_split, StratifiedKFold
    iris = datasets.load_iris()
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.3)
    parameters = {'kernel': ('linear', 'rbf'), 'C': range(1, 10)}
    svr = svm.SVC(probability=True)
    clf = GridSearchCV(svr, parameters, cv=3)  # 3折交叉验证
    # 或者:
    # kflod = StratifiedKFold(n_splits=10, shuffle=True, random_state=7)  # 将训练/测试数据集划分10个互斥子集,
    # clf = GridSearchCV(svr, parameters, scoring='neg_log_loss', n_jobs=-1, cv=kflod)
    
    clf.fit(x_train, y_train)
    print(clf)
    
    # 查看参数最佳组合
    print(clf.best_params_)
    print(clf.best_estimator_)
    print(clf.best_score_)
    
    # 预测测试集的准确率
    y_ = clf.predict(x_test)
    # 准确率
    a = (y_ == y_test).mean()
    print(a)
    # 或直接调用gcv.score(x_test, y_test)
    # 或
    # from sklearn.metrics import accuracy_score
    # accuracy_score(y_test, y_)
    # 三种方法都行
    
    # 混淆矩阵
    from sklearn.metrics import confusion_matrix
    cm = confusion_matrix(y_test, y_)
    print(cm)
    
    # 精确率、召回率、f1-score调和平均值
    from sklearn.metrics import classification_report
    print(classification_report(y_test, y_, target_names=iris.target_names))
    
    
    

    2 随机搜索 

             随机搜索的思想与网格搜索比较相似,只是不再测试上界和下界之间的所有值,而是在搜索范围中随机选取样本点。它的理论依据是,如果样本点集足够大,那么通过随机采样也能大概率地找到全局最优值,或其近似值。随机搜索一般会比网格搜索要快一些,但是和网格搜索的快速版一样,它的结果也是没法保证的。 

    3 贝叶斯优化算法 

            贝叶斯优化算法在寻找最优最值参数时,采用了与网格搜索、随机搜索完全不同的方法。网格搜索和随机搜索在测试一个新点时,会忽略前一个点的信息;而贝叶斯优化算法则充分利用了之前的信息。贝叶斯优化算法通过对目标函数形状进行学习,找到使目标函数向全局最优值提升的参数。具体来说,它学习目标函数形状的方法是,首先根据先验分布,假设一个搜集函数;然后,每一次使用新的采样点来测试目标函数时,利用这个信息来更新目标函数的先验分布;最后,算法测试由后验分布给出的全局最值最可能出现的位置的点。对于贝叶斯优化算法,有一个需要注意的地方,一旦找到了一个局部最优值,它会在该区域不断采样,所以很容易陷入局部最优值。为了弥补这个缺陷,贝叶斯优化算法会在探索和利用之间找到一个平衡点,“探索”就是在还未取样的区域获取采样点;而“利用”则是根据后验分布在最可能出现全局最值的区域进行采样。

    【技术干货】超参数优化专题:贝叶斯优化|BayesOpt|HyperOpt|Optuna|自动化调参|高斯过程|TPE|机器学习_哔哩哔哩_bilibili

    链接: https://pan.baidu.com/s/1zDQC-qMDPK2T-Y6QfNb6GQ 提取码: dhu8

            超参数优化的目标是找出使模型泛化能力最高的超参数。

    ​​​​​​​

     

     

     

    ​​​​​​​​​​​​​​

     

     

     

    ​​​​​​​

    展开全文
  • 超参数调优

    2022-01-29 16:47:23
    使用 Keras Tuner 帮助模型超参数调优 you will use the Keras Tuner to find the best hyperparameters for a machine learning model import tensorflow as tf from tensorflow import keras import keras_tuner ...

    使用 Keras Tuner 帮助模型超参数调优

    Keras Tuner 是一个库,可帮助您为 TensorFlow 程序选择最佳的超参数集,超参数有两种类型:模型超参数,算法超参数。

    import tensorflow as tf
    from tensorflow import keras
    
    import keras_tuner as kt
    
    (img_train, label_train), (img_test, label_test) = keras.datasets.fashion_mnist.load_data()
    
    # Normalize pixel values between 0 and 1
    img_train = img_train_astype('float32') / 255.0
    img_test = img_test_astype('float32') /255.0
    

    定义模型

    构建用于超调的模型时,除了模型架构之外,还要定义超参数搜索空间。您为超调设置的模型称为超模型。

    您可以通过两种方式定义超模型:

    • 使用模型构建工具函数
    • 将 Keras Tuner API 的 HyperModel 类子类化
    def model_builder(hp):
        model = keras.Sequential()
        model.add(keras.layers.Flatten(input_shape=(28, 28)))
    
      # Tune the number of units in the first Dense layer, Choose an optimal value between 32-512
        hp_units = hp.Int('units', min_value=32, max_value=512, step=32)
        model.add(keras.layers.Dense(units=hp_units, activation='relu'))
        model.add(keras.layers.Dense(10))
    
      # Tune the learning rate for the optimizer, Choose an optimal value from 0.01, 0.001, or 0.0001
        hp_learning_rate = hp.Choice('learning_rate', values=[1e-2, 1e-3, 1e-4])
    
        model.compile(optimizer=keras.optimizers.Adam(learning_rate=hp_learning_rate),
                    loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True),
                    metrics=['accuracy'])
    
        return model
    

    实例化调节器并执行超调

    实例化调节器以执行超调。Keras Tuner 提供了四种调节器:RandomSearch, Hyperband, BayesianOptimization, and Sklearn.
    要实例化 Hyperband 调节器,必须指定超模型、要优化的 objective 和要训练的最大周期数 (max_epochs)。

    tuner = kt.Hyperband(model_builder,
                         objective='val_accuracy',
                         max_epochs=10,
                         factor=3,
                         directory='my_dir',
                         project_name='intro_to_kt')
    
    stop_early = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=5)
    
    tuner.search(img_train, label_train, epochs=50, validation_split=0.2, callbacks=[stop_early])
    
    # Get the optimal hyperparameters
    best_hps=tuner.get_best_hyperparameters(num_trials=1)[0]
    
    print(f"""
    The hyperparameter search is complete. The optimal number of units in the first densely-connected
    layer is {best_hps.get('units')} and the optimal learning rate for the optimizer
    is {best_hps.get('learning_rate')}.
    """)
    

    使用从搜索中获得的超参数找到训练模型的最佳周期数。

    # Build the model with the optimal hyperparameters and train it on the data for 50 epochs
    model = tuner.hypermodel.build(best_hps)
    history = model.fit(img_train, label_train, epochs=50, validation_split=0.2)
    
    val_acc_per_epoch = history.history['val_accuracy']
    best_epoch = val_acc_per_epoch.index(max(val_acc_per_epoch)) + 1
    print('Best epoch: %d' % (best_epoch,))
    
    展开全文
  • 一文详解超参数调优方法

    千次阅读 2020-12-08 19:12:14
    ©PaperWeekly 原创 ·作者|王东伟单位|Cubiz研究方向|深度学习本文介绍超参数(hyperparameter)的调优方法。神经网络模型的参数可以分为两类:模型参数,在训...

    ©PaperWeekly 原创 · 作者|王东伟

    单位|Cubiz

    研究方向|深度学习

    本文介绍超参数(hyperparameter)的调优方法。

    神经网络模型的参数可以分为两类:

    1. 模型参数,在训练中通过梯度下降算法更新;

    2. 超参数,在训练中一般是固定数值或者以预设规则变化,比如批大小(batch size)、学习率(learning rate)、正则化项系数(weight decay)、核函数中的 gamma 等。

    超参数调优的目标通常是最小化泛化误差(generalization error),也可以根据具体任务自定义其他优化目标。泛化误差是指预测未知样本得到的误差,通常由验证集得到,关于验证集可以参阅 Cross-validation (statistics). Wikipedia.。

    调优的方法如网格搜索(grid search)、随机搜索(random search)、贝叶斯优化(bayesian optimization),是比较常用的算法,下文将作介绍。其他算法如基于梯度的优化(gradient-based optimization)、受启发于生物学的进化算法(evolution strategy)等,读者可以自行了解。

    网格搜索 Grid search

    网格搜索就是遍历所有可能的超参数组合,找到能得到最佳性能(比如最小化泛化误差)的超参数组合,但是由于一次训练的计算代价很高,搜索区间通常只会限定于少量的离散数值,以下用一段伪代码说明:

    def train(acf, wd, lr):
            优化目标函数得到模型M
            由验证集得到泛化误差e
            return e
    
    learning_rate = [0.0001, 0.001, 0.01, 0.1]
    weight_decay = [0.01, 0.1, 1]
    activation = ['ReLU', 'GELU', 'Swish']
    
    optimum = {'error': 1e10}
    
    # grid search
    for acf in activation:
            for wd in weight_decay:
                    for lr in learning_rate:
                            error = train(acf, wd, lr)
                            if error < optimum['error']:
                                    optimum['error'] = error
                                    optimum['param'] = {
                                            'acf': acf,
                                            'wd': wd,
                                            'lr': lr
                                    }
    

    随机搜索 Random search

    随机搜索在预先设定的定义域内随机选取超参数组合。实验证明随机搜索比网格搜索更高效,主要原因是随机搜索可以搜索连续数值并且可以设定更大的搜索空间,因此有几率得到更优的模型。另外,对于仅有少数超参数起决定性作用的情况,随机搜索对于重要参数的搜索效率更高。

    如图 1,假设参数 2 几乎对优化目标没有影响,而参数 1 很重要,在同样进行 9 次采样的搜索中,网格搜索实际上仅对参数 1 采样了 3 次,而随机搜索为 9 次。关于随机搜索的实验可以查阅论文 Random Search for Hyper-Parameter Optimization. James Bergstra, Yoshua Bengio. 2012.。

    ▲ 图1

    贝叶斯优化 Bayesian optimization

    给定一组超参数,为了计算相应的模型泛化误差,我们需要进行一次完整的模型训练,对于大型的深度学习模型可能需要花上几个小时的时间。注意到网格搜索和随机搜索中,不同的超参数采样是相互独立的,一个直接的想法是,能否充分利用已采样数据来决定下一次采样,以提高搜索效率(或者说减少采样次数)。

    早在 1960 年,就有科学家 Danie G. Krige 用类似的方法用于金矿分布的估计,他用已开采的少数矿点对金矿分布进行建模,后来这类方法被称为 Kriging 或高斯过程回归(Gaussian process regression, GPR)。

    本文将介绍基于高斯过程的贝叶斯优化,其他类型的贝叶斯优化算法将在文末作简要总结。此外,本文关于 GPR 的数学原理部分参考了 MIT 出版的 Gaussian Processes for Machine Learning. C. E. Rasmussen, C. K. I. Williams. 2006(下文简称GPML),读者可自行查阅。

    3.1 算法简介

    超参数优化可以视为求解泛化误差的极值点:

    其中, 为训练集和验证集, λ 为带参数模型。

    以下为了方便讨论并且与相关领域的论文保持一致,我们用 表示待优化的目标函数,并且假设我们的目标是求极大值:

    贝叶斯优化的算法如下:

    可以看到,贝叶斯优化每次迭代都充分利用历史采样信息得到新的采样点,采样函数 的目标是让新的采样点尽可能接近极值点,因此,贝叶斯优化有可能以更少的采样得到优化结果。

    GP 模型可以理解为函数,不过其对于未知输入 的预测不是一个确定的数值,而是一个概率分布。对于给定的 将得到正态分布的均值 μ 和方差 σ ,也就是说, 将给出目标函数值 的概率分布,即 μ σ

    图 2 为 3 次采样后(也就是已知样本数量为 3)GP 模型拟合结果的可视化,样本输入为 1 维,其中黑色曲线为均值 μ ,蓝色区域为一个标准差的置信区间。

    ▲ 图2,源:https://arxiv.org/abs/1012.2599

    3.2 高斯过程

    具体地,我们假设随机变量集合 为高斯过程,其由均值函数(mean function) 和协方差函数(covariance function) 定义:

    其中:

    通常我们假设均值函数为常数 。协方差函数的常见选择是平方指数(squared exponential,SE)函数,也叫高斯核:

    容易发现,上述协方差函数描述了不同输入之间的距离,或者说相似性(similarity)。对于回归或者分类问题,一个合理的假设是,距离较近的输入 x 有相近的目标函数值(或者类别标签)y,比如在分类问题中,距离测试样本更近的训练样本将提供更多关于测试样本类别的信息。可以说,协方差函数“编码”了我们对目标函数的假设。

    现在,假如我们有了一些观测数据 ,其中, 。令 ,根据高斯过程的性质, 和测试样本 服从联合高斯分布:

    其中, 是元素值全为 1 的向量。 为格莱姆矩阵(Gram matrix)。

    可以证明,对于服从联合高斯分布的随机向量

    有:

    因此:

    到这里,我们几乎完成了贝叶斯优化的 GP 模型拟合部分,接下来,还需要作一些调整。

    3.3 观测值噪声

    在实际的项目中,目标函数的观测值 通常带有随机噪声 ϵ ,即:

    一般来说,我们可以假设噪声服从零均值高斯分布, ϵ σ ,并进一步假设不同观测样本的噪声独立同分布,因此对于带噪声的观测样本,其关于协方差函数的先验变成:

    注意到我们增加了参数 σ ,表示目标函数的方差。

    容易得到:

    其中, 为单位矩阵, σ σ

    进一步得到:

    3.4 GP模型的超参数

    注意到,以上关于 概率分布的预测包含参数 σ σ ,我们称之为 GP 模型的超参数。需要指出的是,GP 模型是一种非参数(non-parametric)模型(这里的参数应该类比神经网络的权重和偏置),超参数是独立于模型拟合过程的自由参数。

    回顾对于目标函数 的先验假设:

    在无观测数据的情况下,符合该先验的函数构成一个函数集合。通过多元高斯分布采样(参阅[GPML, Appendix A, A.2]),我们可以得到 σ 时, 关于 的一种采样结果(考虑到可视化的便利性, 为 1 维),并由插值方法得到函数曲线,如图 3:

    ▲图3

    可以看到 l 与采样函数随着 变化的剧烈程度有关。关于其他超参数如何影响 GP 模型的探讨,请参阅 [GPML, Chapter 5]。

    通过最大化边缘似然(marginal likelihood) ,可以得到 GP 模型超参数的最优值,通常称该方法为极大似然估计(maximum likelihood estimate, MLE)。 为观测数据, 之所以被称为边缘似然来源于其积分表达式:

    我们可以通过高斯分布的性质得到上述积分结果,不过我们已经从上文得到观测值服从高斯分布:

    即:

    取 log 得到:

    其中, 为矩阵行列式, σ

    可以看到 仅仅取决于均值常数 ,矩阵 的参数 和随机噪声 σ 。我们把 σ 统一表示为 ,其中  表示  。由相关的矩阵求导公式(参阅 [GPML, Appendix A, A.3]),容易求得 关于 的梯度:

    其中,

    此外,容易得到:

    其中, 表示第 列的列向量。

    接下来我们可以通过类似梯度上升的优化算法得到最优参数值。

    其他 GP 模型的超参数优化方法,如极大后验估计(maximum a posteriori, MAP)和完全贝叶斯估计(fully Bayesian) 可参阅 A Tutorial on Bayesian Optimization. Peter I. Frazier. 2018.。

    3.5 协方差函数

    不同的协方差函数本质上隐含了对目标函数性质的不同假设。如果协方差函数是关于 的函数,那么它具有平移不变性,我们称它是平稳协方差函数(stationary covariance function),进一步,如果是关于 的函数,则该函数具有各向同性(isotropic)。可见,SE 函数是平稳的且各向同性的。

    对于完全取决于内积 的函数,我们称之为内积协方差函数(dot product covariance function),它具有旋转不变形,但不是平稳的。一个内积协方差函数的例子:

    平滑性(smoothness)。随机过程的平滑性由均方可微性(mean square differentiability)决定,比如,SE 函数对应的高斯过程是无限均方可微的。关于均方导数、均方可微的定义你可以自行了解。

    以下介绍几个常见的平稳协方差函数形式。为了简洁,令

    a. 伽马指数函数(γ-exponential covariance function)

    除了 (相当于 SE)以外,它是非均方可微的。图4展示了 时的采样。

    ▲ 图4

    b. 马顿函数(The Matérn class of covariance functions)

    其中, ν 为修正贝塞尔函数(modified Bessel function), ν 为伽玛函数(gamma function)。图 5 展示了 ν 时的采样。

    ▲ 图5

    马顿函数在 ν 均方不可微,而在 ν 时为高阶均方可微。在一些论文中建议用 ν 的马顿函数作为先验,它是二阶均方可微的,具有以下形式:

    c. 二次有理函数(rational quadratic covariance function)

    图6展示了 时的采样。

    ▲ 图6

    以上协方差函数还有各向异性(anisotropic)的版本,可以通过替换 得到, 为对角矩阵。注意到各向同性的 SE 函数只有一个超参数 ,其各向异性版本则有 个超参数, 的维度。

    3.6 采样函数

    现在我们已经可以根据已有观测数据 得到一个用于预测新样本的 GP 模型 ,接下来我们考虑采样函数(acquisition function)的部分。采样函数的作用是让每一次采样都尽可能接近目标函数的极大值/极小值,以此提升极值点搜索效率。具体地,我们用 表示给定 GP 模型的采样函数,对于目标函数的下一次采样:

    GP 模型给出的是目标函数的均值 μ 和方差 σ ,一个直接的策略是,选择更大概率比当前观测数据的目标函数值更大的点(假设我们的目标是寻找极大值),令 为当前观测数据的最大值,可以得到采样函数:

    其中, 是标准正态累积分布函数。

    ▲ 图7,源:https://arxiv.org/abs/1012.2599

    通过分析可知,采样函数 倾向于以很高的概率略大于 的点,而不是以较低的概率大于 更多的点;前者更侧重以更高的把握取得提升(exploitation),后者侧重于探索高风险高收益的区域(exploration)。过于强调 exploitation 会导致优化过程陷入局部极值点,强调 exploration 则可能导致优化目标一直无法得到提升。因此采样函数的主要设计原则就是平衡 exploitation 和 exploration。以下列出几个常见的采样函数。

    a. Probability of improvement (PI)

    上述公式由 得到, 可以控制 exploration 的程度。论文作者建议对参数 建立一个规划表,在早期采样中设置高一些以强调 exploration,然后逐渐调低数值至零。

    b. Expected improvement (EI)

    其中, 是标准高斯分布的概率密度函数。EI 通过分析采样值提升的数学期望 得到, 同样用于平衡 exploitation-exploration,相关论文通过实验表明 可以在几乎所有实验案例中取得不错的表现。

    c. Upper confidence bound (UCB & GP-UCB)

    UCB 由体现预期收益的部分 μ 和体现风险的部分 κ σ 构成,并通过参数 κ 控制 exploration。

    GP-UCB的 随采样进度 t 而变化,在原论文中实验采用的公式是:

    实验中 δ 表示对 的定义域 进行离散化取值得到的点数量,比如对于 1 维的情况, ,每隔 取一个 值,则 。论文还提到在实验中通过对 缩小 5 倍,可以获得性能提升 Gaussian Process Optimization in the Bandit Setting: No Regret and Experimental Design. Niranjan Srinivas, Andreas Krause, Sham M. Kakade, Matthias Seeger. 2009.。

    总结

    协方差函数的选择。SE 函数是最常用的,但是因为基于 SE 的高斯过程是无限均方可微的,可见 SE 隐含了对目标函数平滑性的极端假设,因此有论文建议用 ν 的马顿函数 Practical Bayesian Optimization of Machine Learning Algorithms. Jasper Snoek, Hugo Larochelle, Ryan P. Adams. 2012.。

    均值函数。常数是比较常见的均值函数设置,如果目标函数可能有某种变化趋势,可以考虑采用参数化的均值函数,形如 A Tutorial on Bayesian Optimization. Peter I. Frazier. 2018.,或者基于概率模型的方法[GPML, Chapter 2]。

    采样函数的选择。对于选择哪个采样函数目前没有明确的规则,有论文提出用组合采样函数的方法可以得到比单独使用更好的实验表现,参阅 Portfolio Allocation for Bayesian Optimization. Eric Brochu, Matthew W. Hoffman, Nando de Freitas. 2010.。其他采样函数,如 knowledge-gradient The Knowledge-Gradient Policy for Correlated Normal Beliefs. Peter Frazier, Warren Powell, Savas Dayanik. 2008.,entropy search (ES) Entropy Search for Information-Efficient Global Optimization. Philipp Hennig, Christian J. Schuler. 2012.,predictive entropy search (PES) Predictive Entropy Search for Efficient Global Optimization of Black-box Functions. José Miguel Hernández-Lobato, Matthew W. Hoffman, Zoubin Ghahramani. 2014.,结合 fully Bayesian 的GP EI MCMC Practical Bayesian Optimization of Machine Learning Algorithms. Jasper Snoek, Hugo Larochelle, Ryan P. Adams. 2012.,提升采样函数效率的 mixture cross-entropy algorithm Surrogating the surrogate: accelerating Gaussian-process-based global optimization with a mixture cross-entropy algorithm. R ́emi Bardenet, Bal ́azs K ́egl. 2010.。

    其他贝叶斯优化算法。采用随机森林建模的 Sequential Model-based Algorithm Configuration (SMAC) Sequential Model-Based Optimization for General Algorithm Configuration. Frank Hutter, Holger H. Hoos, Kevin Leyton-Brown. 2011.,更适合高维度、离散化、超参数间有条件依赖的 Tree Parzen Estimator (TPE) Algorithms for Hyper-Parameter Optimization. James Bergstra, R ́emi Bardenet, Yoshua Bengio, Bal ́azs K ́egl. 2011.,以及提升 GP 模型计算效率的 SPGPs 和 SSGPs Taking the Human Out of the Loop: A Review of Bayesian Optimization. Bobak Shahriari, Kevin Swersky, Ziyu Wang, Ryan P. Adams, Nando de Freitas. 2016.。

    最新的进展。2018年一篇关于贝叶斯优化的总结性论文 A Tutorial on Bayesian Optimization. Peter I. Frazier. 2018.,比较新的超参数优化算法 Hyperband Hyperband: A Novel Bandit-Based Approach to Hyperparameter Optimization. Lisha Li, Kevin Jamieson, Giulia DeSalvo, Afshin Rostamizadeh, Ameet Talwalkar. 2017.,结合了TPE和Hyperband的BOHB BOHB: Robust and Efficient Hyperparameter Optimization at Scale. Stefan Falkner, Aaron Klein, Frank Hutter. 2018.,Hyperband 和 BOHB 代码实现 HpBandSter. 2018.。

    附录:部分算法的Python代码示例

    a. 多元高斯分布采样。原理参阅[GPML, Appendix A, A.2]。

    from matplotlib import pyplot as plt
    import numpy as np
    
    # SE协方差函数
    kernel_se = np.vectorize(lambda x1, x2, l: np.exp(-(x1 - x2) ** 2 / (2 * l ** 2)))
    
    def sample_se(x, l, mean=0):
            # x为numpy数组,e.g. x = np.arange(-5, 5, 0.05)
            x1, x2 = np.meshgrid(x, x)
            n = len(x)
            sigma = kernel_se(x1, x2, l) + np.identity(n) * 0.000000001
            L = np.linalg.cholesky(sigma)
            u = np.random.randn(n)
            y = mean + L @ u
            return y
    
    c = ['red', 'green', 'blue']
    l = [3, 1, 0.3]
    
    for i in range(len(l)):
            x = np.arange(-5, 5, 0.05)
            y = sample_se(x, l[i])
            plt.plot(x, y, c=c[i], linewidth=1, label='l=%.1f' % l[i])
    
    plt.xlabel('input, x')
    plt.ylabel('output, f(x)')
    plt.legend(loc='best')
    plt.show()
    
    
    output:
    
    
    
    

    b. 由观测数据集(X, Y)得到新样本的均值 和方差

    from matplotlib import pyplot as plt
    import numpy as np
    
    # 目标函数                                                                                                                                                              
    objective = np.vectorize(lambda x, std_n=0: 0.001775 * x**5 - 0.055 * x**4 + 0.582 * x**3 - 2.405 * x**2 + 3.152 * x + 4.678 + np.random.normal(0, std_n))
    
    # 超参数                                                                                                                                                                
    mean, l, std_f, std_n = 5, 1, 1, 0.0001
    
    # SE协方差函数                                                                                                                                                          
    kernel = lambda r_2, l: np.exp(-r_2 / (2 * l**2))
    
    # 训练集,以一维输入为例                                                                                                                                                
    X = np.arange(1.5, 10, 3.0)
    X = X.reshape(X.size, 1)
    Y = objective(X).flatten()
    
    # 未知样本                                                                                                                                                              
    Xs = np.arange(0, 10, 0.1)
    Xs = Xs.reshape(Xs.size, 1)
    
    n, d = X.shape
    t = np.repeat(X.reshape(n, 1, d), n, axis=1) - X
    r_2 = np.sum(t**2, axis=2)
    Kf = std_f**2 * kernel(r_2, l)
    Ky = Kf + std_n**2 * np.identity(n)
    Ky_inv = np.linalg.inv(Ky)
    
    m = Xs.shape[0]
    t = np.repeat(Xs.reshape(m, 1, d), n, axis=1) - X
    r_2 = np.sum(t**2, axis=2).T
    kf = std_f**2 * kernel(r_2, l)
    mu = mean + kf.T @ Ky_inv @ (Y - mean)
    std = np.sqrt(std_f**2 - np.sum(kf.T @ Ky_inv * kf.T, axis=1))
    
    x_test = Xs.flatten()
    y_obj = objective(x_test).flatten()
    
    plt.plot(x_test, mu, c='black', lw=1, label='predicted mean')
    plt.fill_between(x_test, mu + std, mu - std, alpha=0.2, color='#9FAEB2', lw=0)
    plt.plot(x_test, y_obj, c='red', ls='--', lw=1, label='objective function')
    plt.scatter(X.flatten(), Y, c='red', marker='o', s=20)
    plt.legend(loc='best')
    plt.show()
    

    output:

    c. 贝叶斯优化示例。

    from matplotlib import pyplot as plt
    import numpy as np
    
    # 目标函数                                                                                                                                                                  
    objective = np.vectorize(lambda x, sigma_n=0: 0.001775 * x**5 - 0.055 * x**4 + 0.582 * x**3 - 2.405 * x**2 + 3.152 * x + 4.678 + np.random.normal(0, sigma_n))
    
    # 采样函数 - GP-UCB                                                                                                                                                         
    GPUCB = np.vectorize(lambda mu, sigma, t, ld, delta=0.1: mu + (1 * 2 * np.log(ld * t**2 * np.pi**2 / (6 * delta)))**0.5 * sigma)
    
    # 超参数                                                                                                                                                                    
    mean, l, sigma_f, sigma_n = 5, 1, 1, 0.0001
    
    # 迭代次数                                                                                                                                                                  
    max_iter = 3
    
    # SE协方差函数                                                                                                                                                              
    kernel = lambda r_2, l: np.exp(-r_2 / (2 * l**2))
    
    # 初始训练样本,以一维输入为例                                                                                                                                              
    X = np.arange(0.5, 10, 3.0)
    X = X.reshape(X.size, 1)
    Y = objective(X).flatten()
    
    plt.figure(figsize=(8,5))
    
    for i in range(max_iter):
    
            Xs = np.arange(0, 10, 0.1)
            Xs = Xs.reshape(Xs.size, 1)
    
            n, d = X.shape
            t = np.repeat(X.reshape(n, 1, d), n, axis=1) - X
            r_2 = np.sum(t**2, axis=2)
            Kf = sigma_f**2 * kernel(r_2, l)
            Ky = Kf + sigma_n**2 * np.identity(n)
            Ky_inv = np.linalg.inv(Ky)
    
            m = Xs.shape[0]
            t = np.repeat(Xs.reshape(m, 1, d), n, axis=1) - X
            r_2 = np.sum(t**2, axis=2).T
            kf = sigma_f**2 * kernel(r_2, l)
    
            mu = mean + kf.T @ Ky_inv @ (Y - mean)
            sigma = np.sqrt(sigma_f**2 - np.sum(kf.T @ Ky_inv * kf.T, axis=1))
    
            y_acf = GPUCB(mu, sigma, i + 1, n)
            sample_x = Xs[np.argmax(y_acf)]
    
            x_test = Xs.flatten()
            y_obj = objective(x_test).flatten()
    
            ax = plt.subplot(2, max_iter, i + 1)
            ax.set_title('t=%d' % (i + 1))
            plt.ylim(3, 8)
            plt.plot(x_test, mu, c='black', lw=1)
            plt.fill_between(x_test, mu + sigma, mu - sigma, alpha=0.2, color='#9FAEB2', lw=0)
            plt.plot(x_test, y_obj, c='red', ls='--', lw=1)
            plt.scatter(X, Y, c='red', marker='o', s=20)
            plt.subplot(2, max_iter, i + 1 + max_iter)
            plt.ylim(3.5, 9)
            plt.plot(x_test, y_acf, c='#18D766', lw=1)
            X = np.insert(X, 0, sample_x, axis=0)
            Y = np.insert(Y, 0, objective(sample_x))
    
    plt.show()
    

    output:

    参考文献

    [1] Random Search for Hyper-Parameter Optimization. James Bergstra, Yoshua Bengio. 2012. 

    [2] Gaussian Processes for Machine Learning. C. E. Rasmussen, C. K. I. Williams. 2006. 

    [3] A Tutorial on Bayesian Optimization. Peter I. Frazier. 2018. 

    [4] Gaussian Process Optimization in the Bandit Setting: No Regret and Experimental Design. Niranjan Srinivas, Andreas Krause, Sham M. Kakade, Matthias Seeger. 2009. 

    [5] Practical Bayesian Optimization of Machine Learning Algorithms. Jasper Snoek, Hugo Larochelle, Ryan P. Adams. 2012. 

    [6] A Tutorial on Bayesian Optimization. Peter I. Frazier. 2018. 

    [7] Portfolio Allocation for Bayesian Optimization. Eric Brochu, Matthew W. Hoffman, Nando de Freitas. 2010. 

    [8] The Knowledge-Gradient Policy for Correlated Normal Beliefs. Peter Frazier, Warren Powell, Savas Dayanik. 2008. 

    [9] Entropy Search for Information-Efficient Global Optimization. Philipp Hennig, Christian J. Schuler. 2012. 

    [10] Predictive Entropy Search for Efficient Global Optimization of Black-box Functions. José Miguel Hernández-Lobato, Matthew W. Hoffman, Zoubin Ghahramani. 2014. 

    [11] Practical Bayesian Optimization of Machine Learning Algorithms. Jasper Snoek, Hugo Larochelle, Ryan P. Adams. 2012. 

    [12] Surrogating the surrogate: accelerating Gaussian-process-based global optimization with a mixture cross-entropy algorithm. R ́emi Bardenet, Bal ́azs K ́egl. 2010. 

    [13] Sequential Model-Based Optimization for General Algorithm Configuration. Frank Hutter, Holger H. Hoos, Kevin Leyton-Brown. 2011. 

    [14] Algorithms for Hyper-Parameter Optimization. James Bergstra, R ́emi Bardenet, Yoshua Bengio, Bal ́azs K ́egl. 2011. 

    [15] Taking the Human Out of the Loop: A Review of Bayesian Optimization. Bobak Shahriari, Kevin Swersky, Ziyu Wang, Ryan P. Adams, Nando de Freitas. 2016. 

    [16] A Tutorial on Bayesian Optimization. Peter I. Frazier. 2018. 

    [17] Hyperband: A Novel Bandit-Based Approach to Hyperparameter Optimization. Lisha Li, Kevin Jamieson, Giulia DeSalvo, Afshin Rostamizadeh, Ameet Talwalkar. 2017. 

    [18] BOHB: Robust and Efficient Hyperparameter Optimization at Scale. Stefan Falkner, Aaron Klein, Frank Hutter. 2018. 

    [19] A Tutorial on Bayesian Optimization of Expensive Cost Functions, with Application to Active User Modeling and Hierarchical Reinforcement Learning. Eric Brochu, Vlad M. Cora, Nando de Freitas. 2010. 

    [20] Cross-validation (statistics). Wikipedia. 

    [21] Markov chain Monte Carlo. Wikipedia. 

    更多阅读

    #投 稿 通 道#

     让你的论文被更多人看到 

    如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢?答案就是:你不认识的人。

    总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。 

    PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是最新论文解读,也可以是学习心得技术干货。我们的目的只有一个,让知识真正流动起来。

    ???? 来稿标准:

    • 稿件确系个人原创作品,来稿需注明作者个人信息(姓名+学校/工作单位+学历/职位+研究方向) 

    • 如果文章并非首发,请在投稿时提醒并附上所有已发布链接 

    • PaperWeekly 默认每篇文章都是首发,均会添加“原创”标志

    ???? 投稿邮箱:

    • 投稿邮箱:hr@paperweekly.site 

    • 所有文章配图,请单独在附件中发送 

    • 请留下即时联系方式(微信或手机),以便我们在编辑发布时和作者沟通

    ????

    现在,在「知乎」也能找到我们了

    进入知乎首页搜索「PaperWeekly」

    点击「关注」订阅我们的专栏吧

    关于PaperWeekly

    PaperWeekly 是一个推荐、解读、讨论、报道人工智能前沿论文成果的学术平台。如果你研究或从事 AI 领域,欢迎在公众号后台点击「交流群」,小助手将把你带入 PaperWeekly 的交流群里。

    展开全文
  • 自动超参数调优

    2020-12-21 02:27:42
    使用超参数自动调优简介超参数自动调优是Xiaomi Cloud-ML的功能,可以一次定义多组超参数组合,提交后并行进行训练,并返回效果最优的超参数组合。代码规范用户可自定义“效果最优”的指标,需要在TensorFlow模型...
  • 深度学习-超参数调优

    2021-06-03 09:13:49
    在机器学习中有很多调优的方式机器学习——超参数调优,深度学习中也存在同样的方式
  • 机器学习基础-模型评估及超参数调优方法前言一、超参数与参数二、超参数优化方法1.网格搜索2.随机搜索 前言 前述优化主要是基于模型本身,那么接着可以从被优化项,比如惩罚项上入手,即优化惩罚项系数。那么问题就...
  • 现有的一些自动超参数调优程序依赖于 Python,而老中易只依赖于字符串解析。因此,您可以将老中易与任何编程语言和任何深度学习库一起使用。 特征 流程管理 老中易支持多进程超参调优,目前最多8个进程。 当性能不...
  • 深度神经网络之Keras(三)——正则化、超参数调优和学习方向 本文将继续探索Keras框架下的深度神经网络知识,主要介绍了利用Keras构建的深度神经网络正则化及超参数调优问题。 目录深度神经网络之Keras(三)——...
  • 回归模型的评估及超参数调优

    千次阅读 2021-03-24 22:13:54
    在机器学习中,其中算法最为重要一面就是回归算法,回归算法占我们理解机器学习一大块,这一块的学习可以帮助我们掌握超参数的调节。基本上只要一切基于特征预测连续型变量的需求,我们都使用回归技术。 最著名的...
  • 超参数调优方法整理大全

    千次阅读 2019-11-06 19:08:21
    机器学习中总是会碰见调...一、随机森林超参数优化- RandomSearch和GridSearch (1)RandomSearch 原理: 超参数优化也就是常说的调参,python-sklearn里常用的有GridSearchCV和RandomizedSearchCV可以用。其中Gr...
  • 机器学习——超参数调优

    千次阅读 2021-05-07 09:41:18
    在实战过程中,需要对机器学习模型进行优化以确保模型的最高准确率,因此,超参数调优参数应运而生,常见的超参数搜索算法有网格搜索、随机搜索、贝叶斯优化等。超参数搜索算法一般包括三个要素: 目标函数,即...
  • 1.概念解释 超参数:在学习之前设置的参数(预定义),除了超参数之外的其他参数都是...自动超参数调优:通过调优算法实现超参数的调节,以实现最优的训练模型 2.具体方法 1.网格搜索 2.随机搜索 3.贝叶斯优化算法 ...
  • 使用NNI进行自动超参数调优

    千次阅读 2020-12-01 17:30:54
    使用NNI进行自动超参数调优 有中文文档 NNI (Neural Network Intelligence) 是一个工具包,可有效的帮助用户设计并调优机器学习模型的神经网络架构,复杂系统的参数(如超参)等。 NNI 的特性包括:易于使用,可...
  • 机器学习 --超参数调优

    千次阅读 2018-05-13 04:08:39
    超参数调优,经常会遇到两个问题: 1、 模型发散,参数随着迭代数值绝对值越来越大,甚至发散到无穷,从损失函数来看,误差也会越来越大。 2、 震荡,从损失函数来看,误差出现震荡,模型在局部最优解附近徘徊。 ...
  • 1.什么是超参数超参数(hyper parameters)就是机器学习或深度学习算法中需要预先设置的参数,这些参数不是通过训练数据学习到的参数;原始算法一般只给出超参数的取值范围和含义,...
  • 基于粒子群优化算法(PSO)的超参数调参
  • 在编写完成一个Python脚本之后,便可以用它训练和评估机器学习模型了,现在,问题来了,是否能对它自动调整超参数以提高其性能呢? 自有办法! 在本文中,将展示如何将脚本转换为可以用任何超参数优化库优化的目标...
  • 对于很多算法工程师来说,超参数调优是件非常头疼的事,这项工作比较玄学。除了根据经验设定所谓的“合理值”之外,一般很难找到合理的方法去寻找超参数的最优值。而与此同时,超参数对于模型效果的影响又至关重要。...
  • 1. 为什么需要超参数搜索 神经网络的训练过程中,有很多不变的参数,比如: 网络结构参数:几层,每层宽度,每层激活函数等 训练参数:batch_size,学习率,学习率衰减算法等 这些参数一方面依靠经验,选取合适的...
  • 模型的超参数调优

    千次阅读 2019-06-09 21:00:52
    为了进行超参数调优,我们一般会采用网格搜索、随机搜索、贝叶斯优化等算法。在具体介绍算法之前,需要明确超参数搜索算法一般包括哪几个要素。一是目标函数,即算法最大化/最小化的目标;二是搜索范围,一般通过...
  • 相关文献: 超参数优化实战 如何自动实现超参数优化 用Google Colab的Hyperas实现 Keras超参数调优 原文标题: How to Do Hyperparameter Tuning on Any Python Script in 3 Easy Steps 原文链接: ...
  • 【ML-超参数调优的常见4个方法】

    千次阅读 2020-10-03 13:59:41
    目录 介绍 超参数 内容 1. 传统手工搜索 ...维基百科上说,...超参数调优的越好,得到的模型就越好。调优超参数可能是非常乏味和困难的,更像是一门艺术而不是科学。 超参数 超参数是在建立模型时用于.
  • 超参数调优有哪些方法

    千次阅读 2019-07-29 20:35:40
    为了进行超参数调优,我们一般会采用网格搜索、随机搜索、贝叶斯优化等算法。在具体介绍算法之前,需要明确超参数搜索算法一般包括哪几个要素。一是目标函数,即算法需要最大化/最小化的目标二是搜索范围,一般通过上限...
  • 超参数调优要区别于参数调优 使用最小二乘法或者梯度下降法等最优化算法优化出来的数我们称为参数,无法使用最小二乘法或者梯度下降法等最优化算法优化出来的数是超参数。 参数是模型内部的配置变量,其值可以根据...
  • 本次分享的内容包括: 用管道简化工作流 使用k折交叉验证评估模型性能 使用学习和验证曲线调试算法 通过网格搜索进行超参数调优 比较不同的性能评估指标 一、用管道简化工作流 在很多机器学习算法中,我们可能需要做...
  • 当数据科学家谈论调整他们的模型时,他们经常讨论调整超参数以提高模型的预测能力。 超参数是您在训练之前定义的关于模型的属性,它在训练过程中是不学习的,那么在spark mllib 中如何对超参数进行调优呢?

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 23,615
精华内容 9,446
关键字:

超参数调优

友情链接: wkapi.zip