大数据文摘出品
来源:medium
编译:zeroInfinity、笪洁琼
Kaggle比赛应该是数据竞赛中公认含金量最高的那个。每场比赛,参加的队伍至少上千人,也并非每次都次都能脱引而出,一不小心就要陪跑。
一位刚刚参加了kaggle孟加拉语手写字位分类比赛的小哥就刚刚“陪跑”了一场,但是从这次的失败经历中,他总结了一套“失败方法论”。文摘菌编译了这篇文章,希望各位也能从这位Kaggle失败者的经验里,就像梯度下降模型一样,不断从错误中学习如何更正。
enjoy!
几个星期前,Kaggle的孟加拉语手写字位分类比赛结束了。
孟加拉语是世界上排名第五的语言。这项挑战希望能在孟加拉语识别方法上有所改进。孟加拉语的字母有49个字母和18个变音符号,这意味着有很多可能的字素(书面语言中的最小单位)。
在本次比赛中,我们要能够做到分类这些字素的三个独立部分的类别-字素根,元音变音符号和辅音变音符号。
比赛超过两千只队伍参加,起初我是个人参赛,但过了一段时间,就成功组了一个五人团队。我以及团队在这项比赛上花费了大量的时间和资源,结果最后只得到了第254位,没有奖牌。
我对这个结果感到很沮丧,在家里消沉了很长一段时间。
图来自 forums
在这段消沉的时间里,我认真反思了自己的所作所为以及思考方式,大量阅读顶尖团队的解决方案,并吸取了一些经验教训。
我认为这些方法是通用的,可以应用于任何比赛。它们可以大致分为几个主题:思维模式和常用方法,编码实践,以及为比赛做好准备。
搭建工作环境
图来自 SlideShare
训练模型是kaggle比赛的主要部分,因此有必要为此做准备。
Kaggle的标准配置很好,但是GPU的时间限制很严格-每周只有30小时。 所以跑模型,通常都在我自己的电脑上或在云服务器中运行。
首先,必须设置一个工作环境,可以使用pip,conda或其他方式完成。
最好在kaggle上检查库的版本,并在您的环境中安装相同的版本:不同的版本可能会有不同的API接口或者不同的逻辑。
硬件配置
图来自whatech
当然,另一个重要的事情是硬件本身。如果拥有大量数据(比如本次比赛),则在单个显卡上训练单个模型,就可能需要一天甚至更长的时间。
值得一提的是,运行实验通常比训练最终模型要花费更多的时间,因为需要尝试很多不同的方式。
我的电脑上有2块1080ti,但也不够用。 我已经在Google Cloud上多次租用了GPU,但价格昂贵,因此我开始寻找其他方法。
后来听说最近Hostkey,他们提供租赁网络服务。并且有一个促销计划:
在大型比赛的场地为获奖者提供免费的GPU服务器,以供他们在进一步的比赛,训练或与数据科学相关的个人项目中使用。
作为交换,参与者应在社交媒体上分享他们的使用心得。
起初,我有一台4x1080ti的服务器。环境设置没有问题,很快我就开始训练模型。
模型在单个GPU上的运行效果很好,我就开始逐渐增加所用显卡的数量, 2个,3个GPU都运作良好,但是同时使用4个GPU的实验失败了,没有任何反应。
技术支持迅速做出反应,并在几天之内调查清楚了该问题。事实证明,服务器本身存在一些问题-处理器无法跟上4x1080ti的全部利用率。于是,我切换到另一台服务器:2x2080ti。起初有一个小问题,因为动力不足,但是当工程师又添加了另一个电源,问题就解决了。
从那时起,我在这个服务器上运行了许多模型,并且一直运行良好。它的用户体验很合我的胃口,因此我决定将来继续使用Hostkey的服务器。
拥有一个有效的工作流水线
图来自qiita
拥有一个有效率的工作流水线非常重要。这里的流水线是指用于准备训练数据,训练本身和推理的整体指令流程。使用一些搭建好的高级框架固然值得,但是从头开始编写自己的代码更好。主要好处是可以快速更改参数,并确保所有基本代码都能正常工作,就可以专注于更多思考。
在这次比赛开始,我在Catalyst中使用Jupyter API,但由于它存在一些问题而很快停止了。一段时间后,经我的队友推荐,我开始自己配置在Catalyst上的API。它虽然更适合我,但是的确花了很多时间来适应它。
而我的一个队友使用fast ai,可惜由于fast ai的风格独特,我很难理解它。
因此,我认为最好选择专注一种方法(某种框架或您自己的计算流水线)并坚持下去。
代码优化
图来自 page
有人评论,kaggle竞赛的代码不太好。实际上,大家疯狂迭代,人们通常会花时间尝试一些新想法,而不是编写更好的代码。但这样做也不是好选择。
有时,小的代码优化会产生巨大的影响。如您在屏幕截图中所见,优化后处理速度可能提高30倍。训练模型速度将更快,因此做事使用正确的方法也很重要。
另一方面……
不要盲目相信论坛的其它代码和想法
Kaggle很棒,也有很多很棒的notebook可供参考,还有一些论坛可以找到很棒的思路,对吗? 不一定。
尽管论坛上有很多高质量的(代码)notebook和思路,但也会存在一些问题:
有些notebook里的代码语法有错误,会导致代码跑的时候报错,某些思路复现会报错以及其它的问题;
最令人忧桑的是,论坛中的某些思路可能会误导人。
这一切并不是因为人们故意干坏事,而是很多思路无法独立发挥作用,有些思路必须搭配特定的模型才能成功(坑爹),有些需要高评分的模型,等等;
因此,如果您想使用一些代码或想法,请首先检查并验证它们。
作为这一点的延续:
持续寻找并尝试新的想法
参加kaggle比赛的最好最酷的事情之一就是它会促使人们得到新的SOTA结果(SOTA全称「state-of-the-art」,用于描述机器学习中取得某个任务上当前最优效果的模型)。
为了获得最佳成绩,必须尝试新事物,比如在arxiv查阅论文,寻找好的博客文章等等。 但是,仅仅了解新方法还不够,需要尝试一下。为某个新想法编写代码可能很困难,但这是学习新事物的一种极其有效的方法。即使有些想法行不通,您也会获得有益的经验。
不要沉迷调参
图来自xkcd
这是一个常见的陷阱(我遇到好多次),有人认为调参可以帮他们获得优异的结果。这个想法是对的,但也不完全正确。
在竞赛中,有必要对参数进行两次调整:在开始时和结束时。
开始的调整很重要,因为必须针对不同的问题来调整梯度增强和其他模型。不同的目标,不同的深度,叶子的数量和其他因素可能会导致模型在不同问题的分析的得分截然不同。但是,找到一些好的参数后,请固定参数设置,直到比赛快要结束时再更改。
当您添加新功能或尝试新想法时,请保持参数相同,比较方便进行调参前后结果对比。
当尝试完所有想法时,就可以再次进行调整会使得分略有增加。
对于深度学习而言,情况则有所不同。
参数的可调节范围很大:可以调整架构、损失函数、扩展、预处理和后处理等。因此,不可避免的是,需要花费更多的时间进行优化。但是仍然值得记住的是,一个好的思路比调参数更容易获得好的结果。
总的来说,只有不断的吸取教训以及学习,才能改变陪跑的命运,拿到第一名。
相关报道
https://towardsdatascience.com/what-to-do-when-you-dont-get-any-medal-in-a-kaggle-competition-b54cc433da3