mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4

DL发展概述:从早期ML到DL

DL 随便写写 搞笑

· 技术

DL发展概述:从早期ML到DL

一、早期ML

我今天?大抵是昨天吧,突发奇想简单梳理了一下标准DL的概述。

首先我想谈谈早期的人工智能。我看了谷歌那块对人工智能的定义是:只要这个程序能实现某些类似人类智能的活动,我们就把这种程序叫做人工智能。于是基于规则的系统(Rule-based System)也是人工智能程序的一种。这种系统最关键的地方在于它依赖于我们如何设计这个程序,也就是说如何制定规则,这需要非常专业的背景知识。

但是对于许多复杂的目标问题,虽然穷举大法好(真神吧),但是我们很难把规则都穷举出来,总会有遗漏导致算法有缺陷。最终的结局是,代码中的规则越来越多,变得越来越庞大,直到人们很难维护。所以这种系统对我们来说并不是一个能进行学习的系统,它只是早期人工智能的一种开发方式。

二、经典机器学习(典中典,可以跳)

接下来是一种经典的机器学习方法,也就是Classic Machine Learning。它的流程是:首先把数据输入进来,也就是Input;然后由我们人工来设计特征、提取特征。

特征的提取可以很简单。比如说我发现高等数学和英语对下学期的物理成绩影响很大,那我们可以把这两个特征挑选出来,只选这两个特征,这就是一种人工设计的筛选过程。特征的提取也可以非常复杂。比如说对于图像的提取,我们可以用一些复杂的统计方法,把图像的某个区域转化成一个固定长度的向量。

这一步,无论是简单的筛选还是复杂的统计处理,都是把输入(Input)转化为记录——它可能是一段语音、一段波形、文字或图片,最终都会变成一个向量或一个张量(Tensor)。然后我们在这个向量和我们的输出之间建立一个映射函数,也就是说我们要找到这个映射。像之前的一些线性模型,还有大家自己看到的一些感知机(Perceptron)、MLP(Multilayer Perceptron,多层感知机)以及神经网络,实际都在做这项工作。这就是经典的机器学习。

三、表示学习与维度

再往后就到了表示学习(Representation Learning)。表示学习最主要的一个特征就是希望特征提取也能被学习出来。在早期,特征提取仍然是一个独立的步骤——我们把它把复杂的、非结构化的输入数据变成一个向量,再把这个向量扔给映射函数。

这里有一个很重要的概念叫做维度的诅咒(Curse of Dimensionality)。通俗来说就是你输入的维度越多,你需要的样本数量就呈指数性增长。打个比方吧,一个特征需要10个样本,两个特征就要100个,三个特征就要1000个。维度高了之后,数据需求量就会变得极其庞大。但在现实之中,收集已有标签的数据是非常昂贵且费力的。就像现在已有的YOLO(You Only Look Once,目标检测算法)数据标注一样,数据标注需要人工反复地去进行框选和识别,非常头疼和麻烦,据我所知的一些所售卖的毕业设计的数据标注后的数据集售价甚至高达几千块人民币(虽然这个例子不太恰当)。

所以我希望通过降维(Dimensionality Reduction)来解决这个问题。那么降维是怎么来做的呢?比如一个10维的空间,我们想把它压缩到3维,这本质上是一个线性的或非线性的空间映射。但是我们需要保证在压缩的过程中,原来高维空间的一些信息都能尽量地保留,不能把不同的点都压在同一位置,造成信息损失类的数据损失。这个过程就叫做表示学习或者叫降维,我们要学到的就是从高维空间到低维空间的这个表示。

降维就像一个银河系,像超大转盘的陀螺,在虽然它是一个三维结构,但是你可以尽量地把它看作一个平面,像(压)一个光滑的曲面,我们就可以把它用二维的平面坐标去表示它,它的维度就降低了。这就是降维非常直观的一个体现。那你也可以从中知道降维会导致信息的丧失。就像我说的超大号的陀螺,它的陀螺尖和你自己拿的那个手柄直接被压没了,当然这是后话。

降维最主要的目的就是为了解决维度的问题。因为数据量大、成本高,所以在接下来的深度学习中就体现出一个非常强大的特点。以前我们需要训练一个专门的特征提取器,但在深度学习中,我们只需要一些简单的特征——比如说一张图片,我们可以把它的像素值序列化成一个向量;一段语音,我们就把它的波形单独拿出来。最后,我们用一组独立的额外的一层层网络层(Layer)来负责提取特征,再接入到学习器进行输出,这个学习器就是通常我们所说的多层神经网络(Multilayer Neural Network)。

这与传统方法的区别是:传统方法中特征提取和学习器是分开训练的——特征提取通过无监督学习(Unsupervised Learning),而学习器是有监督学习(Supervised Learning),它们分离开来。但是在深度学习里,训练过程是统一的,我们把它叫做端对端的训练,也就是End-to-End。我们可以构建一个非常大的模型,从输入端到输出端对整个模型进行统一的训练。这就是深度学习系统和以往系统的根本区别。

