结构化机器学习项目

点击量:248

今天总结下:Coursera-Deep Learning-Course3-Structuring Machine Learning Projects的内容,因为这节课里面有好多概念性的东西,不是很实用,因此跳过了很多。

Mismatched Data Distribution Problem

我们在之前的文章里说到dev和test set的data distribution必须一样,这里说的Mismatched Data Distribution,指的是training set和dev/test的数据来源(data distribution)不一样,而以下讨论的几个问题都是基于这个假设的。
先来看一个很常见的应用:

开发一个供用户在手机端使用的识别猫的服务,也就是用户通过手机上传猫的图片到服务器,然后通过训练好的模型来判定这张图片是否是一只猫。

这是一个很普通的应用,但它却存在一个问题:我们在训练时不可能获得大量的来自于用户自己上传的图片数据(移动端),所以这些训练数据只能通过爬虫从网上下载。这样一来,就导致了training set和dev/test的来源不一致的问题,前者来自于网页抓取,后者来自于用户自己上传的。

  • 如何划分数据集?

    假设training set有200,000条,而dev/test只有10,000条,两者相差悬殊。那么这时候我们该如何划分数据集,以达到最佳的效果呢?有两种方法:

    • 把所有数据打乱后混在一起,然后按照如下比例划分:
      OPTION1
      dataset: train dev test
      数据量: 205000 2500 2500
      来源: 网页+移动端 网页+移动端 网页+移动端

      这个有什么缺点呢?很明显,因为来自移动端的数据太少了,随机打乱后对整个训练效果的影响可以说是忽略不计了,所以,当产品交付给用户使用时,效果会大打折扣。

    • 不全部打乱(training set可以打乱),dev和test set全部使用移动端的数据

      OPTION2
      dataset: train dev test
      数据量: 205000 2500 2500
      来源: 网页+移动端 移动端 移动端

      为什么第二种方法更好呢?我们知道dev set的主要作用是帮助我们选择使用哪个模型,因此当dev set的所有数据都来自于用户的真实数据时,这就意味这我们是以真实数据为驱动去选择模型的,也因此在最终交付时效果会更好。

  • 如何诊断问题?
    假设我们在进行模型选择时遇到了这种情况:

    Training Error:1%(假设human level接近于0%)
    Dev Error:10%

    在training set和dev/test的数据来源一致的情况下,我们可以很容易判定出这是一个High Variance Problem;但是当training set和dev/test的数据来源不一致时,还是这样吗?不一定了,为什么呢?因为这个问题也有可能是Data Mismatch导致的(比如training set就是比dev set更容易训练),那么如何判定这到底是个Data Mismatch Problem还是个High Variance Problem呢?很简单,我们从training set里划分出一小块数据形成一个新的数据集叫:training-dev set,用于判定模型在同样的数据分布下是否产生了过拟合。因此,我们得出如下诊断表格:

    Error Type Error Rate Diagnosis
    Human level 0% N/A
    Training 2% Avoidable Bias
    Training-dev 3% Variance
    Dev 12% Data Dismatch
    Test 14% Degree of Overfitting
  • 如何解决这个问题呢?
    最简单的办法自然是收集更多的类似于dev/test的数据放到training set里。如果收集不到怎么办?那么我们可以通过人工合成的方式扩充数据集。比如对语音识别而言,我们可以加入些许噪音;对图像识别而言,我们可以通过对图片进行扭曲,模糊,旋转等一系列操作扩充数据集。

介绍几种学习方法

把这些内容放到这里讲有点奇怪,违和感很强。这里提到的每一种学习方法都是一个很大的研究方向,不是一两句话就能说清的。因此,以下的介绍只是最基本的概念,是在直观上解释这些方法的应用场景,不做深入讲解。

  • 迁移学习(Transfer Learning)
    迁移学习(Transfer learning) 指的是把在一个领域已经学习好的知识(或者模型)迁移到另一个领域,在此模型的基础上使用新的数据集再训练。这样就不需要每一个任务都从零开始训练了,不仅降低了对训练数据量的要求,还能加速训练过程。很常见的一个应用场景是识别医学影像,我们都知道医学影像数据相对来说是很少的。如果能把其他图像识别的模型参数迁移到医学影像领域,那么就能解决由于数据集太少而无法获得良好效果的问题。

  • 多任务学习(Multi-task Learning)
    多任务学习顾名思义就是指一个模型能处理多个任务,这是相对于单任务学习而言的。什么是单任务学习呢?举个很简单的例子:识别一个图片是否是猫,这就是一个单任务问题。而如果我们试图去识别一张图片中是否包含行人,路牌,汽车等多个物体时,这就是一个多任务问题。这种学习方法主要应用在计算机视觉领域,比如用于object detection。

  • 端对端学习(End-to-End Deep Learning)
    对于语音识别而言,传统做法是把这个任务分为几个小任务,然后把他们串起来执行,像流水线一样。
    audio(x)->feature->phoneme->words->transcrips(y)
    而端对端学习则不会把任务分解,它只有一步:
    audio(x)-------------------------->transcrips(y)
    这种学习方法精简了很多步骤,而且效果也比传统方法好很多,比如最新的Google translator就采用了这种方法,它不再逐字翻译,而是学会了整句翻译。但是这种方法有个有前提条件:它需要大量的训练数据,否则,传统方法可能会更好。

发表评论

电子邮件地址不会被公开。 必填项已用*标注