Kaggle大师访谈:他是怎么驰骋机器学习竞赛的

电子说

1.3w人已加入

描述

编者按:早在90年代中期,国外一些论坛上就出现了一种另类访谈活动:Ask Me Anything(AMA)。发起AMA后,任何网友都能在留言中写出自己想要对方回答的一个问题,之后接受采访的对象会视情况作出解答。近日,Reddit、Kaggle和science.d3.ru三个论坛的网友对获得Kaggle Grandmaster头衔的Lyft计算机视觉工程师Vladimir Iglovikov发起了AMA,让我们一起去探寻他是怎么驰骋机器学习竞赛的。

Vladimir Iglovikov

大家好,我是Vladimir Iglovikov。

自从在大学拿到理论物理学的学位后,我就辗转到硅谷想成为一名数据科学家。我现在任职于Lyft的自动驾驶汽车部门,主要从事计算机视觉方面的相关应用。

在过去的几年里,我在机器学习竞赛中投入了大量时间。一方面,它非常有趣;另一方面,它也是提高个人数据科学水平的一种非常有效的方式。我不会说所有竞赛都很简单,也不会吹嘘自己在所有竞赛里都取得了不错的成绩。但有时候我也能触及巅峰,这是我最终能得到“Kaggle Grandmaster”这个头衔的原因。

在这里,我想感谢@Lasteg发起了这个AMA,并收集了Reddit、Kaggle和science.d3.ru(俄语)上的提问。大家的问题有很多,在下面,我会选择性地尽力做一些回答。

以下是我(本人和团队)曾参与过的一些名次还不错的深度学习竞赛:

第10名:Ultrasound Nerve Segmentation(超声神经分割)

第3名:Dstl Satellite Imagery Feature Detection(Dstl卫星图像特征检测)

第2名:Safe passage: Detecting and classifying vehicles in aerial imagery(安全通道:航空影像中的车辆检测与分类)

第7名:Kaggle: Planet: Understanding the Amazon from Space(Planet:从太空了解亚马逊)

第1名:MICCAI 2017: Gastrointestinal Image ANAlysis (GIANA)(胃肠内窥镜图像分析)

第1名:MICCAI 2017: Robotic Instrument Segmentation(内窥镜视野内机器人仪器分割)

第1名:Kaggle: Carvana Image Masking Challenge(自动识别图像中汽车的边界)

第9名:Kaggle: IEEE’s Signal Processing Society — Camera Model Identification(IEEE信号处理学会 - 相机模型识别)

第2名:CVPR 2018 Deepglobe. Road Extraction(道路提取)

第2名:CVPR 2018 Deepglobe. Building Detection(建筑提取)

第3名:CVPR 2018 Deepglobe. Land Cover Classification(土地覆被提取)

第3名:MICCAI 2018: Gastrointestinal Image ANAlysis (GIANA)(胃肠内窥镜图像分析)

问:除了数据,你有其他的生活吗?

是的,我有。

我喜欢当背包客和攀岩。如果你早晨也去旧金山的Mission Cliffs室内攀岩馆攀岩,下次见面时我们可以打个招呼。我也喜欢和人一起跳舞伴舞,特别是Blues Fusion舞曲,我经常光顾旧金山的Mission Fusion和South Bay Fusion。

旅游也是我生活中很重要的一部分。今年春天,我去了白俄罗斯、摩洛哥和约旦。9月,我又在芬兰、德国和奥地利度过了三个星期。当然,今年最好的体验还是黑石城的2018火人节。

问:你的身高和体重是多少?

6英尺(1米8),185磅(84公斤)。

我觉得这个问题的答案可能和锻炼有关,下面是我在校期间的一些力量举重数据:

最大卧推:225磅

最大深蹲:315磅

最大硬拉:405磅

问:你是怎么做到既拥有全职工作,又全天候参加Kaggle竞赛的?

