吴恩达深度学习第三课笔记

Structuring Machine Learning Projects

Posted by kissg on August 23, 2017

Course 3

week1: Machine Learning Strategy 1

  • 训练时可采取的一些机器学习策略罗列:
    • 收集更多数据
    • 收集更多样的训练集
    • 使用梯度下降时, 训练更长时间
    • 尝试用 Adam 代替梯度下降
    • 尝试更大/更小的神经网络
    • 尝试 Dropout regularization
    • 增加 L2 regularization
    • 调整神经网络架构
      • 替换激活函数
      • 增减隐层单元数
  • 正交 Orthogonalization 的重要性, 以机器学习中的链式假设为例进行说明: 当我们训练一个模型时, 首先希望它在训练集上有一个好的表现, 有一些技术手段能做到这一点, 比如更大的神经网络, 使用 Adam 算法等; 前一点得到保障之后, 我们希望 dev set 也能表现得足够好, 也有一些技术手段, 比如正则化; 然后, 希望模型在测试集上也能有好的表现, 也有一些技术手段, 比如使用更大的 dev set; 最后希望模型在现实世界表现得足够好. 每一步, 都有一些技术手段可以使用, 我们最好使用相互正交的技术手段, 即在一个阶段使用的技术手段, 不会影响另一个阶段. 这样, 我们就能独立地改进模型在不停阶段的性能, 而不必担心对其他阶段造成太大影响. (更直观的例子: 开车的时候, 方向盘控制方向, 油门控制加速, 刹车控制减速; 但如果将加减速也加入方向盘的功能, 结果很可能会事与愿违)
  • 早停 Early Stopping 既会影响模型在训练集的表现, 也会影响其在 Dev set 上的表现, 根据正交性原则, 是一个不太可取的技术手段
  • 设置一个评估指标 Evaluation Metric 来挑选模型, 一般都是一个数值型的量, 方便量化比较模型
    • 准确率 Accuracy, 错误率 Error 是最简单的评估指标. 提供了样本被误分类的信息. Error 可以理解成是错误预测的总和除以预测的总数; Accuracy 则是正确预测的总数除以预测的总数, 或者说 1-ERR
    • 真正率 (true positive rate, TPR)假正率 (false positive rate, FPR) 是对于类别不平衡问题特别有用的评估指标. _假正率_是假正例 (实际标签为假, 被误判为真) 的总数除以真实反例的总数; _真正率_是真正例的总数除以真实正例的总数
    • 查准率 Precision (有时也翻译作精确率): 几乎是真正率的同义词. 计算是: 真正例的总数除以预测正例的总数
    • 查全率 Recall (有时也翻译作召回率): 计算公式是: 真正例的总数除以正例的总数 (真正例数 + 假反例数).
    • F1 Score: 一项综合考虑 Precision 和 Recall 的评估指标, 定义为 Precision 和 Recall 的调和平均数 Harmonic Mean
  • 不同的应用场景, 优先考虑的评估指标有所不同. 比如疾病检查, 患者关心的是得病的几率, 他在乎的是查准率 (这也是为什么, 此处优先如此翻译); 但比如疾病预防, 医院希望将某疾病的病患都找出来进行隔离治疗, 这时医院可能优先考虑查全率, 宁抓错, 不放过, 如是也.
  • Dev set 搭配上单个实值评估指标, 能够加速迭代
  • 满足与优化指标 Satisficing and optimizing metrics 说的是, 当考虑多个评估指标时, 选择一个作为优化指标, 其他的作为满足指标. 顾名思义, 优化指标就是训练模型要不断提升/降低的量, 比如错误率; 而满足指标就是, 只要模型的性能在设定的容忍范围内即可, 而不在此范围内的, 均不予考虑, 比如内存消耗在 10 MB 以内.
  • 重要的事情说第二遍: 训练集与 (验证集, 测试集) 的数据分布可以不同, 但验证集与测试集的数据分布必须相同.
  • 验证集的目的, 是为了从多个训练好的模型中, 选择一个最优的. 因此, 只要能够区分不同算法/模型的性能就够了, 不必太大
  • 测试集的目的, 是为了检验最终模型的泛化能力, 也不必太大.
  • 有些情况下, 指标+验证 (metric+dev) 选出的最优模型在实际应用中不一定是最好的, 比如涉及情色内容的分类器. 此时, 就要对评估指标进行调整, 一种方法是使用权值 weights. 仍然以涉及情色内容的分类器为例, 原来, 我们使用的错误率计算是这样的: (其中 I 是指示函数, m 是样本容量); 现在我们要坚决反情色内容, 可以这样 计算错误率, 为非情色图片设置很小的权值, 情色内容设置很大的权值, 那么误判情色图片就会造成一个极大的误差, 使最终的误差变大, 降低该分类器的指标.
  • 我们通过指标来评估模型的性能. 但根据正交的原则, 更恰当的做法是, 先根据要实现的目标, 定义好指标 (英文的描述比较通畅: figure out how to define a metric that captures what you want), 简而言之就是, 先设定好目标; 然后, 训练模型向目标看齐, 不断提升性能, 提升指标. 这样分两步的方式看似与之前没差别, 但实际上差别就在于一个是先定目标, 然后训练; 一个是不管怎样, 先训练, 然后选一个指标来评估其性能. 差别还是很大的
  • 一种评估机器学习性能的方式是和人比, 这里就引入了 human-level 的概念. 机器学习的准确度 Accuracy 提升有两道坎, 一道是 human-level, 人类非常擅长一些工作, 比如判断是猫与否, 因此将其设为第一道坎, 表达了对人类的尊重; 另一道坎是 贝叶斯可能误差 Bayes Possible Error, 这是学习任务的理论最优值, 可以说是, 看得到摸不着的天花板.
  • 当机器的水平逊于人类时, 要提升其性能, 可以参考以下几点:
    • 获得人类标记的数据
    • 手动分析错误, 思考人是如何判断的
    • 分析 bias/ variance
  • Course 2 的笔记中提到过: 训练误差与人类水平 (误差) 之间的差距, 吴恩达老师称为可避免偏差 avoidable bias, 训练误差与验证误差之间差距, 称为方差 variance. 根据此二者, 有四种情形: 低/高偏差, 低/高方差. 当偏差较大时, 应首先降低偏差, 提高模型在训练集上的性能; 方差较大时, 应关注降低方差.
  • Human-level error is a proxy for Bayes error.
  • 不同人, 对于相同任务的水平是不一样的: 专业的和业余的, 水平就明显不一样; 一群专业的, 水平一般也会比一个人高. 根据上面那句准则, 人类的最高水平就代表了 Human-level. 当然, 具体情况还得具体分析.
  • 在一些任务方面, 机器已经吊打人类了, 比如 TI7 上, AI 就击败了 Dendi. 当机器不如人类的时候, 学习任务/训练模型, 有一条比较清晰的脉络; 当机器超过人类之后, 一些情况下, 训练就会像陷入泥泞一样, 难于提高, 因为没有清晰的目标了.
  • 机器胜过人类的场景:
    • 在线广告
    • 产品推荐. 所有有时候找人推荐, 不如上亚马逊咯
    • 对率回归
    • 语音识别
    • 一些图片识别
    • 借贷分析
    • 医药
  • 监督学习的两个基本假设:
    1. 训练能得到很好的性能
    2. 训练集的性能能够很好地泛化
  • 减小 avoidable bias 的一些手段:
    • 训练更大的模型
    • 训练更长时间/使用更优的优化算法
    • 调整神经网络架构/超参数搜索
  • 减小方差的一些手段:
    • 更多的数据
    • 正则化 (L2, dropout, 数据增强)
    • 调整神经网络架构/超参数搜索

