第01课:进阶“深度学习”的问与答

第01课:进阶“深度学习”的问与答

在入门或者进阶深度学习的时候,很多人都会存在各种各样的疑问与迷惑。本课程的初衷也是希望能帮助大家答疑解惑。在开始学习深度学习之前,先明确几个观点,解决一些疑惑。这里,我针对曾经遇到的大多数入门者经常会遇到的问题,这里进行了总结。后续再发现更多的问题,会进一步完善。

我总结了以下几个问题,这也是知乎等各个平台了很多人关心的问题:

  • 深度学习是否可以快速入门?
  • 深度学习是否需要学习理论和公式推导?
  • Fork 了很多源码和 Demo,却没什么进步?
  • 源码读不懂,复现起来很难,怎么办?
  • 学完之后,依然找不到实习工作?
  • 关于深度学习,面试会问哪些问题?

接下来,我们针对上述问题,分别展开回答。

1. 深度学习是否可以快速入门?

对于这个问题,我们首先看一下,入门深度学习,你需要学点什么(假设已经具备 Python 编程基础、高数、线性代数、概率统计的基本数学基础)。

如果你能够坚持看完周志华所著的机器学习入门教材《机器学习》(俗称“西瓜书”)、深度学习基础教程《深度学习》/《Deep Learning》、Caffe 教程《深度学习:21天实战 Caffe》、TensorFlow 教程《TensorFlow 实战》这四本书,相信这时你已初步具备了深度学习的基础,接下来就是特定领域的深入探究。比如,如果想要进行计算机视觉方面的研究,首先需要掌握目前各种各样的卷积神经网结构,于是又需要花费至少两周的时间了解从 LeNet 到 ResNet 再到 mobileNets 等等卷积神经网,具体可以看下表。

深度网络名 年份 作者 描述
LeNet 1994 Yann LeCun 简单卷积神经网
AlexNet 2012 Alex Krizhevsky 2012届图像识别大赛的冠军
ZFNet 2013 Matthew D Zeiler 可视化
Net in Net 2013 Lin M 网络嵌套模型
VGGNet 2014 牛津大学的视觉几何组 ILSVRC-2014中定位任务第一名和分类任务第二名
GoogLeNet 2014 Google ILSVRC14 比赛中获得冠军
Inception-v2/v3 2015 Google 小卷积代替大大卷积
ResNet 2015 MSRA 何凯明团队
Stochastic_Depth 2016 Gao Huang 随机深度
Wide ResNet 2016 Sergey Zagoruyko 考虑宽度网络性能
Inception-ResNet V1/V2/V3 2016 Google 融合 resnet 和 inception 结构的网络
ResNet in ResNet 2016 Sasha Targ 泛化的 resnet 网络结构
Fractalnet 2016 Gustav Larsson 分形结构
ResNeXt 2016 Saining Xie 减少参数
DenseNet 2017 Gao Huang 稠密网络
DPN 2017 颜水成 结合 resnet 和 densenet
PyramidNet 2017 Dongyoon Han 金字塔+resnet 网络
SqueezeNet 2017 伯克利&斯坦福的研究人员 网络压缩
MobileNet V1/V2 2017 Google 精简网络
ShuffleNet 2017 旷视科技 精简网络
SENet 2017 Momenta 精简网络+imageNet2017 冠军

学完这些卷积神经网,这时候你一定会发现大多数深度学习会更关注某一领域,比如:检测模型、分割模型、关键点等等。于是又一堆的 Paper 袭来。因为你需要阅读最新的 Paper,了解最新的技术,以检测网络为例,

学完这些,才真正的算是深度学习入行了,对于一些其他的深度学习任务,你可能需要花费单独的时间再去了解研究。

相信看到这里,大家已经明白,“深度学习能否快速入门”这一问题的答案。当然是不能。我在网上也看到过很多这样的网络教程,标题大多以“快速入门,快速精通”等等为标题,整个课程的时间也在很短的时间之内能够完成。相信,如果大家购买课程,并认真学完,一定会有所收获,但短时间内成为一名合格的算法工程师,是不现实的。这也是很多人会在学完课程之后,很难找到工作的一个主要原因。积累不够,内行人或者说面试官是很容易识破的,因此,希望大家在学习这些课程的时候,端正好自己的心态——深度学习是很难短时间速成的,我们需要打好基础,才能够在这一领域走得更远。这也就涉及到了我们的下一个问题,深度学习是否需要学习理论和公式推导?

