超参优化算法——BO-GP
超参优化算法
特性汇总
NAIE SDK包内置了多种参数优化算法, 适用于多种超参优化场景.
优化算法 | 收敛快 | 探索强 | 维度高 | 迭代多 | 极值多 | 离散值多 | 连续值多 |
---|---|---|---|---|---|---|---|
Random Search (随机搜索) | --- | --- | --- | --- | --- | --- | --- |
Grid Search (网格搜索) | --- | --- | --- | --- | --- | --- | --- |
BO-GP (高斯过程) | ✔ | ✘ | ✘ | ✘ | ✘ | ✔ | ✔ |
BO-SMAC (SMAC) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✘ |
BO-TPE (TPE) | ✔ | ✔ | ✔ | ✔ | ✘ | ✘ | ✔ |
算法简介
内置的算法主要包括两大类: 简单搜索方法
和基于模型的序贯优化方法
.
简单搜索方法
简单搜索方法指的是一些通用的, 朴素的搜索策略. 当前内置的这类方法主要包括: 随机搜索
和网格搜索
.
优化算法 | 算法简介 | 使用场景 |
---|---|---|
Random Search (随机搜索) | 随机搜索指的是每次随机生成一个样本. | 随机搜索尽管思路简单, 但往往能在超参优化问题中取得令人意想不到的效果. 因此, 往往被当作基准使用. |
Grid Search (网格搜索) | 网格搜索指的是遍历用户配置中的所有样本. | 网格搜索效率较低, 往往适用于在用户指定的配置空间进行精调. |
基于模型的序贯优化方法
基于模型的序贯优化方法(SMBO, Sequential Model-Based Optimization)是一种贝叶斯优化的范式.
该范式主要可以分为两个部分: 代理模型(surrogate model)
和 采集函数(acquisition function)
.代理模型
用于对历史样本点的均值和方差进行拟合.采集函数
利用获得的均值和方差提出新的样本点.

