最后还要通过任务本身的实际测试去根据实测问题调整验证集。如果有问题还要再回去前面某个点上再调一遍。
刚刚的例子暂时告一段落吧,现在抛出第二个问题,毕竟预告里面提了要说一说,其实答案相比大家心中已经有了答案。
根据之前的背景,这两个问题中数据特征空间差异是巨大的,所以,其实两个问题不可能直接进行迁移学习,但是,这里方法论是适用的,这里偷个懒,就不再展开介绍如何重新适配了一遍了,相信有了第一个任务的经验,这个任务做起来并不难,迭代次数也会大幅下降。
而通过讲解,相信开篇的问题也可以得到一定的解答。
总结
首先,基础知识很重要,需要掌握大量的基础性调参经验,这里强烈推荐大家去查阅学习旷视大神魏秀参的博客。
其次,需要严格做到对比实验方法,帮助自己准确获得这一次调整带来的性能提升,并就此思考这次调整所带来改变的原因。因为一旦有多维参数发生变化,就很难确定到底是哪一维的问题,不能准确的确定原因。另外,这里虽然排除了多维参数交叉作用的成分,但是可以通过螺旋迭代方法进行弥补。
特别需要提醒大家的是,精细的实验设计会导致尝试路径和次数很长,非常需要耐心。这时是很有必要先大胆降维,避免多个因素不知从何下手;而遇到瓶颈时则可以大胆猜测并假设问题,小心设计实验进行验证,很大概率会有惊喜。
最后,辅助性的工作/工具至关重要,是保证快速迭代的基础。所以选择一个方便上手的框架至关重要,维护框架的细节也非常重要。这里值得建议的是,能用多卡加速就用多卡加速,然后有必要关注一下硬盘读写瓶颈,建议换SSD固态硬盘。不过有一点值得庆幸,小模型的单模型训练速度很快,多因素尝试的时候,迭代速度还可以接受。
最后,一个良好的笔记软件以及使用习惯可以帮你梳理尝试过程中的逻辑和细节。不然,间隔几个小时的训练工作完成之后,只怕你已经忘记上次调整的是什么了。
问题回答
后边回答环节问题较多,回答的时间比较仓促,这边挑三个出来简单再说一下。
第一是关于超参数方面的,也就是学习率batch size,iteration等等超参数的配置。这里也是需要严格的对比实验设计来尝试的。同时,超参数是一般情况下变化不大,总的尝试次数(batchsize * iteration)基本是随着数据集总量来的。所以一般确定了的超参数,在数据量变化不大的时候可以保持不动。
第二是关于检出率和召回率如何兼顾?这个问题现场时候我理解错了,讲的更多的是如何挑选一个好的评价标准。事实上,如果回到本文所最长提到的边际效用递减曲线来说,兼顾检出率和召回率,就是找到一个最靠上的模型和超参数。具体找到这个模型,就是文中所讲的方法论来做了。
第三是轻量级模型下,用imagenet预训练有没有意义?回到特征空间的背景,因为轻量级模型的网络结构容量本身较小,所能容纳的特征量不大。但是imagenet的数据集特征空间非常大,远超了轻量级模型的能力。会导致预训练模型中对特征的描述和目标问题领域相距过大,预训练学出来的特征后边都会被新问题训练过程中覆盖掉。所以,数据不够时合理的解决方法是,可以使用特征相比比较相似的数据集进行预训练,例如车辆检测问题中,数据量不够,可以使用kitti、bdd100k等数据集进行一定的迁移工作。