模型优化调参利器贝叶斯优化bayesian-optimization实践

早在之前很多项目尤其是预测类型的项目中,就已经比较广泛地在实用贝叶斯优化库了,这是一个非常出色的纯python实现的项目,地址在这里,如下所示:

写这篇文章主要有两个目的,一方面是觉得这个工具库挺不错的值得学习使用;另一方面是这段时间陆陆续续在使用的过程中出现了很多莫名的错误,虽然一部分在官方的issues中已经得到了解决,但是还是有几个问题依旧是无法解决,所以就想着一方面找时间看下官方的介绍说明看看有没有合适的办法,另一方面就是作为一个开放讨论的平台,欢迎有同样问题的朋友交流沟通。

安装方式很简单:

$ pip install bayesian-optimization

贝叶斯优化通过构造函数的后验分布(高斯过程)来工作,该后验分布最好地描述了要优化的函数。随着观测值数量的增加,后验分布得到改善,算法更加确定参数空间中哪些区域值得探索,哪些区域不值得探索,如下图所示。

当您反复迭代时,该算法会根据其对目标函数的了解来平衡其探索和开发需求。在每个步骤中,将高斯过程拟合到已知样本(先前探索的点),并使用后验分布结合探索策略(例如UCB(置信上限)或EI(预期改进)),以确定应探索的下一个点(动图gif)。

此过程旨在最小化找到接近最佳组合的参数组合所需的步骤数。为此,该方法使用了一个代理优化问题(寻找捕获函数的最大值),尽管这仍然是一个困难的问题,但成本较低(在计算意义上),并且可以使用通用工具。因此,贝叶斯优化是最适合的情况下采样的功能进行优化是一个非常昂贵的努力。

官方项目中提供了基础使用教程和进阶使用教程还有一些对应的开发实例。

基础使用教程

这是一个基于贝叶斯推理和高斯过程的约束全局优化包,它试图在尽可能少的迭代中找到未知函数的最大值。该技术特别适用于高成本函数的优化,在这种情况下,勘探和开发之间的平衡非常重要。贝叶斯优化通过构造函数的后验分布(高斯过程)来工作,该后验分布最好地描述了要优化的函数。随着观测值数量的增加,后验分布得到改善,算法更加确定参数空间中哪些区域值得探索,哪些区域不值得探索,如下图所示。
当您反复迭代时,该算法会根据其对目标函数的了解来平衡其探索和开发需求。在每个步骤中,将高斯过程拟合到已知样本(先前探索的点),并使用后验分布结合探索策略(例如UCB(置信上限)或EI(预期改进)),以确定应探索的下一个点(参见下面的gif)。
此过程旨在最小化找到接近最佳组合的参数组合所需的步骤数。为此,该方法使用了一个代理优化问题(寻找捕获函数的最大值),尽管这仍然是一个困难的问题,但成本较低(在计算意义上),并且可以使用通用工具。因此,贝叶斯优化是最适合的情况下采样的功能进行优化是一个非常昂贵的努力。

1、指定优化函数

def black_box_function(x, y):"""Function with unknown internals we wish to maximize.This is just serving as an example, for all intents andpurposes think of the internals of this function, i.e.: the processwhich generates its output values, as unknown."""return -x ** 2 - (y - 1) ** 2 + 1

2、实践应用

from bayes_opt import BayesianOptimization
# Bounded region of parameter space
pbounds = {'x': (2, 4), 'y': (-3, 3)}
optimizer = BayesianOptimization(f=black_box_function,pbounds=pbounds,verbose=2, # verbose = 1 prints only when a maximum is observed, verbose = 0 is silentrandom_state=1,
)
optimizer.maximize(init_points=2,n_iter=3,
)
print(optimizer.max)
for i, res in enumerate(optimizer.res):print("Iteration {}: \n\t{}".format(i, res))
#修改参数边界
optimizer.set_bounds(new_bounds={"x": (-2, 3)})
optimizer.maximize(init_points=0,n_iter=5,
)

3、优化

optimizer.probe(params={"x": 0.5, "y": 0.7},lazy=True,
)
print(optimizer.space.keys)
optimizer.probe(params=[-0.3, 0.1],lazy=True,
)
optimizer.maximize(init_points=0, n_iter=0)

4、存储、加载、继续

#Saving progress
from bayes_opt.logger import JSONLogger
from bayes_opt.event import Eventslogger = JSONLogger(path="./logs.log")
optimizer.subscribe(Events.OPTIMIZATION_STEP, logger)
optimizer.maximize(init_points=2,n_iter=3,
)#Loading progress
from bayes_opt.util import load_logs
new_optimizer = BayesianOptimization(f=black_box_function,pbounds={"x": (-2, 2), "y": (-2, 2)},verbose=2,random_state=7,
)
print(len(new_optimizer.space))load_logs(new_optimizer, logs=["./logs.log"]);
print("New optimizer is now aware of {} points.".format(len(new_optimizer.space)))
new_optimizer.maximize(init_points=0,n_iter=10,
)

进阶使用教程

1.、Suggest-Evaluate-Register Paradigm

