超参数优化

1. 前言

现在的机器学习和深度学习中,在模型结构确定的情况下,不同的超参数的选择对整个结果的好坏有着至关重要的影响。不少人还嬉称人工智能工程师,其实是“调参侠”。

1.1 超参数

  • 在模型开始学习过程之前人为设置值的参数,而不是(像bias、weights)通过训练可得到的参数数据。
  • 这些参数定义关于模型更高层次的概念(模型复杂性、学习能力等)。
  • 比如说随机梯度下降算法中的学习速率/learning rate,出于计算复杂度和算法效率等,我们并不能从数据中直接学习一个比较不错的学习速度。但学习速率却又是十分重要的,较大的学习速率不易令模型收敛到较合适的较小值解,而较小的学习速率却又常常令模型的训练速度大大降低。对于像学习速率这样的超参数,我们通常需要在训练模型之前设定。因此,对于超参数众多的复杂模型,调超参技能显得很重要。

2. Grid Search

Grid Search用的是穷举搜索:在所有候选的参数选择中,通过循环遍历,尝试每一种可能性,表现最好的参数就是最终的结果。其原理就像是在数组里找最大值。(为什么叫网格搜索?以有两个参数的模型为例,参数a有3种可能,参数b有4种可能,把所有可能性列出来,可以表示成一个3*4的表格,其中每个cell就是一个网格,循环过程就像是在每个网格里遍历、搜索,所以叫grid search)

  • 搜索整个超参数空间,在高维空间容易遇到维度灾难,不实用。
  • 网格搜索是一种昂贵的方法。假设我们有n个超参数,每个超参数有两个值,那么配置总数就是2的N次方。因此,仅在少量配置上进行网格搜索是可行的。
  • 网格搜索可以并行化,使得网格搜索在足够的计算能力下更加可行。
  • 每次trial之间是相互独立的,不能利用先验知识选择下一组超参数。

3. Random Search

随机搜索是一种在巨大数据规模下执行一个耗时上无法接受的程序的优化方法。

  1. 数据规模大,精确的结果难以在一定时间计算出。
  2. 结果的些许的不精确能够被接受。
  3. 求取的结果是最优化(optimization)问题,有一个成本计算模型。

随机搜索的算法类型:

  1. 基本随机搜索
  2. 爬山搜索算法
  3. 模拟退火算法
  4. 遗传算法

4. GridSearch和RandomSearch的使用

这里给出一个GridSearch和RandomSearch的简单使用方式,方便同学们测试功能用。

from sklearn.neighbors import KNeighborsClassifier
from sklearn import datasets
from sklearn.model_selection import GridSearchCV,RandomizedSearchCV
from sklearn.model_selection import train_test_split

# 加载数据集
iris = datasets.load_iris()
data = iris.data
label = iris.target

# 数据集分割
X_train,X_test,y_train,y_test = train_test_split(data,label,test_size=0.3,random_state=2)
knn_clf_orogin = KNeighborsClassifier()

# 搜索的超参数范围
param_grid ={
        'weights':['distance'],
        'n_neighbors':[i for i in range(1,11)],
        'p':[i for i in range(1,6)]
}

grid_search = GridSearchCV(knn_clf,param_grid,n_jobs=-1,verbose=2)
grid_search.fit(X_train,y_train)
knn_clf1 = grid_search.best_estimator_
y_pre = knn_clf1.predict(X_test)
knn_clf1.score(X_test,y_pre)

# print('grid_search-度量记录:',grid_search.cv_results_)
print('grid_search-最佳度量值:',grid_search.best_score_)
print('grid_search-最佳参数:',grid_search.best_params_)
print('grid_search-最佳模型:',grid_search.best_estimator_)

random_search = RandomizedSearchCV(knn_clf_orogin,param_grid,n_jobs=-1,verbose=2)
random_search.fit(X_train,y_train)
knn_clf2 = random_search.best_estimator_
y_pre = knn_clf2.predict(X_test)
knn_clf2.score(X_test,y_pre)

# print('random_search-度量记录:',random_search.cv_results_)
print('random_search-最佳度量值:',random_search.best_score_)
print('random_search-最佳参数:',random_search.best_params_)
print('random_search-最佳模型:',random_search.best_estimator_)

虽然随机搜索得到的结果互相之间差异较大,但是实验证明随机搜索的确比网格搜索效果要好。

5. Bayesian Optimization

贝叶斯优化其实就是基于模型的超参数优化,根据已有的采样点预估函数,不断迭代获得最大值的一个算法。

5.1 Bayesian Optimization流程图

5.2 算法步骤

  1. \(f\)是我们的的预估函数,也可以是一个黑盒的模型。
  2. \(X\)是自定义的输入参数的范围
  3. \(S\)是Acquisition Function(采集函数),这个函数的作用是通过最大化AF来选择下一个采样点。
  4. \(M\)是先验函数(Prior Function,PF),可以通过\(M\)和\(X\)计算得出具体的模型具体函数表示。
  • 模型步骤解析:
  1. 通过\(INITSAMPLES(f,X)\)采集初始的样本\(D={(x_1,y_1),(x_2,y_2)...(x_i,y_i)}\)
  2. 循环选参数\(T\)次:
    1. 通过\(FITMODEL(M,D)\)计算出\(p(y|x,D)\)的概率。
    2. 通过\(S\)的采集函数计算出\(y\)取值最大时的\(x_i\)。
    3. 判断\(y_i\)值是否满足要求。
    4. 如果不满足要求,继续计算整个过程。

5.3 优点

  • 贝叶树优化和网格搜索相比,迭代次数少(节省时间),粒度可以到很小。
  • 搜索方式自动化,不需要太多人工参与。
  • 调参过程可以控制。