2. 深度学习是否需要学习理论和公式推导?

答案一定是肯定的,理论基础是必须的,也是决定你以后是否具备核心竞争力的一个重要因素,也决定了你网络创新的能力有多强。很多学习深度学习的人,为了速成,会忽略基础的积累,直接上手 Caffe 或者 TensorFlow,开始调包之旅,对于这些模型背后的理论一知半解,或者从一些博客上随便看看。

曾经面试过一些深度学习岗位的求职者,在问到一些背后理论问题的时候,经常会收到的答案是“这个我从知乎上某某地方看到过……”。从这个答案我只能够看到你关注了一些知乎的大 V,可能收藏了很多这样的文章,然而,并没有认真得思考过为什么。一般这种求职者,都会被贴上一个“基础不扎实”的标签,往往也很难成功拿到 Offer。

为什么需要学习理论和公式推导?我总结出原因有以下几点:

  • 面试必考

对于大多数面试官而言,不仅仅想听你讲故事,因为很多你做的事情,在面试官看来都是比较容易和基础的事情。在看到你的简历上项目的名字的时候,大致就已经猜到项目的内容和所用到的方法。因此,在和面试官交流的时候,他会更在意求职者是否具备扎实的基础,而这些更能反映求职者的学习能力和认识问题的深度。这些在后续工作中,会反映你可能更具备解决和处理问题的能力。因此,扎实的理论基础,往往会更容易赢得面试官的青睐。

  • 同事之间的交流

如果你准备从事算法工程师工作,那接下来你的同事一定也是一群可爱的算法工程师。而在工作之中,难免会遇到同事来和你讨论一些论文,一些新的理论和方法。此时,如果不具备扎实的基础,仅仅只会调用一些模型的话,很容易在同事心中造成不好的印象,尤其是领导。如果大家都认为你水平一般的话,相信在接下来的工作之中,一定会产生很多不利的影响。

  • 工作中网络结构的不断创新的能力

结合自己长期从事算法工程师这一岗位的实际情况来看,有些时候,我们不仅仅需要会调用现有的模型,甚至会由于各种各样的原因,不得不实现一些底层的东西,比如:解决硬件上对于某些层不支持的问题。这时候,当然需要你具备较好的工程基础,同样更需要对于原理和源码的深入理解。另外,在实际工作中,很多时候现成的网络结构并不能满足性能要求的,需要我们自己去设计、实现一些精简的网络结构。没有扎实的基础,也就很难在工作上做出重大贡献。

因此,希望大家都能够做到“知其然,也知其所以然”的程度。相信做到这样程度,一定能找到心仪的 Offer。

3. Fork 了很多源码和 Demo,却没什么进步?

很多人会在私下里微信问我这样一个问题——在 Github 上 Fork 了很多的源码,也跑了不少的 Demo,却依然感觉自己的深度学习技能没有得到太大的提升,很迷茫,不知道接下来怎么去做。

这时候,我通常会问他们,除了配置环境、跑 Demo,你还有尝试和去做下面几件事情吗?

  • 阅读作者的源码,了解它的基本思想的同时,了解代码实现的思想?
  • 尝试在作者源码的基础上,进行一些改进,来提升作者算法的性能?
  • 阅读作者的英文论文,了解关于这一方法的其他同类文献?
  • 参加一些领域的公开比赛或者天池的数据大赛?
  • 有没有尝试将这些方法迁移到其他的问题中?
  • ……

很多人听完这一系列问题之后,才会发现,自己原来还有这么多事情没有去做。其实,Fork 代码,运行一些 Demo 这仅仅是展开深度学习研究的第一步,后续还有太多的事情需要我们去进一步完成。相信做完这些事情,你再也不会觉得自己没有进步了。

4. 源码读不懂,复现起来很难,怎么办?

