吴恩达机器学习策略——模型调试

1. 正交化 (Orthogonalization)

Orthogonalization的核心在于每次调试一个参数只会影响模型的某一个性能
机器学习监督式学习模型大致分成四个独立的“功能”: 
  • Fit training set well on cost function ,优化训练集成本函数可以通过使用更复杂NN,使用Adam等优化算法来实现
  • Fit dev set well on cost function,优化验证集成本函数可以通过正则化,采用更多训练样本来实现
  • Fit test set well on cost function,优化测试集成本函数可以通过使用更多的验证集样本来实现
  • Performs well in real world,提升实际应用模型可以通过更换验证集,使用新的cost function来实现
  • 每一种“功能”对应不同的调节方法,是正交的;early stopping在模型功能调试中并不推荐使用。因为early stopping在提升验证集性能的同时降低了训练集的性能,不具有独立性、正交性

 2. 评估指标和优化指标

  构建机器学习系统时,通过设置一个量化的单值评价指标(single-number evaluation metric),来比较不同超参数对应的模型的优劣,从而选择最优的那个模型。常用的有精确率和召回率。         
                     
  实际应用中,我们通常使用综合了精确率和召回率的单值评价指标 F1 Score 来评价模型的好坏。F1 Score 其实就是精准率和召回率的调和平均数(Harmonic Mean),比单纯的平均数效果要好。
  可以将某些指标作为优化指标(Optimizing Matric),寻求它们的最优值;而将某些指标作为满足指标(Satisficing Matric),只要在一定阈值以内即可。对于模型的评价标准优势需要根据实际情况进行动态调整,以让模型在实际应用中获得更好的效果。

3. 数据集划分

  一般将数据集分为训练集、验证集、测试集。构建机器学习系统时,我们采用不同的学习方法,在训练集上训练出不同的模型,然后使用验证集对模型的好坏进行评估,确信其中某个模型足够好时再用测试集对其进行测试

  验证集和测试集的数据来源应该相同(来自同一分布)、和机器学习系统将要在实际应用中面对的数据一致,且必须从所有数据中随机抽取。这样,系统才能做到尽可能不偏离目标。

  数据量较小(小于 1 万)时,通常将数据集按照以下比例进行划分:

  • 无验证集的情况:70% / 30%;
  • 有验证集的情况:60% / 20% / 20%;
  • 大于100万数据量:  98% / 1% / 1% 或 99% / 1%,0.1%都可以

  测试集的大小应该设置得足够提高系统整体性能的可信度,使其能够在过拟合的系统中给出高方差的结果就可以,也许10000左右的数目足够;验证集的大小也要设置得足够用于评估几个不同的模型,足够使其能够检测不同算法、不同模型之间的优劣差异就可以,百万大数据中1%的大小就足够;都要根据实际情况对数据集灵活地进行划分。

  实际应用中,可能只有train/dev sets,而没有test sets。这种情况也是允许的,只要算法模型没有对dev sets过拟合。但条件允许的话,最好有test sets,实现无偏估计

4. 误差

  贝叶斯最优误差一般认为是理论上可能达到的最优误差,我们一般用人类水平误差(Human-level Error)来代表贝叶斯最优误差(或者简称贝叶斯误差)。对于不同领域的例子,不同人群由于其经验水平不一,错误率也不同。一般来说,我们将表现最好的作为人类水平误差。但是实际应用中,不同人选择人类水平误差的基准是不同的,这会带来一定的影响。

 

  模型在训练集上的误差与人类表现水平的差值被称作可避免偏差(Avoidable Bias)。可避免偏差低便意味着模型在训练集上的表现很好,而训练集与验证集之间错误率的差值越小,意味着模型在验证集与测试集上的表现和训练集同样好。理论上没有误差可以能超过贝叶斯错误率的,除非过拟合。训练错误率和开发错误率之前的差值,说明算法在方差问题上还有多少改善空间。

  提高机器学习模型性能主要要解决两个问题:avoidable bias和variance。training error与human-level error之间的差值反映的是avoidable bias,dev error与training error之间的差值反映的是variance。如果可避免偏差大于训练集与验证集之间错误率的差值,之后的工作就应该专注于减小偏差;反之,就应该专注于减小方差。

  • 训练集错误率和训练-验证集错误率的差值反映了方差
  • 训练-验证集错误率和验证集错误率的差值反映了样本分布不一致的问题,从而说明模型擅长处理的数据和我们关心的数据来自不同的分布,我们称之为数据不匹配(Data Mismatch)问题
