文章目录

  • 前言
  • 1. 使用融合模型减少模型的方差
  • 2. 如何融合神经网络模型
    • 2.1 使用不同的训练数据
    • 2.2 使用不同的模型
    • 2.3 使用不同的融合方式
  • 3. tensorflow keras 实现模型平均
    • 3.1 训练多种模型
    • 3.2 融合模型

前言

深度神经网络是非线性的。它们提供了更大的灵活性,并且理论上随着数据集的增多,其性能表现会越好。其缺点是通过随机训练算法进行学习,这意味着神经网络对训练数据很敏感,并且每次训练时会得到不同的权重向量,从而产生不同的预测。通常,这被称为具有高方差的神经网络,当使用其模型进行预测时,可能效果并不好。

减少神经网络模型方差的成功方法是融合多个模型而不是单个模型,并结合这些模型的预测结果综合判断,这样的模型称为融合模型(Aggregation Model),这种算法称为集成学习(Ensemble Learning)。融合模型不仅可以减少预测的方差,而且可以产生比任何单个模型都更好的预测。


1. 使用融合模型减少模型的方差

训练深度神经网络可能在计算上非常昂贵。在包含数百万个样本的数据集上训练非常深的网络可能需要花费数天,甚至数月的时间。

训练许多不同的候选网络,然后选择最佳的网络,并丢弃其余的网络。这种方法有两个缺点。

  • 浪费在训练其余网络上的所有精力。
  • 在验证集上表现最佳的网络可能不是在新测试数据上表现最佳的网络。

神经网络模型是一种非线性方法,可以学习数据中的复杂非线性关系。但是,这种学习算法具有很大的随机性,可以将神经网络视为一种具有低偏差和高方差的学习方法。

解决神经网络高方差的一种方案是训练多个模型并融合它们的预测,之前的集成学习文章中提到过。一个好的模型,意味着它的预测要好于随机预测的结果。重要的是,这些模型必须以不同的方式保持良好,并且产生不同的预测误差。这正是融合模型性能表现好的原因。

融合来自多个神经网络的预测会增加一个偏差,该偏差又会抵消单个训练后的神经网络模型的变化。融合模型的预测结果相对于拥有相同训练数据集,模型配置的单个神经网络模型来说,其预测对数据的敏感性很低,因为减少的训练房差,所以可以表现得更好。除了减少预测中的方差之外,集成模型可以比任何单个最佳模型产生更好的预测。

集成学习是融合模型充分利用针对同一问题准备的多个模型的预测的方法。通常,集成学习涉及在同一数据集上训练多个网络,然后使用每种训练后的模型进行预测,然后再以某种方式组合预测以得出最终结果或预测。实际上,融合模型是应用机器学习中的一种标准方法,可确保做出最稳定,最好的预测。

例如,Alex Krizhevsky 在2012年的论文《深度卷积神经网络Imagenet分类》中,介绍了用于照片分类的深度卷积神经网络AlexNet,它使用了多个表现良好的CNN模型的模型平均,来获得最好的结果。将一个模型的性能与在两个,五个和七个不同模型上平均的总体预测进行比较。


2. 如何融合神经网络模型

在同一数据集上训练具有相同配置和不同初始随机权重的网络集合。然后,使用每个模型进行预测,并将实际预测计算为预测的平均值。由于训练模型中的计算开销以及由于增加更多的神经网络模型而导致的性能下降,因此融合模型的数量通常保持较小,集成的模型一般小于10个。

集成学习领域已得到很好的研究,并且有很多变体。考虑集成方法的配置主要有以下三种:

  • 训练数据:每个模型使用不同的训练数据。
  • 模型选择:使用不同的神经网络模型。
  • 融合模型:使用不同的模型融合方式。

2.1 使用不同的训练数据

融合模型中,每个神经网络模型的训练数据可以不同。

最简单的方法是使用k折交叉验证来估计所选模型配置的泛化误差。在此过程中,在训练数据的k个不同子集上训练了k个不同的模型。然后可以保存这k个模型并将其作为融合模型中的神经网络模型。

另一种流行的方法包括对替换后的训练数据集进行重新采样,然后使用重新采样的数据集对网络进行训练。重采样过程意味着每个训练数据集的组成是不同的,存在重复示例的可能性,从而使在数据集上训练的模型对样本密度的期望稍有不同,进而产生不同的泛化误差。这种方法称为自举融合(bootstrap aggregation),或简称为装袋算法( bagging ),用于具有高方差和低偏差的未修剪决策树。考虑到该方法预处理速度很快,通常会使用大量决策树,例如数百或数千。

减少方差提高统计学习方法的预测准确性的自然方法是从总体中获取许多训练集,使用每个训练集构建单独的预测模型,并对得到的预测取平均。然而这是不切实际的,因为通常无法访问多个培训集。相反,我们可以通过从(单个)训练数据集中重复采样来实现。

一种等效的方法是使用训练数据集的较小子集,使用不进行正则化以允许更快的训练和过拟合的模型。欠优化模型更普遍地适用于融合模型中神经网络的选择。

