一、进行误差分析
以猫分类器为例,假设我们的模型表现的还不错,但是依旧存在误差,预测后错误标记的数据中有一部分狗图片被错误的标记成了猫。我们不能盲目的直接去训练狗的分类器,以能更好的区分猫和狗。
我们首先需要去对错误的样本进行分析,假如错误分类的100个样本中,只有5个狗样本被错误的标记成了猫,那么经过你的完善,你的模型能够区分猫和狗,你的效率也只是提高了5%。所以对误差进行分析就显得比较重要,而且可以帮助我们在未来的工作中指明优化方向,节省时间。具体的方法可以进行人工的对错误标记的样本进行再处理、分析。
下面以一个例子来介绍一下操作步骤
- 1.人工标记
将错误标记样本以表格的形式列举出来,然后人工的标记处样本的分类,最后统计出各种分类(或者说错误标记的原因)所占比例。
Image | Dog | Great cats(大型猫科动物,如狮子) | Blurry(图片模糊) | Comments |
---|---|---|---|---|
1 | √ | |||
2 | √ | 眯着眼 | ||
3 | √ | √ | 在动物园,且下着雨 | |
…… | ||||
% of total | 8% | 43% | 61% |
注意:上面的分类并不是互相独立的,只是举个例子。
- 2.分析误差
又上面的结果可以知道,误差样本中只有8%是狗狗的图片,而43%是大型猫科动物,61%是因为图片模糊。很显然此时你即使用毕生所学去优化区别狗和猫的算法,整个模型的准确率提升的空间也远不如后两个特征高。所以如果人手够的话,也是可以选择几个特征进行优化的。
二、清楚标注错误的数据
机器预测可能会出错,那么人当然也有可能会出错。所以如果训练集和验证集中认为添加的标签Y出现误差该怎么处理呢?
这里分两种情况:
- 1.随机误差
这种情况比较好,因为如果人为误差比较接近随机误差,那么可以选择性的进行忽略,因为深度学习算法对于随机误差还是有一定的健壮性的。
- 2.非随机误差
Image | Dog | Great cats(大型猫科动物,如狮子) | Blurry(图片模糊) | Incorrectly labeled | Comments |
---|---|---|---|---|---|
1 | √ | ||||
2 | √ | √ | 只是一只手画的的猫,不是真的猫 | ||
3 | √ | 背景的角落里有一只猫 | |||
…… | |||||
% of total | 8% | 43% | 61% | 6% |
什么时候我需要修正这6%标记错误的样本?举个例子:
假设我们有如下数据:
- 总体验证集误差:10%
- 由人工错误标记引起的错误样本比例: 0.6%
- 由其他原因引起的错误样本比例:10%-0.6%=9.4&
当其他原因引起的错误样本比例远远高于人工误差的时候,从效率角度考虑,我们可以优先处理其他原因导致的误差,显然他的受益会更高。
假如你通过优化算法,减少了因其他原因引起的误差,并且使得总体验证集误差降到了2%,此时我们再分析一下:
很显然,因为并没有对人工误差进行优化,所以由人工错误标记引起的错误样本比例依旧是0.6%,那么人工误差在总误差中所占的比例则达到了0.6%/2%=30%,相比于之前的6%影响力变大,所以此时则应该考虑对人工误差动手了。
三、快速搭建第一个系统,并进行迭代
步骤流程:
- 1.建立训练集,验证集,测试集
- 2.迅速搭建初始化系统
- 3.使用前面提到的Bias/Variance分析和误差分析来确定接下来的优化方向
因为我们的目的是做出一个系统,所以我们可以先初步快速的做出一个简单的系统,然后逐步的分析修改完善。
四、在不同的划分上进行训练并测试
这个和之前的划分略有区别,之前的划分比如测试多个国家的数据,我们会把多个国家的数据打乱然后进行分配。
但这边的话,就比如说我们要识别手机拍的猫的照片,但是这类照片像素很低并且数据很少,而我们手上只有大量高清的从网上找来的用相机拍的猫的照片。
那么我们的目的是为了识别手机拍的照片,且数据量要少。所以我们在分配的时候将高清的照片全部作为训练集去训练,手机拍的照片可以拿出一半作为训练集,其他作为开发和测试集,也可以把所有手机拍的照片作为开发和测试集。
五、不匹配数据划分的偏差和方差
对上面的PPT截图进行解释:
左边
首先还是以喵咪分类器作为例子,假设人类的误差接近贝叶斯误差0%。而训练集误差和开发集误差分别为1%和10%,二者相差9%,而且如果两个数据集来自同一个分布,那么我们就可以说模型训练结果方差较大。
但是当两个数据集来自不同的分布时,我们就不能得出上面的结论了。另外,这9%的方差可能有两个原因导致的,一是我们自己实现的代码有问题,二是数据分布不同,所以你很难确定哪个是更主要的原因。因此为了改变找出是哪个原因我们做如下的事情:
创建Training-dev set(训练-开发集),其实就是从原来的训练集中抽取一部分数据出来,但是不喂给模型。(如上图所示)
右边
那怎么操作呢?很简单,下面以几个例子来说明:
1.因为Training-dev set(训练-开发集)和Training set同分布,所以假设训练出来的结果如下:
- training error: 1%
- training-dev error: 9%
- dev error: 10%
此时可以看到来自同分布数据的训练误差和训练-开发误差存在较大的方差,这说明不是数据的分布不同导致的,而是算法本身存在问题。
2.假设训练出来的结果如下:
- training error: 1%
- training-dev error: 1.5%
- dev error: 10%
此时就可以说不是我们算法的问题了,而是发生了data mismatch(数据不匹配问题)
右下角
1.假设人类的误差接近贝叶斯误差0,且训练误差如下:
- training error: 10%
- training-dev error: 11%
- dev error: 12%
此时我们会认为模型与人类误差相比存在较大的偏差。所以就朝着减小偏差的方向改善
2.同样假设人类的误差接近贝叶斯误差0,且训练误差如下:
- training error: 10%
- training-dev error: 11%
- dev error: 20%
此时我们会认为存在两个问题:
- 高偏差
- 数据不匹配问题
六、定位数据不匹配
定位数据不匹配,举个例子,对车的识别。
我们训练集只有20类车的相关照片,而测试集对于车的识别是对所有车的识别,所有车有几百种类型,训练集的车的类型只是测试集中一个很小的子集,所以会导致数据的不匹配而产生较大的误差。
因此我们可以通过一些方法去制造一些数据去完善训练集,比如说查找不同类型的车然后和不同的背景照片组合形成一个新的数据。也比如车内声音识别的例子,我们可以通过将安静时候的声音加上车内的噪音混合来制造大量的数据来喂给模型进行训练,也提高的模型对不匹配数据的正确率。
七、迁移学习
简单的解释就是假如我们之前训练好了一个喵咪分类器,后来我们有了新任务——做一个海豚分类器,那么就可以将之前创建的喵咪分类器模型运用到新任务中去
举个例子,假设我们对信号灯的红、绿灯进行了大量数据的学习,现在有了新任务,即需要识别黄灯,此时我们就不需要从头搭建模型,我们可以继续使用红绿灯网络框架,只需修改神经网络最后一层,即输出层,然后用已经训练好的权重参数初始化这个模型,对黄灯数据进行训练学习。
为什么可以这么做呢?因为尽管最后的标签不一致,但是之前学习的红绿灯模型已经捕捉和学习了很多有用的特征和细节,这对于黄灯的学习十分有帮助,而且这么做也可以大大的加快模型的构建速度。
课后习题可以更清楚地解释迁移学习。
但是一般来说是有条件限制的,如下:
(假如想将A模型运用到B模型)
- A和B需要有相类似的输入数据集,例如要么都是图像识别,要么是语音识别
- A的数据集要足够多,即远多于B
- A中学到一些low level features要对B有所帮助
八、多任务学习
在迁移学习中,整个过程是串行的,即咱们首先得实现A模型,然后在运用到B模型。而在多任务学习中,可以是同时开始学习。
举个栗子:
现在很火的无人驾驶汽车,在行驶路上需要识别很多类型的物体,如行人、红绿灯、指路标志等等,所以此时可以使用多任务学习来实现。神经网络示意图如下:
如图示,最后的y^y^是一个有4元素的向量,假设分别是行人、汽车、停车标志、信号灯。如果识别出图片中有哪一个元素,对应位置则输出1。
注意:这要与softmax进行区分,softmax只是一次识别一种物体,比如说识别出是行人,则输出[1,0,0,0],而不会说同时识别出行人和信号灯。
适用情况:
最后,吴大大说在实际中迁移学习使用频率要远高于多任务学习,但是有个例外就是视觉检测项目中用多任务学习比较多。
总结一下:
多任务学习能让你训练一个神经网络来执行许多任务,这可以给你更好的性能,比单独完成各个功能更好的性能。(不常见)
迁移学习是指自己需要算的任务的数据集相对很小,然后通过寻找一个数据集要大很多的相关问题,以他为基础训练神经网络,然后迁移到数量很少的任务上来。
九、什么是端到端的深度学习
定义:
相对于传统的一些数据处理系统或者学习系统,它们包含了多个阶段的处理过程,而端到端的深度学习则忽略了这些阶段,用单个神经网络来替代。
语音识别例子:
在少数据集的情况下传统的特征提取方式可能会取得好的效果;如果在有足够的大量数据集情况下,端到端的深度学习会发挥巨大的价值。
优缺点:
优点:
端到端学习可以直接让数据“说话”;
所需手工设计的组件更少。
缺点:
需要大量的数据;
排除了可能有用的手工设计组件。
应用端到端学习的 Key question:是否有足够的数据能够直接学习到从 x 映射到 y 的足够复杂的函数。