• 深度学习——结构化机器学习项目(学习策略2)[9]


    目录

    • 人工误差分析
    • 数据不匹配问题
    • 迁移学习
    • 多任务学习
    • 端到端学习

    一、人工误差分析manual error analysis

    • 对学习的结果进行人工误差分析

    例:猫的分类器train结果的正确率为90%(10%的误差),对结果进行人工分析,如果发现有些狗被识别为猫导致错误,考虑怎么来减少这种错误?

    • 如何通过人工误差分析来提高算法性能

    列出一些可能的错误类型,然后统计在一定样本空间内每种错误所占的比例(中间也可能总结出新的错误类型),根据比例大小来判断应该从哪个方向优先开始优化(如下是模糊对结果影响比较大)

    Image Dog Great Cats Blury Incorrectly labeled Comment
    1          
    2          
    ...          
    % of total 8% 43% 61% 12%  
    • 标注错误的问题

    监督学习是包含输入X和输出标签Y,如果Y被标记错误(人为的),那是否有必要对这些标签进行修改?

    答:DL对于随机误差鲁棒性不错,所以如果这些人为误差随机性较大,且数据集较大,则不太有必要进行修改。但是如果是系统误差就问题大了。通过比较由于标注不正确和其它原因导致的错误率比较来判断是否需要手动修改标签

    overall error on dev 10% 2%
    error due incorrect labeled 0.6% 0.6%
    error due other 9.4% 1.5%
    • 修正标不正确数据集的几点建议
      • 无论是什么操作,在dev和test数据集都应该进行,以保证它们是来自同样的分布
      • 算法正确的结果也应该进行检查,而不只是检查出错的结果
      • 经过手工修正后,train和dev/test数据集可能分布上会有点差异。这种情况还是可接受的
    • 建立一个ML系统的建议

    例如一个语音识别系统,建议快速建立一个简单的,然后再进行优化迭代

    可以考虑的方向

    基本步骤

    Noisy background

      Cafe noise

      Car noise

    Acceted speech

    Far from microphone

    Young children's speech

    Stuttering

    Set up dev/test set and metric

    Build inital system quickly

    User Bias/Variance analysis & Error analysis to prioritize next steps

    二、数据不匹配问题

    • 数据集来自不同的分布如何划分

    比如猫的app,数据集:200,000张图是来自网页,而10,000张图是来自移动设备(应用关心的部分),如何对该数据集进行划分?

      划分 优点 缺点
    方式一

    把两个数据集混合得到210,000

    205,000 train   2500dev   2500test

    test/dev/train三者同分布 dev/test中包含了网页数据,而这些数据并不是我们想要关心的
    方式二

    train: 来自网页的20,000以及500来自移动设备

    dev/test: 500来自移动设备

    test/dev和train三者同分布 dev/test中只包含移动设备数据,这正是我们关心的目标。建议选该方案
    • 数据不匹配问题

    假设一个猫分类器,人类的错误就0%—training error为1%—dev error为10%。因为train和dev数据集可能分布不同,所以不能直接判断是否是方差过大

    新增一个train-dev数据集(与train同分布),用它来判断是否存在data mismatch问题:因为数据集分布不同导致的错误

      数据集 错误率 错误率
    人类错误   0% 0%
    train error   10% 10%
    train-dev error 来自train,但是没有用于训练 11% 11%
    dev error   12% 20%
    错误类型   bias

    bias+data mismatch

    • 如何处理data mismatch问题
      • 进行手工错误分析,尝试理解train和dev/test数据集间的不同
      • 让train尽量与dev/test相似

    可以采用人工合成数据的方法,但是可能会有过拟合的问题。比如为了模拟在汽车的嘈杂环境中说话的场景,将1000句说话声与1个小时的汽车声音合并,可能需要把1小时的时间复制n多份,然后合并,这样可能会导致对这1小时声音的过拟合

    三、迁移学习transfer learning

    从一个任务A学习后,把它的网络再运用于学习另一个任务B

    • 迁移方法
      • 若任务B的数据较少,则可以只学习最后的一两层
      • 若任务B的数据较多,则可以把任务A的学习当作预训练pre-train,得到整个网络所有权重的初始值,接着用目标数据对整个网络学习并对所有参数进行更新(微调fine tune

    可以这样的原因:两个任务会共享一些低层的特征,比如输入的都是图片

    例:识别猫的网络迁移到学习x射线图

    • 什么时候迁移学习是比较有意义的(A->B)
      • 两个任务有相同的输入
      • A的数据集比B的数据集大很多
      • A的低层特征对学习B有帮助

    四、多任务学习

    一次可以学习多个特征,比如从一张图中同时识别是否有车、有停车标志等,也就是对于一个输出有多个标签

    输出的label:$widehat{y}=[0quad1quad1quad 0] [是否有行人 quad是否有车quad 是否有停车标志quad是否有红绿灯]$,其中可以有多个1,而softmax分类是只能有一个结果是1,其它为0

    loss函数$=frac{1}{m}sum_{i=1}^msum_{j=1}^4L(widehat{y}_j^{(i)}, y_j^{(i)})=frac{1}{m}sum_{i=1}^msum_{j=1}^4(-y_j^{(i)}logwidehat{y}_j^{(i)}-(1-y_j^{(i)})log(1-widehat{y}_j^{(i)}))$

    • 什么时候多任务学习会比较有用

    例:无人驾驶时需要同时识别多种物体

      • 一个任务集可以共享低层的特性
      • 一般每个任务拥有的数据量相似
      • 多任务的性能比单任务差的唯一情况是多任务的网络不够大

    总体来说:在实践中,多任务学习会比迁移学习的使用频率低,但计算机视觉是例外

     五、end-to-end 端到端学习

    端到端的学习:利用神经网络给定输入可以直接输出直接拿到你想要的结果

    • 例子
      • 音频转文字

    传统上,有些事是以流水的方式工作,比如音频转文字,需要先识别出特征,然后音位,接着构成一个词,最后变成文本。但以端到端的方式就是直接输入音频,经过网络学习输出文本即可

      • 门禁系统

    有些并不能一步就完成的,需要分成多步。比如门禁系统,通过识别人脸来判断是否准入

    分成两步:先从图片找出头部并放大,再与信息系统中的头像进行比较判断是否一致

    为什么:每一步的操作比较简单,且每一步的数据可以够大。如果直接一步的话,数据量(需要的是人靠近门禁系统时的照片)并不是很大(端到端的学习需要有足够多的数据)

    • 端到端学习优缺点
      • 优点:let data speak:不在中间加入人为的思想,比如在语音识别时,并不强调一定要以音位的方式来表达转换;需要比较少的人工设计模块(hand designed人为的设计)
      • 缺点:需要大量数据;排除了些可能有用的人工设计模块
    • 是否应该使用端到端?

    关键问题是:你是否有足够的数据来学习从x映射到y的复杂函数

    自动驾驶的例子:根据输入的图像x决定方向盘的操作y。这样的数据并不是很容易获得,所以中间可以先经过一些其它系统处理,而不是直接端到端

  • 相关阅读:
    用bash脚本统计代码行数
    Winform应用程序实现通用消息窗口
    文件管理工具“三剑客” #Everything #SpaceSniffer #Clover
    Jenkins pipeline:pipeline 语法详解
    Android studio安装教程
    恶意代码分析实战 shellcode分析 lab 191 192 193 整体来说 对汇编代码的分析要求较高 因为没法直接反编译为C代码看
    恶意代码分析实战 加壳与脱壳 lab 181 182 183 184 185 手动脱壳和自动脱壳操作
    恶意代码分析实战 IDA分析 lab 73 一个通过感染主机exe 修改kernel.dll为恶意dll的后门程序 要做清理的话 是很难的!
    恶意代码分析实战 隐蔽的恶意代码启动 lab121 122 123 124 进程注入、进程替换、hook procmon监控os api调用不行 数据分析还是要sysmon
    恶意代码分析实战 ollydbg使用来了 Lab 91 92 93
  • 原文地址:https://www.cnblogs.com/coolqiyu/p/8666615.html
Copyright © 2020-2023  润新知