其它方法可能涉及选择输入空间的随机子空间分配给每个模型,例如输入空间中超参数的子集或输入特征的子集。


2.2 使用不同的模型

大多数神经网络,特别是由于存在大量的次优局部最小值而实现次优性能的神经网络。如果采用一组已收敛到局部极小值的神经网络并应用平均,可以构建一个改进的估计。一种理解方法是,考虑到一般而言,落入不同局部最小值的网络在特征空间的不同区域中将表现较差,因此它们的误差项将不会强烈相关。

这可能会导致方差减小,但可能不会显着改善泛化误差。由于模型都学习了相似的映射功能,因此模型所产生的错误可能仍然过于相关。一种替代方法可能是更改每个集成模型的配置,例如使用具有不同容量的网络(例如,层或节点的数量)或在不同条件下训练的模型(例如,学习率或正则化)。其结果可能是这些异构的模型已经学习了具有不同地映射关系的集合,进而在其预测和预测误差中具有较低的相关性。

可以通过开发网络和调整其超参数实现这种具有不同配置模型的集成。可以在选择子模型的过程中过程中每个模型,并选择一部分更好的模型来构成最后的融合模型。

如果单个模型可能需要花费数周或数月的时间进行训练,另一种选择是在训练过程中定期保存最佳模型(检查点模型),然后在已保存的模型中选择需要融合的模型。

非常深的神经网络的一个好处是,中间的隐藏层提供了低分辨率输入数据的学习表示。隐藏层可以直接输出其内部表示,并且来自一个非常深的网络的一个或多个隐藏层的输出可以用作新分类模型的输入。当使用自动编码器模型训练深度模型时,这可能是最有效的。这种类型的融合称为垂直融合。


2.3 使用不同的融合方式

简单的融合方式是直接对各个神经网络模型的预测进行平均。

一种改进方法是使用验证数据集选择子模型,然后通过对每个模型的预测进行加权平均。这种方法称为加权平均集成(weighted average ensemble),有时称为模型混合(model blending)

更进一步,可以使用更复杂的非线性方法。除了每个子模型提供的预测之外,该方法还考虑特定的输入样本。这种方法一般被称为模型堆叠(model stacking)或堆叠泛化(stacked generalization)。

有许多用于堆叠模型的更复杂的方法,例如增强功能,一次可以添加一个集成子模型,以纠正先前模型的错误。增加的复杂性意味着这种方法很少用于大型神经网络模型。

另一个略有不同的组合是将具有相同结构的多个神经网络的权重进行组合。可以对多个网络的权重进行平均,以期产生一个新的单一模型,该模型具有比任何原始模型都更好的整体性能。这种方法称为模型权重平均(model weight averaging)


3. tensorflow keras 实现模型平均

在Keras中开发模型平均合奏的最简单方法是在同一数据集上训练多个模型,然后组合来自每个训练模型的预测。

3.1 训练多种模型

训练多个模型可能会占用大量资源,具体取决于模型的大小和训练数据的大小。

集成所需的模型数量可能会根据问题和模型的复杂性而有所不同。这种方法的好处是可以继续创建模型,将其添加到集合中,并通过对保持测试集进行预测来评估它们对性能的影响。

小型模型可以全部同时加载到内存中,而超大型模型可能必须一次加载一个模型才能进行预测,然后再组合预测。

from tensorflow.keras.models import load_model
...
n_members = 10
models = list()
for i in range(n_members):# load modelfilename = 'model_' + str(i + 1) + '.h5'model = load_model(filename)# store in memorymodels.append(model)
...

3.2 融合模型

对于回归问题,可以对预测计算平均值。

...
# make predictions
yhats = [model.predict(testX) for model in models]
yhats = array(yhats)
# calculate average
outcomes = mean(yhats)

对于分类问题,有两种选择。

一种是计算预测的整数类别出现次数。

...
from scipy.stats import mode
# make predictions
yhats = [model.predict_classes(testX) for model in models]
yhats = array(yhats)
# calculate mode
outcomes, _ = scipy.stats.mode(yhats)

这种方法的缺点是,对于较小的融合和兴或具有大量类别的数据集,预测结果可能不准确。

在二分类问题中,输出层上使用了S形激活函数,可以像回归问题一样计算预测概率的平均值。在具有两个以上类别的多类别分类问题的情况下,在输出层上使用softmax激活函数,可以在采用argmax获得类别值之前计算每个预测类别的概率之和。

...
# make predictions
yhats = [model.predict(testX) for model in models]
yhats = array(yhats)
# sum across ensembles
summed = numpy.sum(yhats, axis=0)
# argmax across classes
outcomes = argmax(summed, axis=1)

对于多分类的情况,可以使用MLP等神经网络。