在我眼里,参加Kaggle竞赛就是我的第二份全职工作(无偿),这么做的理由很充分——Kaggle上的活跃用户通常都在寻求转变,我也不例外。当我从学术界转向工业界时,我就开始参加竞赛。我需要一种有效的方法来测试ML算法是否适合解决一些潜在问题,需要用它来提升自己的工具使用熟练度,需要把我的思维方式扩展到机器学习的新世界。

后来,当我在Bidgely找到第一份工作后,我更加注重Kaggle竞赛的参与。那时我白天在做信号处理任务,晚上则彻夜沉迷在表格数据的竞争中。我其实没有很好地平衡工作和生活,但每分每秒获得知识量告诉我:这么做是值得的。

等到某个时间点,我知道自己已经准备好迎接新阶段了,我就跳槽到了TrueAccord,在那里,我可以做很多传统机器学习工作。但停止参加Kaggle还是不明智的。于是我把白天用来做传统机器学习,把夜间和周末用来做深度学习,工作与生活的平衡更糟糕了。尽管如此,我还是学到了很多东西,也顺势成了Kaggle Master。当我能在Lyft获得一份Level5的工作时,所有努力都得到了回报——对于深度学习而言,自动驾驶是一个非常重要的应用领域。

最后,现在的我并没有全天候参加Kaggle竞赛,但我还在努力学习。我的工作中有许多令人兴奋的计算机视觉问题,我正试图在Kaggle未涵盖的领域获得更多知识。当然,我还是会向各种竞赛提交自己的作品,但这主要是为了更好地理解参与者面临的问题和挑战。只有理解参赛者,我才能更深刻地从论坛分享的信息中汲取经验。

问:你觉得哪些日常安排可以帮你提升效率?你是怎么安排自己的一天的?

首先,我不确定自己是不是很有效率。:)我一直在寻找一种新的方法来优化我的日程。

在日常生活中,一个人需要做的事总比他想做的事多得多,而且它们还不一定是有用的、令人愉快的。这意味着我总要先考虑该做什么。有几本书对这个问题进行了很好的讨论,这里我把它们推荐给想提高自己效率的人:

So Good They Can’t Ignore You: Why Skills Trump Passion in the Quest for Work You Love

Deep Work: Rules for Focused Success in a Distracted World

在工作日,我会在早上6点起床,然后去攀岩馆攀岩,这有助于我保持身材和清醒头脑。攀完岩我就开车去上班。公司的自动驾驶工程中心在Palo Alto,这让喜欢住在城里的我有点忧伤。开车很有趣,但通勤很无聊。为了更有成效地度过通勤时间,我会在车上听有声读物。这不是说我在上下班途中可以专注于阅读,这些读物往往包含有用的非技术技能和商业导向,非常适合开车时听。

我也很想在工作和生活之间保持平衡,但目前还没做到这点——尽管我还是会花很多时间和朋友聚会或参加其他活动,不过幸好它们中的大多数是在旧金山举行的。与此同时,我还需要学习,需要保持在机器学习领域的竞争力。这不仅涉及我在办公室的前途,也影响着更长远的东西。所以我会在晚上花些时间阅读技术论文,编写竞赛、业余项目和开源项目的代码。

谈到开源项目,我想借此机会推广一个图像增强库。这是我和Alexander Buslaev、Alex Parinov、Eugene Khvedchenia从计算机视觉挑战工作中总结出来的。

最后,为了回答这个问题,我想我还是得提供一些具体的技巧:

比起MacBook,我更喜欢Ubuntu + i3——个人表现加成10%。

我不常用Jupyter Notebook,只会在做EDA和可视化时偶尔用用。模型的几乎所有代码都是我自己编写的,写代码工具是PyCharm,检查代码的工具是flake8,完成后再把代码托管到GitHub上。很多机器学习问题其实很相似,所以投资一个没有太多重复内容、更优质的代码库会有助于加快项目进度,让你赢在起点。

我会尽量手动编写单元测试。很多人都认可单元测试在数据科学中的重要性,但并不是每个人都会花时间来编写它们。关于这方面的内容,Alex Parinov写了一篇很好的文档,详细介绍了从简单到复杂的入门方法。如果你准备参加Kaggle竞赛,你可以先参考他的做法,在管道里添加更多测试。

