手工分析错误
手工分析错误的大多数是什么
猫猫识别,准确率90%,想提升,就继续猛加材料,猛调优? --应该先做错误分析,再调优!
把识别出错的100张拿出来,
如果发现50%是"把狗识别成了猫"。那么发力点就是这个,如果再优化,提升就很大!
如果发现只有5%是"把狗识别成了猫",那么在狗这个方面努力,提升不大。
手工也可以分析多个错误类别
对于识别出错的100张图片,分析到底是什么情况。
对于上述问题,找准方向,让系统识别"不清楚的猫"的能力更强,就提升很大!
错误标签/错误标签的修正
训练集标签有错误怎么办
训练集 == {一组列向量(猫),一个向量(答案)},如果答案错了呢?
比例一般很小,没啥影响!
如果是系统型的错误,就要处理了。比如对于白色猫,手打的标签==狗。那么用户上传一只白色的猫,系统真的认为是一种狗。
错误标签的修正
- 在验证集和测试集上同时使用,并且是同样的修正手段,以保证验证集和测试集来自相同的分布;
- 同时检查判断正确和判断错误的例子(通常不用这么做);
- 在修正验证集和测试集时,鉴于训练集的分布不一定和验证/测试集完全相同,可以不去修正训练集。
快速地构建一个简单的系统
建议快速搭建好第一个系统,然后开始迭代。 (是不是类似那个。。快速原型模型?)
- 设置好训练、验证、测试集,设置好衡量指标,确定目标;
- 快速训练出一个初步的系统,用训练集来拟合参数,用验证集调参,用测试集评估;
- 通过偏差/方差分析以及错误分析等方法,决定下一步优先处理的方向。
训练集与验证集-来源不一致的情况(异源问题)
有时,我们很难得到来自同一个来源的训练/验证/测试集
SSR类图片 == 专业拍摄+高清,我们目前有20W个。
A类图片 == 非专业拍摄+标清,我们有1W个
既然模型的目的==识别这些用户上传的A类模糊图片。那么
训练集 == 20W个SSR + 5K个A
验证集 == 测试集 == 2.5K个A
异源时的拟合度分析
误差分析:拟合情况是从误差里面看出来的
若是之前,模型训练好之后,表现情况:训练集判别误差1%,测试集判别误差8%,我们可以说明过拟合问题。
若是异源,同样的情况,我们不一定能说明是过拟合。
情况1.过拟合问题 情况2.可能单纯的训练集高清大图比较容易识别,测试集模糊不堪不好搞。
解决方案:搞一个新的数据集--在训练神经网络之前,从训练集中拿出一部分 == 训练验证集。
若训练集误差1%,训练验证集误差9%,验证集误差10% == 过拟合问题
若训练集误差1%,训练验证集误差1.5%,验证集误差10% == 数据来源不一致问题
如何解决异源问题
- 做错误分析,尝试了解训练集和验证/测试集的具体差异(主要是人工查看训练集和验证集的样本);
- 尝试将训练数据调整得更像验证集,或者收集更多类似于验证/测试集的数据。
使用人工合成数据也可以考虑,但需要注意的是,比如:噪音1h合成在600h的语音,人听不出区别,但模型知道这全是同样的声音,对这个声音数据特别拟合,对未来随机的噪声表现不佳。
迁移学习
什么是迁移学习
识别猫--》识别狗
如何实现
先删除神经网络中原有的输出层,加入新的输出层(一层或者几层)并随机初始化权重系数(W[L]W[L]、b[L]b[L])
随后用新的训练集进行训练,就完成了迁移学习
CT训练数据少 == 只训练红色部分的参数,这个做法叫微调(Fine-Tuning)
CT训练数据多 == 只保留网络结构,重新训练wb。但是初始wb == 之前的模型的wb,这个过程称为预训练(Pre-Training)
什么时候使用迁移学习
买数据贵、数据少、小团队直接拿训练好的,发挥出自己的东西。
- 两个任务有同样的输入(比如都是图像或者都是音频);
- 拥有更多数据的任务迁移到数据较少的任务;
- 某一任务的低层次特征(底层神经网络的某些功能)对另一个任务的学习有帮助。
多任务学习
直观理解
回想softmax,可以输入一张图,判断 猫/狗/鸡。
多任务学习 == 输入一张图,同时判断 是否存在 猫 狗 鸡
多任务学习 数据集里面的答案标签不再是 0或1 而是一个向量!多个图片的答案 就是一个矩阵
对比:
Softmax 回归的输出向量 y 中只有一个元素为 1;而多任务学习的输出向量 y 中可以有多个元素为 1。
成本函数的变化
成本函数要改变成:累加C个的值(上图是4个),求平均值。
什么时候使用多任务学习
- 训练的一组任务可以共用低层次特征;(识别行人、红绿灯,背景可能都是马路)
- 通常,每个任务的数据量接近;(数据集中,包含的行人、红绿灯等物品的数量 最好差不多,才发挥多任务的优势)
- 能够训练一个足够大的神经网络,以同时做好所有的工作。多任务学习会降低性能的唯一情况(即和为每个任务训练单个神经网络相比性能更低的情况)是神经网络还不够大。
端到端学习
什么是"端到端学习"
传统的机器学习 分块模型 == 每一个模块处理一种输入,然后其输出作为下一个模块的输入,构成一条流水线。
端到端深度学习(End-to-end Deep Learning) == 只用一个单一的神经网络模型来实现所有的功能。
它将所有模块混合在一起,只关心输入和输出。
什么时候使用"端到端学习"(优点/缺点)
优点:
- 只要有足够多的数据,剩下的全部交给一个足够大的神经网络。比起传统的机器学习分块模型,可能更能捕获数据中的任何统计信息,而不需要用人类固有的认知(或者说,成见)来进行分析,往往比人类手工干预、手工设计的算法还要优秀;
- 所需手工设计的组件更少,简化设计工作流程;
缺点:
- 需要大量的数据;
- 排除了可能有用的人工设计组件;人类设计的算法帮不上忙,也不用不上。(计算机可能另一种角度表示逻辑,而不用人类强加设计、强加表示的语音/音符/音位等等)
决定一个问题是否应用端到端学习的关键点是:是否有足够的数据,支持能够直接学习从 x 映射到 y 。也有其他因素。