迭代深度学习模型时总被人遗忘的一角:数据集

提示:本文面向深度学习硕博新生或入门从业者,采用非学术的通俗易懂地方式进行描述。表述可能不简练,个别说法可能不严谨,还请海涵。欢迎在评论区指出。您也可以专门写一篇博客来纠正我,然后记得提醒我把您连接挂本文底部。


前言

机器学习有一个工程化的定义,由Tom Mitchell在1997年提出,“一个计算机程序通过经验E来学习任务T, 性能是P,如果针对任务T的性能P随着经验E的不断增长而增长,则称为机器学习”。我一直觉得这个定义有些晦涩,不知道是不是翻译的原因。

不过,怎么定义是学者们的事情,作为技术的应用者我们其实就关心两件事情: 经验E从哪里来,如何让机器进行学习(或者说学习这个过程是怎样的),经验又是如何完成增长的。

在多数机器学习应用中,通常经验E是指数据集,学习的过程通过学习算法实现,最后学习到的知识以数据或者函数的形式存储在系统中。利用学习到的知识可以将更多输入转化为经验E,经验的增长再次驱动学习算法。大概是这么个过程,
在这里插入图片描述
提示:图来自《机器学习实战:基于Scikit-Learn、Keras和TensorFlow》。对于初学者,我一般都推荐这本书。讲解清晰配备代码,可以快速上手构建技术栈。“有缘”后面再看西瓜书加深理论。一上来就先学理论很容易让不少人觉得门槛过高,最后放弃学习。“先解决有无,后解决优劣”

显然,数据是整个过程中不可获取的一部分。

但实际应用时总被同学们忘记。以目标检测为例,为了使深度学习模型取得更好的效果,反复改进模型和优化算法,(在公开数据集上)取得了不错的效果发了论文,但是一到企业做项目(或者导师的横向)就抓瞎。模型上倾尽全力,结果中纹丝不动。

论文里一定会写“深度学习取代了传统机器学习手工提取特征的过程…”,但做项目就冒出“数据迭代? 数据, 还需要迭代?”的难评言论。深度学习中只是减少了利用专家经验提取训练输入数据的依赖,不代表数据不重要了。


一、数据是怎么影响模型性能的?

这个问题很宽泛,很难专业地严谨地去回答。我的水平也十分有限,所以我在回答前,选择先问同学们几个问题,

  • 模型是怎么从图像中学习到“知识”的?
  • 模型的性能是怎么评估的?

第一个问题:模型是怎么从图像中学习到“知识”的?

第一个问题很好回答。(有监督)深度学习训练的过程是:
①输入一个矩阵(图像在计算机系统中的存在形式),
②经过一个变换函数(“模型”在计算机中的存在形式),获得一个值 (“推理/推理结果”)。
③通过比对预测值与真实值之间的误差,计算梯度反向更新整个变换函数(更新模型中的参数)。
通过反复①②③不断更新模型权重(“知识”在计算机中的存在形式)

通过训练,模型总是期望自己能够往训练数据集中(input和label)的变换函数靠拢。你的训练集,四舍五入就是模型训练的上限。即便现阶段模型学习能力愈发强大,已经不像几年前什么VGG动不动就跑飞不拟合,但你训练集的质量始终会影响模型拟合。

我举个栗子,在训练集中的一组连续画面中你的标注框(红色),对于同一个目标,一会儿标注 一会儿不标注,一会儿边界框紧紧包络,一会儿粗犷的框选。这会使模型训练时关于这个目标的loss居高不下。这个来自标注数据集的“经验”抽象得人都看不懂,(我把标注框去掉,你重新标注你都标不出这样的)。更不用说,让一个弱人工智能模型从单张图上学到这种预测的“抽象”知识了。
在这里插入图片描述在这里插入图片描述
时刻1 时刻2

