
對于神經網絡,機器學習等字眼大家應該都很熟悉,今天我們不談這個,我們看一下這個在這些模型中一個重要的子領域網絡超參數搜尋。常見的搜尋方法是:試錯法(Babysitting)、網格搜尋(Grid Search)、随機搜尋(Random Search)、貝葉斯優化(Bayesian Optimization)。前面三種都是好了解的,都可以從字面意思進行了解。我們主要講下這個貝葉斯優化算法。其算法可以轉化為一個形式的方程式:
x=argmaxf(x) x∈R
此方程的主要意思是獲得f(x)最大時的x值,同時x是R中的一個子元素。
算法主要分為兩種子形式:一種Prior Function(PF),當我們不知道目标函數曲線是什麼樣的時候,我們就隻能猜(機率)。主要的方式有含參、不含參、線性、非線形等。比如有高斯過程(GP),認為目标函數滿足多變量高斯分布。當然也有存在其他的函數,在選擇PF的時候,需要謹慎選擇模型,不同的模型效果是不一樣的;另外一種Acquisition Function(AC),在經曆過PF的選擇後,那麼就要對PF模型進行進一步修正,就需要通過提供真實的樣本點來推測最優參數。
基本的流程就是給一個先驗的參數進行不斷的優化尋找其最優的參數點。我們下面就直接看下在R語言中是如何實作的,我們需要用到包rBayesianOptimization。
首先我們看下包的安裝:
install.packages(“rBayesianOptimization”)install.packages("xgboost")
在此包中隻有一個主要的函數BayesianOptimization,其參數如下:
其中主要的參數:
Bounds 每個超參數的下界和上界的指定清單。清單的名稱應該與FUN的參數相同。init_grid_dt中的所有采樣點都應該在界限範圍内。請使用“L”字尾表示整型超參數。
Init_grid_dt 采樣點的資料,可以是data.frame或者data.table. 同時可以通過最後一列命名“Value”來為預先采樣的值進行标注。
Init_points 在貝葉斯優化拟合高斯過程之前,随機選取的點的個數。
N_iter 重複貝葉斯優化的總次數。
Acq 設定AC的子函數。包括:
Poi-Probability of improvement
ei-Exceptedimprovement
ucb- upper confidence bound
通過上面的函數的優化,我們會得到具體的一個輸出參數清單:
接下來我們就看下包自帶的執行個體:
1. 簡單的方程:
Test_Fun function(x) { list(Score = exp(-(x - 2)^2) + exp(-(x - 6)^2/10) + 1/ (x^2 + 1), Pred = 0)}## Set larger init_points and n_iter forbetter optimization resultOPT_Res bounds = list(x= c(1, 3)), init_points =2, n_iter = 1, acq ="ucb", kappa = 2.576, eps = 0.0, verbose = TRUE)
2. 複雜模型的實作:
library(xgboost)data(agaricus.train, package ="xgboost")dtrain label =agaricus.train$label)cv_folds 5, stratified = TRUE, seed = 0)xgb_cv_bayes function(max.depth,min.child.weight, subsample) { cvlist(booster = prediction= TRUE, max_depth =max.depth, min_child_weight =min.child.weight, subsample =subsample, colsample_bytree = 0.3, lambda = 1, alpha= 0, objective ="binary:logistic", eval_metric ="auc"), data = dtrain, nround = 100, folds = cv_folds, prediction =TRUE, showsd = TRUE, early_stopping_rounds = 5, maximize= TRUE, verbose = 0) list(Score = cv$evaluation_log[,min(cv$evaluation_log$test_rmse_mean)] ,Pred = cv$pred)} OPT_Res bounds =list(max.depth = c(2L, 6L), min.child.weight= c(1L, 10L), subsample = c(0.5, 0.8)), init_grid_dt =NULL,init_points = 10, n_iter = 20, acq ="ucb", kappa = 2.576, eps = 0.0, verbose = TRUE)
當然我們這裡并沒有得到最優的參數。大家可以根據自己的需求進行修改相對應的位置。
歡迎大家學習交流!