目前我正在尝试用DVC进行模型的版本控制,我希望这能让模型管道和代码更具重复利用性。

我会避免过多地使用鼠标,有时候,这也意味着我得把设置好的热键写在纸上,把纸放在面前,然后尽可能多地使用它们。

我不用社交网络。

我每天只会查看几次电子邮件。

每天早上,我都会用Trello为自己创建这一天里可以完成的任务列表,然后尝试去完成它们。

我会避免让自己的一天过于碎片化,因为许多任务需要专注投入,过于频繁地转换焦点没有益处。

这些建议都很常规,但我实在想不起来自己有什么“独门”技巧:)

问:你是怎么追赶当前领域的技术前沿的?

我并不觉得自己赶上了前沿。如今机器学习领域正值蓬勃发展,我们有读不尽的论文、竞赛、博客文章和书籍。每当我遇到一个新问题,我就会专注于查看它的最新进展并进行深入研究。读懂解答后,我就会切换到下一个。因此,我在自己没有上手经验的东西上反而更贴近前沿,我个人觉得这一点倒是可以接受的。

与此同时,对于那些需要深厚专业背景且我有实践经验的地方,我也有一张问题清单,只是这份清单太长了,而且正在变得越来越长。这个事实让我感到安心,因为我的私人repo就像一个代码“百宝箱”,能让我在开始任何新机器学习任务时轻松上手。而且这也意味着对于许多问题,我已经实现了非常强大的管道,可以在下次遇到类似问题时加快进度。

我也参加NIPS、CVPR等会议,大会上展示的结果是对我们现在可以做什么、不可以做什么的风向指引。

问:几年前(比如4-5年前),非ML领域的Ph.D(如物理、机械工程等)在求职市场上可能有很大优势,但现在情况好像不一样了,如果一个ML工程/开发岗同时有两个人来应聘,一个是非ML方向的Ph.D,一个是ML方向的硕士,IT/ML行业似乎都更喜欢后者。你本人是物理学的Ph.D,之后转行到了机器学习,也许在这个问题上有更深刻的认识。

所以你对非ML方向的Ph.D转行机器学习这件事怎么看?他的学位有助于求职吗?和ML方向的硕士相比,这些Ph.D在求职中会有哪些优势?

这是个难题,我并不知道具体答案,但我会尽力说出自己的想法。

物理学是一门伟大的专业。即便我现在可以回到过去,在物理和CS之间重新做出选择,我还是会在明知自己会转行CS的情况下继续选择读物理。

当然,这么做的主要原因是我对物理学和自然科学很感兴趣。机器学习能告诉你我们身边这个浩瀚无垠、丰富多彩、趣味无穷的宇宙是怎么运转的吗?显然不行,但物理可以!而且它能做的不止于此!我从物理学转行机器学习的一个理由是门槛不高,因为物理作为一门专业,它教授的不只是量子力学、相对论、量子场论和其他高度专业化的知识,它也涉及数学、统计学和编程技能。这些知识是我轻松转到其他领域的重要桥梁。

物理能教会你以有条理的方式在严谨的理论和实验之间进行操作,这也应该是机器学习从业者的基本素养。如果一个人上不了大学,他是几乎不可能以自学的方式学会物理和高等数学的。这也使我坚信,深度学习的下一个重大突破将是机器学习与高等数学、物理、化学及其他前沿领域高度融合后的产物。毕竟现在计算机视觉任务要用到的数学只是大一水平。

以上这些都说明,数学并不是入门机器学习的门槛,从业者的过分“偏科”也正是数学、物理、化学和其他STEM学科的知识几乎无法被用于解决业务问题的原因,是这些专业的毕业生感到自己被背叛了的原因。他们都具备很多专业知识,甚至有博士学位,他们在学术界度过了很多年,但是都得不到一份有意义的高薪工作。

另一方面,现在编程技能在任何地方都必不可少,这也是当一个精通数学的人和一个会写代码的人同时求职时,雇主更喜欢选第二个人的原因。

