深度学习工程应用快速入门

课程介绍

伴随人工智能时代的到来,深度学习技术也发挥着越来越重要作用,越来越多的技术人才开始投身入这一行业中,并希望发展成为一名深度学习算法工程师。然而,在实际的工程设计中,深度学习研发者总会面临着各种问题与困惑,比如:

  • 我们在设计深度网络的时候有什么技巧和原则吗?
  • VGG、ResNet 网络如何应用在实际的芯片上?
  • BN 层应该放在哪里比较合理?
  • 网络越深越好还是越宽越好?
  • 训练时如此多的优化方法,一定是 SGD 吗?
  • 学习率怎么调比较合适?
  • 模型迁移、模型剪枝、模型压缩、模型精剪设计,这些该如何去实践?
  • 序列问题中的 RNN 网络,怎样设计才能够确保网络更好、更快的收敛?
  • Siamese、Triplet 这样的网络要怎样训练?样本怎么处理、挖掘?
  • ……

本达人课,将针对上述问题进行一一分析与解答。主要针对机器学习初学者、深度学习入门者以及其他想从事深度学习相关工作的从业者,内容涉及到深度学习的基本概念,模型原理,不同类别的网络模型,模型设计的基本原则、训练、优化、模型精简等不同方面。另外,本课程还通过实际的网络设计,结合相应的原则来解决分类任务、序列任务等,带领大家深入理解网络设计的基本原则和方法,并锻炼深度学习编程能力和技巧。

本课程共包括22个课时,分为四大部分:

  • 第一部分(第01-02课),带你初步认识深度学习以及如何进阶深度学习。
  • 第二部分(第03-14课),从工程实践的角度出发,详细介绍深度学习中涉及到的各种各样的概念、原理,重点讲解在工业实战中的使用技巧和原则,帮助大家打好的深度学习工程实战基础。
  • 第三部分(第15-20课),从实际工程的角度出发,详细介绍卷积神经网、循环神经网的发展历程、工程设计原则和方法,并带领大家一起设计一个精简的深度网络,并用于目标检测任务。
  • 第四部分(第21课),作为课程的最后一部分,我们将对整个课程做总结、回顾与展望。

作者介绍

王学宽,曾就职于海康威视研究院担任计算机视觉方向算法工程师,发表多篇学术论文、申请多项国家专利,参与多项图像、自然语言项目相关课题研发工作,在计算机视觉领域具有深厚的专业知识和工程开发经验。运营有公众号:白话机器学习(微信号:simpleml90hou),开设有知乎专栏:《深度学习干货铺》

课程内容

开篇词:一门真正面向工程的深度学习进阶课程

大家好,我是深度学习算法工程师王学宽。现就职于某 AI 智能科技公司,参与教育+计算机视觉类创新性产品研发任务。曾在香港理工大学担任 RA,参与大规模图像检索项目的研发,后加入海康威视,参与 ADAS 视觉相关算法研发工作。曾发表多篇学术论文、申请多项国家专利,先后参与多项图像、自然语言项目相关课题研发工作,在深度学习领域具有深厚的专业知识和工程开发经验。运营有公众号:白话机器学习(微信号:simpleml90hou),开设有知乎专栏:《深度学习干货铺》。

很高兴能在接下来的十周里,通过《深度学习工程应用指南》达人课来分享深度学习在工程应用中的实战心得,包括在网络设计、训练调参、优化压缩、迁移剪枝等各个方面的技术知识和探索心得。希望能够通过通俗易懂的语言,带大家一起揭开深度学习的神秘面纱,帮助大家快速入门深度学习,并尽快展开工程实战项目。

深度学习入行的迫切性已无须强调,无论从行业发展前景、行业人才需求、国家人工智能发展战略等不同角度来看,深度学习作为人工智能发展的基石,在未来行业中必将大放异彩。目前,越来越多的企业,纷纷迈开了深度学习的第一步,并取得重要成果。对于从业者而言,行业的欣欣向荣带来更多的就业机会,更高的薪资待遇。越来越多的人开始希望投身到深度学习这个行业之中,从事工程或者算法类的相关工作。在实际工作中,入行者即便已了解了 Caffe 和 TensorFlow 等基础知识,但在实际工程设计时,依然会遇到各种各样的困惑,比如:

  • 我们在设计深度网络的时候有什么技巧和原则吗?
  • VGG、ResNet 网络如何应用在实际的芯片上?
  • BN 层应该放在哪里比较合理?
  • 网络越深越好还是越宽越好?
  • 训练时如此多的优化方法,一定是 SGD 吗?
  • 学习率怎么调比较合适?
  • 模型迁移、模型剪枝、模型压缩、模型精剪设计,这些都需要怎么去实践?
  • 序列问题中的 RNN 网络,怎样设计才能够确保网络更好、更快的收敛?
  • Siamese、Triplet 这样的网络要怎样训练?
  • 样本怎么处理、挖掘?
  • ……

