进行错误分析
算法没有达到预期表现,人工检查一下算法错误,称为错误分析。
对100个错误估计的开发集进行人工检查,如果5%的图片都是狗图,说明把狗错认为猫,只占错误的5%,没必要专门对狗进行分辩。但是如果有50%的情况都是狗错认为猫,那么分析狗的情况就有价值。
例如:
用表格分析100个错误样本,其中每张图有什么特点,或者说是什么原因导致识别错误,最后统计一下哪个原因是导致错误的主要原因,可以针对解决那个问题。
比如下面的错误样本根据统计,43%的样本把大型猫科动物识别为小猫,61%的样本具有模糊的问题,所以最好先解决对模糊情况的识别问题。
清除标注错误的数据
是否值得花时间去修正标签呢?
- 深度学习算法虽然对于系统错误不健壮,但是对于训练集中的随机错误是相当健壮,所以可以不用管。
如果开发集和测试集有标注错误的例子怎么办呢?
可以和上面统计错误原因一样,列表确认一下错误标签导致的情况占比是多少。
- 假设总错误率10%,其中由于标注错误导致的错误是0.6%,其他原因导致的是9.4%,那就先解决其他问题。
- 假设总错误率2%,其中由于标注错误导致的错误是0.6%,其他原因导致的是1.4%,那对错误的标注进行修改还是很有必要的。
如果你要更正标签,请注意:
- 同时在 开发集和测试集 上操作(同一分布)
- 检查了判断错误的样本,也需要考虑到判断正确的样本(可能是标签就错了,恰好错判,导致预测正确),但通常此步不会做,太耗时了(比如98%的判对了,检查98%的数据?太多了)
- 只修正 开发集 / 测试集 的标签,而不修正训练集 的标签是合理的,训练集 通常比他们大得多,算法相当健壮
老师建议:
- 不要排斥人工分析错误
- 亲自去查看错误样本,统计数量,找到优先处理的任务
搭建第一个系统,并进行迭代
- 快速设立 开发集和测试集,还有指标(定目标,定错了,也可以改)
- 搭好系统原型,训练一下,看看效果,在 开发集 / 测试集上,评估指标表现如何
- 用之前说的偏差方差分析,错误分析,确定下一步优先做什么(哪些工作最有希望提升)
不同的划分上进行训练集并测试集
假设猫分类时,20万张图片来自高质量网络图片,1万张来自手机模糊图片,而我们更关心用户手机上传模糊图片的分类效果,如何划分集合?
建议:
- 训练集:205000 = 200000 高质量 + 5000 模糊
- 开发集:2500 模糊
- 测试集:2500 模糊
不在开发集和测试集中存放网络图片:避免为并不关心(并不重要)的问题投入过多努力。
虽然不同分布,但是长期带来训练就能得到性能提升。
不匹配数据划分的偏差和方差
出现训练集和开发集误差相差较大时,可能是已经学习过类似的图像但是判断错误,或者是因为单纯没见过这种图像的判断错误。
从训练集中,取出训练-开发集,这部分不涉及训练。
当同样出现下图情况
左边误差在训练-开发集上忽然增加,问题在于训练集训练的较好结果,无法泛化到相同分布的训练-开发集。说明在同样的分布中,并不稳定,存在方差问题。
右边误差在开发集上忽然增加, 由于开发集和前面所有集合的分布不同,而模型擅长前者,而对你关心的开发集,模型表现不好,这称之为数据不匹配
- 若开发集和测试集差异较大,则说明存在过拟合情况(本例子中没有存在)
- 也有可能存在测试集比训练集效果还好,可能因为更容易识别
没有特别系统的方法去解决数据不匹配问题,但可以做一些尝试
解决数据不匹配
发现有严重的数据不匹配,亲自做误差分析,了解 训练集 和 开发集 / 测试集 的具体差异
为了避免对测试集过拟合,要做误差分析,应该人工去看 开发集 而不是 测试集
举例:
开发一个语音激活的后视镜应用,你可能要听一下 开发集 的样本,弄清楚 开发集 和 训练集 有什么不同:
- 比如,发现很多开发集样本汽车噪音很多
- 比如,后视镜经常识别错误街道号码
你意识到,开发集有可能跟训练集不同或者更难识别:
- 那么你可以尝试把训练数据变得更像开发集一点,
- 也可以收集更多类似你的开发集和测试集的数据。
所以,如果你发现车辆背景噪音是主要误差来源,那么你可以模拟车辆噪声数据;
或者你发现很难识别街道号码,你可以有意识地收集更多人们说数字的音频数据,加到你的训练集里
如果你的目标是让训练数据更接近开发集,怎么做呢?
人工合成数据(artificial data synthesis)(干净的语音+汽车背景噪声)
人工数据合成有一个潜在问题:
比如说,你在安静的背景里录得 10000小时 音频数据,你只录了 1 小时 车辆背景噪音,将这 1小时 汽车噪音循环放 10000次,并叠加到上面的语音
- 人听起来,这个音频没什么问题
- 但是有一个风险,有可能你的学习算法对这1小时汽车噪音过拟合,你只录了1小时汽车噪音,只模拟了全部数据空间的一小部分(噪声过于单一),所以找 10000 小时不同的噪声叠加在音频上是合理的
迁移学习
有时候神经网络可以从一个任务中学习知识,并将这些知识应用到另一个独立的任务中。
例如,已经训练好一个神经网络识别猫,然后使用那些知识或部分知识去帮助您更好地阅读x射线扫描图,这就是所谓的迁移学习
预训练就是指:用数据a训练得到的权重,在此基础上对数据b进行训练
低层次特征:低层次特征往往是泛化的、易于表达的,如纹理、颜色、边缘、棱角等等。
迁移学习什么时候是有意义的呢?
- 在迁移来源问题中有很多数据,但迁移目标问题没有那么多数据。(例如:你有100万张图像识别数据,而只有100张X射线图像)
- 数据量如果反过来了,迁移学习可能就没有意义了(没有太大的帮助)
- 迁移学习确实可以显著提高你的学习任务的性能
多任务学习
同时让单个神经网络同时做几件事,希望每个任务都能帮到其他任务。
用个无人驾驶车的例子,图片中你要检测很多对象(人,车,交通灯,停车标志等等),那么输出标签是多个标签。
损失函数:
每张图可以有多个标签,训练一个神经网络做四件事情 比 训练四个完全独立的神经网络分别做四件事,性能要更好
什么时候进行多任务学习有意义
- 训练任务可以共用低层次特征
- 每个任务的数据量很接近,单项任务可以从多任务学习得到很大性能提升,前提:其他任务数据总量加起来必须比单个任务的数据量大的多
- 训练一个足够大的神经网络,多任务学习肯定不会或者很少会降低性能,比单独训练神经网络来单独完成各个任务性能要更好
什么是端到端的深度学习
以前有一些数据处理系统或者学习系统,它们需要多个阶段的处理。那么端到端深度学习就是 忽略所有这些不同的阶段,用单个神经网络代替它。 它需要很多的数据来训练,才可能有好的效果。
端到端深度学习系统是可行的,它表现可以很好(例如,机器翻译),也可以简化系统架构,让你不需要搭建那么多手工设计的单独组件,但它并不是每次都能成功(从X射线照片判断年龄)
是否要使用端到端的深度学习其优点
其优点:
- 让数据自己说话,没有人为的加入各种规则
- 更少的手工设计,简化工作流程
其缺点:
- 有可能排除了有用的手工设计组件,精心设计的人工组件可能非常有用,但它们也有可能真的降低算法的性能(数据量很大的时候,人工组件可能降低算法性能)
是否使用
- 是否有足够多的数据吗,去学习一个复杂的映射函数关系
- 机器性能
纯粹的端到端深度学习方法,前景不如更复杂的多步方法(比如人脸识别,人脸每次的位置是变化的,先识别出有人脸,然后把人脸区域截取出来,再对其进行预测,分步进行)。
因为目前能收集到的数据,还有我们现在训练神经网络的能力是有局限的