超参优化算法——BO-GP
方法描述
GP
(Gaussian process)是一种基于模型的序贯优化方法(SMBO, Sequential Model-Based Optimization). 该算法:
- 采用
高斯过程模型
(GP, Gauss Process)建立代理模型.
高斯过程模型会自动拟合样本点并输出均值, 方差. - 采用
EI
(expected improvement)或者TS
(Thompson Sampling)作为其采集函数生成新采样点.
采集函数会根据代理模型选取均值小
或方差大
的点进行采样.
算法细节可参考论文.
方法特性
高斯过程
对已探索的点都非常确信, 会为这些点及其附近点分配非常小的方差, 因此, 该方法具有较强的收敛能力
, 能在简单问题中快速找到局部最优点.
但是, 高斯过程模型
在训练需要进行时间复杂度为O(n^3)的矩阵求逆操作, 因此, 不适合迭代次数过多的场景.
性能测试
本节将用四个函数测试GP
算法的性能:
Sphere函数介绍
该函数形似碗, 仅有一个最优点, 没有局部最优点.
GP在Sphere函数上的测试结果
Ackley函数介绍
该函数形似溶洞中的钟乳石, 仅有一个最优点, 存在大量的局部最优点.
GP在Ackley函数上的测试结果
Himmelblau函数介绍
该函数形似山谷, 存在四个全局最优点, 没有局部最优点.
GP在Himmelblau函数上的测试结果
Rastrigin函数介绍
该函数形似森林, 仅有一个最优点, 存在大量的局部最优点.
GP在Rastrigin函数上的测试结果
运行时间: 1146.68s (19.11min)
最优结果: 61.74
结果说明
GP
算法收敛非常迅速, 往往少量迭代
后就能搜索到最优点, 但GP
并不会在迭代后期进行大量的探索.
因此, GP
算法具有非常强的收敛能力
, 但探索能力
较弱.
同时, GP
算法由于需要大量计算, 不适合高维
和迭代次数多
的场景.
性能测试代码
由于GP
算法不能冷启动, 因此, 超参优化在运行GP
之前会默认执行5次随机搜索.
Sphere函数测试代码
import numpy as np
from naie.context import Context
# 定义Sphere函数
def sphere(): x, y = Context.get("x"), Context.get("y") return np.square(x) + np.square(y)
# 定义搜索配置
config = { "goal": "min", "trial_iter": 500, "method": "bo-gp", "domain_spaces": { "sphere": { "hyper_parameters": [ { "name": "x", "range": [ -10, 10 ], "type": "FLOAT" }, { "name": "y", "range": [ -10, 10 ], "type": "FLOAT" } ] } }
}
# 运行BO-GP
from naie.model_selection import HyperparameterOptimization
opt = HyperparameterOptimization(sphere, configuration=config)
opt.start_trials()
Ackley函数测试代码
import numpy as np
from naie.context import Context
# 定义Ackley函数
def ackley(): x, y = Context.get("x"), Context.get("y") return -20 * np.exp(-0.2 * np.sqrt(0.5 * (np.square(x) + np.square(y)))) \ - np.exp(0.5 * (np.cos(2 * np.pi * x) + np.cos(2 * np.pi * y))) \ + np.e + 20
# 定义搜索配置
config = { "goal": "min", "trial_iter": 500, "method": "bo-gp", "domain_spaces": { "ackley": { "hyper_parameters": [ { "name": "x", "range": [ -5.12, 5.12 ], "type": "FLOAT" }, { "name": "y", "range": [ -5.12, 5.12 ], "type": "FLOAT" } ] } }
}
# 运行BO-GP
from naie.model_selection import HyperparameterOptimization
opt = HyperparameterOptimization(ackley, configuration=config)
opt.start_trials()
Himmelblau函数测试
import numpy as np
from naie.context import Context
# 定义Himmelblau函数
def himmelblau(): x, y = Context.get("x"), Context.get("y") return np.square(np.square(x) + y -11) + np.square(x + np.square(y) - 7)
# 定义搜索配置
config = { "goal": "min", "trial_iter": 500, "method": "bo-gp", "domain_spaces": { "himmelblau": { "hyper_parameters": [ { "name": "x", "range": [ -5, 5 ], "type": "FLOAT" }, { "name": "y", "range": [ -5, 5 ], "type": "FLOAT" } ] } }
}
# 运行BO-GP
from naie.model_selection import HyperparameterOptimization
opt = HyperparameterOptimization(himmelblau, configuration=config)
opt.start_trials()
Rastrigin函数测试
采用一个10维的Rastrigin函数来测试BO-GP
在高维问题中的性能.
import numpy as np
from naie.context import Context
def _square_sum(args): args = np.asarray(args) return np.sum(np.square(args))
def _cos_sum(args): args = np.asarray(args) return np.sum(np.cos(2*np.pi*args))
# 定义Rastrigin函数
def rastrigin(): args = \ Context.get("a"), Context.get("b"), Context.get("c"), Context.get("d"),\ Context.get("e"), Context.get("f"), Context.get("g"), Context.get("h"),\ Context.get("i"), Context.get("j") A = 10 n = len(args) return A*n + _square_sum(args) - A*_cos_sum(args)
# 定义搜索配置
config = { "goal": "min", # 运行1000次超参优化 "trial_iter": 1000, "method": "bo-gp", "domain_spaces": { "himmelblau": { "hyper_parameters": [ { "name": "a", "range": [ -5.12, 5.12 ], "type": "FLOAT" }, { "name": "b", "range": [ -5.12, 5.12 ], "type": "FLOAT" }, { "name": "c", "range": [ -5.12, 5.12 ], "type": "FLOAT" }, { "name": "d", "range": [ -5.12, 5.12 ], "type": "FLOAT" }, { "name": "e", "range": [ -5.12, 5.12 ], "type": "FLOAT" }, { "name": "f", "range": [ -5.12, 5.12 ], "type": "FLOAT" }, { "name": "g", "range": [ -5.12, 5.12 ], "type": "FLOAT" }, { "name": "h", "range": [ -5.12, 5.12 ], "type": "FLOAT" }, { "name": "i", "range": [ -5.12, 5.12 ], "type": "FLOAT" }, { "name": "j", "range": [ -5.12, 5.12 ], "type": "FLOAT" } ] } }
}
# 运行BO-GP
from naie.model_selection import HyperparameterOptimization
opt = HyperparameterOptimization(rastrigin, configuration=config)
opt.start_trials()
文章来源: zhuanlan.zhihu.com,作者:网络人工智能园地,版权归原作者所有,如需转载,请联系作者。
原文链接:zhuanlan.zhihu.com/p/379134866
- 点赞
- 收藏
- 关注作者
评论(0)