而帮助大家认识这些问题,并尝试着解决这些问题,也是我推出这门课程的初衷。

课程优势

主要优势可以总结一下几点:

  • 全面的内容、快速入门到实战

    本课程内容涉及到工程实战深度学习中的各种概念、问题,内容全面、适合初学者从入门到快速实战,更面向工程开发。

  • 工程实战下的通俗概念阐释

    本课程涵盖深度学习各个不同领域涉及到的模型基本原理,并结合工程经验,对这些核心概念进行分析、解释。针对具体的数学推导公式,深入剖析。本课程在第二部分涉及到多个概念,每个课程将配有细致的图示化解释,通俗易懂。

  • 工程实战下的设计原则和技巧

    本课程重点介绍深度学习在实际工程实战时会遇到的一些问题,并针对这些问题,给出各种常用的解决技巧,另外,在设计网络时,也给出基本的设计原则,更加符合工程开发。

  • 更加直观的实战代码讲解

    本课程对网络设计原则、模型讲解的过程中,会引入大量的深度学习代码,以 Python 语言为主,来对模型、设计技巧、原则等问题进行说明,更加直观。

课程大纲

本课程共包括 23 个课时,分为四大部分。主要针对机器学习初学者、深度学习入门者以及其他想从事深度学习相关工作的从业者,分别涉及到深度学习的基本概念,模型原理,不同类别的网络模型,模型设计的基本原则、训练、优化、模型精简等等不同方面。另外,本课程还通过实际的网络设计,结合相应的原则来解决分类任务、序列任务等,加上动手实践过程,带领大家深入理解网络设计的基本原则和方法,并锻炼深度学习编程能力和技巧。

  • 第一部分(第01-02课):绪论。

    初窥门径。本部分带你初步认识深度学习、了解深度学习行业背景、发展状况以及如何进阶深度学习。

  • 第二部分(第03-14课):深度学习的核心理论。

    深谙其理。本部分从工程实践的角度出发,详细介绍深度学习中涉及到的各种各样的概念、原理,尤其在工业实战中的使用技巧和原则,帮助大家打好深度学习工程实战基础。

  • 第三部分(第15-20篇):工程实战中深度神经网设计原则。

    登堂入室。本部分从实际工程的角度出发,详细介绍卷积神经网、循环神经网的发展历程、工程设计原则和方法,并带领大家一起设计一个精简的深度网络,并用于目标检测任务。

  • 第四部分(第21篇):总结、回顾与展望。

    总结与超越。本部分对课程进行总结,回顾已经学习过的知识点,在此将这些知识点串成一条完整的技术路线,温故知新,并为大家接下来展开深度学习专业领域研究奠定理论基础。

关于深度学习如何学的疑惑

很多朋友会认为深度学习是一门工程类学科,也有人把它比喻成一个炼丹的过程,而 Caffe、TensorFlow 就相当于是炼丹炉,而深度网络则像是在炼丹。而深度学习框架的使用,使得这项炼丹技巧越来越大众化,越来越多的人慢慢开始忽视深度学习背后的科学知识,把它仅仅当做一门实验科学来做。甚至有人认为,只要调调包、调调参就够了。然而,真的是这样子吗?

我相信,有这样想法的人,即使是从事着这样行业,估计也不会有太高的成就。深度学习技术发展确实十分迅速,网络上各种各样的开源模型确实存在很多,那这些模型真的就只是调用下就可以了吗?

实际上,并不是这样子的。基础不扎实,首先你可能很难获得一份大厂的 Offer。国内外名企在招聘的时候,十分强调基础的重要性,而这里的基础并不是仅仅只看过西瓜书、NG 的课程这么简单,更需要你能够讲出其中的内部原理、机制。对于深度学习工程师,不仅仅需要你去调调参,同样也需要你去阅读大量的文献,设计新型的网络结构。

记住,想要走的远,就需要基础打得牢。不要相信那些网上的烟雾弹,迷失本心。付出多少才会收获多少,薪资也才会符合自己创造的价值。想想公司可能花闲钱来养你划水吗?答案一定是,No!

你将收获什么?

  • 扎实的技术岗位求职知识储备