但我相信情况会发生变化。不是现在,而在未来的某个时间点。重要的是大家需要先认清一个现实,就是你在大学里读的论文、上的课和你在工作中会用到技能可能不会直接相关。但这不会是一个大问题。通常情况下,你需要先了解工业界数据科学家/软件开发者的工作内容,如果实在没法在大学进修,你可以自学。很多从业者其实都是在工作后才学到那么多东西的。

就我个人经历而言,当我在研究数据科学的同时准备理论物理学论文时,找工作确实给了我不小的压力。我没有数据科学家这个岗位所必需的知识,也不懂硅谷的工作流程,更不了解企业对我的期望。就是这样一个一无所知的我,坚持不停把自己的简历一次次投递给不同的公司,经历了一轮又一轮的面试失败,并从每一次失败中学习经验,直至通过面试。

我记得有一次被问到论文写了什么,当时我用到了量子蒙特卡洛方法,于是试图向面试官解释它是什么、为什么要用它。听完我的叙述,面试官看着我问道:“这种技术能怎么帮助我们提高客户参与度呢?”

所以对于那些非CS专业人士来说,最有希望的方法是去旁听计算机系的数据科学课程,并在空闲时间自学数据科学和机器学习。幸运的是,现在有很多这方面的优秀资源。比如你可以在自己专业内找一个想在研究里采用机器学习方法的教授,或是去科技公司申请ML相关的实习岗,获得实习机会比直接拿到全职offer容易多了,也更容易转正。

一般来说,你不应该高估专业、大学对自己就业的影响。当一家公司雇用你时,他们的设想就是付给你钱让你帮他们解决所面临的问题。你的学位和专业只是评估你个人能力的一个指标。当然,如果HR没能从你的简历里看到想要的东西,你就很容易被筛掉,你可能建立的人脉网络——对求职很重要——也会出现断裂。但是,这不应该影响你选择什么专业。

也许我还是太天真了,但是一个人之所以会选择这个专业,不是因为它有高薪就业前景,而是因为你对这个领域充满激情。

问:你觉得数据科学/机器学习领域最有趣的问题在哪一方面?我已经完成了近半硕士学习,但却发现自己还没想好要深入哪一个子领域。我之前和人聊过这个问题,他断言未来最有前景的会是算法开发和scaling(刚好和数据科学/机器学习这种调用库的不同)。你对此有什么看法?或者你有什么关于灵活就业的建议?

我想说数据科学/机器学习领域中最有趣的问题远不是今天的主流问题。主流问题研究现在已经人满为患了——把机器学习用于信用评分、推荐系统、零售和其他任务——我们已经受够了把数据映射到资金。试想一下,如果你能把机器学习用于数学、物理学、生物学、化学、历史、考古学、地质学或任何其他人没有尝试过的领域,那么你可能就会发现自己的那一头Purple Cow(Yahoo前营销总监Seth Godin提出的概念)。

关于职业选择,和生物学、物理学不同,你在数据科学/机器学习领域学到的技能允许你轻松从一个领域转移到另一个领域。当然,开发银行/对冲基金的交易算法和开发自动驾驶汽车的算法不一样,但它们的差别也不是很大,只要基础过硬,你就能很快掌握必需技巧。

问:30岁非数学/CS背景的人搞机器学习是不是太晚了?还是刚好能赶上末班车?如果能赶上,你觉得最低要求是什么?

当然为时不晚。机器学习里有近90%的技术只要求大一的数学知识,所以你不需要多精通数学。数据科学中使用最广泛的语言是Python和R,它们都是高级语言,可以轻松上手。

我建议你可以适当上一些在线课程,并开始研究Kaggle竞赛。虽然很多概念听上去很陌生,但只要你有足够的恒心和决心,一切都会水到渠成。

和年龄相关的两个典例:

Kaggle Grandmaster Evgeny Patekha:四十岁才开始数据科学生涯

Kaggle Grandmaster Alexander Larko:五十五岁才开始参加Kaggle竞赛