week2: Machine Learning Strategy 2

  • 深度学习对于训练集的随机误差有相当强的鲁棒性
  • 误差分析 Error Analysis 就是分析错误, 找出原因. 一种方法是表格分析法: 比如分类任务, 选择一定数量的误分类样本, 列出一系列误分类的原因, 然后统计分析, 找出主要原因, 或定位易解决的原因. 下图是表格分析的一个例子

chart_error_analysis.png

  • 要处理误标记的问题, 应同时处理验证集与测试集的误标记样本, 确保同分布. 不仅误标记处理, 任何对验证集的处理, 都应以相同的方式再处理测试集.
  • 必要时候, 可以对正确分类的数据也进行分析 (也许存在错错得对的情况也说不定)
  • 观察验证样本, 思考如何改进. 比如猫的分类器, 当考虑是否有必要更好地处理狗以获得更好的性能时, 就可以取一定数量的误分类的验证集样本, 统计狗的数量, 然后决定是否要实现对狗的强化识别.
  • 上述的表格分析法, 实际上就能让我们同时考虑多个方法.
  • 要进行深度学习, 要做的第一件事情是: 快速构建第一个系统, 然后迭代, 验证想法, 早发现早治疗.
  • 当训练集与 (验证集, 测试集) 具有不同的数据分布时, 混合所有样本随机洗牌划分数据集是错误的处理方式. 正确的处理方式是, 从同分步的验证集, 测试集中取出部分样本加入训练集. 很多时候, 海量的训练数据是容易获得的, 而验证测试数据是稀缺的.
  • 还有一种数据划分方式是, 从训练集中划出少量样本作为 training-dev set, 其与训练集同分布, 但不用于训练. 此时, train set error 与 training-dev set error 之间的差距称为方差, training-dev set error 与 dev error 之间称为 数据不匹配 data mismatch, dev error 与 test error 称为验证集的过拟合程度 degree of overfitting to dev set
  • 解决数据不匹配问题的几种方法:
    • 手动分析误差, 理解训练集与验证/测试集的差异
    • 使训练数据更接近验证/测试数据; 或者收集更多与验证/测试数据相似的数据加入训练集. 一种可用的技术手段是: 人工数据合成 artificial data synthesis. 比如对于语音识别, 将人声与噪声进行合成, 得到较真实的现实场景的声音数据. 这时会带来的一个问题是, 如果使用同一份噪音, 可能会造成过拟合, 因为噪声也被当作了有价值的特征.
  • 迁移学习 transfer learning, 简而言之就是将从某一学习过程得到的知识应用到新的领域. 目前这要求, 任务是相近的. 比如放射诊断只有不多的数据, 对于训练一个高准确率的深度神经网络远远不够, 这时就可以借用一个训练好的图片识别深度神经网络的大部分层次, 只替换掉接近输出层的部分层次, 之后通过简单训练, 就得到了放射诊断的深度神经网络. 这就是迁移学习, 它将图片识别的知识迁移到了放射诊断, 理论依据是, 图片识别与放射诊断的低层特征是相似的, 比如线条的特征, 这就是两个学习任务共同的知识. 如下图所示:

