首先介绍一下raytune这个东西,了解机器学习深度学习的朋友应该知道调参是机器学习中必不可少的一个环节,当你的模型被设计出来之后,或者你使用别人现成的模型的时候,你是要去调整模型的一个超参数从而是模型在你的数据集上达到一个比较好的效果的。通常的做法当然就是手动去设置参数然后跑一组组实验,最后选择一组结果较好的参数。但是在多GPU,你需要同时跑多组实验的时候,手动去跑多组实验是很麻烦的一件事,相信搞过的朋友一定懂。所以这里就需要一个类似于自动化训练平台的东西来帮助你找到比较优的一个参数,而raytune也就是干这个事情的。
由于这次不是主要讲raytune的,所以就简单写一下怎么用raytune,有兴趣的朋友可以自己去raytune的github首页去了解,链接已经放在最开始的部分了。raytune的搞法差不多就是将原来训练的一个个epoch拆开,一个epoch一个epoch去搞,因此你要做的事情主要有三个,分别是写好你的data_loader
,train_one_epoch
,evaluate_one_epoch
,函数的意思很简单,就是在一个epoch下train和evaluate,具体的实现和代码可以去参考raytune主页。
今天想记录一下的主要是在小数据集上如何使用raytune进行多模型的ensemble,问题源于一次实验,我们需要在小数据集上(不到3000)进行一次二分类问题的实验,由于数据集太小,训练的时候很容易过拟合而且数据集的划分也很容易存在train,valid,test上分布特征不一致的问题,就有可能valid上效果好但是test上面不行,或者valid上面不好但是test上面反而效果很好的问题。因此但次实验的结果是不准确的,所以需要做模型的ensemble。
在raytune中,你可以设置同时跑多个sample,一个sample对应的就是一组参数,原来一个sample中是一个model,但是现在一个sample中对应的多个model了,也就是多个model会share同一个初始参数,但是会在不同seed下random split的数据集上train和validate,最后在test上取平均,这样作用也就是减轻数据集小带来的问题。但是现在问题是,如何做validate?raytune上面是你需要让一个sample在validate之后返回一个评估值,单个模型的话直接返回auc或者acc就好了,但是多个模型呢?直接取平均?我一开始确实是没有多想直接取的平均,然鹅,这样做的效果其实并不好。。。然后老板直接提出应该要取一个sample中每个mode在所有epoch中最好的model,而不是取同一个epoch下的model,简单来说前者方便后者麻烦,但是后者显而易见更有效。
前者图示:
后者图示:
我按照后面这样改了,但是效果还是。。不好。。后来发现是因为我给每个sample中的model分的数据用的seed不是随机的,是0,1,2,3。。。结果导致每次都是第三个mode效果不好,就很迷。于是乎后来每份数据的seed用的都是随机数,效果一下子就上来了,平均test auc直接从0.87的蹦到了0.94,真的太神奇了。附上效果图:
总之就是数据集小的时候一定要做ensemble,而且要严格按照ensemble的方式去分数据。