资讯 文档
技术能力
语音技术
文字识别
人脸与人体
图像技术
语言与知识
视频技术

模型超参数自动搜索

简介

本任务使用的是贝叶斯优化,其用于机器学习调参由J. Snoek(2012)提出,主要思想是,给定优化的目标函数(广义的函数,只需指定输入和输出即可,无需知道内部结构以及数学性质),通过不断地添加样本点来更新目标函数的后验分布(高斯过程,直到后验分布基本贴合于真实分布。简单的说,就是考虑了上一次参数的信息,从而更好的调整当前的参数。

它与常规的网格搜索或者随机搜索的区别是:

  • 贝叶斯调参采用高斯过程,考虑之前的参数信息,不断地更新先验;网格搜索未考虑之前的参数信息
  • 贝叶斯调参迭代次数少,速度快;网格搜索速度慢,参数多时易导致维度爆炸
  • 贝叶斯调参针对非凸问题依然稳健;网格搜索针对非凸问题易得到局部最优

安装说明

使用贝叶斯超参数搜索,需要安装以下开源工具包(目前开源工具包只支持python3语法)

pip install bayesian-optimization

开始使用

开始训练

以文本分类任务中的bow模型为例

# 进入文本分类目录:
cd wenxin_appzoo/tasks/text_classification
# BOW模型,基于json实现预置网络训练。
python run_trainer_bayes.py --param_path ./examples/cls_bow_ch_bayes.json

代码说明

使用贝叶斯进行超参数搜索的入口文件run_trainer_bayes.py,与通常的入口文件run_trainer.py有以下不同(注释部分)

def run_trainer(param_dict, learning_rate):    # 设置需要搜索的超参数,例如learning_rate
    """
    :param param_dict:
    :return:
    """
    logging.info("run trainer.... pid = " + str(os.getpid()))
    dataset_reader_params_dict = param_dict.get("dataset_reader")
    dataset_reader = dataset_reader_from_params(dataset_reader_params_dict)

    model_params_dict = param_dict.get("model")
    model_params_dict["optimization"].update({"learning_rate": learning_rate})     # 更新超参数
    model, num_train_examples = model_from_params(model_params_dict, dataset_reader)
    model_params_dict["num_train_examples"] = num_train_examples

    trainer_params_dict = param_dict.get("trainer")
    trainer = build_trainer(trainer_params_dict, dataset_reader, model, num_train_examples)

    trainer.train_and_eval()
    logging.info("end of run train and eval .....")

    return trainer.eval_metrics["acc"]    # 设置需要优化的指标,例如acc,也可以是loss、f1、recall等

def run_bayes(param_dict):     # 入口函数
    from bayes_opt import BayesianOptimization    # 导入贝叶斯优化库
    from functools import partial
    pbounds = param_dict["trainer"]["bayes_optimization"]     # 获取需要优化的超参数词典
    fit_with_partial = partial(run_trainer, param_dict)
    optimizer = BayesianOptimization(    # 初始化
            f=fit_with_partial,
            pbounds=pbounds,
            verbose=2,  # verbose = 1 prints only when a maximum is observed, verbose = 0 is silent
            random_state=param_dict["trainer"].get("random_state", 1),
            )
    optimizer.maximize(init_points=param_dict["trainer"]["init_points"], n_iter=param_dict["trainer"]["n_iter"])    # 开始搜索,使用maximize原因是指标acc大多数情况下越大越好
    for i, res in enumerate(optimizer.res):    # 打印搜索结果
        print('==='*20)
        print("Iteration {}: \n\t{}".format(i, res))
    print(optimizer.max)    # 输出最优的超参数组合

json文件说明

使用贝叶斯进行超参数搜索的任务配置文件./examples/cls_cnn_ch_bayes.json,与通常的json配置文件./examples/cls_cnn_ch.json有以下不同

"trainer": {
    "type": "CustomDynamicTrainer",
    "PADDLE_PLACE_TYPE": "gpu",
    "PADDLE_IS_FLEET": 0,
    "metrics_visual": true,
    "visual_log_dir": "./visual_log",
    "bayes_optimization": { # 配置需要搜索的超参数,例如learning_rate
        "learning_rate": [1e-6, 5e-4]
      },
    "init_points": 10, # 随机探索步数,随机探索有助于探索空间的多样化。通常init_points参数设置在10~20之间
    "n_iter": 10, # 执行的贝叶斯优化步数,值越大,越有可能找到一个好的最大值。通常n_iter设置在25~50之间
    "random_seed": 20,
    "train_log_step": 10,
    "is_eval_dev": 0,
    "is_eval_test": 1,
    "eval_step": 100,
    "save_model_step": 10000,
    "load_parameters": "",
    "load_checkpoint": "",
    "pre_train_model": [],
    "output_path": "./output/cls_bow_ch",
    "extra_param": {
      "meta":{
        "job_type": "text_classification"
      }
    }

 |
上一篇
模型训练可视化工具
下一篇
样本数量不平衡问题方案(Focal Loss & Circle Loss)