超参优化算法

 

华为网络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).
代理模型用于对历史样本点的均值和方差进行拟合.
采集函数利用获得的均值和方差提出新的样本点.

超参优化算法——BO-GP_优化算法

SMBO范式具体可参考论文.
当前内置的这类方法主要包括: BO-GPBO-SMACBO-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.