深度学习(13):机器学习策略(2)

误差分析

当我们发现验证集和训练集误差比人工误差大很多时,我们认为此时存在可避免偏差,可以优化。这时候对产生误差的原因进行分析有助于我们的下一步迭代。例如对于猫图片分类器,通过观察验证集上的错误我们发现,80%的错误来源都是把狗看成了猫,这就启发我们针对狗进行优化(多找一些狗的图片、设计狗相关的算法等)可能会使我们的错误率降低80%。

在分析误差时,我们可以并行的分析很多因素,也可能会找到共性的新因素,能够给下次迭代提供方向。

修改错误数据

有时候,我们的数据并不是完全准确的,可能由于收集时的粗细大意,导致某些数据的标签与实际不符。这时候我们要考虑是否需要对错误数据进行修改。

首先对于训练集来说,只要错误数据是随机的,往往不需要修改。训练集数据量实在太大,修改代价巨大,而且因为神经网络的鲁棒性比较强大,不太在乎这一两个数据(几个错数据平均一下并不能特别影响代价函数)。但是如果错误数据是系统性的(例如总是把白猫不当猫),那就会出大问题,得修改。

对于测试集和验证集,我们就需要分情况考虑对错误数据进行修改。例如对于猫分类的神经网络,我们认为人的误差是0%。我们发现此时的验证集误差是10%,然后通过对验证集中的误差数据(分类器分错的部分)抽样,我们发现这10%中,由数据本身错误导致的误差大约为0.5%。显然相对于10%,0.5%微不足道,可以忽略,没必要修改这些数据,我们当下的目标就应该修改偏差。然而如果两个模型,一个验证集误差2.0%,一个验证集误差2.1%,这时候0.5%的错误就会产生巨大的影响,可能会影响我们的决策,于是需要对验证集中误差数据的错误数据进行修改。对于测试集我们也要进行同步修改以保证二者同分布。

看到上面的修改方式你可能会疑惑,错误数据不仅仅存在于误差数据中,也同时存在于模型正确分类的部分当中,为什么只修改误差数据,这样不是会高估性能吗?这样做的原因是模型误差往往较小,因此需要修改的错误数据也小,可以减小修改代价。
有心人也会看到,我们只对验证集测试集进行修改,却没有对训练集进行修改,道理同上,尽可能减小修改的数据量。尽管这样会导致训练集数据和验证集、测试集数据的分布略有不同。

快速搭建第一个神经网络

深度学习是一个高度迭代的过程。在一个深度学习项目的开始,我们没必要冥思苦想、深思熟虑,可以快速的搭建一个简单的神经网络,通过对这个网络进行误差分析等等,可以帮助我们更快的找到优化方向。

在不匹配的数据上进行训练

我们一直在强调,测试集、训练集、实际应用的数据必须保持同分布,才能使得模型最终效果优秀。但我们没总提到训练集。原因是因为很多时候,我们对于实际应用的场景数据量太小了。例如对于猫分类的应用,我们手上只有2w个用户的实际图片(低清、业余)。然而这些数据不够训练所用,我们还可以从网站上找100w个高清、专业的图片。

对于这种情况我们往往如下分配:
训练集100w高清+1w用户
验证集5k用户
测试集5k用户
这样分配仍然保证测试集、训练集、实际应用的数据同分布,还能利用海量的高清数据。

然而这样做存在问题,我们验证集和训练集的误差差值不仅来源于方差,还来源于数据分布不同造成的差别。因此需要我们在误差分析时多加注意。

我们在原有的训练集中再划分出一小部分,作为train-dev set(训练验证集,这里翻译已经不传神了)。train-dev set由于和训练集同分布,因此可以帮我们单独体现出模型的偏差指标。各个量之间的关系如下:
在这里插入图片描述

人工误差和训练集误差差值仍代表可避免偏差
训练集误差和train-dev set误差差值代表方差
train-dev set和测试集、验证集之间的差值代表数据不匹配的差距

定位数据不匹配

上述的可避免偏差和方差我们已经学习了很多方法进行优化。然而对于数据不匹配的差距,目前没有系统性的方式进行处理,可用的几个方法如下:

1.人工分析:通过人工分析,找到训练集和验证集之间的差异。例如对于一个车载语音助手,我们发现相对于训练集,验证集的数据普遍具有车内噪音。
2.针对人工分析的差异,获取更多的相关数据
3.人工合成数据:有时候第2条很难执行,我们找不到现有数据。这时候可以尝试合成人工数据。例如我们录一个小时的车内噪音,把它们加在原有的数据集当中以获取”车内的声音“

第3个方法有一个显著的缺点,就是人工合成的数据往往容易造成过拟合。因为我们只录制了一个小时的车内噪音,它不能完全涵盖所有的车内噪音,我们人工合成的只是实际空间的一小部分。这就可能导致模型对这1个小时的噪音过分学习。

迁移学习

有时候我们可以利用一个数据量大的任务,来帮助我们实现一个性质类似但是数据量较小的任务。

例如我希望进行一个骨折的图像识别,可是我手头的骨折数据只有1w个,显然没法利用这点东西训练全新的神经网络

这时候我已经有一个猫的图像识别,数据量为100w个。我们可以先利用这100w个猫数据对神经网络进行训练。
随后我们将猫模型的最后一层去掉,重新加上一层或几层的随机初始神经元。利用我们的骨折数据,参考已有的骨折数据量,可以只针对新加入的神经元进行训练也可以对所有的神经元继续训练,最终得到想要的骨折识别模型。

这样做有效的原因是:
1.A,B任务的输入格式相同
2.A,B任务具有相同特点:猫识别中进行的图像处理(点、线、图形等)对骨折识别也有帮助。
3.A的广大数据能为B的较少数据提供额外帮助。

多任务学习

多任务学习是指针对n个不同的任务,我把它们都用一个神经网络训练,神经网络的输出维数由1扩展到n,分别代表n个任务的结果。

这有点像之前的softmax,不同是softmax处理单一任务,只允许输出1个1。而多任务学习不同,它允许输出多个1(例如一张图里可以既有猫又有狗)

这样做有效的原因是:
1.这n个任务可以利用共同的基本性质(和上面的迁移学习有点类似)
2.n个任务的数据量大致相同

只要网络规模足够大,多任务学习往往比单独训练n个模型效果更加优秀。

对比迁移学习:迁移学习在实际应用中更多,原因是很难找到基本性质相同且数据量还相同的n组任务。我们往往见到的都是数据量差距较大的任务。

端到端的深度学习

过去的机器学习中,对于一个任务,我们往往要利用人的经验设计很多中间步骤,按步骤完成整个任务。
端到端的深度学习像是一个降维打击,直接构建输入到输出的映射,忽略中间步骤。

学计算机的都知道,有些好处不能凭空得来,端到端的深度学习有以下瓶颈:
1.需要的数据量巨大
2.没办法利用人已有的知识,模型构建难度较高。

因此实际使用时,往往需要考虑咱有没有足够的数据再做考虑。有时候可以将一个复杂问题拆解(门禁识别问题=人脸裁剪+人脸核对),才能达到不错的结果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值