深度学习本质上是深度人工神经网络。它不是孤立的技术,而是数学、统计机器学习、计算机科学和人工神经网络。网络等综合领域。对深度学习的理解离不开本科数学最基础的数学分析(高等数学)、线性代数、概率论和凸优化;深度学习技术的掌握离不开以编程为核心的动手实践。没有扎实的数学和计算机基础支撑,深度学习的技术突破只能是空中楼阁。因此,想要在深度学习技术上有所建树的初学者,有必要了解这些基础知识对于深度学习的意义。此外,我们的专业路径也会从结构和优化的理论维度介绍深度学习的入门,并基于深度学习框架的实践分析进阶路径。最后,本文还将分享深度学习的实践经验和获取深度学习前沿资讯的心得体会。数学基础如果你能顺利阅读理解深度学习论文中的数学公式,并能独立推导出新的方法,说明你已经具备必要的数学基础。掌握数学分析、线性代数、概率论和凸优化四门数学课程所包含的数学知识,熟悉机器学习的基本理论和方法,是入门深度学习技术的前提。因为无论是理解深层网络中每一层的运算和梯度推导,还是将问题形式化或推导损失函数,都离不开扎实的数学和机器学习基础。数学分析:在工科专业开设的高等数学课程中,主要学习内容是微积分。对于一般的深度学习研究和应用,需要重点学习函数与极限、导数(尤其是复合函数的导数)、微分、积分、幂级数展开、微分方程等基础知识。在深度学习的优化过程中,求解函数的一阶导数是最基础的工作。说到微分中值定理、泰勒公式、拉格朗日乘子,你不应该只是觉得眼熟。这里是同济大学第五版的《高等数学》课本。线性代数:深度学习中的运算通常表示为向量和矩阵运算。线性代数就是这样一个以向量和矩阵为研究对象的数学分支。需要复习的内容包括向量、线性空间、线性方程、矩阵、矩阵运算及其性质、向量微积分。说到雅可比矩阵和海森矩阵,你需要知道确切的数学形式;当给出矩阵形式的损失函数时,您可以轻松求解梯度。这里是同济大学第六版的《线性代数》教科书。概率论:概率论是研究随机现象规律的数学分支。随机变量在深度学习中有很多应用。无论是随机梯度下降、参数初始化方法(如Xavier),还是Dropout正则化算法,都离不开概率。理论的理论支持。除了掌握随机现象(如随机实验、样本空间、概率、条件概率等)、随机变量及其分布的基本概念外,还需要对大数定律和中心极限定理,参数估计,假设检验等。理解之后,可以进一步研究一点随机过程和马尔可夫随机链。这里推荐浙大版的《概率论与数理统计》。凸优化:结合以上三门数学基础课程,凸优化可以说是一门应用课程。但对于深度学习来说,由于常用的深度学习优化方法往往只利用一阶梯度信息进行随机梯度下降,所以从业者其实不需要太多“高深”的凸优化知识。理解凸集、凸函数、凸优化的基本概念,掌握对偶问题的一般概念,掌握梯度下降法、随机梯度下降法、牛顿法等常见的无约束优化方法,了解一点等式-约束优化和不等式约束优化方法,可以满足理解深度学习中优化方法的理论要求。这里推荐一本教科书,StephenBoyd的《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和服务器硬件知识(比如我讲PCI-E通道时CPU的当CPU和GPU之间的数据交换瓶颈,你可以理解),你肯定会如虎添翼。深度学习概论接下来,我们将从理论和实践的角度来介绍深度学习概论。深度学习理论介绍:我们可以用一张图(图1)来回顾一下深度学习中的关键理论和方法。从MCP神经元模型开始,首先需要掌握卷积层、Pooling层等基本结构单元,Sigmoid等激活函数,Softmax等损失函数,以及感知器、MLP等经典网络结构。接下来掌握网络训练方法,包括BP、Mini-batchSGD和LRPolicy。***你还需要了解深度网络训练中两个至关重要的理论问题:梯度消失和梯度溢出。以卷积神经网络为例,我们用图2展示入门所需的知识。起点是Hubel和Wiesel对猫视觉皮层的研究,再到日本学者福岛邦彦的神经认知机器模型(卷积结构已经出现),但第一个CNN模型诞生于1989年和1998年,后来被称为LeNet.随着ReLU和Dropout的引入,以及GPU和大数据带来的历史机遇,CNN在2012年迎来了历史性的突破——AlexNet网络结构诞生。2012年之后,CNN的演进路径可以概括为四种:1.Deepernetwork;2.增强卷积模块的功能以及融合ResNet和吸引两种思想的各种变体;3.从分类到检测,***进步是ICCV2017的BestPaperMaskR-CNN;4.增加新的功能模块。深度学习实践入门:掌握一个开源深度学习框架的使用,并深入研究代码,才是真正掌握深度学习技术的必由之路。使用最广泛的深度学习框架包括Tensorflow、Caffe、MXNet和PyTorch。学习框架没有捷径。按照官网文档一步步配置和操作,在GitHub社区参与讨论,遇到无法解答的问题谷歌。这是快速入门的好方法。在初步掌握了框架之后,进一步的完善需要依靠具体的研究问题。一个简短而快速的策略是首先检查该领域的权威基准。比如人脸识别领域的LFW和MegaFace,图像识别和物体检测领域的ImageNet和MicrosoftCOCO,图像分割领域的PascalVOC等。通过复现或改进别人的方法,动手实践数据准备、模型训练、调参,你可以在你所在领域的Benchmark上取得目前最好的成绩,初步完成实战入门环节。后续的进步需要在实战中不断探索和完善。例如:熟练处理大规模训练数据,掌握准确率和速度之间的平衡,掌握调参技巧,快速复现或改进他人的工作,能够实现新方法等。深度学习实践经验在此,我将分享四个方面的深度学习实践经验。1.数据充足。大量的标注数据在本质上仍然支配着深度学习模型的准确性,每一位深度学习从业者都需要意识到数据是极其重要的。获取数据的途径主要有三种:开放数据(主要是学术界开放,如ImageNet和LFW)、第三方数据公司付费数据、结合自身业务产生的数据。2、熟练的编程能力。深度学习算法的实现离不开熟练的编程能力,熟练使用Python进行编程是基础。如果进一步修改底层实现或者增加新的算法,可能需要修改底层代码。这时候,熟练的C++编程能力就变得不可或缺了。一个明显的现象是,曾经只需要掌握Matlab就可以扬眉吐气江湖的计算机视觉研究人员,现在需要开始补课学习Python和C++。3.丰富的GPU资源。深度学习的模型训练依赖于充足的GPU资源。通过多机多卡模型的并行,可以有效提高模型的收敛速度,从而更快地完成算法验证和参数调整。一个专门做深度学习的公司或者实验室,拥有几十到上百个GPU资源是很常见的。4.创新方法。以深度学习领域权威的ImageNet大赛为例,从2012年深度学习技术大赛夺冠到2017年上届大赛,方法创新始终是深度学习进步的核心驱动力。如果仅仅满足于增加一点数据、加深网络或调整几个SGD参数,很难做出真正完美的结果。根据笔者的亲身体验,方法创新确实可以带来不可思议的效果。有一次参加阿里巴巴组织的天池图像检索比赛,作者提出了一个小创新——使用一种新的带有带标签噪声数据的损失函数。结果,深度模型的准确率得到了极大的提升,并获得了当年的冠军。深度学习前沿【前沿资讯来源】要在实战中推进技术,必须了解深度学习的最新动态。换句话说,就是看论文:除了定期阅读Arxiv,查看GoogleScholar的代表作参考文献,关注ICCV、CVPR、ECCV等顶级会议外,知乎的深度学习专栏和Reddit偶尔也会有***论文讨论(或精彩吐槽)。一些优质的公众号,比如Valse前沿技术精选、深度学习大讲堂、PaperWeekly等,也经常有深度学习前沿技术推送,也可以作为信息获取来源。同时,关注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)。近几周上映的《阿尔法零》再次展现了深度强化学习的强大威力。它完全不依赖于人类的经验。在围棋项目中,通过深度强化学习“左右格斗”培养出来的棋力已经远超上一代。秒杀一群人类高手的AlghaGoMaster。同样,生成对抗网络及其各种变体不断预示着学习算法生成自己的数据的时代的序幕。作者所在的公司也在尝试结合深度强化学习和GAN来增强跨模态训练数据。新的数据集。数据集是深度学习算法的训练场,因此数据集的演进是深度学习技术进步的缩影。以人脸识别为例,在后LFW时代,MegaFace和MicrosoftCeleb-1M数据集接管了大规模人脸识别和数据标签噪声条件下的人脸识别。在后ImageNet时代,VisualGenome试图构建一个包含对象、属性、关系描述和问答对的视觉基因组。
