神经网络的性能受超参数,如学习率、隐含层层数以及大小等的影响非常大,所以在实际应用中,我们往往需要寻找一组最优的超参数组合,尽可能保证神经网络的泛化性能。超参数调参主要分为手动调参和自动调参两种方式。
一、手动调参
手动调参即调参人员进行人工手动调参,对调参人员的知识、经验要求较高,过程繁琐且耗时。神经网络超参数较多且各参数之间相关影响,故该方法不实用。若欲学习调参以及超参数是如何影响网络权重的,那该方法具有一定的意义。
二、自动调参
自动调参即通过算法对超参数进行自动化调参,主要有网格搜索、随机搜索、贝叶斯优化以及其他算法。
(一)网格搜索
遍历所有可能的超参数组合,但依据现有算力,这是不现实的。故一般是事先限定若干可能,再遍历进行调参,性能较优,但搜索仍然不高效。
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
#准备数据
x,y=load_iris()["data"],load_iris()["target"]
#网格搜索
best_score=0
best_param=dict()
for n_estimators in range(10,250,100):
for min_samples_splt in range(2,25,10):
for max_depth in range(5,15,5):
for max_features in range(1,10):
model=RandomForestClassifier(n_estimators=int(n_estimators),
min_samples_split=int(min_samples_splt),
max_depth=int(max_depth),
max_features=0.1*max_features)
model.fit(x,y)
current_score=model.score(x,y)
if current_score>best_score:
best_score=current_score
best_param["n_estimators"]=int(n_estimators)
best_param["min_samples_split"]=int(min_samples_splt)
best_param["max_depth"]=int(max_depth)
best_param["max_features"]=0.1*max_features
print("最优模型性能:",best_score)
(二)随机搜索
在限定的若干可能中随机选取超参数组合,该方法搜索效率比网格搜索较好,但结果之间差异较大,即随机性较强,平均性能较差。
(三)贝叶斯优化
神经网络调参本身就是一种优化,即通过调节神经网络超参数,使训练好的神经网络泛化性能最优。贝叶斯优化兼顾了网格搜索和随机搜索两种的优势,即搜索效率高且性能也较好,Python也对贝叶斯优化进行了封装,使用简单。【使用前要安装Bayesian-Optimization库】
1.导入相关库
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from bayes_opt import BayesianOptimization
2.准备数据
x,y=load_iris()["data"],load_iris()["target"]
这里用iris数据集进行演示。
3.定义目标函数
def opt_function(n_estimators, min_samples_split, max_features, max_depth):
model=RandomForestClassifier(
n_estimators=int(n_estimators),
min_samples_split=int(min_samples_split),
max_features=min(max_features,0.999),
max_depth=int(max_depth),
random_state=2
)
model.fit(x,y)
return model.score(x,y)
输入为所要优化的超参数,输出为误差或者分类准确率(自行确定,即其能代表神经网络的性能)。
4.实例化贝叶斯优化模型
model_bo = BayesianOptimization(
f=opt_function,
pbounds={'n_estimators': (10, 250),
'min_samples_split': (2, 25),
'max_features': (0.1, 0.999),
'max_depth': (5, 15)}
)
其中:f为所要优化的目标函数名,即步骤3中定义的目标函数;pbounds为步骤3中函数输入形参名及其取值范围,字典形式。
5.贝叶斯优化
model_bo.maximize(init_points=5,n_iter=5)
其中:init_points为初始点个数,n_iter为迭代优化次数,即总的迭代次数为init_points+n_iter=5+5=10。运行结果如下所示,粉色表示比前面的最优还较优。
6.输出结果
print(model_bo.max)
取出最优优化结果,如下所示。
其中:target为目标函数最优值,params为所要优化的参数(字典形式)。
(四)其他优化算法
除上述方法外,超参数还可由其他优化算法,如遗传算法、粒子群算法等进行优化。