超参优化算法——BO-GP
超参优化算法
华为网络AI平台(NAIE)官方帐号
特性汇总
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.