吴恩达《深度学习-结构化机器学习项目》2--机器学习策略(2)

1. Carrying out error analysis误差分析
误差分析:顾名思义就是对错误的部分进行分析,在训练集或开发集里随机取一定数量的错误样本,如100个,然后手动统计错误类型,根据错误类型决定下一步应该做什么。统计过程推荐采用电子表格。
作用:可以帮助快速定位某个方向是否值得尝试。

举例说明:猫识别的例子,假设建立的模型正确率为90%,也就是错误率是10%,而且我们发现被分错的里面有一些狗被错分到了猫类,如果我们直接着手解决狗的这部分问题,那么和可能花费了几个月之后,改善并不大,这时候如果我们做错误分析,即取100个错误样本,然后统计里面狗的个数,如果狗只有5个,那么即使我们完美的解决了这个问题,错误率最多改善0.5%,那么就不太值得尝试,如果发现狗大概有50个,那么如果解决这个问题,错误率会降低5%,这时候就很有必要着手解决这个问题了。

吴恩达《深度学习-结构化机器学习项目》2--机器学习策略(2)
上图为错误统计表格的样本。


2. Cleaning up incorrectly labeled data修正不正确的标签
在监督学习中,用来建立模型的数据中,如果有写样本标记是错误的,那么是否值得花时间去修改这些错误标签?

对于训练集:深度学习对于随机误差是具有鲁棒性的,所以如果误差是随机的,比如标记员不小心标记错误,那么不修改这些错误也没关系。但是对于系统性错误,需要修改,比如标记员总是把白色小狗标记成猫。


对于开发集和测试集:推荐可以在误差分析的时候,增加错误标记类。如果这些错误标记严重影响了在开发集上评估算法的能力,那么就需要花费时间去修正这些错误,如果没有严重到影响在开发集上评估成本偏差的能力,那么就没必要浪费宝贵的时间。

举例说明,开发集的作用是用来区分算法的优劣,如果两个算法的错误率分别是10%和6%,而错误标记在错误样本中占比6%,也就是对错误率的影响为0.6%,那么此时可以不用处理错误标记,那如果两个算法的错误率分别是2.1%和1.9%,错误标记对错误率的影响依旧为0.6%,那么这时候由于错误标记的影响,我们不能保证1.9%的算法真的比2.1%的好,这就需要去修正错误标签。

几条建议:
1)如果要修改数据集,那么要对开发集、测试集做同样的修改,保证其分布的一致性。

2)修改错误标签的时候,既要检查算法判断错误的例子,也要检查算法判断正确的例子。因为正常情况下,正确率都远远高于错误率,所以对正确分类的样本检查,就意味着要检查很大数量的样本,会花费大量的时间,所以有时候也跳过。

3)修改验证集和测试集样本,也有可能不修改训练集的样本,这样也是可以接受的。因为训练集鲁棒性很好而且通常是非常巨大的,修改的性价比不高。

吴恩达《深度学习-结构化机器学习项目》2--机器学习策略(2)

总的来说,误差分析是要人工干预训练过程,有些工程师可能不太喜欢这种无聊又笨拙的方式,但这种方式给了模型更多的人类信息,对模型的准确性是有很大帮助的。

3. Build your first system quickly then iterate
对于没什么经验的新手,如果要新建一个模型,建议先快速建立一个模型训练,然后通过方差/偏差/误差分析,来确定下一步如何做,然后继续迭代。快速建立的这个模型的意义是为了确定方差、偏差的范围。
吴恩达《深度学习-结构化机器学习项目》2--机器学习策略(2)
对于经验丰富的工程师或者某些研究比较成熟的领域如人脸识别,可以一开始就搭建有针对性的复杂网络。

4. Training and testing on different distribution

当train set与dev/test set来自不同分布的时候,如何构建准确的机器学习模型呢?

以猫类识别为例,train set来自于网络下载,图片比较清晰;dev/test set来自用户手机拍摄,图片比较模糊。假如train set的大小为200000,而dev/test set的大小为10000。

做法一:将train set和dev/test set完全混合,然后在随机选择一部分作为train set,另一部分作为dev/test set。好处是训练集、开发集和测试集来自同一分布;坏处是开发集含有真正关心数据(用户手机拍摄)较少,使得算法定位出现偏差。所以不推荐此种做法。

做法二:从dev/test set中分出一部分放入train set,剩下的部分作为dev/test set。好处是目标定位更准确,因为开发集测试集都是我们最关心的用户手机拍摄数据。坏处是train set和dev/test set的分布不同。但事实证明,这样的划分会带来更好的系统性能。之后会讲一些处理训练集和开发集验证集分布不同的处理技巧。

5. Bias and Variance with mismatched data distributions
之前介绍过,根据human-level error、training error和dev error的相对值可以判定是否出现了bias或者variance。但是,这一方法不适用于train set和dev/test set来源于不同分布的情况。例如某个模型human-level error为0%,training error为1%,dev error为10%。根据之前的方法,显然该模型出现了variance。但是,training error与dev error之间的差值9%可能来自算法本身(variance),也可能来自于样本分布不同。比如dev set都是很模糊的图片样本,本身就难以识别,跟算法模型关系不大。因此不能简单认为出现了variance。


那对于train set和dev/test set来源于不同分布的情况应该怎么分析呢?
训练之前从train set里面分出一个train-dev set,用来确定方差(train errortrain-dev error差值),其误差称为train-dev error,dev error和train-dev error的差就是由于训练集和开发集分布不同引起的,称之为数据不匹配。
吴恩达《深度学习-结构化机器学习项目》2--机器学习策略(2)
一般情况下,human-level error、training error、training-dev error、dev error以及test error的数值是递增的,但是也会出现dev error和test error下降的情况。这主要可能是因为训练样本比验证/测试样本更加复杂

