Lesson3--结构化机器学习项目

模型调试

当训练模型觉得效果仍需改进的时候,你可以做以下步骤提升效果:
这里写图片描述
那在什么时候选用哪一种方法来进行调试呢,这时候应该用到正交(orthogonality)的方法,也就是我们希望调整这一个性能的时候不影响另外一个性能,就像调整电视机的屏幕的时候,我们调试电视机的宽度的时候,就不应该改动它的高度,否则电视屏幕很难调节好。因此相对应的,在机器学习的调整过程中,当我们发现在训练集,验证集,测试集或者是用户使用过程不好时,都应该有相对应的策略来做相应的调整。

第一步:训练集上表现不错
	如果在训练集上的模型表现不好,就需要用更大的神经网络结构或者使用优化算法来进行模型训练;
第二步:验证集上表现不错
	如果此时表现较差的话,说明模型过拟合,此时用正则化方法或者用更多的训练数据来训练模型;
第三步:测试集上表现不错
	如果此时表现不好,则用更多的验证集数据;
第四步:实际应用中表现良好
	如果此时表现较差,说明验证集测试集和真实分布不一样;或者说明采用的损失函数不够好。

这里写图片描述

划分开发dev/测试test集

1.开发测试集要来自同一个分布
2.确定你选择的开发/测试集能够反映你做的事情的目标。(设置一个正确的靶心作为目标)具体来说,选择一个开发集+数值指标就等于确定了靶心,选择测试集就是衡量射中靶心的准确度。

划分数据集的大小?
采用传统的7/3划分在大数据时代已经不管用了,当你的数据有百万条的时候,正确的做法是划分大量数据到训练集,划分少量数据到开发集和测试集,测试集的数据只要大到能够保证一定的置信度即可。

方差or偏差?

如何分析方差和偏差呢?首先了解一个概念,也就是上图中的bayes error,这是指error的最优值,假设我们进行图片分类,人的表现几乎可以达到bayes error的时候,我们来分析两个案例:
这里写图片描述
方案A中可避免误差(Training error-Humans)=7%,方差(dev-training)=2%,那么我们应该尽量去减少偏差,使训练误差更接近于人的误差;而在方案B中可避免误差为0.5%,方差为2%,这说明训练误差已经较优了,相比之下,可能我们应该通过正则化等手段减少方差。
要将人的表现来近似等于bayes error的话,不同的人有不同的表现,我们应该选择最好的最小的误差来作为bayes error的近似,这点通过bayes error的定义来理解。只有当训练误差与测试误差都接近人的误差的时候,我们才很难去分析下一步应该是减小偏差还是减小方差,因为两者的数值都很小,这也就是为什么机器性能超过人表现的时候发展变得缓慢的原因。
当机器性能优于人类的时候,我们很难判断下一步怎么去做。在自然感知任务中,比如人眼判断图片中是否有猫,人的表现都很好,接近bayes error,但是,在结构化任务中,也就是使用到数据库来存储信息进行分析的时候,例如预测点击量、规划物流线路的时候,人的表现就不如机器了。

重新选择一个指标(when performs bad in real world)

当你发现设定的指标并不能很好的衡量模型好坏的时候,就需要重新为目的设定一个评价指标。接下来用两个例子说明:
1)比如在推送猫的图片的时候,仅仅使用误差率来衡量效果是不确切的,因为将情色照片判为猫照片进行推送的后果是很严重的,因为我们可以对误差率加上一个权重,例如对其他照片的判断失误权重设为1,而对情色照片判断失误的权重设为10。(当然也可以有其他的方法)
这里其实就用到了正交化的思想将选择一个模型分为两步:1.选择一个合适的评价指标(修改损失函数);2.尽量在这个目标上达到最好的效果(损失函数最小化)。
2)如果你使用的开发测试集都是高质量的图片,而用户上传的大多是模糊的图片的时候,可能会出现用户体验不好的情况。这个时候就应该重新划分开发测试集,并且重新确定评价指标。

误差分析

