构建机器学习项目2

Error Analysis

  • Carrying out error andlysis

如果你想得到一个训练算法来做人类可以做的任务 而且你所训练的算法还没有达到人类的效果 你需要手动地检查算法中的错误 来得到你下一步该做什么 这个过程叫做错误分析

image.png

首先 拿大约100张分类错误的验证集图片并进行手动检测 只需要数一数 看有多少张 验证集中标错的样本实际上是狗的图片 现在 假设事实证明 在验证集中分错的100张样本里有5%是狗的图片 也就是说 验证集中分错的100张中有5张是狗 这意味着在这100张图片中 特指你分错的这100张 即使完全解决狗的问题也只在这100张中多分对了5张 换言之 若只有5%的错误是狗照片 如果你在狗的问题上花了大量时间 最好的情况也就是 你的错误率 从10%下降到9.5% 对吗 这5%是错误里的相对下降值,因此是从10%下降到9.5% 那么你可能可以合理地判断出这样并不是最好的利用时间的方式 也有可能是,但至少给了你一个上限 通过处理狗的问题能提高多少准确率 对吗?

在机器学习中 有时我们把这称为表现上限 意思是最好的情况是什么 关注狗的问题能有多大的帮助

在错误分析中 只看验证集里你的算法判断错误的样本


image.png

综上所述 要进行错误分析,你应该找到一套 在你验证集中错误标识的样本 并按假阳性和假阴性来看 并计算不同类别中的 误判个数 在此过程中 可能会促使你提出新的错误类别 就像我们看到的 当你浏览样本的时候 有很多Instagram滤镜 或者Snapchat滤镜 他们也搞乱了分类 您可以在过程中创建新类别 但通过对不同类中错误标识的例子计数 通常这将有助于你判断优先级 或给你新方向的灵感

  • Cleaning up incorrectly labeled data

监督式学习的问题中,数据由输入X和输出的标签Y组成 如果检查数据集,你发现有些 输出标签Y错了 (也就是说)你的部分数据,有错误的标签 你值得花费时间去修正这些标签吗? 让我们一起看看这个问题

深度学习算法对随机错误很稳健, 但它们(深度学习算法)对系统误差不那么稳健 比如说,如果你的标记员一直把白色的狗标记为猫, 那就会产生问题,因为你的分类器会 学着把所有的白色的狗分类成猫 但是随机错误,或者接近随机的错误 通常对深度学习算法来说,不算太糟糕

image.png

对于开发集和测试集中的错误标记数据呢?一个比较推荐的做法是,在错误分析的过程中 增加一列,去统计 Y的标签错误的数量,这个标记员漏掉了背景里的这只猫 所以,在那里打个对勾,表示第98个例子的标签错了 可能在这个例子里, 这个图片实际上是一个画的猫,而不是真的猫 可能你想要标记员标记成0,而不是1 所以在这里打个对勾 就像你计算错误率 (这些错误率)由其他类别导致的,可以计算一下由这些错误标签导致的错误率 在你的开发集里,Y的值是错的 这解释了为什么你的机器学习算法 预测了一个和数据里标签不一致的结果 所以,现在的问题是 我们值得花费时间去纠正这6%的错误标记的例子吗? 如果这些错误对你评估算法在开发集上的效果 有很大的影响的话 那就继续做吧,花时间去纠正这些错误标签 但是如果没有太大影响 对你用开发集去评估模型 那你的时间最好不要花在这上面

image.png
image.png
  • Build your first system quickly, then iterate

image.png

Mismatched training and dev/test set

深度学习算法都希望有大量的训练数据 要使它运转在最佳状态 训练集中要有足量已标记训练数据 这导致很多团队将能找到的任何数据 都塞进训练集,只为有更多的训练数据 即使有些 甚至很多这种数据 来自于与开发集和测试集不同的分布 因此在深度学习时代,越来越多的团队正在使用的 训练数据并非来自与开发集和测试集相同的分布

  • Training and testing on different distribution

通过估计学习算法的偏差和方差 能帮你确定下一步工作的优先级 但当你的训练集 开发集 测试集 来自不同的分布时 偏差和方差的分析方法也会相应变化 接下来一起看看如何实现

image.png
image.png
  • Bias and Variance with mismatched data distributions

