神经网络超参数调参

本文探讨了神经网络性能受超参数影响,介绍了手动调参的局限性,重点讲述了自动调参中的网格搜索、随机搜索和贝叶斯优化方法,以及如何利用贝叶斯优化进行高效且性能良好的超参数优化,同时提及其他优化算法作为扩展选项。
摘要由CSDN通过智能技术生成

神经网络的性能受超参数,如学习率、隐含层层数以及大小等的影响非常大,所以在实际应用中,我们往往需要寻找一组最优的超参数组合,尽可能保证神经网络的泛化性能。超参数调参主要分为手动调参和自动调参两种方式。

一、手动调参

手动调参即调参人员进行人工手动调参,对调参人员的知识、经验要求较高,过程繁琐且耗时。神经网络超参数较多且各参数之间相关影响,故该方法不实用。若欲学习调参以及超参数是如何影响网络权重的,那该方法具有一定的意义。

二、自动调参

自动调参即通过算法对超参数进行自动化调参,主要有网格搜索、随机搜索、贝叶斯优化以及其他算法。

(一)网格搜索

遍历所有可能的超参数组合,但依据现有算力,这是不现实的。故一般是事先限定若干可能,再遍历进行调参,性能较优,但搜索仍然不高效。

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为所要优化的参数(字典形式)。

(四)其他优化算法

除上述方法外,超参数还可由其他优化算法,如遗传算法、粒子群算法等进行优化。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吃冰442

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值