# define model
model = Sequential()
model.add(Dense(15, input_dim=2, activation='relu'))
model.add(Dense(3, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
# fit model
history = model.fit(trainX, trainy, validation_data=(testX, testy), epochs=200, verbose=0)
# evaluate the model
_, train_acc = model.evaluate(trainX, trainy, verbose=0)
_, test_acc = model.evaluate(testX, testy, verbose=0)

参考:
https://machinelearningmastery.com/ensemble-methods-for-deep-learning-neural-networks/
https://machinelearningmastery.com/model-averaging-ensemble-for-deep-learning-neural-networks/

【调参10】:如何通过组合多个神经网络提高模型性能相关推荐

  1. 调参:深度学习模型24种优化策略

    [时间序列预测/分类] 全系列60篇由浅入深的博文汇总:传送门 文章目录 1. 深度学习模型面临的挑战 1.1 神经网络学习映射功能 1.2 学习网络权重很困难 1.3 求解非凸误差面 1.4 学习算 ...

  2. 手把手系列—风控模型的调参方法和实际应用

    序言: 大数据时代的风控体系必有模型部分的参与,用策略贯穿整个风控体系,以数据为驱动,模型一定是标配内容.于是在模型的建设上,如何精细化地输出一套有效的模型,就是在精细化管理上非常重要的一个差异点.不 ...

  3. 数据标注、模型调参debug...通通自动化!华为云AI开发集大成之作ModelArts 2.0发布...

    乾明 发自 凹非寺  量子位 报道 | 公众号 QbitAI 福音.AI开发门槛现在更低. 不用你编码,甚至无需AI开发经验. 如今你所需所做:只需标注一小部分数据,然后它就会帮你标注剩下数据,并且自 ...

  4. sklearn快速入门教程:(四)模型自动调参

    上个教程中我们已经看到在sklearn中调用机器学习模型其实非常简单.但要获得较好的预测效果则需要选取合适的超参数.在实际的项目中其实也有不少参数是由工程师借助其经验手动调整的,但在许多场景下这种方式 ...

  5. 系列 《使用sklearn进行集成学习——理论》 《使用sklearn进行集成学习——实践》 目录 1 Random Forest和Gradient Tree Boosting参数详解 2 如何调参?

    系列 <使用sklearn进行集成学习--理论> <使用sklearn进行集成学习--实践> 目录 1 Random Forest和Gradient Tree Boosting ...

  6. Random Forest和Gradient Tree Boosting模型如何调参

    作者:城东 链接:https://www.zhihu.com/question/34470160/answer/114305935 来源:知乎 著作权归作者所有,转载请联系作者获得授权. 我来讲一讲R ...

  7. Random Forest和Gradient Tree Boosting如何调参

    作者:城东 链接:https://www.zhihu.com/question/34470160/answer/114305935 来源:知乎 著作权归作者所有,转载请联系作者获得授权. 使用skle ...

  8. Xgboost回归四种调参方法及Python简单实现

    前言 Xgboost对特征工程和数据处理比较友好,相比之下调参成为用好Xgboost重要的一环,本文分别从参数.调参方法.Python实现的维度进行梳理,作为调参思路的记录. 本文将关注以下几个问题: ...

  9. 写给新手:2021版调参上分手册!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:山竹小果,来源:夕小瑶的卖萌屋 在日常调参的摸爬滚打中,参考了不少 ...

最新文章

  1. 编程之美 3.1 字符串移位包含问题
  2. Mysql 批量写入数据 性能优化
  3. Subset-Sum Problem 子集和问题
  4. 禅道项目管理_禅道项目管理软件 v12.5.1 开源版
  5. Gartner公布2017年十大战略科技发展趋势
  6. P1303 A*B Problem 高精度乘法
  7. python如何循环使用input_python基础知识input到while循环
  8. C#.Net工作笔记006---关于各种四舍五入_小数点保留第几位等操作_随时更新
  9. JS----window对象详解
  10. 自己写cache server之网络框架处理——对比mysql、Oracle(上)
  11. Galera Cluster大坑的解决方案
  12. 4.Kong入门与实战 基于Nginx和OpenResty的云原生微服务网关 --- Kong 的基本功能
  13. jquery-galleryview-2.0 漂亮多样化的图片特效(多项自定义)
  14. 爬取某家网二手房数据(详细教程)
  15. 京都计算机学院放假时间表,2018年官方放假安排时间一览表
  16. Linux命令整理(二)
  17. 大连鸿蒙刺青怎么样,哪个部位纹身最“疼”?纹身师:敢在这三个地方纹身的,是真汉子...
  18. C++:CompareNoCase函数
  19. 排列熵、模糊熵、近似熵、样本熵的原理及MATLAB实现之近似熵
  20. Ae 效果快速参考:表达式控制

热门文章

  1. iOS Still Image Capture Using AVCaptureSession(使用AVCaptureSession获取静止Image)
  2. Isometric terrain
  3. 软件测试面试题及答案,不给答案的面试题都是耍流氓
  4. 给出一个数字求出它的个位、十分位、百分位、千分位、万分位........
  5. 如何使用 cri-docker 解决 Kubernetes 1.24 不支持 Docker 的问题
  6. eclipse设置 “暗黑色” 主题
  7. Eclipse RCP - 第一个RCP程序
  8. Android自定义Drawable第十五式之啡常OK
  9. 月下独酌(作者:李白li bai)
  10. 深度学习Python环境打包到另外一台电脑(详细教程)