image.png
image.png
image.png
  • Addressing data mismatch

如果训练集的分布 与你的开发集和测试集的分布不同 并且如果误差分析表明出现了数据不匹配的问题 你该怎么解决?

image.png
image.png

Learning from multiple tasks

  • Transfer learning

深度学习中最有力的方法之一,是有时你可以把在一个任务中神经网络 学习到的东西,应用到另一个任务中去。 比如,你可以让神经网络 学习去识别物体,比如猫,然后用学习到的 (一部分)知识 来帮助你更好地识别X射线的结果。 这就是所谓的迁移学习

你有几种方法来重新训练这个放射数据的神经网络。 如果你只有一个小的放射数据集, 你可以只重新训练最后一层的权值,就是WL 和PL,同时保留其它所有参数。 如果你有足够的数据, 你也可以重新训练神经网络的其余所有层。 我们的经验就是如果你有一个小规模的数据集, 那么就去重新训练最后一层和输出层的神经网络, 或者你也可以训练最后一到两层的神经网络。 但是如果你有大量的数据, 你或许可以对这个神经网络的所有参数都进行重新训练。 要是你对神经网络的所有参数进行重新训练, 那么这样训练的初始化阶段 有时候被我们叫做预训练(pre-training) 原因是,你在是使用图像识别的数据 来预初始化(pre-initialize)或者说预训练神经网络的权重。 然后如果你在之后对所有的权重进行更新, 那么在放射扫描的数据上的训练有时候被我们叫做微调(fine tuning) 所以有时候你会在深度学习领域听到预训练(pre-training)和微调(fine tuning)这些词, 上面我所说的就是他们在迁移学习中 表达的真正含义

image.png

那么迁移学习在什么时候有用呢 当你在你的被迁移的模型中拥有大量的数据, 而你在你需要解决的问题上拥有相对较少的数据时, 迁移学习是适用的

image.png
  • Multi-task learning

迁移过程是有先后顺序的 从任务A中学习,然后将其迁移到任务B。 在多任务学习中,你(多个任务)一起开始 尝试让一个神经网络同时做几件事 然后,每个任务将会帮助完成其他任务

image.png
image.png

End-to-end deep learning

  • What is end-to-end deep learning

近期,深度学习最令人兴奋的进展之一 是端到端深度学习的崛起 那么,什么是“端到端“的深度学习呢? 简单地说,我们有一些数据处理系统 或者是由多个阶段组成的学习系统 端到端的深度学习做的 就是它可以捕获所有的阶段 并且,通常可以将其替代为单个神经网络 也就是说运行速度更快 以语音识别为例 其目标是接收输入音频片段X 将其转换为该音频剪辑对应的 脚本输出Y。 传统的语音识别分为多个处理阶段。 首先,需要提取音频的一些特征, 一些人工设计的音频特征。 或许你听说过MFCC 这种算法(MFCC), 用于提取一组特定的人工设计的音频特征。 提取了低级特征之后, 可以应用机器学习算法 从音频剪辑中查找音素 音素是声音的基本单位 比如说,单词"cat"由三个音构成 Cu,Ah和Tu,算法会提取出这三个音素 然后把音素串在一起,形成单词 再将这些单词串在一起,构成音频剪辑的脚本。 不同于上述由多个阶段组成的途径(管道) 端到端的深度学习 可以训练一个庞大的神经网络,只需输入音频片段, 然后直接输出脚本

当你的数据集较小时, 传统的管道方法实际上同样有效, 有时甚至更好。 你需要一个大的数据集以便端到端的方法真正突显其作用。 如果你有中等量的数据, 可以采用折衷的方法:输入音频, 绕过这些特征,只学习输出神经网络的音素, 然后继续其它阶段。 因此这是端到端学习的一个步骤, 不是彻底的端到端学习

image.png

所以在实际应用中, 把整个问题分成两个子问题来解决会 比完全端到端的深度学习方案得到更好的性能。 尽管如果你有足够的数据, 也许端到端的方案会更加好, 但是目前来说在实际应用中这不是最好的方法

image.png
image.png
  • Whether to use end-to-end deep learning

image.png
image.png

你可能感兴趣的:(构建机器学习项目2)