5.4 缺点

  • 不容易找到全局最优解。
  • 过程比较复杂。

原文地址:https://www.cnblogs.com/huangyc/p/11519129.html

时间: 2024-10-09 13:34:02

超参数优化的相关文章

CS231n 卷积神经网络与计算机视觉 7 神经网络训练技巧汇总 梯度检验 参数更新 超参数优化 模型融合 等

前面几章已经介绍了神经网络的结构.数据初始化.激活函数.损失函数等问题,现在我们该讨论如何让神经网络模型进行学习了. 1 梯度检验 权重的更新梯度是否正确决定着函数是否想着正确的方向迭代,在UFLDL中我们提到过,计算时梯度公式如果计算错误是不容被察觉的,我们需要比较分析法得到梯度与数值法得到的梯度是否相似,下面是一些技巧: 1.1 centered formula 高等数学中我们知道导数的近似公式: df(x)dx=f(x+h)?f(x)h 以及下面的centered formula: df(

sklearn参数优化方法

学习器模型中一般有两个参数:一类参数可以从数据中学习估计得到,还有一类参数无法从数据中估计,只能靠人的经验进行指定,后一类参数就叫超参数 比如,支持向量机里的C,Kernel,gama,朴素贝叶斯里的alpha等,在学习其模型的设计中,我们要搜索超参数空间为学习器模型找到最合理的超参数,可以通过以下方法获得学习器模型的参数列表和当前取值:estimator.get_params() sklearn 提供了两种通用的参数优化方法:网络搜索和随机采样, 网格搜索交叉验证(GridSearchCV):

机器学习 | 特征工程- 超参数调优方法整理

特征工程是机器学习当中很重要的部分,可以帮助我们设计.创建新特征,以便模型从中提取重要相关性.本文将记录并持续更新相关特征工程的工具包介绍,包括自动模型选择和超参数调优等各方面. · Featuretools Featuretools 是一个开源的Python 库,用于自动化特征工程.自动特征工程能够缩减时间成本,构建更优秀的预测模型,生成更有意义的特征,还能防止数据泄漏(data leakage). 目标任务:从数据表格集中获取所有的数据信息并整合到一张表中,再创建特征. 解决方案:采用深度特

sklearn参数优化

学习器模型中一般有两个参数:一类参数可以从数据中学习估计得到,还有一类参数无法从数据中估计,只能靠人的经验进行指定,后一类参数就叫超参数 比如,支持向量机里的C,Kernel,gama,朴素贝叶斯里的alpha等,在学习其模型的设计中,我们要搜索超参数空间为学习器模型找到最合理的超参数,可以通过以下方法获得学习器模型的参数列表和当前取值:estimator.get_params() sklearn 提供了两种通用的参数优化方法:网络搜索和随机采样, 网格搜索交叉验证(GridSearchCV):

基于贝叶斯优化的超参数tuning

https://arimo.com/data-science/2016/bayesian-optimization-hyperparameter-tuning/ 贝叶斯优化:使用高斯过程作为代理函数,并且通常优化提升幅度的期望Expected Improvement(新试验相对当前最好观测的提升的期望).高斯过程是一组函数的分布.高斯过程中的一个样本包括一组函数.训练高斯过程会拟合训练数据的分布,因此能产生和观测数据相近的函数.使用高斯过程,我们可以计算搜索空间中任意点的期望提升.然后将期望提升

机器学习算法中如何选取超参数:学习速率、正则项系数、minibatch size

机器学习算法中如何选取超参数:学习速率.正则项系数.minibatch size 本文是<Neural networks and deep learning>概览 中第三章的一部分,讲机器学习算法中,如何选取初始的超参数的值.(本文会不断补充) 学习速率(learning rate,η) 运用梯度下降算法进行优化时,权重的更新规则中,在梯度项前会乘以一个系数,这个系数就叫学习速率η.下面讨论在训练时选取η的策略. 固定的学习速率.如果学习速率太小,则会使收敛过慢,如果学习速率太大,则会导致代价

如何选取一个神经网络中的超参数hyper-parameters

1.什么是超参数 所谓超参数,就是机器学习模型里面的框架参数.比如聚类方法里面类的个数,或者话题模型里面话题的个数等等,都称为超参数.它们跟训练过程中学习的参数(权重)是不一样的,通常是手工设定的,经过不断试错来调整,或者对一系列穷举出来的参数组合一通枚举(叫做网格搜索).深度学习和神经网络模型,有很多这样的参数需要学习. 2.一些启发式规则 在实际应用中,当你使用神经网络去解决问题时,很难找到好的超参数.假设我们现在正在处理MINIST数据库的问题,并且对超参数是如何使用的一无所知.假设我们大

PHP引擎php.ini参数优化

参数以外常见的PHP优化方法手段 1)php引擎缓存加速优化 #xcache.ZendOpcache.eaccelerator #http://www.lichengbing.cn/archivers/270.html 2) 使用tmpfs作为缓存加速缓存的文件目录 tmpfs,基于内存的文件系统,加快转存暂存文件的速度 [[email protected] ~]# mount -t tmpfs tmpfs /dev/shm -o size=256m [[email protected] ~]#

深度学习之超参数调试

前言            以下内容是个人学习之后的感悟,转载请注明出处~ 超参数调试 在深度学习中,超参数有很多,比如学习率α.使用momentum或Adam优化算法的参数(β1,β2,ε).层数layers.不同层隐藏 单元数hidden units.学习率衰退.mini=batch的大小等.其中一些超参数比其他参数重要,其优先级可以分为以下几级,如图,红色 框最优先,橙色次之,紫色再次之,最后没有框住的一般直接取经验值(当然你也可以自己取). 那么如何来调试超参数呢? 以下图的2维超参数为