相信很多订阅或者准备订阅这个课程的人,都是希望在未来能够投身到深度学习、人工智能这个行业中的,而目前伴随着行业人数、技术门槛等各方面的提升,很多公司在笔试、面试的时候,都更加关注深度学习基础是否扎实这一问题。在面试中,很多面试官喜欢提问深度学习模型背后的一些理论性的东西。因此,更加需要大家注重这方面的积累。本课程通过细致的原理剖析,帮助大家吃透深度学习中的各个理论,相信用来挑战接下来的面试应该是绰绰有余了。

  • 深度学习模型初识

很多同学在开始学习深度学习的时候,都喜欢从模型的角度入手,本课程同样也不例外,在介绍过深度学习的基本理论和方法之后,我们立刻将重点转移到真实的模型和方法中,通过以模型为载体,再次反观理论方法,相互印证,进而更好的推动读者对这两方面内容的理解。

  • 模型设计、模型压缩,更工程化的技术

本课程中涉及到了丰富的模型设计、压缩、迁移等工程实战相关知识,相信目前在网络上已经存在各种各样的关于 Caffe、TensorFlow 的视频教程,这些教程更多的偏向于纯粹的工程入门,更像是在教你用一门软件。对于工程化而言,模型设计原则、模型压缩方法、技巧等等往往具有更加重要的意义。它是我们掌握深度学习技术的进阶基础,一个合格的深度学习算法工程师,不仅要懂得如何设计模型,更需要懂得如何设计精简的模型。

  • 工程深度学习实例讲解

在模型讲解阶段,课程会引入大量的实战代码,并通过代码讲解,来带领大家深入理解不同模型的网络结构。而深度学习本身也更加强调实战能力,“纸上谈兵”没有实际意义。

作者寄语

我希望本课程的读者在掌握深度学习相关知识和技巧的同时,能够将所学应用到实际的项目中,时刻牢记,我们需要有更多的创新精神和意识,真正用 AI 技术去重新认识世界、改变世界,推动社会的进步。我相信,这个时代是人工智能的时代,同时也希望这个时代能够有你的身影。

最后,预祝每一位准备入行深度学习的朋友,均能够通过自身的学习与努力找到心仪的工作。如果大家有任何疑问和建议,也可以通过读者圈或者在我的知乎专栏“深度学习干货铺”留言与我交流,希望我们能够共同探讨、共同进步。

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

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

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

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

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

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

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

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

深度网络名年份作者描述
LeNet1994Yann LeCun简单卷积神经网
AlexNet2012Alex Krizhevsky2012届图像识别大赛的冠军
ZFNet2013Matthew D Zeiler可视化
Net in Net2013Lin M网络嵌套模型
VGGNet2014牛津大学的视觉几何组ILSVRC-2014中定位任务第一名和分类任务第二名
GoogLeNet2014GoogleILSVRC14 比赛中获得冠军
Inception-v2/v32015Google小卷积代替大大卷积
ResNet2015MSRA 何凯明团队
Stochastic_Depth2016Gao Huang随机深度
Wide ResNet2016Sergey Zagoruyko考虑宽度网络性能
Inception-ResNet V1/V2/V32016Google融合 resnet 和 inception 结构的网络
ResNet in ResNet2016Sasha Targ泛化的 resnet 网络结构
Fractalnet2016Gustav Larsson分形结构
ResNeXt2016Saining Xie减少参数
DenseNet2017Gao Huang稠密网络
DPN2017颜水成结合 resnet 和 densenet
PyramidNet2017Dongyoon Han金字塔+resnet 网络
SqueezeNet2017伯克利&斯坦福的研究人员网络压缩
MobileNet V1/V22017Google精简网络
ShuffleNet2017旷视科技精简网络
SENet2017Momenta精简网络+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。

第02课:揭开深度学习的神秘面纱
第03课:深入理解标准卷积
第04课:千变万化的卷积——反卷积、分组卷积、空洞卷积和深度可分离卷积
第05课:局部感知的妙处
第06课:复杂多变的激活函数
第07课:丰富的正则化策略
第08课:对比分析各种优化方法
第09课:初识深度网络中的深与宽
第10课:深度网络的记忆能力
第11课:Attention 机制
第12课:深度学习中的迁移机制
第13课:谈一谈 Siamese、Triplet 等多支的网络问题
第14课:深度网络的训练技巧与评测标准
第15课:从简到繁再到简的卷积神经网的变迁
第16课:卷积神经网络的设计之道
第17课:从 RNN 到 LSTM 再到 Seq2Seq,循环神经网的变迁
第18课:循环神经网的设计之道
第19课:模型精简之道——量化、剪枝、教师网络
第20课:带你设计一个精简的深度神经网(目标检测任务)
第21课:课程总结

阅读全文: http://gitbook.cn/gitchat/column/5b30789393f14818da76bdbc

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页