实习商汤,校招华为,我的深度学习之路

人工智能头条 2018-11-20 13:56
关注文章


最近听说现在国内外一线互联网巨头,包括后起的独角兽,对 AI 人才的需求非常大,Google、Facebook 为了抢 AI 人才都快 battle 起来了。


然而实际上,AI 岗位还是面临僧多粥少的窘境。其中一个非常关键的问题在于,真正掌握 AI 知识技术的人才,还是非常稀缺。

那么如何能够成为 AI 人才,又如何能够被抢呢?是很多人都非常关心的问题。人工智能头条的后台也经常能够收到很多类似的留言。

所以禅师联系到了曾在商汤实习,目前校招选定华为的小伙伴,谈谈他是如何在深度学习这条路上,一步一步往深度走的。


本文适用人群:非计算机、非 AI 专业的同学,或刚接触该专业的本科、硕士生。

作者介绍:

沿途的笔记。西安电子科技大学人工智能学院研三学生,发表论文两篇,拥有目标检测、图像匹配、高光谱图像分类 3 项专利。遥感领域国际竞赛取得第一名


自 2016 年阿尔法狗问世以来,深度学习的地位无论是在学术界还是在工业届都逐步攀升。

从事深度学习岗位的工程师们的薪水也水涨船高,拿今年秋招各大互联网巨头给应届生的待遇便可见一斑。



重赏之下,必有勇夫。所以很多学数学、机械等其他专业的同学也想转行加入深度学习的大浪潮。

与此同时,过剩的人才也导致了该领域的竞争空前激烈,更有甚者传出某企业的 CV 算法岗投岗量与 HC 比达到 100:1。

下图是某四个知名互联网企业简历投递量与 HC 比:


目前关于深度学习入门、进阶的教程也很多,琳琅满目。很多大牛写的内容,对新人来说,经常显得太深奥。

很多刚入门的同学们、从其他行业转行的开发者,往往是一脸懵逼的进去,又一脸懵逼的出来。

于是我决定,自己的实际情况出发,以自己的学习经历、心得和里程,写一篇针对性很强的文章。

入门

素材:精准简洁,切忌贪多

刚接触深度学习的同学,很容易陷入一个死结:“贪多”。

网上到处搜笔记搜资源,看见“机器学习”“人工智能”…的群就加。特别热衷于搜集类似于“机器学习从入门到精通”、“XXX 大学机器学习公开课”、“X 百 G 的深度学习资料一定要收藏”…

先不说这些资源的完整性,单就内容量来讲,这几十个 G,甚至是几百 G 的学习资源,也会让人晕头转向。

(禅师插个嘴,其实就想想你硬盘里那几十个 G 的视频,你有没有看完。这些学习资料,你就能看完了?)

因此,选择精准的入门教程非常关键。

我推荐的视频资源有:

  1. Coursera 上的吴恩达的《机器学习》

  2. Hinton 的 《Neural Networks for Machine Learning》

推荐的书籍:

  1. 周志华老师的《机器学习》

  2. Ian Goodfellow 的“花书”《深度学习》

这一部分主要是用于夯实基础,了解相关的概念。虽然本文的主题是深度学习的学习历程,但机器学习与深度学习有着千丝万缕的联系,最好还是要一起看一看。

上面所提到的资料不要觉得看一遍就完事儿,一定要多看几遍,即使有实战经验之后也可以反复看,保证你每看一遍都会有新的体会。

勤做笔记,动手推导

在学习上面我推荐的两个视频资源及书籍的时候,会涵盖高等数学、矩阵论、凸优化、概率统计等知识。

我们需要熟悉的机器学习和深度学习理论包括:


重要理论上的数学推导,一定要一步步的验证!

能根据书本(或视频)一步步走下来。遇到知识盲点、遗忘的部分,就针对性的查阅资料,力争不放过任何重点。

这里需要提醒的是,不建议从头开始学习数学知识,因为时间周期太长,中途可能仍会遗忘。可以在实际问题涉及到的时候,随时查阅。

好,恭喜你,你已经一只脚踏进了深度学习的大门。

确定研究领域后,就可以开始混迹相关网站、论坛。然后开始着手学习经典主流深度学习算法。

进阶:从经典主流内容下手

等你真正进入大门后,你就会发现,深度学习实在是一个非常庞大的系统,涵盖的知识面很广,那么我们该从那个方向下手呢?

