希望這篇文章能夠讓你無痛理解貝葉斯優(yōu)化,記得點(diǎn)贊!
貝葉斯優(yōu)化什么
既然是優(yōu)化,就有優(yōu)化命題的存在,比如要在某個(gè)區(qū)間內(nèi)去最大化某個(gè)函數(shù)
如果這個(gè)函數(shù)計(jì)算比較容易,甚至還可以知道它的梯度,那事情就好辦了,一階、二階優(yōu)化算法換著上就完事。
https://zhuanlan.zhihu.com/p/169835477
但現(xiàn)實(shí)往往沒有那么理想,這個(gè)函數(shù)的一階、二階導(dǎo)數(shù)信息我們可能是沒有的,甚至計(jì)算一次函數(shù)的值都很費(fèi)勁(給定一個(gè)x,計(jì)算f(x) 的計(jì)算量很大。
比如神經(jīng)網(wǎng)絡(luò)中的超參數(shù)優(yōu)化),這時(shí)候就要求助 gradient-free 的優(yōu)化算法了,這類算法也很多了,貝葉斯優(yōu)化就屬于無梯度優(yōu)化算法中的一種,它希望在盡可能少的試驗(yàn)情況下去盡可能獲得優(yōu)化命題的全局最優(yōu)解。
概述
由于我們要優(yōu)化的這個(gè)函數(shù)計(jì)算量太大,一個(gè)自然的想法就是用一個(gè)簡單點(diǎn)的模型來近似f(x),這個(gè)替代原始函數(shù)的模型也叫做代理模型,貝葉斯優(yōu)化中的代理模型為高斯過程,假設(shè)我們對(duì)待優(yōu)化函數(shù)的先驗(yàn)(prior)為高斯過程,經(jīng)過一定的試驗(yàn)我們有了數(shù)據(jù)(也就是evidence),然后根據(jù)貝葉斯定理就可以得到這個(gè)函數(shù)的后驗(yàn)分布。
有了這個(gè)后驗(yàn)分布后,我們需要考慮下一次試驗(yàn)點(diǎn)在哪里進(jìn)一步收集數(shù)據(jù),因此就會(huì)需要構(gòu)造一個(gè)acquisition函數(shù)用于指導(dǎo)搜索方向(選擇下一個(gè)試驗(yàn)點(diǎn)),然后再去進(jìn)行試驗(yàn),得到數(shù)據(jù)后更新代理模型的后驗(yàn)分布,反復(fù)進(jìn)行。
綜上所述,貝葉斯優(yōu)化的流程為:
高斯過程
高斯過程是多元高斯分布向無窮維的擴(kuò)展,如果說高斯分布是隨機(jī)變量的分布,則高斯過程是函數(shù)的分布,它可以由均值函數(shù)和協(xié)方差函數(shù)組成
這里的均值和協(xié)方差函數(shù)的推導(dǎo)和具體形式先省略不管,感興趣的可以看之前的博文,需要明確的是我們已經(jīng)可以根據(jù)高斯過程的后驗(yàn)分布對(duì)這個(gè)未知函數(shù)在任意位置的值做出預(yù)測,均值包括方差。
關(guān)于高斯過程的更多可見:
https://zhuanlan.zhihu.com/p/158720213
acquisition函數(shù)
Typically, acquisition functions are defined such that high acquisition corresponds to potentially high values of the objective function, whether because the prediction is high, the uncertainty is great, or both.
也就是說貝葉斯優(yōu)化選擇的搜索方向?yàn)轭A(yù)測值大的位置或者不確定性大的位置,這樣才有可能搜到目標(biāo)函數(shù)的最優(yōu)解。
因此貝葉斯優(yōu)化中很多工作關(guān)注點(diǎn)在于acquisition函數(shù)的設(shè)計(jì):
最大化提升概率
最容易想到的就是我希望下一次試驗(yàn)的結(jié)果比當(dāng)前所有觀測結(jié)果都要好
或者說這個(gè)新采樣的函數(shù)值更優(yōu)的概率要大
但是光這樣考慮是有點(diǎn)目光短淺的,它忽略了對(duì)不確定性的考慮,一味追求選擇大概率肯定大于f(x)+的點(diǎn),也就是一直在exploitation,這樣的缺點(diǎn)是可能就陷入了局部最優(yōu),忽略了潛在的最優(yōu)解。改進(jìn)的方法也很簡單,加個(gè)偏置就可以了
最大化提升量
提升的概率大并不意味著提升得多,一種量化的角度就是考慮提升量(可以不嚴(yán)謹(jǐn)?shù)乩斫鉃樘荻认陆捣ㄖ校粌H要下降,而且要下得更多一點(diǎn))
那么要求得下一次試驗(yàn)點(diǎn)就可以最大化期望的提升量
由于代替模型為高斯過程,提升量Ι的似然滿足標(biāo)準(zhǔn)正態(tài)分布,進(jìn)一步可以推導(dǎo)(不會(huì)推導(dǎo)想了解推導(dǎo)的再留言吧)得到
最大化置信上界
由于我們的代理模型是高斯過程,預(yù)測為分布,即有均值也有方差,那么就可以構(gòu)造一個(gè)置信上界
這樣的上界同時(shí)考慮了預(yù)測值的大小以及不確定性,高斯過程在觀測數(shù)據(jù)的位置不確定性(方差)小,在未探索區(qū)域的不確定大。
Talk is Cheap
讓我們來解讀一下源碼,一探究竟
首先定義個(gè)Bayesian_opt的類,其中的代理模型高斯過程從sklearn拉出來就好了
from sklearn.gaussian_process import GaussianProcessRegressor self.GP = GaussianProcessRegressor(...)
定義acquisition function
def PI(x, gp, y_max, xi): mean, std = gp.predict(x, return_std=True) z = (mean - y_max - xi)/std return norm.cdf(z) def EI(x, gp, y_max, xi): mean, std = gp.predict(x, return_std=True) a = (mean - y_max - xi) z = a / std return a * norm.cdf(z) + std * norm.pdf(z) def UCB(x, gp, kappa): mean, std = gp.predict(x, return_std=True) return mean + kappa * std
尋找acquisition function最大的對(duì)應(yīng)解,更精細(xì)化的可以去優(yōu)化一下,這里僅展示隨機(jī)采樣的方式。
def acq_max(ac, gp, y_max, bounds, random_state, n_warmup=10000): # 隨機(jī)采樣選擇最大值 x_tries = np.random.RandomState(random_state).uniform(bounds[:, 0], bounds[:, 1], size=(n_warmup, bounds.shape[0])) ys = ac(x_tries, gp=gp, y_max=y_max) x_max = x_tries[ys.argmax()] max_acq = ys.max() return x_max
主函數(shù)
while iteration < n_iter: ? ?# 更新高斯過程的后驗(yàn)分布 ? ?self.GP.fit(X, y) ? ?# 根據(jù)acquisition函數(shù)計(jì)算下一個(gè)試驗(yàn)點(diǎn) ? ?suggestion = acq_max( ? ? ? ? ? ?ac=utility_function, ? ? ? ? ? ?gp=self.GP, ? ? ? ? ? ?y_max=y.max(), ? ? ? ? ? ?bounds=self.bounds, ? ? ? ? ? ?random_state=self.random_state ? ? ? ?) ? ?# 進(jìn)行試驗(yàn)(采樣),更新觀測點(diǎn)集合 ? ?X.append(suggestion) ? ?y.append(target_func(suggestion)) ? ?iteration += 1
編輯:黃飛
-
神經(jīng)網(wǎng)絡(luò)
+關(guān)注
關(guān)注
42文章
4768瀏覽量
100679 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4325瀏覽量
62539 -
貝葉斯
+關(guān)注
關(guān)注
0文章
77瀏覽量
12564
原文標(biāo)題:貝葉斯優(yōu)化(原理+代碼解讀)
文章出處:【微信號(hào):vision263com,微信公眾號(hào):新機(jī)器視覺】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論