模型優化調參利器貝葉斯優化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.pswp.cn/web/40501.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/40501.shtml
英文地址,請注明出處:http://en.pswp.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文件。 …

React Hooks 深度解析

Hooks簡介 誕生背景: 在React 16.8之前的版本中,組件主要分為函數組件和類組件兩大類。函數組件簡單輕量,但不支持狀態(state)和生命周期方法;而類組件雖然功能強大,但編寫和維護起來相對復雜。…

驅動開發系列-如何與硬件通信

目錄 一:概述 二:I/O端口和I/O內存的概念 三:硬件寄存器(I/O寄存器)和內存 四:使用I/O端口 一:概述 驅動程序是軟件與硬件之間的抽象層;因此,它需要與這兩者對話,本文將向你展示驅動程序如何與硬件對話。并介紹I/O端口和I/O內存的概念。 二:I/O端口和I/O…

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…

Centos7刪除MariaDB

在 CentOS 7 上刪除 MariaDB 可以通過 yum 包管理器來完成。以下是一步一步的指導: 打開終端:首先,你需要打開你的 CentOS 7 系統的終端。 停止 MariaDB 服務(如果正在運行):在卸載 MariaDB 之前&#xff…

IDEA實現遠程Debug的步驟與方法

IDEA實現遠程Debug的步驟與方法 在軟件開發過程中,遠程Debug是一個非常重要的功能,它允許開發者在本地IDE中調試遠程服務器上的應用程序。IntelliJ IDEA作為一款強大的Java開發工具,提供了豐富的遠程Debug功能。本文將詳細介紹如何使用IDEA實…

多語言版在線出租車預訂完整源碼+用戶應用程序+管理員 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…

【openstack基礎操作】

openstack 常用命令 source ~/base/src/kayobe-config/etc/kolla/admin-openrc.sh https://docs.openstack.org//kayobe/latest/doc-kayobe.pdf 鏡像下載點 http://cloud.centos.org/centos/7/images/創建虛擬機 openstack server create --image 13d0686a-a7cc-4cc6-8bf7-76…

2024年【湖北省安全員-C證】考試資料及湖北省安全員-C證考試試卷

題庫來源:安全生產模擬考試一點通公眾號小程序 湖北省安全員-C證考試資料是安全生產模擬考試一點通生成的,湖北省安全員-C證證模擬考試題庫是根據湖北省安全員-C證最新版教材匯編出湖北省安全員-C證仿真模擬考試。2024年【湖北省安全員-C證】考試資料及…

JS+CSS+HTML項目-中國國家圖書館

頁面做的不多,CSS效果請看嗶哩嗶哩