答案是:

  1. 内容,选择经典主流

  2. 方向,选择自己感兴趣的

为什么要强调经典主流呢?因为新出的论文,太容易遇到水论文了。无论什么领域,经过时间积淀下来的东西,才是好东西。

相反,经典主流的东西,理论完备,积累的资料多,研究的人多,碰到问题也相对容易找到前辈的解答。

为什么选择自己感兴趣的方向呢?还不是因为兴趣是最好的老师!

例如如果你比较感兴趣 CV,就可以从 CV 的目标检测为切入口。然后再深入一线去看相关论文。

以 CV 中的目标检测为例,它的发展历程如下图所示:

目标检测发展史👆

现阶段在视觉顶会上,关于目标检测的文章就已经很多了,短时间内根本不可能全部吃透。

所以要有针对性的重点进行突破,其实很多算法都是触类旁通的。比如👆上图中红色内容所表示的算法需要精读,其他检测算法了解即可。

更具体的,了解传统 DMP 算法及主要缺陷,然后 two-stage 思路发展到 RCNN 做出了哪些改进。

再到 SPP-Net 做了哪些改进,然后到 Fast-RCNN、Faster-RCNN 又改进了什么?以及 one-stag 思路中 SSD 系列、YOLO 系列之间的差别。

恭喜你,你已经正式踏上了深度学习这条不归路了。

实操

解决问题

上面提到需要重点精度的论文,由于我们自身水平有限,而论文受到篇幅限制,没办法把细节都解释清楚。

这就导致我们再实操过程中,会遇到很多问题。遇到问题不可怕,我们可以从下面两个方向入手解决:

  1. 在相关论坛搜集高手们对该论文的解读

  2. 阅读论文开源代码

还解决不了的,Google、论坛、博客、人工智能头条的股东粉群……

你会发现,你遇到的问题,别人可能早就遇到并且得到解决,这样就事半功倍啦。

总结经验

问题解决之后,应该做总结,便于巩固理解,加深印象。

尤其要做的是,找出论文各部件之间的差异,分析这个差异是“改进”造成的差异还是由于对主体算法“因地制宜”而造成的差异。

比如,YOLO 和 YOLOv2 之间,bbox 的回归计算方法是不一样的。我们要体会作者的初衷,不断去靠近这些大神们的思路。

再比如,Faster-RCNN 和 YOLOv2 虽然均是有事先 Anchor Boxes 来对 bbox 做回归,但是回归的计算方式也不一样,这就是由于这两个 Anchor Boxes 的由来不同导致的。

Faster-RCNN 是由三种宽高比、三种尺寸形成的 Anchor Boxes,而 YOLOv2 则是由先验框聚类得到的。

将这些细枝末节以图表,文字的形式总结起来(可以写在 CSDN 或 GitHub 上,也可以写在纸质版笔记本上),能够有助于我们找到一些算法的改进空间或者一些新的灵感。

选择合适的框架

对于重要的论文文章,光看是远远不够的,我们还得学习其工程实现。

一来是编程复现论文算法有助于加深理解,二来是可以将我们所学知识转化为生产力。

下图是某机构对各大深度学习框架的综合评估。


这里重点推荐 TensorFlow 和 PyTorch,因为它们不仅灵活性高,而且背后有强大的团队维护,可查阅的文档也很丰富。

当选定一个深度学习框架之后,应当通过具体工程实例去学习,而非直接去阅读源码

遇到一些常用的或者复杂的函数用法,要总结到个人博客中。

更重要的一点是,要时常混迹于 GitHub 之中,将 star/fork 数量较多的、且与自己研究方向相近的代码 clone 下来去练习,学习大佬们的编程风格。

讲真,好的编程习惯写出来的代码简直是一个非常愉悦的艺术享受,这里切记自己闭门造车,一定要多读大神们的代码。

这里拿 TensorFlow 举例。先去看 TensorFlow 文档,接下来看《TensorFlow 实战 Google 深度学习框架》,然后是《TensorFlow 实战》。注意别弄错了顺序,前面那本书稍微简单点,后面那本书主要是 demo。

待到 TensorFlow 能够灵活运用的时候,我们就得学习调参技巧了,这里推荐魏秀参的大作《解析深度学习网络——深度学习实战手册》(当初看这本书的时候,感觉自己的很多想法都与大神在这本书中提到的结论一致,感觉能与大神想到一起,真是十分开心)。

实战演练,paper 复现

