本文主要是介绍自研贝叶斯优化算法遇到的坑,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
自研贝叶斯优化算法,如何判断算法能拟合?我目前是在一个tiny的数据集上跑一下,看算法能否收敛到正确的的局部最小值。这里要有两个关键词:
- 收敛。算法是需要收敛的。黑盒优化的本质就是增加在优势样本附近的采样率。如果算法如同随机搜索不收敛,那么是有问题的。
- 正确。收敛点是正确的,如果收敛到错误的点,那还不如随机搜索。
文章目录
- 自研SMAC
- 代理模型
- 获益函数
- 遇到过的坑
- TPE
- 遇到的坑
- 随机采样次数的影响
- bw_method 的影响
- TS+TPE 跳出局部最优解
自研SMAC
代理模型
SMAC的本质是用随机森林作为代理模型。这个代理模型调包就好了(前提是你熟读开源代码千百遍,知道调什么)
from skopt.learning.forest import RandomForestRegressor, ExtraTreesRegressor
众所周知,RandomForestRegressor
不仅会对行做采样,也会对列做采样。ExtraTreesRegressor
只会对行做采样。就我使用的经验来看,特征>样本的情况适合用RF,其余情况一般用ET。SMAC的论文提到,他使用的随机森林会用所有的样本,但特征的采样率是83%. (SMAC源码分析->代理模型的构建)
从skopt
文档来看,一般来说ET要比RF表现好。
获益函数
就我的经验来看,EI肯定要比PI好,因为EI算的是期望,利用的比重其实比探索要大。PI更注重探索,更发散。
skopt
实现了EI, PI, LCB, EIPS等。我目前实现了EI,LogEI。
LogEI的代码可以看SMAC
,RoBO
就实验来看,感觉LogEI和EI差别不大。个人感觉上,无loss_transform+EI == log_scaled loss_transform+LogEI
SMAC的LogEI貌似就是搭配 log_scaled loss_transform的。
RoBO的LogEI与SMAC的实现有很大不同。
使用上来看,EI+ log_scaled loss_transform即可,xi
( ξ \xi ξ) 这个参数设0.01
,0
好像都没什么区别
class EI():def __init__(self, xi=0.01):# in SMAC, xi=0.0,# smac/optimizer/acquisition.py:341# par: float=0.0# in scikit-optimize, xi=0.01# this blog recommend xi=0.01# http://krasserm.github.io/2018/03/21/bayesian-optimization/self.xi = xidef __call__(self, model, X, y_opt):mu, std = model.predict(X, return_std=True)values = np.zeros_like(mu)mask = std > 0improve = y_opt - self.xi - mu[mask]scaled = improve / std[mask]cdf = norm.cdf(scaled
这篇关于自研贝叶斯优化算法遇到的坑的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!