illustration_of_transfer_learning.png

  • 上面提到, 迁移学习目前的要求是, 学习任务是相近的, 知识是相通的. 可以把图片识别的知识迁移到放射诊断, 但不能迁移到语音识别.
  • 迁移学习另一个比较硬性的要求是, 大训练集训练得的知识可以迁移到小训练集的学习任务. 但反之被认为是不可取的, 一来这样的知识不可靠, 二来没有太大意义.
  • 总结一下迁移学习的一些前提条件:
    • 任务 A, B 具有相同的输入
    • 要将任务 A 习得的知识迁移到任务 B, 要求任务 A 的数据量大于 B
    • A 的低层特征对学习任务 B 有帮助
  • 多任务学习 Multi-task learning, 简而言之就是在一个训练任务中, 同时学习多种经验. 以自动驾驶为例, 车辆需要识别行人, 其他车辆, 交通标志, 信号灯等, 从包含以上多个目标的图片中进行识别训练, 那么同一个训练过程, 就需要识别出多个物体. 每个物体的识别, 都是一项学习任务, 因此, 同时识别多个物体就属于 多任务学习 了.
  • 多任务学习的样本输出值是一个 (n, 1) 维向量, 其中 n 是学习任务数. 假设以 0-1 标记图片中各物体出现与否, 多任务学习的输出有点类似 one-hot 向量. 但不同于 one-hot 向量有且仅有且必须有一个元素被标记为 1, 多任务学习的输出向量可以认为就是单任务学习的输出的组合, 每个位置上的输出值都表示图片中是否存在对应物体. 这就要求图片的标签, 即 y 也是一个 (n, 1) 维向量. 相应地, 多任务学习的损失函数 Loss 也是一个向量
  • 有时候, 多任务学习的样本标签带有一些问题标记, 通常用 ? 表示. 只要不是全是问题标记的情况, 该样本依旧可以用于训练, 只是最后处理的时候忽略该项, 或采用其他技术手段即可. 而如果直接丢弃该样本, 那对于现实生活中存在的大量信息缺失情形, 可用于训练的数据将大大减少, 因此要不抛弃不放弃.
  • 总结一下多任务学习的一些前提条件:
    • 学习的一系列任务, 都能从共享的低层特征中收益. 比如图片中多物体的识别, 低层特征如线条就是共享的, 所有的物体识别都能从中获益. 此处有一个推论, 就是得益于特征共享, 多任务学习的性能会比独立训练多个单任务神经网络更好.
    • 通常, 各学习任务的数据量是相近的. 以自动驾驶为例, 要学习识别行人, 车辆, 交通标志, 信号灯, 那么, 能够识别出行人, 车辆, 交通标志, 信号灯的样本数量应该是相近的. 一个直观的感觉是, 有 1000000 个样本, 其中 999000 能识别出车辆, 只有 1000 样本能识别出行人, 那么行人不是更像噪声吗
    • 多任务学习的一个假设是: 只要训练一个足够大的神经网络, 就能在各项任务上都有足够好的性能
  • 端到端学习 end to end learning, 简而言之就是没有中间过程, 从输入直接到输出. 以语音识别为例, 传统的做法是, 1) 从音频中提取特征; 2) 从特征中提炼音素; 3) 构词; 4) 转录成文本. 而端到端学习, 就是简单粗暴的从音频到转录文本. 如下所示:

illustration_of_end-to-end-learning.png

  • 端到端学习的优缺点:
    • 优点:
      • 让数据发声
      • 只需要更少的人工参与
    • 缺点:
      • 可能需要大量的数据, 大到足以让数据发声
      • 剔除了潜在的有帮助的人工参与
  • 人工参与到机器学习/深度学习的各环节, 可以将人的经验, 知识等注入系统, 也许能帮助系统更好更快的学习. 此外, 将端到端学习拆分成多个相对独立的学习过程, 有点分治的味道, 易于实现, 性能也可能比设计不佳的端到端学习更好.