问:你觉得技术领域的正规基础教育对于在数据科学和Kaggle竞赛里取得成功很重要吗?你有没有遇到过反例?

有用是肯定有用的,但也有很多人虽然没怎么接受过基础教育,在竞赛里仍然取得了好成绩。一个典型的例子是Mikel Bober-Irizar,他是Kaggle Grandmaster,但还在念高中。

另一个值得关注的点是,你在Kaggle上学到的技能只是你在工业界、学术界工作时所需技能的一小部分。对于那些没有涉及的知识,基础教育可以为你提供。

总而言之,即便你高中肄业,你也可以横行Kaggle。

问:在不租用云服务器的情况下,我能用家里的电脑训练出高分竞赛模型吗?

我从不在竞赛里用云服务,但我家里确实有两台性能相对较好的电脑。其中一台装了4块GPU,另一台装了2块。虽然没有好的硬件条件也能在Kaggle上取得好成绩,但缺乏算力会限制你检验想法的次数。检验的想法越多,最终成绩可能会越好。所以如果你得用每周7天、每天24小时训练模型,我还是建议你投资一下硬件。

同时,拥有一台功能强大的机器是不够的,你也需要会编写可以充分利用它的代码。

我从Keras换到Pytorch的原因之一是PyTorch中的DataLoader在当时更好用

由于imgaug(图像增强Python库)太慢了,我们写了albumentations,把CPU利用率提到了100%,同时GPU还有富余空间

为了加快硬盘上jpeg图像的I/O,我没有用PIL、skimage和OpenCV,而是用了libjpeg-turbo和PyVips

问:你对数据科学新手参加Kaggle有什么建议吗?你觉得哪种竞赛更适合他们?

参加Kaggle的入门教程有很多,但据我所知,其中最有效的应该遵循以下流程:

观看一些涵盖python编程和机器学习基础知识的在线课程。

在Kaggle上挑选一个竞赛,如果你能写一个端到端的管道进行数据映射,那再好不过。但这对新手来说可能有点难,所以你也可以照搬别人共享的kernel。

在PC上运行模型,生成提交,并在Kaggle排行榜上找到自己的排名。在进行这些步骤时,你可能会第一次感受到操作系统、驱动程序、库版本、I/O问题给你造成的困扰,你得尽早开始习惯它。如果这时你还不了解kernel是什么,没关系。

调参(盲目也行),重新训练模型并提交预测结果。不要担心,你的竞争者们都在对模型进行反复优化,期望得到更好的结果。

接着就是学会有技巧地调参,在这个阶段,你就要开始掌握机器学习的工作原理和基础知识,把研究添加进实验中。学习的方向有很多,其中第一种是上mlcourse.ai、CS231n这样的在线免费课程,阅读书籍,学习高等数学、统计学,学会如何编写更好的代码。第二种是尽快掌握和你想要解决的问题相关的术语,专注于它们,更高的Kaggle排名就是你最好的动力。但是切记不要在研究与实验之间做出选择——它们必须同步进行。机器学习是一门应用学科,不要把它当成纯粹的课本知识:没有实践的理论是愚蠢的,没有理论的实践是盲目的。

比赛结束后,尽管你付出了很多努力,但最终结果可能并不好。不要气馁,这是意料之中的。你应该多看看论坛,阅读获奖者分享的解决方案,尝试着让自己有所提到。等下次再遇到相似问题时,你的起点会更高。

在其它竞赛中重复上述过程,你就可以获得高分,更重要的是,你积累到了任务、竞赛经验和大量代码和管道。

问:你对Kaggle有些竞赛发生数据泄漏有何看法?你觉得利用这个漏洞合乎道德吗?

我得承认,组织比赛是一件非常困难的事,所以当泄漏被发现时,我不会苛责组织者。而且对于参赛者利用数据泄露这种行为,我觉得可以接受。虽然数据泄露会有损竞赛的公平性,但它对我个人的影响只是我不能把这个竞赛中学到的东西放到类似问题中。我认为Kaggle的管理人员需要创建一个可能会发生数据泄漏的竞赛清单,并在竞赛开始前认真检查数据,防止同样的问题一次又一次地发生,我相信他们正在努力解决这个问题。

