1、问题的提出
① 在介绍贝叶斯优化之前,我们先来介绍一下机器学习的一般思路,机器学习可以看作是一个黑盒子模型,我们输入一个X,通过机器学习模型得到一个输出y,也即是:
图中样本矩阵如下图:
通过机器学习模型,我们可以给每一个特征分配一个权重w,如果有m个特征,那么就有m个权重w,这些权重可以组成一个参数矩阵W,机器学习就是通过对大量样本进行训练,更新并确定这个权重矩阵的(以三个特征为例,见下图)。
② 由上介绍我们可知,要想获得一个比较好的预测结果,我们需要较多的有标签样本进行训练,但是如果在实际应用中获得样本的标签成本较高,我们当然希望能利用较少的样本来获得更好的收益。贝叶斯优化就是来解决训练样本获取成本高、样本少这个问题的。除了贝叶斯优化以外,主动学习也可以解决此类问题,这里不做过多介绍。
2、贝叶斯基础知识
①后验概率就是已知结果求原因(P因|果);似然估计是由因求果P(果|因);先验概率是由历史求因(P(因))。见下图:
上图1点击这观看原地址,图2点击这查看原地址,通过这两个链接,就可以熟悉贝叶斯公式。
3、贝叶斯优化流程
贝叶斯优化的简要流程如下图:
通过上图我们可以发现,贝叶斯优化中的难点在于对高斯过程回归和采集函数的理解,下面进行介绍。
3.1 高斯过程回归(GPR)
GPR假设y值服从联合高斯分布(先验),根据训练集X可以得到最优的核矩阵,从而得到后验以估计测试集y*。则:
直接上代码,我们以一维为例:
import numpy as np
import matplotlib.pyplot as plt
class GPR:
def __init__(self,optimize=True):
self.is_fit = False
self.train_X,self.train_y = None,None
self.params = {"l":0.5,"sigma_f":0.2}
self.optimize = optimize
def fit(self,X,y):
self.train_X = np.asarray(X)
self.train_y = np.asarray(y)
self.is_fit = True
def predict(self,X):
if not self.is_fit:
print("GPR Model not fit yet")
return
X = np.asarray(X)
kxx = self.kernel(self.train_X,self.train_X)
kpp = self.kernel(X,X)
kxp = self.kernel(self.train_X,X)
kxx_inv = np.linalg.inv(kxx+1e-8*np.eye(len(self.train_X)))
mu = kxp.T.dot(kxx_inv).dot(self.train_y)
conv = kpp - kxp.T.dot(kxx_inv).dot(kxp)
return mu,conv
def kernel(self,x1,x2):
dist_matrix = np.sum(x1**2, 1).reshape(-1, 1) + np.sum(x2**2, 1) - 2 * np.dot(x1, x2.T)
return self.params["sigma_f"] ** 2 * np.exp(-0.5 / self.params["l"] ** 2 * dist_matrix)
上面的代码中:
train_X和train_y是已经知道的训练样本和标签。 X是需要预测的样本,核函数用的是高斯核函数,见下
代码 self.params = {“l”:0.5,“sigma_f”:0.2}中的sigma_f就是公式中的σ,l就是公式中的l。这样代码中定义的函数kernel就是高斯核函数。有应为
y
∗
y*
y∗=
K
(
X
∗
,
X
)
K(X*,X)
K(X∗,X)
K
(
X
,
X
)
−
1
K(X,X)^{-1}
K(X,X)−1 。predict函数中就是计算通过计算
K
(
X
∗
,
X
)
K(X*,X)
K(X∗,X)和
K
(
X
,
X
)
−
1
K(X,X)^{-1}
K(X,X)−1来得到均值和方差的。
3.2、采集函数
高斯过程回归的核心公式是
y
∗
y*
y∗=
K
(
X
∗
,
X
)
K(X*,X)
K(X∗,X)
K
(
X
,
X
)
−
1
K(X,X)^{-1}
K(X,X)−1,其中的
K
(
X
∗
,
X
)
K(X*,X)
K(X∗,X)和
K
(
X
,
X
)
−
1
K(X,X)^{-1}
K(X,X)−1都是已知的,我们可以根据该式获得新样本
X
∗
X*
X∗的预测值
y
∗
y*
y∗,贝叶斯优化是通过迭代来逐步实现目标的,通过高斯过程回归完成了对单个未知样本的预测,而采集函数就是通过高斯过程回归中计算出的均值和方差来决定下一个取值点的应该怎么取,常见的采集函数有UCB,PI,EI三种:
①
U
C
B
UCB
UCB(Upper confidence bound):
U
C
B
UCB
UCB=
μ
(
x
)
μ(x)
μ(x)+
k
σ
(
x
)
kσ(x)
kσ(x),其中,
μ
(
x
)
μ(x)
μ(x)为均值,
σ
(
x
)
σ(x)
σ(x)为方差。
②
P
I
PI
PI(probability of improvement):
P
I
(
x
)
PI(x)
PI(x)=
P
(
f
(
x
)
≥
f
(
x
+
)
+
υ
)
P(f(x)≥f(x^{+})+υ)
P(f(x)≥f(x+)+υ)=
Φ
(
μ
(
x
)
−
f
(
x
+
)
−
υ
σ
(
x
)
)
Φ(\frac{μ(x)−f(x^{+})−υ}{σ(x)})
Φ(σ(x)μ(x)−f(x+)−υ)
超参数
v
v
v用于调节探索和开发,
f
(
x
+
)
f(x^{+})
f(x+)是现有的最大值,
v
v
v=0倾向于收敛到
f
(
x
+
)
f(x^{+})
f(x+)附近,
Φ
(
•
)
Φ(•)
Φ(•)表示正态累计分布函数。其原理是找到未知点的函数值比
f
(
x
+
)
f(x^{+})
f(x+)大的概率,取这些点中概率最大的点,具体比
f
(
x
+
)
f(x^{+})
f(x+)大多少不考虑,这里通过Z-scores标准化法,让每个未知点函数值大于
f
(
x
+
)
f(x^{+})
f(x+)的概率可以进行比较。
Z-scores标准化法,
x
−
μ
σ
\frac{x−μ}{σ}
σx−μ为观察点,μ 为所有观察点的均值,σ为所有观察点标准差,
x
−
μ
σ
\frac{x−μ}{σ}
σx−μ的概率密度函数符合标准正态分布。
③
E
I
EI
EI(Expected improvement):
其中,
z
=
μ
(
x
)
−
f
(
x
+
)
σ
z=\frac{μ(x)−f(x^{+})}{σ}
z=σμ(x)−f(x+),
Φ
(
•
)
Φ(•)
Φ(•)表示正态累计分布函数,
f
(
x
+
)
f(x^{+})
f(x+)为现有最大值。EI函数解决了PI未考虑未知点,比已知最大点大多少的问题,EI函数求的是未知点函数值比
)
f
(
x
+
)
)f(x+)
)f(x+)大的期望。