SMBO范式具体可参考论文.
当前内置的这类方法主要包括: BO-GP
, BO-SMAC
和BO-TPE
.
优化算法 | 算法简介 | 使用场景 |
---|---|---|
BO-GP (高斯过程) | GP是SMBO范式下最经典的贝叶斯超参优化算法, 其采用的代理模型是高斯过程模型(GP, Gaussian Process). | BO-GP收敛性能好, 适合于资源受限的超参搜索场景(如:亟需寻找一个局部最优点), 但迭代次数较多时其性能会下降. |
BO-SMAC (SMAC) | SMAC(Sequential Model-Based Optimization forGeneral Algorithm Configuration)隶属于SMBO范式, 其代理模型为随机森林(RF, Random Forest). | BO-SMAC具有优异的超参探索能力, 可以使用于各种超参优化场景, 尤其擅长处理大量离散型的超参. |
BO-TPE (TPE) | TPE(Tree-structured Parzen Estimator)亦隶属于SMBO范式, 其代理模型为基于核密度估计模型(KDE, Kernel Density Estimation)混合模型. | BO-TPE可以使用于各种超参优化场景中, 其探索能力优异, 通常都能取得较好的效果. |
SDK使用
使用示例
import json
from sklearn.metrics import accuracy_score
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from naie.context import Context
## Step 1. 定义需要被优化的主函数
def main():
iris = datasets.load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target)
n_estimators = Context.get("n_estimators")
min_samples_split = Context.get("min_samples_split")
max_features = Context.get("max_features")
clf = RandomForestClassifier(
n_estimators=int(n_estimators),
min_samples_split=int(min_samples_split),
max_features=max(min(float(max_features), 0.999), 1e-3),
random_state=2
)
clf.fit(X_train, y_train)
accuracy = accuracy_score(y_test, clf.predict(X_test))
return accuracy
## Step 2. 定义超参空间
config = {
"trial_iter": 10,
"method": "bo-gp",
"goal": "max",
"domain_spaces": {
"my_model": {
"hyper_parameters": [
{
"name": "n_estimators",
"range": [
10,
500
],
"type": "INT",
"slice": 1
},
{
"name": "max_features",
"range": [
0.01,
1.0
],
"type": "FLOAT",
"slice": 1
},
{
"name": "min_samples_split",
"range": [
2,
25
],
"type": "int",
"slice": 2
}
]
}
},
"async_optimization": True
}
## Step 3. 运行超参优化
from naie.model_selection import HyperparameterOptimization
optimizer = HyperparameterOptimization(main, configuration=config)
optimizer.start_trials()
主函数:
- 超参需要通过Context.get()来从程序外部获取;
- 被定义的主函数需要有一个可比较大小的返回值.
超参优化配置:goal
表示优化目标, 可选值为 "max" 或者 "min".trial_iter
表示超参优化任务的最小迭代次数.trial_time
表示超参优化任务的最大执行时间, 单位为 "分钟".
- 优化方法配置
method
表示优化方法, 具体配置如下:bo
表示贝叶斯优化 (BO, Bayesian Optimization), 是一种基于历史训练数据提出样本点的优化方法, 其中:bo-gp
表示采用高斯过程 (GP, Gaussian Process) 作为代理模型的贝叶斯优化方法.bo-smac
表示采用随机森林 (RF, Random Forest) 作为代理模型的贝叶斯优化方法.bo-tpe
表示采用核密度估计 (KDE, Kernel Density Estimation) 生成代理模型的贝叶斯优化方法.random
表示纯随机的优化方法.grid
表示网格遍历形式的优化方法.
- 超参数配置
domain_spaces
表示算法的搜索域.my_model
表示当前算法的算法名称.hyper_parameters
表示超参的搜索域, 详细信息如下:name
表示超参名称.type
为超参类型, 其值应当为以下选项中的一个:["INT","INT_EXP","INT_CAT","FLOAT","FLOAT_EXP","FLOAT_CAT","STRING","BOOL"].INT
表示整数型超参, 该类超参会在 (a, b) 范围内随机采样.INT_EXP
表示指数类型的整型超参, 该类超参会先在 (log(a), log(b)) 范围内随机采样, 再用指数函数恢复到原范围内.INT_CAT
表示范畴类型的整型超参, 该类超参会在一组可选值内随机采样, 例如(用","分隔): 1,5,7.FLOAT
表示浮点型超参, 该类超参会在 (a, b) 范围内随机采样.FLOAT_EXP
表示指数类型的浮点型超参, 该类超参会先在 (log(a), log(b)) 范围内随机采样, 再用指数函数恢复到原范围内.FLOAT_CAT
表示范畴类型的浮点型超参, 该类超参会在一组可选值内随机采样, 例如(用","分隔): 0.1, 0.5, 0.7.STRING
表示字符串型超参, 该类超参会在一组可选值内随机采样, 例如(用","分隔): "string_1", "string_2", "string_3".BOOL
表示布尔型超参, 该类超参会在 True 和 False 范围内随机采样.slice
表示超参的切割片数, 该参数仅当网格搜索时才会被使用.
- 并行优化配置
async_optimization
表示是否使用并行优化, True表示开启并行优化, False表示关闭并行优化.multi_job
表示是否使用多机并行, True表示多机并行优化, False表示使用单机并行优化(多进程).n_jobs
表示并行数量.
注意点
如果在SDK是在本地运行的, 则需要用如下形式设置result_path来为程序指定输出目录.
from naie.context import Context
Context.set("result_path", r'./result')
NAIE SDK帮助文档汇总请参考:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
2022-08-24 Windows 提权方式总结
2019-08-24 Koadic的安装和使用---http c2远控工具
2018-08-24 5G RRC——为NAS层提供连接管理,消息传递等服务; 对接入网的底层协议实体提供参数配置的功能; 负责UE移动性管理相关的测量、控制等功能
2018-08-24 信令风暴问题根因分析
2018-08-24 无线基站侧的信令风暴根因——频繁的释放和连接RRC产生大量信令、设备移动导致小区重选信令增加、寻呼信令多