在训练过程中,如何进行误差分析以提高准确度呢?
仍旧以猫图片的检测为例,选择被错误分类为猫的图片进行分析。通过制作一张表格,将分类错误的图片进行归类,我们找出各种原因使得分类错误的概率,导致分类错误率高的原因就是我们下一步应该解决的问题。例如统计结果如下图所示的话,就应该主要解决大型猫科动物和模糊图片导致分类错误的问题。
还有一种情况是人工标记label错误,当训练集中有错误时:如果是随机错误而不是系统错误,那么对深度学习的模型影响是很小的,我们可以不作处理;当测试集中有错误时:我们可以在误差分析中加上一栏(标记错误),然后统计标记错误造成的误差。
这里写图片描述
当标记错误只占分类错误的一小部分的时候,或许不做处理也是ok的;但是当标记错误占分类错误的比例较大时,我们应该去修正标记错误,此时标记错误已经影响到我们评估模型了。
当需要去修正标记错误的样本时要注意以下几点:
1.如果要进行修正的话,要同时对训练和测试集做相同的处理,因为训练测试集应该来自同一个分布;
2.检查分类出错的样本的同时也应该检查分类对的样本,否则可能出现偏差大的情况;(成本高)
3.有时候只需要修正测试数据集,此时造成的训练集与测试集分布的轻微不同是可以接受的。

构建初始的系统然后进行迭代!使用方差偏差分析、误差分析来提高初始模型的性能。

当划分traning/dev/test set遇到困难

假设我们收集到的猫图片有200000张来自内部数据,只有10000张来自实际用户,那怎么划分呢?
要注意的是dev/test set的作用就是为了设定一个目标,因此这个目标和最后的使用场景应该是最接近的,因此来自实际用户的照片应该被分到dev/test set中,否则训练出来的模型实际使用效果就不好。

但这个会导致训练集和测试集的分布不同,这时候如果训练误差和测试误差的差别较大的话,我们无法判别是数据分布不同的原因还是模型存在方差偏差的原因,这时采用的方法是在训练集中分出一部分作为traning-dev set来衡量模型是否存在方差偏差问题。
这是我们有的误差有:
bayes error
traning error
training-dev set
dev set
前两者之间衡量的是偏差问题,其次两个之间衡量的是方差问题。再其次衡量的是样本集分布不均匀的问题。

如果发现了样本分布不同的问题,此时可以采用以下几个方法来适当的改进结果:
1.对出错的测试样本进行误差分析,尽量收集能够改进这方面的样本;
2.人工合成与测试集相似的训练集,但这个有一个可能是导致学习算法过度拟合人工加入的元素。

即,先用内部数据解决模型是否存在偏差/方差问题,然后用用户实际样本数据来进行测试,对出错的样本进行误差分析,尽量收集能够改进这方面的样本。

其他的深度学习方式

任务迁移

什么时候使用任务迁移呢?这里我们认为是从任务A迁移到任务B:
1.当两项任务具有同样的输入时;
2.当任务A的训练样本多于任务B时;
3.从任务A中学习到的低层次的特征对B有帮助时。
例如,我们有10000张图片用于图片识别猫,有100张图片用于X射线分析,那么由于两者都是图片输入,且前者比后者数量上大得多,而且猫图片分析的底层特征,比如说线条等对B有帮助,那么我们就可以使用任务A的训练出的模型的底层参数训练任务B,此时只需要修改任务B最后一两层的参数即可。

多任务学习

多任务学习在实际中应用比较少,典型的一个例子是物体检测。同时检测多个物体可能比单独检测一个物体的效果要好。
要注意:多任务学习的输出不是softmax的损失函数,而是多个logistic损失函数的累加。因为一个输入样本可以有多个标签而不是一个标签。
比如说在一张图片中检测是否有行人,车辆,指示牌。我们可以训练三个单独的神经网络,也可以使用多任务学习来训练一个较庞大的神经网络。
什么时候多任务学习是有意义的呢?
1.训练其他任务得到的底层特征可以帮助用来训练这个任务;
2.训练各个任务的数据集大小差不多;
3.(硬件上)能够训练一个较为庞大的神经网络。对于多任务学习来说,需要训练的神经网络显然比单个模型要大。

端到端的深度学习end-to-end deep learning

实例:语音识别。
这里写图片描述
以前我们需要流水线工作训练每个组块,现在可能输入语音可以直接得到结果,这就是端到端的深度学习。
一般来说,端到端的学习要求训练样本的数据要很大。因此,它不一定是全能的。比如说在人脸识别中,要一下子输入含有人脸的图片,输出是否为公司的人员这种对应的训练数据是很少的,因此我们可以把它划分为两步:首先在一张图片中学习如何框出人脸,然后学习对放大的人脸进行判断是否与数据库中的人脸匹配。相比来说,后面这两步都有比较大的训练集。
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值