在这里插入图片描述在这里插入图片描述
时刻3 时刻4
如果你还是不能理解,你可以自己手动计算做个这样的数据集,手动计算一下loss试试。我要说的总结起来就是,标注数据通过影响loss,引导着你模型学习的方向。

同理,数据类别不均衡也是这么影响模型的。数量小的类别,产生的loss很难左右整个数据集产生的loss,模型无法避免地会向类别多的目标上倾斜。

第二个问题:模型的性能是怎么评估的?

通常会有一个量化的标准,比如 准确率、召回率、mIOU、F1-score。我想你会说“指标高,就是好!”。但这个命题成立是有前提的。同学们先别急着再冒“导弹维修”式困惑,我换个说法:

  1. COCO数据集上效果好的模型,放到你的应用场景效果就一定好吗?

大概率是的,COCO数据集很大很复杂,模型在上面有着不错精度≈模型有很强的学习能力。但模型有很强的学习能力不等于在你的场景中好使,效果究竟怎么样,只有从你的场景中产生的验证集才能检验。

通过公开数据集训练出来的模型总是无法满足你的每一项要求,无论是从而“类别”、“精度”还是一些自定义更“抽象”的要求。举个例子,甲方说要个模型专门识别狗。你下载了COCO数据集,训练了YOLO模型说:“包在我身上!”结果到现场一看,地上跑的是:米家CyberDog 机器狗,宇树Go2 机械狗。
在这里插入图片描述
尽可能拥有更多的目标场景对应需求的数据集,是使你的模型匹配定制化的需求这个问题上,相当简洁和明了的方法。有同学说,迁移学习领域那么多方法,不增加数据集也可以使模型在任务场景效果增强。但话又说回来,为啥要“迁移学习”,这还不是因为没有那么多数据嘛。有条件就先把数据做大或者持续补充,并行地结合一些模型训练方法。况且这些迁移学习方法上手难度高,不利于实现。迁移学习这个领域你甚至找不到一本系统化面向工程化的书籍。工程上的很多事情没学术视角下的那些弯弯绕绕,给钱 干活 能出成果就OK。

  1. 那某一个验证集上精度数值高(例如95%)的模型,就一定在应用场景中效果好吗?

我的回答是这也得看情况。数值是虚的,只有参考意义。

产生、迭代模型要用的数据可以划分成三个板块:训练集、验证集和测试集:

训练集,是你喂模型训练学习的原材料。
验证集,是课后习题,检验模型训练的结果。你根据这个指标,反复调参。
测试集,是模拟考试,近似评估模型在应用中的效果。

有同学总是理解不了验证集和测试集的区别。这不是你的问题,由于这两者在意图上有交叉,在常见的深度学习训练过程中通常可以画等号。换个角度看就清晰了,训练过程中 Train Loss和acc (精度)代表在训练集上的学习程度, Validation Loss 和 acc 作为独立的评估,视Validation中效果最好的模型为最终结果。两者一般不会有样本重叠,这样即便是训练过拟合了,我们也能通过独立验证集的评估结果,拿到整个训练中效果最优的模型。

到这已经很明了,我们的拿到的“最优”模型,严谨角度来讲是“训练过程中验证集上结果最好的”模型。只要你的验证集能代表真实工况,你的结果模型就能代表真实工况下的效果。可惜,你的验证集永远无法完全代表真实工况。换个通俗的讲法,你高考模拟做了很多,可对考研来讲意义不大。你考研模拟考做了很多,但模拟考终究是模拟,考场上命题人说诶 我今天给你整个花活。

但是我们的训练集和验证集可以无限接近真实工况。统计学习和大数定理告诉我们,你可以通过不断抽样(获取更多的数据)来达成逼近。如果你要在一个路口做自动监控目标检测,你就要收集尽可能多的代表性样本。你的图片样本里不能只有白天,还得有黑夜。(你以为这就完了?还得有下雨 下雪 下冰雹)。你的图片样本里应该有各种情况。你做行人识别,画面中冒出来一个交警。交警算不算行人。你做车祸检测,只要两个车IOU重叠那就是撞车了。没问题,但是你得把这种情况考虑进去
在这里插入图片描述
这也是为什么各大公司需要不断补充数据,让自动驾驶系统不断完善的底层逻辑。