四、先是SVM的兴起和被肘击

再往前看,从90年代到2010年前,最火的机器学习模型是支持向量机(Support Vector Machine,SVM)家族。但到了深度学习时代,由于SVM的一些限制,我们开始使用深度神经网络(Deep Neural Network,DNN)来实现端对端的学习。

回顾一下发展过程。基于规则的系统,本质来说就像我们以前的人工算法设计过程中所用的算法,大多是图搜索、树搜索等传统算法,而表示学习通过从数据中进行训练来得到算法。

在经典的机器学习中,scikit-learn给出的流程图。比如:样本数量大于50怎么走?小于50怎么办?是分类问题还是回归问题?有没有标签?有标签用什么分类器?没标签用什么聚类算法?这是一个传统ML方法的典型流程。

那SVM家族最后受到了怎么样的挑战(肘击)后曼巴out了呢?主要原因有三点:

第一,人工设计的特征有局限性,我们想不到的特征丢失了。

第二,SVM在处理大数据集的时候效果不是很好。

第三,越来越多的应用在处理非结构化的数据(如图片、文本和声音等)时效果比较差。以前我们处理的多是关系型数据表,用SVM配合一些简单的特征工程就够了。但现在面对这些非结构化数据,SVM需要先用人工特征处理,这正是它的瓶颈。

在这项挑战中,深度学习在各个领域都达到了性能上的巨大提升。

五、然后是ILSVRC竞赛被肘击了

哦对了,也可以看ILSVRC(ImageNet Large Scale Visual Recognition Challenge,大规模视觉识别挑战赛)这项竞赛。在2012年后,错误率降到了16.4%。这一年正是深度学习开始崭露头角的一年,其中最有名的就是AlexNet。

之后错误率一路下降。到了2015年,错误率达到了3.57%。而人类在同类任务上的错误率大概是5%。这是一次算法的性能远远超过了人类的水平。后来这个竞赛被认为已经被解决了,就不再举办。——manba out!

六、神经网络的历史

我简单地介绍一下神经网络的历史。早期来源于神经科学,但现代的深度学习主要来自于数学和工程学。

神经元是怎么工作的呢?一个神经元通过树突接收信号,再通过轴突把信号传递给其他神经元。借鉴这个生物结构,用仿生学的方法设计了一个简单的模型,称为感知机(Perceptron)。也就是把输入信号加权求和再输出。后来随着分层的感知结构出现,我们开始把神经元连接起来,形成人工神经网络(Artificial Neural Network,ANN)。

神经网络的发展也是一波三折。它最重要的算法叫做反向传播(Backpropagation)。之所以需要反向传播,是因为网络层数的增多,直接用解析式求偏导太困难了。反向传播的核心是计算图(Computational Graph)。比如说我们计算E = (A + B) × (B + 1),可以把它拆解成几个基本操作。在计算图内,我们每一步只做基本计算,例如简单的加法或乘法。

整个过程是先做前馈计算(Forward Propagation),计算出每一个节点的值,同时记入每个点输入的偏导函数。然后对于输出端开始进行反向传播,利用链式法则(Chain Rule)把路径上的偏导数乘起来,就最终得到了输出对任一个输入的偏导数。比如,求E对A的偏导就是E对C的偏导乘以C对A的偏导;而求E对B的偏导,就是要把两条路径的偏导加起来。这就是基于图的链式求导法则。这个算法让我们可以构建非常复杂的计算图,而不用手动地求复杂函数的导数,非常灵活。

七、深度学习的发展

回顾深度学习的发展:1998年,Yann LeCun(杨立昆)提出了LeNet-5,用于识别手写的邮政代码;2012年提出了AlexNet;2014年有GoogleNet(也称Inception)和VGG(Visual Geometry Group);2015年有ResNet(残差网络),是何凯明大佬提出的。这些模型层出不穷。

所以学习深度学习最重要的是实现基本块(Basic Block),最后去组装构造出属于自己的模型。比如可以把残差网络ResNet看成一种循环结构,或把循环神经网络RNN(Recurrent Neural Network)看成一种循环结构。我们需要做的就是针对自己的任务,把这些基本块组装成代码。

最后,针对深度学习这几年的发展速度,主要是三方面的原因:算法层、数据层和算力层。

好消息是,深度学习本身并不难。只需要有基本的线性代数、概率论、Python知识,一般像我半个月就能上手。而且我们不需要自己从头实现计算图和反向传播算法,都可以用现成的学习框架,比如说PyTorch、TensorFlow等。这些框架能高效地利用GPU,并提供了大量神经网络的基本构件。这也是我们现在很多人选择PyTorch作为工具的原因——它非常灵活,便于调试,也非常符合Python风格,安装也非常方便。去官网选好配置就能一键安装,这是好事啊。

这是好事啊

版权声明

本文采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处。

显示设置
主题色相
壁纸模式
樱花粒子