【背景】:神经网络在训练过程中,有许多超参数会影响网络达到最优值(可能是局部最优),所以对超参数的选择和自动搜索成为一件急迫的工作。
【解决的问题】:贝叶斯优化假设超参数与最后我们需要优化的网络损失函数存在一个函数关系。且这个函数符合高斯分布。
【具体思路】:假设一组超参数组合是X=x1,x2,…,xn (xn表示某一个超参数的值,可以是batchsize,网络层数,学习率…)
-
已知若干对数据组成的数据集D,每一对数据表示成(X, y), X是一组超参数,y是这组超参数对应的函数结果。
-
贝叶斯优化的大体思路如下:
-
假设有一个函数f,x代表超参数组合,比如(batch_size, lr_rate),需要在一个参数空间中找到一组参数,可以使得f(x)最小,公式如下:
x*=argminf(x) x∈X (1) -
又因为已知模型服从高斯分布,且已知数据集D,所以可计算得到模型具体函数表述。根据函数表达式,选择满足公式(1)的参数,也就是选择合适的超参数组x.(怎么选择的不扩展讲啦)
-
例如我们通过上述步骤已经选出了一组超参数xi,那么我们下一步就是将超参数带入网络中去进行训练,最后得到输出yi。
(这里不能想当然地觉得得到x了,再带入模型函数表达式,就可以得到对应的yi。这里的函数表达式是根据先验的数据集D得到的,本质上来说也是对数据的拟合,拟合拟合,当然不是真实的值啦,所以还是要将选出的x带入模型训练,得到对应的yi,这里的yi才是真实值。) -
最后,用上述(xi,yi)更新数据集D。不断更新,那么模型的函数表达越准确,得到的x也越符合公式(1)的要求。
【代码实现】
下面就举例一个简单的贝叶斯优化的例子:
from bayes_opt import BayesianOptimization
# 定义一个简单的函数,例如 f(x, y) = -x**2 - (y - 1)**2 + 1
def black_box_function(x, y):
return -x ** 2 - (y - 1) ** 2 + 1
# 设置要优化的参数及其范围
pbounds = {'x': (-2, 2), 'y': (-3, 3)}
# 创建一个 BayesianOptimization 对象
optimizer = BayesianOptimization(
f=black_box_function, #优化的函数对象
pbounds=pbounds, #优化的输入值的范围
random_state=1, #指定随机种子,保证实验可复现
)
# 进行优化
optimizer.maximize(
init_points=5, #初始随机采样点的数量
n_iter=10, #优化循环的次数
)
# 打印优化结果
print(optimizer.max)
结果:
| iter | target | x | y |
-------------------------------------------------
| 1 | 0.7862 | -0.3319 | 1.322 |
| 2 | -7.777 | -2.0 | -1.186 |
| 3 | -12.87 | -1.413 | -2.446 |
| 4 | -4.287 | -1.255 | -0.9266 |
| 5 | 0.241 | -0.4129 | 0.2329 |
| 6 | -3.479 | 2.0 | 1.692 |
| 7 | -7.0 | -2.0 | 3.0 |
| 8 | -6.366 | 1.974 | -0.8621 |
| 9 | -1.485 | -1.566 | 0.8185 |
| 10 | -3.375 | 0.6124 | 3.0 |
| 11 | 0.6732 | 0.5689 | 0.944 |
| 12 | 0.4505 | 0.3931 | 1.628 |
| 13 | 0.9956 | -0.003769 | 0.9337 |
| 14 | 0.7176 | -0.5125 | 0.8593 |
| 15 | 0.937 | 0.1403 | 1.208 |
=================================================
下面详细讲述,上述不同参数带给结果的影响:
init_points,初始随机采样点的数量。
-
探索 vs. 利用:
贝叶斯优化过程涉及两个阶段:探索(exploration)和利用(exploitation)。
初始随机采样点数较多时,算法会更倾向于探索整个参数空间,从而更有可能找到全局最优解。
如果初始采样点数较少,优化器可能过早地集中在某些局部区域,导致错过全局最优解。
模型初始训练: -
初始采样点用于训练高斯过程(GP)模型。更多的初始点意味着初始模型会更准确,从而提升之后的优化效率。
如果初始点太少,模型可能对参数空间的了解不足,导致后续预测和选择点不够准确。
计算成本: -
更多的初始采样点会增加计算成本,特别是在每次评估目标函数代价较高的情况下。需要权衡初始采样点的数量和可接受的计算资源。
n_iter,优化循环的次数。
- 可以调整,如果初始模型不佳,需要采用更多的循环次数。
?如果循环迭代后得不到满意的结果,可以调整哪些方面?
-
适当增加初始采样点:
-
对于复杂的目标函数或高维参数空间,适当增加初始采样点数有助于更好地探索参数空间。
一个经验法则是:初始采样点数设置为参数维度的10倍。例如,对于1个参数,可以尝试10个初始采样点。
逐步调试: -
在初始优化过程中,可以从较少的采样点开始(例如5个),观察结果。如果结果不理想,可以逐步增加采样点数。
保持一定的迭代次数,确保有足够的优化循环来利用探索的信息。