做者 | 刘昕
程序员
深度学习本质上是深层的人工神经网络,它不是一项孤立的技术,而是数学、统计机器学习、计算机科学和人工神经网络等多个领域的综合。深度学习的理解,离不开本科数学中最为基础的数学分析(高等数学)、线性代数、几率论和凸优化;深度学习技术的掌握,更离不开以编程为核心的动手实践。没有扎实的数学和计算机基础作支撑,深度学习的技术突破只能是空中楼阁。算法
因此,想在深度学习技术上有所成就的初学者,就有必要了解这些基础知识之于深度学习的意义。除此以外,咱们的专业路径还会从结构与优化的理论维度来介绍深度学习的上手,并基于深度学习框架的实践浅析一下进阶路径。编程
最后,本文还将分享深度学习的实践经验和获取深度学习前沿信息的经验。服务器
若是你可以顺畅地读懂深度学习论文中的数学公式,能够独立地推导新方法,则代表你已经具有了必要的数学基础。网络
掌握数学分析、线性代数、几率论和凸优化四门数学课程包含的数学知识,熟知机器学习的基本理论和方法,是入门深度学习技术的前提。由于不管是理解深度网络中各个层的运算和梯度推导,仍是进行问题的形式化或是推导损失函数,都离不开扎实的数学与机器学习基础。数据结构
数学分析:在工科专业所开设的高等数学课程中,主要学习的内容为微积分。对于通常的深度学习研究和应用来讲,须要重点温习函数与极限、导数(特别是复合函数求导)、微分、积分、幂级数展开、微分方程等基础知识。在深度学习的优化过程当中,求解函数的一阶导数是最为基础的工做。当提到微分中值定理、Taylor公式和拉格朗日乘子的时候,你不该该只是感到与它们似曾相识。这里推荐同济大学第五版的《高等数学》教材。框架
线性代数:深度学习中的运算经常被表示成向量和矩阵运算。线性代数正是这样一门以向量和矩阵做为研究对象的数学分支。须要重点温习的包括向量、线性空间、线性方程组、矩阵、矩阵运算及其性质、向量微积分。当提到Jacobian矩阵和Hessian矩阵的时候,你须要知道确切的数学形式;当给出一个矩阵形式的损失函数时,你能够很轻松的求解梯度。这里推荐同济大学第六版的《线性代数》教材。机器学习
几率论:几率论是研究随机现象数量规律的数学分支,随机变量在深度学习中有不少应用,不管是随机梯度降低、参数初始化方法(如Xavier),仍是Dropout正则化算法,都离不开几率论的理论支撑。除了掌握随机现象的基本概念(如随机试验、样本空间、几率、条件几率等)、随机变量及其分布以外,还须要对大数定律及中心极限定理、参数估计、假设检验等内容有所了解,进一步还能够深刻学习一点随机过程、马尔可夫随机链的内容。这里推荐浙江大学版的《几率论与数理统计》。编程语言
凸优化:结合以上三门基础的数学课程,凸优化能够说是一门应用课程。但对于深度学习而言,因为经常使用的深度学习优化方法每每只利用了一阶的梯度信息进行随机梯度降低,于是从业者事实上并不须要多少“高深”的凸优化知识。理解凸集、凸函数、凸优化的基本概念,掌握对偶问题的通常概念,掌握常见的无约束优化方法如梯度降低方法、随机梯度降低方法、Newton方法,了解一点等式约束优化和不等式约束优化方法,便可知足理解深度学习中优化方法的理论要求。这里推荐一本教材,Stephen Boyd的《Convex Optimization》。编辑器
机器学习:归根结底,深度学习只是机器学习方法的一种,而统计机器学习则是机器学习领域事实上的方法论。以监督学习为例,须要你掌握线性模型的回归与分类、支持向量机与核方法、随机森林方法等具备表明性的机器学习技术,并了解模型选择与模型推理、模型正则化技术、模型集成、Bootstrap方法、几率图模型等。深刻一步的话,还须要了解半监督学习、无监督学习和强化学习等专门技术。这里推荐一本经典教材《The elements of Statistical Learning》。
深度学习要在实战中论英雄,所以具有GPU服务器的硬件选型知识,熟练操做Linux系统和进行Shell编程,熟悉C++和Python语言,是成长为深度学习实战高手的必备条件。当前有一种提法叫“全栈深度学习工程师”,这也反映出了深度学习对于从业者实战能力的要求程度:既须要具有较强的数学与机器学习理论基础,又须要精通计算机编程与必要的体系结构知识。
编程语言:在深度学习中,使用最多的两门编程语言分别是C++和Python。迄今为止,C++语言依旧是实现高性能系统的首选,目前使用最普遍的几个深度学习框架,包括Tensorflow、Caffe、MXNet,其底层均无一例外地使用C++编写。而上层的脚本语言通常为Python,用于数据预处理、定义网络模型、执行训练过程、数据可视化等。当前,也有Lua、R、Scala、Julia等语言的扩展包出现于MXNet社区,呈现百花齐放的趋势。这里推荐两本教材,一本是《C++ Primer第五版》,另一本是《Python核心编程第二版》。
Linux操做系统:深度学习系统一般运行在开源的Linux系统上,目前深度学习社区较为经常使用的Linux发行版主要是Ubuntu。对于Linux操做系统,主要须要掌握的是Linux文件系统、基本命令行操做和Shell编程,同时还需熟练掌握一种文本编辑器,好比VIM。基本操做务必要作到熟练,当须要批量替换一个文件中的某个字符串,或者在两台机器之间用SCP命令拷贝文件时,你不须要急急忙忙去打开搜索引擎。这里推荐一本工具书《鸟哥的Linux私房菜》。
CUDA编程:深度学习离不开GPU并行计算,而CUDA是一个很重要的工具。CUDA开发套件是NVidia提供的一套GPU编程套件,实践当中应用的比较多的是CUDA-BLAS库。这里推荐NVidia的官方在线文档http://docs.nvidia.com/cuda/。
其余计算机基础知识:掌握深度学习技术不能只知足于使用Python调用几个主流深度学习框架,从源码着手去理解深度学习算法的底层实现是进阶的必由之路。这个时候,掌握数据结构与算法(尤为是图算法)知识、分布式计算(理解经常使用的分布式计算模型),和必要的GPU和服务器的硬件知识(好比当我提及CPU的PCI-E通道数和GPU之间的数据交换瓶颈时,你能心照不宣),你必定能如虎添翼。
接下来分别从理论和实践两个角度来介绍一下深度学习的入门。
深度学习理论入门:咱们能够用一张图(图1)来回顾深度学习中的关键理论和方法。从MCP神经元模型开始,首先须要掌握卷积层、Pooling层等基础结构单元,Sigmoid等激活函数,Softmax等损失函数,以及感知机、MLP等经典网络结构。接下来,掌握网络训练方法,包括BP、Mini-batch SGD和LR Policy。最后还须要了解深度网络训练中的两个相当重要的理论问题:梯度消失和梯度溢出。
以卷积神经网络为例,咱们用图2来展现入门须要掌握的知识。起点是Hubel和Wiesel的对猫的视觉皮层的研究,再到日本学者福岛邦彦神经认知机模型(已经出现了卷积结构),可是第一个CNN模型诞生于1989年,1998年诞生了后来被你们熟知的LeNet。随着ReLU和Dropout的提出,以及GPU和大数据所带来的历史机遇,CNN在2012年迎来了历史性的突破——诞生了AlexNet网络结构。2012年以后,CNN的演化路径能够总结为四条:1. 更深的网络;2. 加强卷积模的功能以及上诉两种思路的融合ResNet和各类变种;3. 从分类到检测,最新的进展为ICCV 2017的Best Paper Mask R-CNN;4. 增长新的功能模块。
深度学习实践入门:掌握一个开源深度学习框架的使用,并进一步的研读代码,是实际掌握深度学习技术的必经之路。当前使用最为普遍的深度学习框架包括Tensorflow、Caffe、MXNet和PyTorch等。框架的学习没有捷径,按照官网的文档step by step配置及操做,参与GitHub社区的讨论,遇到不能解答的问题及时Google是快速实践入门的好方法。
初步掌握框架以后,进一步的提高须要依靠于具体的研究问题,一个短平快的策略是先刷所在领域权威的Benchmark。例如人脸识别领域的LFW和MegaFace,图像识别领域与物体检测领域的ImageNet、Microsoft COCO,图像分割领域的Pascal VOC等。经过复现或改进别人的方法,亲手操练数据的准备、模型的训练以及调参,能在所在领域的Benchmark上达到当前最好的结果,实践入门的环节就算初步完成了。
后续的进阶,就须要在实战中不断地去探索和提高了。例如:熟练的处理大规模的训练数据,精通精度和速度的平衡,掌握调参技巧、快速复现或改进他人的工做,可以实现新的方法等等。
在这里,分享四个方面的深度学习实战经验。
1. 充足的数据。大量且有标注的数据,依旧在本质上主宰着深度学习模型的精度,每个深度学习从业者都须要认识到数据极端重要。获取数据的方式主要有三种:开放数据(以学术界开放为主,如ImageNet和LFW)、第三方数据公司的付费数据和结合自身业务产生的数据。
2. 熟练的编程实现能力。深度学习算法的实现离不开熟练的编程能力,熟练使用Python进行编程是基础。若是进一步的修改底层实现或增长新的算法,则可能须要修改底层代码,此时熟练的C++编程能力就变得不可或缺。一个明显的现象是,曾经只须要掌握Matlab就能够笑傲江湖的计算机视觉研究者,现在也纷纷须要开始补课学习Python和C++了。
3. 充裕的GPU资源。深度学习的模型训练依赖于充裕的GPU资源,经过多机多卡的模型并行,能够有效的提升模型收敛速度,从而更快的完成算法验证和调参。一个专业从事深度学习的公司或实验室,拥有数十块到数百块的GPU资源已是广泛现象。
4. 创新的方法。以深度学习领域权威的ImageNet竞赛为例,从2012年深度学习技术在竞赛中夺魁到最后一届2017竞赛,方法创新始终是深度学习进步的核心动力。若是只是知足于多增长一点数据,把网络加深或调几个SGD的参数,是难以作出真正一流的成果的。
根据笔者的切身经历,方法创新确实能带来难以置信的结果。一次参加阿里巴巴组织的天池图像检索比赛,笔者提出的一点创新——使用标签有噪声数据的新型损失函数,结果竟极大地提升了深度模型的精度,还拿到了当年的冠军。
【前沿信息的来源】
实战中的技术进阶,必须要了解深度学习的最新进展。换句话说,就是刷论文:除了按期刷Arxiv,刷表明性工做的Google Scholar的引用,关注ICCV、CVPR和ECCV等顶级会议以外,知乎的深度学习专栏和Reddit上时不时会有最新论文的讨论(或者精彩的吐槽)。
一些高质量的公众号,例如Valse前沿技术选介、深度学习大讲堂、Paper Weekly等,也时常有深度学习前沿技术的推送,也均可以成为信息获取的来源。同时,关注学术界大佬LeCun和Bengio等人的Facebook/Quora主页,关注微博大号“爱可可爱生活”等人,也常有惊喜的发现。
【建议关注的重点】
新的网络结构。在以SGD为表明的深度学习优化方法没有根本性突破的状况下,修改网络结构是能够较快提高网络模型精度的方法。2015年以来,以ResNet的各类改进为表明的各种新型网络结构如雨后春笋般涌现,其中表明性的有DenseNet、SENet、ShuffuleNet等。
新的优化方法。纵观从1943年MCP模型到2017年间的人工神经网络发展史,优化方法始终是进步的灵魂。以偏差反向传导(BP)和随机梯度降低(SGD)为表明的优化技术的突破,或是Sigmoid/ReLU以后全新一代激活函数的提出,都很是值得期待。笔者认为,近期的工做如《Learning gradient descent by gradient descent》以及SWISH激活函数,都很值得关注。但可否取得根本性的突破,也即彻底替代当前的优化方法或ReLU激活函数,尚不可预测。
新的学习技术。深度强化学习和生成对抗网络(GAN)。最近几周刷屏的Alpha Zero再一次展现了深度强化学习的强大威力,彻底不依赖于人类经验,在围棋项目上经过深度强化学习“左右互搏”所练就的棋力,已经远超过上一代秒杀一众人类高手的AlghaGo Master。一样的,生成对抗网络及其各种变种也在不停地预告一个学习算法自我生成数据的时代的序幕。笔者所在的公司也正尝试将深度强化学习和GAN相结合,用于跨模态的训练数据的增广。
新的数据集。数据集是深度学习算法的练兵场,所以数据集的演化是深度学习技术进步的缩影。以人脸识别为例,后LFW时代,MegaFace和Microsoft Celeb-1M数据集已接棒大规模人脸识别和数据标签噪声条件下的人脸识别。后ImageNet时代,Visual Genome正试图创建一个包含了对象、属性、关系描述、问答对在内的视觉基因组。
做者简介:刘昕,工学博士,毕业于中国科学院计算技术研究所,师从山世光研究员。主要从事计算机视觉技术和深度学习技术的研究与工业化应用,现担任人工智能初创公司中科视拓CEO。
本文为《程序员》原创文章,未经容许不得转载,更多精彩文章请点击「阅读原文」订阅《程序员》