python代码设置超参数_超参数调优总结,贝叶斯优化Python代码示例

本文介绍超参数(hyperparameter)的调优方法。

神经网络模型的参数可以分为两类,模型参数,在训练中通过梯度下降算法更新;

超参数,在训练中一般是固定数值或者以预设规则变化,比如批大小(batch size)、学习率(learning rate)、正则化项系数(weight decay)、核函数中的gamma等。

超参数调优的目标通常是最小化泛化误差(generalization error),也可以根据具体任务自定义其他优化目标。泛化误差是指预测未知样本得到的误差,通常由验证集得到,关于验证集可以参阅 [Cross-validation (statistics). Wikipedia.] 。调优的方法如网格搜索(grid search)、随机搜索(random search)、贝叶斯优化(bayesian optimization),是比较常用的算法,下文将作介绍。其他算法如基于梯度的优化(gradient-based optimization)、受启发于生物学的进化算法(evolution strategy)等,读者可以自行了解。

网格搜索 Grid search

网格搜索就是遍历所有可能的超参数组合,找到能得到最佳性能(比如最小化泛化误差)的超参数组合,但是由于一次训练的计算代价很高,搜索区间通常只会限定于少量的离散数值,以下用一段伪代码说明,

def train(acf, wd, lr):

优化目标函数得到模型M

由验证集得到泛化误差e

return e

learning_rate = [0.0001, 0.001, 0.01, 0.1]

weight_decay = [0.01, 0.1, 1]

activation = ['ReLU', 'GELU', 'Swish']

optimum = {'error': 1e10}

# grid search

for acf in activation:

for wd in weight_decay:

for lr in learning_rate:

error = train(acf, wd, lr)

if error < optimum['error']:

optimum['error'] = error

optimum['param'] = {

'acf': acf,

'wd': wd,

'lr': lr

}

随机搜索 Random search

随机搜索在预先设定的定义域内随机选取超参数组合。实验证明随机搜索比网格搜索更高效,主要原因是随机搜索可以搜索连续数值并且可以设定更大的搜索空间,因此有几率得到更优的模型。另外,对于仅有少数超参数起决定性作用的情况,随机搜索对于重要参数的搜索效率更高。如图1,假设参数2几乎对优化目标没有影响,而参数1很重要,在同样进行9次采样的搜索中,网格搜索实际上仅对参数1采样了3次,而随机搜索为9次。关于随机搜索的实验可以查阅论文 [Random Search for Hyper-Parameter Optimization. James Bergstra, Yoshua Bengio. 2012.] 。

贝叶斯优化 Bayesian optimization

给定一组超参数,为了计算相应的模型泛化误差,我们需要进行一次完整的模型训练,对于大型的深度学习模型可能需要花上几个小时的时间。注意到网格搜索和随机搜索中,不同的超参数采样是相互独立的,一个直接的想法是,能否充分利用已采样数据来决定下一次采样,以提高搜索效率(或者说减少采样次数)。早在1960年,就有科学家Danie G. Krige用类似的方法用于金矿分布的估计,他用已开采的少数矿点对金矿分布进行建模,后来这类方法被称为Kriging或高斯过程回归(Gaussian process regression, GPR)。本文将介绍基于高斯过程的贝叶斯优化,其他类型的贝叶斯优化算法将在文末作简要总结。此外,本文关于GPR的数学原理部分参考了MIT出版的 [Gaussian Processes for Machine Learning. C. E. Rasmussen, C. K. I. Williams. 2006.](下文简称GPML),读者可自行查阅。

算法简介

超参数优化可以视为求解泛化误差的极值点,

其中,

为训练集和验证集,

为带参数模型。

以下为了方便讨论并且与相关领域的论文保持一致,我们用

表示待优化的目标函数,并且假设我们的目标是求极大值,

贝叶斯优化的算法如下,

可以看到,贝叶斯优化每次迭代都充分利用历史采样信息得到新的采样点,采样函数

的目标是让新的采样点尽可能接近极值点,因此,贝叶斯优化有可能以更少的采样得到优化结果。

GP模型可以理解为函数,不过其对于未知输入

的预测不是一个确定的数值,而是一个概率分布。对于给定的

将得到正态分布的均值

和方差

,也就是说,

将给出目标函数值

的概率分布,即

图2为3次采样后(也就是已知样本数量为3)GP模型拟合结果的可视化,样本输入为1维,其中黑色曲线为均值 μ(\mathbf x) ,蓝色区域为一个标准差的置信区间。

高斯过程

具体地,我们假设随机变量集合

为高斯过程,其由均值函数(mean function)

和协方差函数(covariance function)

定义,

其中,

通常我们假设均值函数为常数

。协方差函数的常见选择是平方指数(squared exponential,SE)函数,也叫高斯核,

容易发现,上述协方差函数描述了不同输入之间的距离,或者说相似性(similarity)。对于回归或者分类问题,一个合理的假设是,距离较近的输入x有相近的目标函数值(或者类别标签)y,比如在分类问题中,距离测试样本更近的训练样本将提供更多关于测试样本类别的信息。可以说,协方差函数“编码”了我们对目标函数的假设。

现在,假如我们有了一些观测数据

,其中,

。令

,根据高斯过程的性质,

和测试样本

服从联合高斯分布,

你可能感兴趣的:(python代码设置超参数)