社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

常见深度学习模型集成方法

小白学视觉 • 2 年前 • 210 次点击  

点击上方小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

本文转自|计算机视觉工坊
历届kaggle竞赛冠军的做法,或简单或复杂,其最后一步必然是集成学习,尽管现有的模型已经很强大了,但是集成学习往往能够起到锦上添花的作用。一般而言,深度学习的集成有两大层面:数据层面模型层面。下面详细介绍这些方法。

01 数据层面

(1)数据扩充法

数据扩充法在训练和测试阶段均适用,可以增强模型的鲁棒性。
常见的数据扩充方法有:
  • 图像多尺度(multi-scale):将图像resize到不同尺寸,分别输入网络,对结果进行平均或者加权。
  • 随机扣取(random crop):对测试图片随机扣取n张图像,在测试阶段用训练好的深度网络模型对n张扣取出来的图分别做预测,之后将预测的各类置信度平均作为测试图像最终的测试结果。

(2)简单集成法

“简单集成法”是Liu等人提出针对不平衡样本问题的一种简单集成学习解决方案,好处在于模型集成的同时还能缓解数据不平衡带来的问题。
简单集成法,简单说三点:
  1. 对于样本较多的类采取降采样(undersampling),每次采样数依据样本数量最少的类别而定,这样每类取到的样本数可保持均等;
  2. 采样结束后,针对每次采样得到的子数据集训练模型,如此采样、训练重复进行多次。
  3. 最后依据训练得到若干个模型的结果取平均/投票。

02 模型层面

2.1 单模型集成

(1)同一模型不同初始化

同一模型不同初始化方法,非常适用于小样本学习场景,会大幅度缓解模型的随机性,提升最终任务的预测结果。
对于同一个模型来说,不同的参数初始化方式通过随机梯度下降方法得到的训练结果也会不同。具体的做法如下:
  • 初始:首先对同一模型进行不同初始化;
  • 集成:将得到的网络模型结果进行集成;

(2)同一模型不同训练轮数

同一模型不同训练轮数方法,可以有效降低训练轮数过多带来的过拟合风险。
若网络超参数设置得当,深度模型随着网络训练的进行会逐步趋于收敛,但不同训练轮数的结果仍有不同。无法确定到底哪一轮得到的模型最适用于测试数据,我们将最后几轮训练结果做集成。

(3)不同损失函数

损失函数是整个网络训练的 “指挥棒”,选择不同目标函数势必让网络学到不同的特征表示。
具体的做法如下,以分类任务为例:可将包括交叉熵损失、合页损失、大间隔交叉熵损失、中心损失等作为损失函数分别训练模型。而在测试阶段,有两种做法:
  • 置信度融合:直接对不同模型预测结果做平均/投票
  • 特征融合:将不同网络得到的深度特征抽出后级联(concatenate)作为最终特征,然后训练浅层分类器(如支持向量机)完成预测工作;

(4)多层特征融合法

由于深度卷积神经网络特征具有层次性的特点,不同层特征富含的语义信息可以相互补充,因而在目标检测、图像语义分割、细粒度图像检索这些领域常见多层特征融合策略的使用。
一般地,多层特征融合操作可直接将不同层的网络特征进行级联(concatenate),而对于特征融合应该选取哪些网络层,选取的经验是:最好使用靠近目标函数的几层卷积特征,因为愈深层特征包含的高层语义愈强,分辨能力也愈强。相反,网络较浅层的特征更为普适,用于特征融合反而起不到作用。

(5)网络快照法

我们知道深度神经网络模型复杂的解空间中存在非常多的局部最优解,而传统的Min-batch SGD往往只能收敛到其中一个局部最优解,如下所示:
图1 SGD:传统SGD方法只能收敛到一个局部最优解
相反的,网络快照法通过循环调整学习率,使得网络依次收敛到不同的局部最优解,利用这些最优解对模型进行集成,示意图如下所示:

图2 快照法:通过循环调整学习率,使得网络依次收敛到不同的局部最优解
具体的做法如下,将网络学习率设置为随模型迭代轮数t改变的函数:

其中:
  • 为初始学习率,一般设置为 0.1 或 0.2;

  • t为模型迭代轮数;
  • T为模型总的批处理训练次数;
  • M为“循环退火”次数,对应于模型将收敛到的局部最优解的个数;
注:退火原先是材料加工的一个特有名词,指将金属加热到某个再结晶温度并维持一段时间,再将其缓慢冷却的过程。这里退火指网络模型学习率从初始学习率逐渐减缓到0的过程。
学习率从0.1*1 随着t增长逐渐减缓到0,之后将学习率重新放大,从而跳出该局部最优解,如此往复,分别得到不同权重参数的同一模型。测试阶段,一般我们挑选最后个模型“快照”用于集成,这些模型“快照”可以采用“直接平均法”。

2.2 多模型集成

我们可以使用不同架构的网络训练模型,根据这些模型结果做集成。假设共有N个模型待集成,对于某测试样本x,其预测结果为N个维向量:S1,S2,...,Sn(C为数据的标记空间大小)。我们介绍常见的四种方法:

(1)直接平均法

直接平均不同模型产生的类别置信度得到最终预测结果。
公式:

(2)加权平均法

在直接平均法的基础上加入权重来调节不同模型输出间的重要程度。
公式:

其中,Wi 对应第 i 个模型的权重,且必须满足:

实际使用中,权重 w_i 的取值可以根据不同模型在验证集上各自单独的准确率而定。简单说:准确率高点的权重高点,准确率低点权重就小点。

(3)投票法

投票法,少数服从多数,投票数最多的类别作为最终预测结果。
投票法前,我们先将模型各自预测的置信度基于阈值转换为相应的类别,那么对于某次预测,就有以下两种情况:
  • 某个类别获得一半以上模型投票,则将样本标记为该类别;
  • 没有任何类别获得一半以上投票,则拒绝预测;
但是这样有个问题,就是模型拒绝预测时候怎么办?一般我们采用相对多数投票法,很简单,少数服从多数,即投票数最多的类别即作为最终预测结果。

(4)堆叠法

堆叠法,一阶段,原始模型进行训练和预测,预测结果作为二阶段的输入,非常容易过拟合。
堆叠法分两步:
  1. 原始模型训练、预测:样本x作为模型的输入,Si为第i个模型的类别置信度输出;
  2. 预测结果作为二阶段输入:讲这些输出置信度进行级联,作为新的特征,基于这些特征训练一个新的分类器进行训练;
注意此时的学习器可以为任何学习算法模型,如支持向量机、随机森林等。不过在此需要指出的是,堆叠法真的非常非常容易过拟合!

03 总结

集成的汇总如下:
留大家一个作业,回顾我们的课程,然后用思维导图或者表格整理出这些方法的优缺点。下面,我有一个之前自己学习笔记整理的(不完全):
还有,请大家思考,我们实战中怎么用模型集成来提升最终预测准确率?下期我们用实战来讲模型集成到底怎么用?

好消息,小白学视觉团队的知识星球开通啦,为了感谢大家的支持与厚爱,团队决定将价值149元的知识星球现时免费加入。各位小伙伴们要抓住机会哦!


下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲
小白学视觉公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲
小白学视觉公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群


欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/119826
 
210 次点击