CSDN|如何提高模型性能?这几个方法值得尝试 | CSDN 博文精选( 三 )


  • 构建相应的模型 。
  • 将模型在训练数据上拟合 , 并衡量其在验证数据上的最终性能 。
  • 选择要尝试的下一组超参数(自动选择) 。
  • 重复上述过程 。
  • 最后 , 衡量模型在测试数据上的性能 。
  • 这个过程的关键在于 , 给定许多组超参数 , 使用验证性能的历史来选择下一组需要评估的 超参数的算法 。 有多种不同的技术可供选择:贝叶斯优化、遗传算法、简单随机搜索等 。 训练模型权重相对简单:在小批量数据上计算损失函数 , 然后用反向传播算法让权重向正确的方向移动 。 与此相反 , 更新超参数则非常具有挑战性 。 我们来考虑以下两点 。
    • 计算反馈信号(这组超参数在这个任务上是否得到了一个高性能的模型)的计算代价可能非常高 , 它需要在数据集上创建一个新模型并从头开始训练 。
    • 超参数空间通常由许多离散的决定组成 , 因而既不是连续的 , 也不是可微的 。 因此 , 你通常不能在超参数空间中做梯度下降 。 相反 , 你必须依赖不使用梯度的优化方法 , 而这些方法的效率比梯度下降要低很多 。
    这些挑战非常困难 , 而这个领域还很年轻 , 因此我们目前只能使用非常有限的工具来优 化模型 。 通常情况下 , 随机搜索(随机选择需要评估的超参数 , 并重复这一过程)就是最好的 解决方案 , 虽然这也是最简单的解决方案 。 但有一种工具确实比随机搜索更好 , 它就是 Hyperopt 。 它是一个用于超参数优化的Python 库 , 其内部使用Parzen 估计器的树来预测哪组超 参数可能会得到好的结果 。 另一个叫作Hyperas 的库将Hyperopt 与 Keras 模型集成在一起 。 一 定要试试 。
    模型集成
    想要在一项任务上获得最佳结果 , 另一种强大的技术是模型集成(model ensembling) 。 集 成是指将一系列不同模型的预测结果汇集到一起 , 从而得到更好的预测结果 。 观察机器学习竞赛 ,特别是Kaggle 上的竞赛 , 你会发现优胜者都是将很多模型集成到一起 , 它必然可以打败任何单 个模型 , 无论这个模型的表现多么好 。
    集成依赖于这样的假设 , 即对于独立训练的不同良好模型 , 它们表现良好可能是因为不同 的原因:每个模型都从略有不同的角度观察数据来做出预测 , 得到了“真相”的一部分 , 但不 是全部真相 。 你可能听说过盲人摸象的古代寓言:一群盲人第一次遇到大象 , 想要通过触摸来 了解大象 。 每个人都摸到了大象身体的不同部位 , 但只摸到了一部分 , 比如鼻子或一条腿 。 这 些人描述的大象是这样的 , “它像一条蛇”“像一根柱子或一棵树” , 等等 。 这些盲人就好比机器 学习模型 , 每个人都试图根据自己的假设(这些假设就是模型的独特架构和独特的随机权重初 始化)并从自己的角度来理解训练数据的多面性 。 每个人都得到了数据真相的一部分 , 但不是 全部真相 。 将他们的观点汇集在一起 , 你可以得到对数据更加准确的描述 。 大象是多个部分的 组合 , 每个盲人说的都不完全准确 , 但综合起来就成了一个相当准确的故事 。
    我们以分类问题为例 。 想要将一组分类器的预测结果汇集在一起[即分类器集成(ensemble the classifiers)] , 最简单的方法就是将它们的预测结果取平均值作为预测结果 。
    preds_a= model_a.predict(x_val) preds_b= model_b.predict(x_val) preds_c= model_c.predict(x_val) preds_d= model_d.predict(x_val) 只有这组分类器中每一个的性能差不多一样好时 , 这种方法才奏效 。 如果其中一个分类器 性能比其他的差很多 , 那么最终预测结果可能不如这一组中的最佳分类器那么好 。
    将分类器集成有一个更聪明的做法 , 即加权平均 , 其权重在验证数据上学习得到 。 通常来 说 , 更好的分类器被赋予更大的权重 , 而较差的分类器则被赋予较小的权重 。 为了找到一组好 的集成权重 , 你可以使用随机搜索或简单的优化算法(比如 Nelder-Mead 方法) 。


    推荐阅读