口水话说完了,上总结:

数据集质量和多样性对模型性能至关重要,贯穿从训练、验证到部署的始终。在你的应用中,你应该尽可能从应用场景中获取训练集、验证集,并不断扩充,帮助模型适应动态场景变化。

二、如何从数据侧去迭代模型

假设你已经有了i张图像作为初始数据集,并训练出了一个模型。如果短时间内无法获得大量的标注数据集,那我们就必须做到,让后面扩充的每一张数据都比以往有着更大训练收益。

这也和主动学习(Activate Learning)的理念正好重合。关于主动学习的理论,你可以看下面这个博主的文章

https://zhuanlan.zhihu.com/p/377045943

有一个很简单的方,无需实现相关算法,就可确定哪些样本更有价值去标注,能让模型更快提升精度。就是你用模型去推理未标注图像,取n张那些效果很差的作为要补充的标注图像,再次训练调优,如此往复。可以总结为下图

在这里插入图片描述

核心思路是查漏补缺,迭代渐进式扩大数据集。此外,当你的模型健壮到一定程度后,即便是预测没有见过的样本,上面也能有不少正确的预测,你只需要微调那些误差大的,标注漏检的。

以下是注意事项

  • 在这个过程中,你要制定清晰可量化的标注标准,维持良好的数据一致性。

尤其是在数据集建立初期就要确定清楚标注标准。方便所有参与标注的人员共用同一个标准,和验收标注结果。

除了有哪几个类别,类别的定义,这些初始问题。还有,遮挡到什么程度这个目标不标注?标注框是只标注目标漏出的部分,还是预测性地框选包含遮挡部分的整个体积?画面中是否有某个区域不用标注?当目标小到某个程度时可以不标注。

  • 标准一旦修改,一定要在整个数据集中同步

脏数据或者标准不一的数据会带来什么影响,我第一章应该提到过。数据光多没用。模型的精度不可能是百分百,自产自销左脚踩右脚不现实。这个过程中一定需要人工进行干预,进行数据清洗。

  • 学会接受总有脏数据的事实

不要钻牛角尖,不要完美主义。除非你的数据集小的可怜,不然一定会有标注失误的存在。

关于如何标注和工具推荐,可以看我之前的文章。

https://blog.csdn.net/m0_46396537/article/details/141168127

本文口水话有点多,具体体现在 理论叙述比较少,经常“换句话讲”和“举个例子”,还望读者海涵。首先,我本身水平和时间都有限。其次,你可能不是本文的受众,这是件好事。从带很多高校学生(本硕博)以及企业实习生的经验中,我定义这篇文章的受众有两类人:

一是自学深度学习,期待(着急)做点效果好的应用。他们许多不具备如 最优化方法、数理统计等理论基础。
但这不是我不教他们的理由。在深度学习技术门槛日渐降低的今天,我希望我三言两语就能解决他们的困惑,让他们玩的开心/工作顺利,目的就达到了。如果以后想深挖,自己再去学习。先完成后完美。

二是科班出身,学校里理论造诣优异,成果斐然,走出校园对于企业需求发现自己所学所练的功法失灵。
他们被淹没在学术论文和公众号的海洋中,坚信SOTA模型和各种结构是解决工程问题的唯一方法。正如我的标题《迭代深度学习模型时总被人遗忘的一角:数据集》,我想提醒他们。做深度学习应用是以结果为导向的,模型改结构、改超参数等调优不是唯一能够使模型在目标场景好用的方法,不要忘了数据集上也应该下功夫。

后面有空,我再来更新本文的描述方式(现在我着急要新人创作流量券,当天投稿才能获得)

  • 10
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值