模型目标:在训练集上有很好的表现,推广到开发和测试集啥也有很好的表现
减少可避免偏差方法:训练更大的模型,训练更长时间、训练更好的优化算法(Momentum、RMSprop、Adam),寻找更好的网络架构(RNN、CNN)、寻找更好的超参数
减少方差:收集更多的数据,正则化(L2、dropout、数据增强)

5.模型误差与方法

  • 对于训练集:深度学习对于训练集中的随机错误是相当健壮的(robust)。只要这些错误样本离随机错误不太远,有时可能做标记的人没有注意或者不小心,按错键了,如果错误足够随机,放着这些错误不管可能也没问题,而不要花太多时间修复它们,只要总数据集足够大,实际错误率可能不会太高
  • 对于验证集或者测试集:可以在进行误差分析时,通过统计人为标记错误所占的百分比,看看假阳性(false positives)假阴性(false negatives)来大致分析这种情况对模型的识别准确率的影响,并比较该比例的大小和其他错误类型的比例,以此判断是否值得去将错误的标记一一进行修正,还是可以忽略
  • 验证集和测试集标签数据修正注意事项:
    • 在验证集和测试集上同时使用同样的修正手段,以保证验证集和测试集来自相同的分布;
    • 同时检查判断正确和判断错误的例子(通常不用这么做);
    • 在修正验证集和测试集时,鉴于训练集的分布不必和验证/测试集完全相同,可以不去修正训练集
  • 如何解决数据不匹配问题的建议:
    • 做错误分析,尝试了解训练集和验证/测试集的具体差异(主要是人工查看训练集和验证集的样本);
    • 尝试将训练数据调整得更像验证集(人工合成数据,加噪音,图像增强等),或者收集更多类似于验证/测试集的数据

6. 模型学习方式

  • 迁移学习将已经训练好的模型的一部分知识(网络结构)直接应用到另一个类似模型中去。

  

    • 两个任务有同样的输入(比如都是图像或者都是音频);
    • 拥有更多数据的任务迁移到数据较少的任务;
    • 某一任务的低层次特征(底层神经网络的某些功能)对另一个任务的学习有帮助。
  • 多任务学习:使用单个神经网络模型,利用共享表示采用并行训练同时学习多个任务,例如无人驾驶需要同时检测行人、车辆、停车标志,还有交通灯各种其他东西

    • 多个任务之间具有相关性,并且任务之间可以利用相关性相互促进
    • 多任务学习和 Softmax 回归看上去有些类似,容易混淆。它们的区别是,Softmax 回归的输出向量 y 中只有一个元素为 1;而多任务学习的输出向量 y 中可以有多个元素为 1
    • 应用要求:
      • 训练的一组任务可以共用低层次特征,低层次信息的共享有助于减少计算量,同时共享表示层可以使得几个有共性的任务更好的结合相关性信息,任务特定层则可以单独建模任务特定的信息,实现共享信息和任务特定信息的统一
      • 每个任务的数据量接近;
      • 能够训练一个足够大的神经网络,以同时做好所有的工作。多任务学习会降低性能的唯一情况(即和为每个任务训练单个神经网络相比性能更低的情况)是神经网络还不够大
  • 端到端学习训练一个巨大的神经网络,输入一段音频,输出直接是听写文本。只需要把训练集拿过来,直接学到了xy之间的函数映射,绕过了其中很多步骤,直接功能对接,只关心输入和输出。
    • 优点:所需手工设计的组件更少,简化设计工作流程;数据足够多的情况下直接端对端实现
    • 缺点:需要大量数据;派出了可能有用的人工设计组件
posted @   forever_fate  阅读(131)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!
点击右上角即可分享
微信分享提示