超参优化算法
华为网络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.