# Let's start by defining our function, bounds, and instantiating an optimization object.
def black_box_function(x, y):return -x ** 2 - (y - 1) ** 2 + 1optimizer = BayesianOptimization(f=None,pbounds={'x': (-2, 2), 'y': (-3, 3)},verbose=2,random_state=1,
)from bayes_opt import UtilityFunctionutility = UtilityFunction(kind="ucb", kappa=2.5, xi=0.0)next_point_to_probe = optimizer.suggest(utility)
print("Next point to probe is:", next_point_to_probe)target = black_box_function(**next_point_to_probe)
print("Found the target value to be:", target)optimizer.register(params=next_point_to_probe,target=target,
)#The maximize loop
for _ in range(5):next_point = optimizer.suggest(utility)target = black_box_function(**next_point)optimizer.register(params=next_point, target=target)print(target, next_point)
print(optimizer.max)

2、Dealing with discrete parameters

def func_with_discrete_params(x, y, d):# Simulate necessity of having d being discrete.assert type(d) == intreturn ((x + y + d) // (1 + d)) / (1 + (x + y) ** 2)
def function_to_be_optimized(x, y, w):d = int(w)return func_with_discrete_params(x, y, d)
optimizer = BayesianOptimization(f=function_to_be_optimized,pbounds={'x': (-10, 10), 'y': (-10, 10), 'w': (0, 5)},verbose=2,random_state=1,
)
optimizer.set_gp_params(alpha=1e-3)
optimizer.maximize()

3、Tuning the underlying Gaussian Process

optimizer = BayesianOptimization(f=black_box_function,pbounds={'x': (-2, 2), 'y': (-3, 3)},verbose=2,random_state=1,
)
optimizer.set_gp_params(alpha=1e-3, n_restarts_optimizer=5)
optimizer.maximize(init_points=1,n_iter=5
)from bayes_opt.event import DEFAULT_EVENTS, Events
optimizer = BayesianOptimization(f=black_box_function,pbounds={'x': (-2, 2), 'y': (-3, 3)},verbose=2,random_state=1,
)
class BasicObserver:def update(self, event, instance):"""Does whatever you want with the event and `BayesianOptimization` instance."""print("Event `{}` was observed".format(event))
my_observer = BasicObserver()optimizer.subscribe(event=Events.OPTIMIZATION_STEP,subscriber=my_observer,callback=None, # Will use the `update` method as callback
)def my_callback(event, instance):print("Go nuts here!")optimizer.subscribe(event=Events.OPTIMIZATION_START,subscriber="Any hashable object",callback=my_callback,
)
optimizer.maximize(init_points=1, n_iter=2)

进一步的详情可以自行了解官方教程即可。

简单的实践介绍就到这里,下面说两个还记得的报错问题。

1、StopIteration: Queue is empty error in optimizer.maximize()

关于这个问题,官方论坛和stackoverflow论坛里面都有很多讨论,也有给出一些对应的解决办法,但是都没有能解决我的问题。

2、"ValueError: array must not contain infs or NaNs" happens after self.suggest().

这个问题与上面问题往往是交替或者是同时出现的。

目前依旧在研究文档,不知道是不是自己哪里理解有误导致的,也欢迎有同样问题的朋友一起沟通交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/40501.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

零基础做项目---五子棋对战---day01

创建项目 这里使用阿里云服务器 https://start.aliyun.com/ 勾选 MyBatis Framework (在SQL分类下)MySQL Driver (在SQL分类下)WebSocket (在Messaging分类下)Spring Web (在Web分类下) 项目结构 消息发送机制 按照当前已有的知识,主要是HTTP HTTP自身是难以实现这…

c++ 里如何检测内存泄露:比如用了 new ,但没有用 delete