当自己的编程能力、使用深度学习框架的能力达到一定水平后,我们要进入实战演练阶段:复现经典论文。

刚开始可能会比较难,所以我们可以先从论文作者或者热心同行们开源的代码入手。具体步骤是:

  1. 浏览开源代码,比对代码与论文描述是否一致,代码是否对自己更进一步理解论文有所帮助

  2. 调试代码。建议初学者不要囫囵吞枣,只是“看”代码,还要一步步调试,看各个函数的用法,学习各种编程小技巧,验证每步的结果与自己在“大脑编译”的结果是否一致

  3. 动手复现。复现之前,可以先根据开源的代码画一个程序框图,然后根据框图逐次实现。然后将自己编写的代码调通,对比开源代码看看有哪些差距。一般差距主要体现在:代码的简洁性和功能的完整性。

  4. 重复第 2、3 步,直到自己能一目十行阅读开源代码,能掌握每个地方的编程技巧,复现出来的代码与开源代码基本一致,且能与论文对应的上的时候,这篇文章可以算是吃透了。

延伸

专注自己的东西

当自己复现的论文达到一定数量之后,编程水平会得到一个飞跃的提升。这时,我们要将自己从一个“学习者”的角色转换到“模仿者、改进者”的角色。

一方面,我们要整合自己已经吃透的论文(包括代码),另一方面,我们要与时俱进跟进前沿研究,跟着大佬们“分一杯羹”。

经典文章和新论文两手抓

到了这个阶段,我们就不仅仅只读经典的文章了,还要开始接触新领域,新文章。我们千辛万苦学这么多东西,最终就是要有产出。

对于很多年前的研究课题,它们只能帮助我们夯实基础,提升基本功,并不能有助于我们发表属于自己的论文或者专利。

因为这些经典主题,早就被前辈同行们嚼烂了,只剩下骨头渣了。

碎片化阅读

当我们对深度学习领域坚持学习到一段时间之后,总会收藏一些自己感兴趣的论坛、专栏,以及大牛们的个人主页,他们会分享一些最新的经验或者研究成果。

对于这些经验成果,我们可以选取自己感兴趣的或者与所研究领域相关的部分重点阅读(而不是全盘通读,这样太浪费时间)。

比如前一阵子吴恩达分享的《Machine Learning Yearning》里面有些实战经验就很值得学习。

学会辨别新出来的好论文

对于年代较为久远的论文,我们可以通过文章的索引量或者开源代码 star 数量的多少来判断其是否值得读。

对于新出炉的论文,我们可以去相关论坛看大神们的推荐(如关注一些知乎上的大 V 们,他们会经常在专栏里推荐一些新出炉的好文章)。

还有一些高质量的公众号,论坛等。

将这些新文章里的 idea 与自己储备的基本知识相互碰撞,寻找一切可能产生的关联,或者找到新文章 idea 的不足,自己能加以改进。

发表属于自己的文章

当经典文献和新文章积累到一定程度时,我们一定会有一些自己的想法。这时候就需要我们扎实的代码功底,将我们自己的想法实现出来。

对于新手,我觉得有这样几种情况可以视为自己的成果发表成论文:新问题用老方法,老问题用新方法,改进他人的新方法。

然后将自己的 idea 及实验结果向导师汇报,让导师帮忙将自己的 idea“润色加工”,就可以愉快的发 paper 啦。

总结

本贴是对我个人学习深度学习历程的一个总结,更偏实际应用。

如果自己时间充裕,且导师愿意放人的话,可以去一些科研氛围浓厚的企业实习,如商汤科技、Face++、地平线、阿里达摩院、腾讯 AI Labs 等。

笔者曾有幸在商汤研究院实习过一段时间,当真是人才济济,被组内的小伙伴渊博的知识,敏捷的头脑所折服,对提升自己的见识水平大有裨益。

但如果找的企业太偏向业务,我个人认为还不如呆在实验室多做做科研,多发几篇论文来的实在。在大神们创造的理论框架下,千锤百炼、精益求精,就一定能有所收获。

我整理过的一些重要书籍,LeetCode 刷题代码,以及面试经验等,详见

https://github.com/computervisionlearner/Start_DeepLearning

微信扫一扫
关注该公众号

文章被以下专辑收录
3844
{{panelTitle}}
支持Markdown和数学公式,公式格式:\\(...\\)或\\[...\\]

还没有内容

关注微信公众号