深度学习tips-搭建深度学习模型,不知如何下手?

来源:互联网 发布:天猫旗舰店的流量数据 编辑:程序博客网 时间:2024/05/16 03:05

很多刚刚入门的同学们面对一个刚刚到手的课题就像面对一块刚刚到手的烫山芋一样,无从下口… …是无从下手。那么应该如何开始呢?答案很简单,立刻搭建一个最简单的模型,然后按照划分的训练集开始训练,然后用开发集测试得到的结果进行一轮一轮的迭代。
如果你是这一行业的老手,或许熟知这一领域的各种方法,或许博览这一领域的著名paper,当然你不需要从最简单的模型开始搭建。
当你搭建好了一个最初的模型,就放心的训练它吧,当然你不能幻想它能带给你什么样的结果,但是它能给你一个非常重要的信息,就是指向优秀结果的路标。


当你的最初的最简单的这个模型训练结束后,得到测试结果,你会通过测试结果知道是偏差出了问题还是方差出了问题(不清楚偏差与方差的同学请点击链接)。当然最初的模型都是偏差过大。


然后我们要分析测试过程中模型搞错的那些样本的特性。看看是哪些问题造成了模型将这些样本搞错。
用猫鉴别器举例,我们训练一个模型来鉴别一个图片是不是猫,结果有10%鉴别错误,我们就来分析一下这10%的样本有什么特性。
结果发现,其中6%是因为图片模糊,3%因为把豹子等猫科动物也鉴别成猫,1%是因为样本标签是错的(例如本来是狗,标签写的却是猫)。通过分析,我们可以清晰地知道改进什么会给我们带来多大的收益。改进图片模糊问题,最高可以增加6%的准确率。而花多达数月的时间去纠正样本标签,最高的收益也只是1%而已。


如果误差只有2%了,那由于标签错误而产生的1%的误差就显得非常重要了。因为标签很多都是人工手打上去的,难免会出现个别错误,例如将狗的标签打成猫,将猫的标签打成鸡。
毋庸置疑,这时候我们要修改错误的标签了。可以想象的是,这是一项工作量巨大的任务。因此对于占数据量绝大多数的训练集来说,我们认为个别的错误不会影响训练模型的鲁棒性。因此不去关心训练集中的标签错误问题,这一下就减轻了很多工作量。
我们观察鉴别错误的那些样本,发现其中有一点是标签错误的,将它改正过来,此时一定要记得的是,不仅在鉴别错误的样本中存在标签错误,在鉴别正确的样本中也会出现标签错误。因此我们要做的是耐心的在开发集和测试集中寻找这种错误标签并改正它。


有的时候我们的测试集和训练集并不是十分相同,例如在训练猫鉴别器时,我们的训练集的数据都是从网络上爬来的高清图片,而用户使用的图片都是手机拍摄的有些模糊的图片,如何在训练模型使用高清图片的情况下兼顾用户的那些随意的图片呢?
在这种情况下一般我们将用户上传的图片的一半作为开发集和测试集,另一半混入高清图片中作为训练集使用。


此时又会有新的问题,如果这时我们的训练误差是1%,开发集误差是10%,这在以上正常情况下是模型的方差出了问题,而此时,训练集与开发集测试集不是来自同一分布,所以我们如何破判断到底是什么导致了1%与10%的差别呢?
在这种情况下,我们要在训练之前,在训练集中抽出一小部分作为训练-开发集(training-dev set),这个训练-开发集和训练集是保持同一分布的。使用余下的训练集做训练,使用训练-开发集做测试。如果测试结果如下:

数据集 误差1 误差2 误差3 人类水平 1% 1% 1% 训练集 1% 1% 10% 训练-开发集 9% 1.5% 11% 开发集 10% 10% 20%

如果真实情况是表格中误差1的情况,我们就可以知道,是模型的方差出了问题,模型只在训练集上有效,在相同分布的数据集上都无法有效地泛化。
如果真实情况是表格中误差2的情况,说明模型训练的不错,只是因为开发集合训练集的分布不同,才导致了开发集会有10%的误差,这个叫做数据不匹配问题。
误差3的情况很好判断,模型都没有训练到位,偏差还很大,同时也存在了数据不匹配问题。


可是现在并没有系统的解决数据不匹配问题的方法。
使用合成的数据是一个有利有弊的办法。训练集和开发集分布不同,往往因为开发集和测试集有现实中的噪声而训练集是完美的数据,我们可以将训练集进行合成,加入噪声,这样可以提高模型的效果。但是我们人工无法分辨出噪声的分布,因此加入的噪声很可能只是实际噪声的一个子集,经过多轮的训练会造成模型对这一小段噪声的过拟合。


参考资料:吴恩达DeepLearning

原创粉丝点击