(1 方法一) 用 MFC 框架的 F5 不带断点的调试。可以在输出窗口提示是否有内存泄露。 (2 方法二) ,在 main 函数中添加如下代码,用 F5 不带断点的调试: int main() {_CrtSetDbgFlag( _CRTDBG_A…

vue.js微商城后台管理系统

一.需要运行的效果 20240701-231456 二.代码(解析) 首先,为项目添加依赖: yarn add element-plus --save yarn vue-router4 --save 新建一个项目包,然后命名为商品管理,在components中新建几个vue文件。 …

C++新特性

C新特性主要体现在语法改进和标准库扩充两个方面。以下是一些主要的C新特性: 语法改进 统一的初始化方法:C11扩大了用大括号括起的列表(初始化列表)的使用范围,使其可用于所有的内置类型和用户自定义的类型。这种定义…

【C语言】指针(1)--入门理解

目录 一、内存和地址 二、指针变量和地址 三、指针变量类型的意义 一、内存和地址 只要讲指针就离不开内存 因为指针就是访问内存的 计算上CPU(中央处理器)在处理数据的时候,需要的数据是在内存中读取的,处理后的数 据也会放…

PY32F030高性能单片机,主频高达48M,最大64 KB 闪存,8 KB SRAM

PY32F030是普冉的一颗32位高性能MCU,采用32 位 ARM Cortex-M0 内核,高达16~64 Kbytes Flash 和 2~8 Kbytes SRAM 存储器,最高 48 MHz 工作频率。PY32F030 单片机的工作温度范围为 -40 ~ 105 C,工作电压范围为1.7 ~ 5.5 V&#xff…

多语言版在线出租车预订完整源码+用户应用程序+管理员 Laravel 面板+ 司机应用程序最新版源码

源码带PHP后台客户端源码 Flutter 是 Google 开发的一款开源移动应用开发 SDK。它用于开发 Android 和 iOS 应用,也是为 Google Fuchsia 创建应用的主要方法。Flutter 小部件整合了所有关键的平台差异,例如滚动、导航、图标和字体,可在 iOS 和…

DevOps实战:使用GitLab+Jenkins+Kubernetes(k8s)建立CI_CD解决方案

一.系统环境 本文主要基于Kubernetes1.21.9和Linux操作系统CentOS7.4。 服务器版本docker软件版本Kubernetes(k8s)集群版本CPU架构CentOS Linux release 7.4.1708 (Core)Docker version 20.10.12v1.21.9x86_64CI/CD解决方案架构图:CI/CD解决方案架构图描述:程序员写好代码之…

ASP.NET MVC-razor编写-2-svg中使用js+添加事件监听

环境:win10 效果 初始状态: 鼠标移入某个text(比如KS primer)时,text和连接的线条与箭头都变色: 鼠标移出时回复正常。 如果是移入另一种红色的text(比如Cell Sceening Tag)&…

创建本地仓库

一、新建挂载目录 二、将挂载本地镜像挂载到目录 三、配置yum仓库 一、新建挂载目录 mkdir /BenDiCangKu 二、将挂载本地镜像挂载到目录 1、先连接本地光盘 2、挂载光盘 mount /dev/sr0 /BenDiCangKu 3、查看挂载 由此可见挂载成功 三、配置yum仓库 1、新建yum仓库文件…

php简单商城小程序系统源码

🛍️【简单商城小程序】🛍️ 🚀一键开启,商城搭建新体验🚀 你还在为繁琐的商城搭建流程头疼吗?现在,有了简单商城系统小程序,一切变得轻松又快捷!无需复杂的编程知识&a…

构建Android studio版的CarSystemUI工程时因为包名一致导致BuildConfig问题

项目场景: 公司计划开发杰发AC8025-Android 12版本车载平台,前期预研需要构建Android studio版的CarSystemUI工程 问题描述 AAOS车载项目里面的CarSystemUI源码默认无Android studio版本,为了后期快速开发调试需要构建Android studio能直接…

STM32基础知识

一.STM32概述 第一款STM32单片机发布的时间为2007年6月11日。由意法半导体(ST)公司推出,是STM32系列中的首款产品,具体型号为STM32F1,它是一款基于Cortex-M内核的32位微控制器(MCU)。 STM32F1…

2024年【湖北省安全员-C证】考试资料及湖北省安全员-C证考试试卷

题库来源:安全生产模拟考试一点通公众号小程序 湖北省安全员-C证考试资料是安全生产模拟考试一点通生成的,湖北省安全员-C证证模拟考试题库是根据湖北省安全员-C证最新版教材汇编出湖北省安全员-C证仿真模拟考试。2024年【湖北省安全员-C证】考试资料及…

JS+CSS+HTML项目-中国国家图书馆

页面做的不多,CSS效果请看哔哩哔哩

英智玲珑一体机在律所能做什么

只要不开庭,学习就不能停 好的律师是法律知识的百科全书 要精通、全面理解各类型的法律 还要不断学习更新的条例释义 一天即使工作24小时 也有忙不完的文书起草,资料核对,案情分析整理 有了英智玲珑一体机,这些都不是难题&am…

一键式创建GTest测试平台

适用于C GTest测试平台搭建。直接上python脚本。 #!/usr/bin/env python3 # -*- coding: utf-8 -*-import argparse import os import platform import subprocess from xml.etree import ElementTree as ETdefault_root_path "d:\\test\\UTtest"class DeveloperTe…

四款主流电脑监控软件(电脑监控软件主要优势)

在现代企业环境中,确保员工的工作效率和企业信息的安全成为了管理者的重要任务。电脑监控软件作为一种有效的管理工具,能够帮助企业实现这些目标。固信电脑监控软件在这方面表现尤为出色,本文将详细介绍固信电脑监控软件的优势及其主要功能&a…

《NATURE丨使用 AlphaFold 3 准确预测生物分子相互作用的结构》

NATURE丨使用 AlphaFold 3 准确预测生物分子相互作用的结构 注意!:本文创作仅根据个人理解和网络信息,如有错误恳请指正!谢谢! 大家好,今天分享的文献是2024年5月发表在Nature上的“ Accurate structure …

(仿真+报告+源码)基于51单片机的温湿度监测系统

(仿真报告源码)基于51单片机的温湿度监测系统 付费后获得百度网盘链接,网盘链接在最后,有问题私信哦~~~ 一.系统简介 该系统由单片机、温湿度传感器器、液晶显示器以及浇水控制电路组成。该系统使用AT89C51单片机作为控制核心&…