贝叶斯优化bayes_opt在工程上的应用
贝叶斯优化方法是一种基于高斯过程去迭代搜索的优化算法,非常实用。下面,从一个具体的实例来简单了解一下贝叶斯优化方法。
详细讲解贝叶斯优化的例子见:https://coderzcolumn.com/tutorials/machine-learning/bayes-opt-bayesian-optimization-for-hyperparameters-tuning
Python中有一系列的用于调整超参数的库,比如:
- optuna
- hyperopt
- bayes_opt
- scikit-optimize
- keras-tuner
本文详细介绍bayes_opt如何使用,关于其他的方法使用教程可见:https://coderzcolumn.com/tutorials/machine-learning/
“bayes_opt"是如何工作的
bayes_opt 利用贝叶斯推断和高斯过程来寻找超参数值,从而在较少的试验中获得最佳结果。它可以将任何黑盒函数作为输入,并最大化该函数的输出返回值。
超参数库首先会构建函数的后验分布(高斯过程),以准确描述我们想要最大化输出的输入函数。然后,库会尝试将函数作为输入的不同参数组合。
当我们尝试不同的组合时,后验分布就会得到改善。高斯过程会更多地了解参数空间中取得良好结果的区域,并在该空间中不断探索,而不是尝试整个参数空间。
每次试验都会拟合高斯过程,并使用后验分布和探索策略(UCB(置信度上限)或 EI(预期改进))来确定下一次尝试的参数组合。它试图在尽可能少的试验中找到函数的最佳参数设置。
使用”bayes_opt"来调整超参数的步骤
- 定义 objective function
- 定义 Hyperparameters Search Space
- 最大化 objective function
- 打印最佳结果
具体实例
以下是在光通信的DSP处理算法中的具体实例,由于实验时无法保证发射功率lp恒定,所以将lp设置为超参数,并用bayes_opt方法来查找使模型Q因子最大的lp。
-
定义 目标函数:
def obj_func(lp): p = util.dBm2w(lp) p0 = util.dBm2w(1) sig, ber = eval_ber(mdl, tstSet, prbsTst, use_cuda=True, power_factor=p / p0) ber = np.mean(ber) Q = util.ber2q(ber) return Q
-
定义超参数搜索的空间
pbounds = {'lp':(-5,5)}
注意这里要以字典的形式传入;由于只有一个超参数,所以字典里只有一个实体。
-
最大化目标函数
optimizer = BayesianOptimization( f=obj_func, pbounds=pbounds, verbose=2, ) utility = UtilityFunction(kind='ei',xi=0.05) optimizer.maximize(init_points=5, n_iter=10, acquisition_function=utility)
首先要实例化一个贝叶斯优化器-optimizer=BayesianOptimization(f, pbounds, random_state=None, verbose=2);
- f 就是我们定义好的目标函数
- pbounds 就是我们定义好的参数搜索的字典
其次,需要实例化一个Utility函数:UtilityFunction(kind=‘ei’, xi=0.05)
- kind代表三种不同的种类,有‘ucb’: Upper Confidence Bound;‘ei’: Expected Improvement;‘poi’: Probablity of Improvment;
- xi 代表随机初始点的值
实例化后,可以调用optimizer的maxmized方法:maxmize(init_points=5, n_iter=10, acquisition_function=utility)
- init_points 参数接受整数值,指定要尝试多少个随机参数组合。
- n_iter 参数接受整数值,指定初始随机试验完成后要尝试多少个参数组合。
-
打印最佳结果
Q = optimizer.max['target'] lp_best = optimizer.max['params'] # 如果还有其他超参数,那么如此打印: param_1 = optimizer.max['params']['param_1'] param_2 = optimizer.max['params']['param_2']