阅读源码就带来一个很重要的问题,就是源码读不懂怎么办?很多读者也会因此而感到挫败,或者干脆怀疑自己是否适合继续从事算法的相关工作。其实,就算是我,也会遇到很多源码读不懂,很多文章很难复现的情况。这里给大家提供几个参考的建议:

  • 关注核心代码, 相比于框架类代码,核心代码才是我们更应该关注的地方,甚至是改进的地方,因此,从核心代码出发,往往会将代码阅读的难道降低;
  • 配合文章阅读代码, 很多人不喜欢阅读英文的文献,其实这是十分错误的一个思想,往往配合文章一起来阅读代码,你会发现,代码理解起来会容易许多;
  • 难啃的骨头可以放一放, 如果经过自己的各种努力,依然有一些代码没有读懂,那就先放一放,在以后有更多精力的时候再去阅读,尝试去理解它,这里大家一定不要觉得没看懂这些源码,就等于算法不理解;
  • 多与人交流, 虽然很多人可能会很不情愿和你讨论源码,毕竟有可能他也没看过,但多一个人讨论,终究可能会多一些不同的理解与发现;
  • 日常多记录, 经典的代码实现一定要多多记录和收集起来,以后自己在工作和学习中,很容易就遇到了。这会给你带来很多帮助。

5. 学完之后,依然找不到实习?

关于实习的问题,也是很多读者最关心的问题之一,很多人,在学习完深度学习的课程之后,发现去面试的时候,依然很难找到工作,这也使得很多转行做深度学习朋友产生很大的挫败感,甚至怀疑自己是不是适合这一行业。也有朋友会向我咨询这方面的问题,我觉得有必要关于此问题,提醒大家需要注意以下几点:

  • 理论基础是否扎实。 关于理论基础的重要性,在上文中已经进行了阐述。大家谨记,仅仅通过看视频获取基础理论,是远远不够的。很多人在看完 Ng 的机器学习课程以后,会觉得自己已经入行机器学习了,实际上,这些还远远不够,你仍需要补充大量的理论知识,包括数学、编程、深度学习模型,以及阅读大量领域相关英文文献;

  • 具备实际的项目经验。 这里的实际项目指的是利用深度学习解决过一些实际的问题,而不是跑过 mnist,cifar 这样的数据集;

  • 是否发表过高质量的论文。 注意这里指的是高质量,至少 EI、SCI 检索的论文。如果有能力,可以考虑顶会和顶级期刊的论文;

  • 是否有过竞赛的经历。 很多人会说,自己转行过来的,并没有机会去发表论文,或者导师没有相应的课题,那怎么办?这时候,你可以考虑去参加天池数据大赛、Challenge AI 挑战赛等等,目前国内外,有很多很多这样的公开比赛,或者在公开的数据集刷榜。这些都是无门槛,任何人都可以参与的,靠这些为自己的简历镶金,何乐而不为呢?

  • 计算机基础知识是否扎实。 很多算法面试,比如 BAT 这些大厂 ,会更加看中你的计算机基础是否扎实,会考察一些 ACM 类型的题目。关于计算机素养的考察,希望大家能够经常去 LeetCode 这样的平台刷题,来提升自己的思维和编程能力。

6 .关于深度学习,面试会问哪些问题?

最后,我们再看一下,深度学习的面试会遇到哪些问题,希望大家能够有针对的进行准备和培养,相信,大家也会更容易找到自己心仪的 Offer。这里我总结了一些,供大家参考:

  • 代码题(LeetCode 类型)。主要考察数据结构和基础算法,以及代码基本功。大家在找工作之前,一定要刷一些题;
  • 机器学习基础。推荐大家阅读周志华老师的西瓜书、Ng 的机器学习课程和李航的《统计学习方法》;
  • 深度学习基础。推荐大家阅读《Deep learning》花书;
  • 编程语言。推荐 Python+TensorFlow+Caffe;
  • 充分准备做过的项目。尽量准备一些不同的项目作为亮点展示给面试官;
  • 阅读 CVPR、ICCV、ECCV 上相关领域的最新 Paper,甚至可以和面试官探讨;
  • 调整好心态,不要急躁,也不要灰心,坚持找,相信最终一定能拿到好的 Offer。

最后,向大家推荐一些深度学习的面经:

结束语

我相信每一个想要从事深度学习算法工作的人,都心怀一颗不甘的心。我也希望大家能够发挥自己的最大努力,去提升自己,多从自身找原因,发现自己的不足,而不是抱怨面试官的不公。相信,千里马终将会遇到伯乐,如果现在还没有,那一定是你跑的还不快,仍需要加油!

最后,祝每一位即将从业者,都能够找到一份心仪的 Offer。

上一篇
下一篇
目录