问:作为数据科学工程师,你觉得参加Kaggle竞赛有多大用处?

这很难说。参加Kaggle竞赛能在一些关键但非常狭窄的领域提升你的技术水平。它往往考量多种技术的组合使用,所以对一些岗位可能是非常有益的。但它不是万金油,就我现在从事的自动驾驶汽车领域而言,我从Kaggle上学到的东西只能作为从其他渠道学到的技能的一种有力补充。

同样的,也许你的竞赛技术水平扎实,但那还远远不够。很多东西你需要在行业内实践过才会懂。

成为Kaggle Master并不是必要的,这个头衔也没法证明你会在工作中表现出色。但与此同时,我相信如果一个人是Kaggle Master,他应该能通过HR筛选,得到一个面试机会。

问:如果一个人没有数学/CS或其他涉及高等数学学科的教育背景,他在Kaggle竞赛中的上限是多少(以及更广泛的数据科学领域)?激情和欲望能让一个人走多远?

如果你目标明确而且有很强的学习意识,那无论是Kaggle竞赛还是数据科学领域,你一定会到达顶尖水平。最艰难的一步始终是第一步,今天,现在,马上去做!不要说明天,因为明日复明日,那意味着永远不会行动。

我看了所有问题,没有人问我该怎么找到一个可以帮助自己取得更高排名的人,但我认为这一点很重要。解决这个问题最常见的方法是找一些同样对这个竞赛感兴趣的朋友/同事,大家一起讨论、开会、分享问题甚至组成团队。然后有些人要忙这个,有些人得忙那个,虽然团队成绩也许还挺好,但它肯定也就止步于此了。

我有一种更有效、更好的办法:

编写自己的管道,或是直接复制粘贴论坛上共享的管道

让管道以适当的格式把输入数据映射到提交的文件中,并生成交叉验证得分

验证交叉验证带来的得分变化是否和排行榜上的排名变化一致

进行探索性数据分析,阅读论坛帖子、论文、书籍和以前类似竞赛的解决方案,所有这些工作都要独立完成

在某个时间点,比如竞赛结束前的2-4周,这时你会被卡住。你尝试了所有可以想到的办法,但始终提高不了排行榜名次。你需要一个新的想法来源

这时你可以在自己的“分段”找一些比较活跃的参赛者,和他们交流

首先,哪怕只是上涨了一点点预测平均得分,那都可能带来名次上的显著提升;其次,你和别人用的方法可能不一样,分享一些已经尝试的、未曾尝试的方法很有帮助;第三,因为竞争最初是针对每个人单独进行的,所有人都看了数据、编写了管道,所有人都把竞赛置于其他活动之上,此时大家的竞争意识更强,也更可能刷新排行榜。

但更重要的是,人们往往会高估他们在竞赛上的付出,低估他们在拥有稳定的管道前会出现的问题数。排行榜就是一个筛选同伴的过滤器,能让你和你的潜在队友处于同一位置。

在一些竞赛中,特定领域的知识也对良好结果有很大作用,比如有时如果团队里有一个不太懂数据科学,但是能看懂医学成像的人,他也能发挥很大作用。但这种情况相当罕见。

在这里,我想感谢所有我有幸结识并成为队友的人们,你们在竞赛中让我领悟颇多:

Artem Sanakoeu,Alexander Buslaev,Sergey Mushinskiy, Evgeny Nizhibitsky,Konstantin Lopuhin,Alexey Noskov,Artur Kuzin,Ruslan Baikulov,Pavel Nesterov,Arseny Kravchenko,Eugene Babakhin,Dmitry Pranchuk,Artur Fattakhov,Ilya Kibardin,Liam Damewood,Alexey Shvets,Anton Dobrenkii ,Selim Seferbekov,Alexandr Kalinin,Alexander Rakhlin。

如果你还有其他问题,欢迎在原文下留言评论(需翻墙)。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分