6. Addressing data mismatch定位数据不匹配
对于数据不匹配问题,也就是训练集和开发集分布不一致引起的问题,目前没有系统的解决方法,但是有一些值得一试的方法:
1)人工误差分析,试图找出训练集和开发集的不同

2)找到更多类似开发集的数据来做训练,比如人工合成,但是人工合成有一点需要特别注意,若是只模拟了训练集中的一小部分,那么算法很可能对这一部分过拟合,比如汽车语音识别,如果有1000小时无噪声的语音数据,想要给他们加上开车噪声,但是只有一小时的开车噪声,如果重复的将这一小时的噪声加给1000小时的语音数据,那么算法很有可能对这部分噪声过拟合。

7. Transfer learning迁移学习
深度学习最大强的理念之一就是可以将神经网络从某个任务中习得的知识应用到另一个独立的任务中,这就是迁移学习。

如果我们已经有一个训练好图像识别的神经网络。现在,我们想要构建另外一个通过X光片进行诊断的模型。迁移学习的做法是删掉图像识别神经网络的输出层及相应的权重系数W[L], b[L],建立新的输出层,并对权重赋随机值。然后用新的样本(X,Y),重新训练

重新训练权重系数,如果新样本数量较少,那么可以只训练输出层的权重系数W[L], b[L],保持其它层所有的权重系数W[l], b[l]不变。如果样本数量足够多,那么也可以只保留网络结构,重新训练所有层的权重系数。这种做法使得模型更加精确,因为毕竟样本对模型的影响最大。选择哪种方法通常由数据量决定。
如果重新训练所有权重系数,初始W[l], b[l]由之前的模型训练得到,这一过程称为pre-training。之后,不断调试、优化W[l], b[l]的过程称为fine-tuning。
迁移学习也可以去掉输出层后再增加额外一些神经层,需要根据实际情况判断。

为什么迁移学习有效?
神经网络浅层部分能够检测出许多图片固有特征,例如图像边缘、曲线等。使用之前训练好的神经网络部分结果有助于我们更快更准确地提取X光片特征。二者处理的都是图片,而图片处理是有相同的地方,第一个训练好的神经网络已经帮我们实现如何提取图片有用特征了。 因此,即便是即将训练的第二个神经网络样本数目少,仍然可以根据第一个神经网络结构和权重系数得到健壮性好的模型。

迁移学习什么情况适用?
吴恩达《深度学习-结构化机器学习项目》2--机器学习策略(2)
只有同时满足这三个条件迁移学习才有意义。第一条里面same input指的是同类型数据如图像、音频等。
8. Multi-task learning

多任务学习是让一个神经网络同时做几件事,并希望每个任务都对其他任务有帮助。

比如识别图片中的多种物体,如人、车、交通标志、信号灯等,当然也可以训练多个神经网络,每个神经网络识别一种物体,但是由于神经网络的早期特征在识别不同物体的时候都要用到,所以训练一个神经网络解决多个问题更为高效。

另外多任务学习和softmax也是不同的,softmax 是single label的,即输出向量y只有一个元素为1;而Multi-task learning是multiple labels的,即输出向量y可以有多个元素为1.


多任务学习模型的cost function为:

吴恩达《深度学习-结构化机器学习项目》2--机器学习策略(2)

其中,j表示任务下标,c是任务总数,L是通常的logistics loss,即:

吴恩达《深度学习-结构化机器学习项目》2--机器学习策略(2)

值得一提的是,多任务学习中,可能存在训练样本Y某些label空白的情况,这并不影响多任务模型的训练,在计算cost function的时候只计算有label的项就可以了。
多任务学习适用于什么情况呢?

吴恩达《深度学习-结构化机器学习项目》2--机器学习策略(2)

当同时满足上面三条的时候,多任务学习才有意义。其中第二条不是绝对的,也就是可以满足也可以不满足,但通常需要任一单个任务之余的数据量之和远远大于这个任务的数据量。关于最后一项,有研究员发现当神经网络不够大的情况下可能导致多任务学习的性能反而不如多个单任务的神经网络。

9. What is end-to-end deep learning

端到端深度学习就是将所有不同阶段的数据处理系统或学习系统模块组合在一起,用一个巨大的神经网络模型来实现所有的功能。它将所有模块混合在一起,只关心输入和输出。

传统流水线(pipline)方法和端对端方法对比:

吴恩达《深度学习-结构化机器学习项目》2--机器学习策略(2)

传统流水线方法还是端对端,如何选择?
传统流水线方法适用于数据量较小的情况;端对端方法适用于数据量较大的情况。数据量适中的情况下可以选择中间件方法,即跳过一些步骤的传统流水线方法。

举例说明,人脸识别的门禁检测系统,对于某个公司来说数据量比较小,如果直接拿相机拍摄的照片进行学习的话,可能由于拍摄的远近角度等问题影响学习效果,而如果分成两步,首先检测人脸,然后放大人脸到图像*,再用其进行模型训练,这样分成两个简单的任务,即降低了处理难度又提高的模型性能。如果数据量足够大,则用端对端方法更好。

10. Whether to use end-to-end deep learning

端对端深度学习优点:

--让数据说话,直接从x到y训练神经网络,能更好的捕捉数据中的任何统计信息,而不是*加入人类的成见,其整体表现可能会更好;

--所需手工设计的零件更少,能够简化设计工作流程。

缺点:

--需要大量的数据;

--排除了可能有用的手工设计组件。

吴恩达《深度学习-结构化机器学习项目》2--机器学习策略(2)

是否要采用端对端深度学习?

关键问题是:是否有足够的数据去学习x到y的必要复杂度函数。