超参优化算法——BO-GP

举报
就挺突然 发表于 2021/06/10 00:55:54 2021/06/10
【摘要】 方法描述GP(Gaussian process)是一种基于模型的序贯优化方法(SMBO, Sequential Model-Based Optimization). 该算法:采用高斯过程模型(GP, Gauss Process)建立代理模型.高斯过程模型会自动拟合样本点并输出均值, 方差.采用EI(expected improvement)或者TS(Thompson Sampl...

方法描述


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

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。