相关课件:https://download.csdn.net/download/haoyutiangang/10509045
2.1 进行误差分析
当我们在训练一个模型的时候,如一个猫和狗分类模型,最终得到了90%的精确度,即有10%的错误率。所以我们需要研究错误的占比来决定接下来改进的方向,才能更好地提升分类的精度。
- 收集错误样例(100条错误数据即可)
- 利用图表分析错误的类型和比例
- 决定接下来的改进方向
举例
在开发集(测试集)中,获取大约100个错误标记的例子,并统计错误数据的类型和数量。
- 修改那些被分类成猫的狗狗图片标签;
- 修改那些被错误分类的大型猫科动物,如:狮子,豹子等;
- 提升模糊图片的质量。
用图表的方式进行并行分析
统计错误类型的百分比,这个分析步骤可以给我们一个粗略的估计,让我们大致确定是否值得去处理每个不同的错误类型。
2.2 清楚标注错误的数据
数据标记错了是否应该处理?怎么处理?
训练集
深度学习算法对训练集中的随机误差具有相当的鲁棒性。
- 随机性误差: 不管它也没什么问题。如:做标记的人不小心错误,或按错分类键。
- 系统性误差: 会导致分类器错误,需要处理。如:做标记的人一直把如例子中的白色的狗标记成猫。
开发验证集 & 测试集
如果在开发集和测试集中出现了错误标记的问题,我们可以在误差分析的过程中,增加错误标记这一原因,再对错误的数据进行分析,看看错误标记的比例来决定是否要去修正这些错误。
如果决定要去修正这些错误
- 对开发集和测试集上的数据进行检查,确保他们仍然来自于相同的分布。
- 通常只从分类错误的数据中纠正错误,很少从分类正确的数据中纠正错误
- (因为数据量大,纠正难度大),但是仍然要考虑到分类正确的数据中也有可能有错误标记数据。
- 纠正后训练集和开发/测试集来自不同的分布
- 如果只是少量的纠正数据导致训练集合开发/测试集的分布稍有不同,对模型影响不大。
2.3 快速搭建你的第一个系统并进行迭代
快速搭建和迭代的原则
- 搭建系统(尤其是新系统)的时候一般采用快速搭建,逐步迭代的方法
- 而不是想的太多,在一开始就建立一个非常复杂,难以入手的系统。
- 例外:成熟的系统或者已有大量相关文献的系统,此时可以一开始就搭建复杂些的系统,不过你需要了解这些复杂性的原理。
快速搭建和迭代的步骤
- 设置开发、测试集和优化指标(确定方向);
- 快速地建立基本的系统;
- 使用偏差方差分析、误差分析去确定接下来的优先处理方向。
2.4 在不同的划分上进行训练和测试
考虑我们要实现一个识别用户手机上传的图片中是否有猫的机器学习模型。
我们可以从网上获取大量的高清晰的猫的图片去做分类,如200000张,但是只能获取少量利用手机拍摄的不清晰的图片,如10000张。但是我们系统的目的是应用到手机上做分类。也就是说,我们的训练集和开发集、测试集来自于不同的分布。
- 不建议:将两组数据合并到一起再随机分配到训练集/开发集/测试集上
- 优点:训练集/开发集/测试集数据来自同一分布
- 确定:设立开发集的目的是瞄准目标,而这种方式的开发集偏离了我们的目标
- 推荐:
- 训练集 = 全部的web图片 + 一部分用户上传图片
- 开发集/测试集 = 剩下的用户上传图片(每种50%)
- 优点:瞄准目标,长期来看可以带来更好的系统性能
- 缺点:训练集和开发集/测试集来自不同的分布。
2.5 不匹配数据划分的偏差和方差
训练集合开发/测试集来自不同分布时,我们需要将训练集中的一小部分拆出来作为训练开发集,用来验证与训练集同样分布的开发集上的模型表现。也就是算法的泛化能力。
通过:Human level、Training set error、Training-dev set error、Dev error、Test error 之间误差的大小,可以分别得知我们的模型,需要依次在:可避免的偏差、方差、数据分布不匹配、开发集的过拟合程度,这些方面做改进。
通常情况下来说,通过不同的集合上的误差分析,我们得出的结果会是中间一列误差由小变大,即误差上升的情况。但是也有一定的可能会出现右边一列误差在开发测试集上又表现的好的情况。
此时可以考虑用模型训练和测试开发集的数据,看看此时的各项误差情况。
2.6 定位数据不匹配
如果我们分析出误差是由于训练集和开发/测试集的数据分布不匹配造成的,应该如何解决这种问题呢。
- 误差分析:训练集和开发测试集的具体差异哪里。(如:噪音,图片清晰度等)
- 获取具有开发测试集性质的数据作为训练集
- 手机更多类似于开发/测试集的数据
- 将训练集改造的更像测试集(如:人为增加噪音,模糊图片)
- 改造要谨慎,有可能改造的数据只是真实场景的一小部分(比如同样的噪音,同样的图片模糊程度等),这样的数据训练起来容易产生过拟合
2.7 迁移学习
1. 定义
对于类似的模型,可以将A模型中学到的基础知识运用到B模型中
- A的学习叫做预处理
- 迁移到B的学习叫做微调
2. 步骤A–>B
- 将训练好的模型 A 的输出层拿掉
- 放入B的输出层或者后2-3层
- 利用B的数据训练新放入的几层
- 如果数据量多,可以尝试沿着模型向前多训练几层甚至是全部层
3. 迁移学习的意义
A有很多数据,B却没有那么多的数据。迁移学习可以利用A学到的基础知识帮助B提升性能。
4. 有意义的情况
- 任务A和任务B有着相同的输入X
- 任务A所拥有的数据要远远大于任务B(对于更有价值的任务B,任务A所拥有的数据要比B大很多)
- 任务A的低层特征学习对任务B有一定的帮助;
2.8 多任务学习
多任务学习与迁移学习
- 迁移学习:串行学习方式,利用已有模型提升性能
- 多任务学习:多个任务并行学习,各个任务对其他的任务均有一定的帮助。
多任务学习与softmax
- softmax: 多个输出类,但是一个样本只属于一个类
- 多任务学习:多个输出类,一个样本可以同时属于多个类
自动驾驶的例子
自动驾驶模型中,需要识别图片中的行人、汽车、路标、交通灯等等。
下面输出向量的四个维度分别代表:行人、汽车、路标、交通灯
- Cost Fuction: 四种loss的加和
部分标记的数据
- 有些图片,可能只标记了汽车和行人,有些图片只标记了行人和路标,等等部分标记的图片
- 也可以利用多任务学习来处理,只是这个时候计算 Cost Function 的时候只对带标签的j进行求和,而不是对所有四种进行求和。
多任务学习有意义的情况
- 训练的一组任务可以共用低层特征;
- 对于每个任务大量的数据具有很大的相似性
- 在迁移学习中由任务A“100万-数据”迁移到任务B“1000数据”
- 多任务学习中,任务A1,…,An 每个任务均有1000个数据,合起来就有1000n个数据,共同帮助任务的训练
- 可以训练一个足够大的神经网络并同时做好所有的任务。
多任务学习在图像识别的领域中用处比较广泛,但是由于条件苛刻,再平时应用的远不如迁移学习的场景多。
2.9 什么是端到端的深度学习
- 传统的数据处理系统或者学习系统包含了很多歌阶段的处理过程
- 端到端的深度学习是直接的映射,忽略了中间的各个阶段,用单个神经网络来代替
- 优点是省去了中间阶段的研究
- 缺点是需要大量的数据才能有比较好的性能
不能一味的选择端到端,因为有的场景没有足够的数据,而分为几个阶段的话则都有大量的数据或者简单的运算。所以要具体问题,具体分析。
2.10 是否要使用端到端的深度学习
- 优点:
- 端到端学习可以直接让数据“说话”;
- 所需手工设计的组件更少。
- 缺点:
- 需要大量的数据;
- 排除了可能有用的手工设计组件。
知识的获取有两个途径:
1. 从数据中学习
2. 利用人工设置的精巧的系统
- 当数据量足够大时,人工的精巧系统的作用可以忽略了,甚至人工的精巧系统会有局限性限制了知识的全面性。
- 当数据量不够大时,人工的精巧系统就显得比较重要了,可以用少量的数据学习到更多的知识。
关键问题在于:是否有足够的数据能够直接学习到从x映射到y的足够复杂的函数。