软件工程师,入门下深度学习吧

概述

        ChatGPT,英文全称为Chat Generative Pre-trained Transformer,是OpenAI研发的聊天机器人程序。ChatGPT是人工智能技术驱动的自然语言处理工具,它能够通过理解和学习人类的语言来进行对话,还能根据聊天的上下文进行互动,真正像人类一样来聊天交流。除此之外,还能进行撰写邮件、脚本、文案、翻译、代码,写论文、写诗、绘画等任务。

        ChatGPT是人工智能深度学习的技术产物。对于软件工程师,了解下深度学习的发展历程、基本概念和基本原理等知识,还是很有必要的。

发展历程

        深度学习的发展历程可以归纳为三个阶段,如下图所示。

        第一阶段的成果1:M-P模型

        1943年,心理学家麦卡洛克和数学逻辑学家皮兹提出了M-P模型。M-P模型是模仿神经元的结构和工作原理,构成的一个基于神经网络的数学模型,本质上是一种“模拟人类大脑”的神经元模型。M-P模型作为人工神经网络的起源,开创了人工神经网络的新时代,也奠定了神经网络模型的基础。

        第一阶段的成果2:感知机模型

        1958年,美国科学家罗森布拉特发现了一种类似于人类学习过程的学习算法——感知机学习。他正式提出了由两层神经元组成的神经网络,称之为“感知器”。感知器本质上是一种线性模型,可以对输入的训练集数据进行二分类,且能够在训练集中自动更新权值。感知器的提出吸引了大量科学家对人工神经网络研究的兴趣,对神经网络的发展具有里程碑式的意义。

        第一阶段的局限性

        1969年,美国数学家及人工智能先驱明斯基在其著作中证明了感知器本质上是一种线性模型,只能处理线性分类问题,连最简单的XOR(亦或)问题都无法正确分类。这等于直接宣判了感知器的死刑,神经网络的研究也陷入了将近20年的停滞。

         第二阶段的成果1:BP算法、非线性分类

        1986年,深度学习的大牛辛顿发明了适用于多层感知器(MLP)的反向传播(BP)算法,并采用Sigmoid进行非线性映射,有效解决了非线性分类问题。同时,BP算法也解决了明斯基指出的双层网络难以训练的问题,使一层以上的神经网络进入了实用阶段,开启了第二轮神经网络的研究热潮。

         第二阶段的成果2:万能逼近定理

        1989年,美国应用数学家乔治-塞班克证明了MLP的万能逼近定理,即对于任何闭区间内的一个连续函数,都可以用含有一个隐含层的BP网络来逼近。后来,奥地利数学家科特-霍尼克进一步完善了该理论,证明了神经网络的拟合能力是接近无限强的,任意复杂的分类决策边界都可以被逼近。至此,神经网络的研究又进入了一个新的高潮。

         第二阶段的成果3:卷积神经网络

        1989年,大神杨乐昆(现任纽约大学教授、Facebook副总裁兼人工智能首席科学家)提出了后来名满天下,第一个真正意义上的深度学习网络,也是目前深度学习中应用最广的神经网络结构——卷积神经网络(Convolutional Neural Networks, CNN)LeNet,并将其用于数字识别,且取得了较好的成绩,不过当时并没有引起足够的注意。

         第二阶段的局限性

        1991年,BP算法被指出存在梯度消失问题,即在误差梯度后向传递的过程中,后层梯度以乘性方式叠加到前层,由于Sigmoid函数的饱和特性,后层梯度本来就小,误差梯度传到前层时几乎为0,因此无法对前层进行有效的学习。参数过多,以及参数的调优,也是当时神经网络被诟病的问题。

         第三阶段的成果:AlexNet

        2012年,辛顿课题组为了证明深度学习的潜力,首次参加ImageNet图像识别比赛,其通过构建的CNN网络AlexNet一举夺得冠军,且碾压第二名(SVM方法)的分类性能。也正是由于该比赛,CNN吸引到了众多研究者的注意。

         第三阶段:快速发展

        从2012年之后,深度学习的热度呈现指数级上升,到2016年时,深度学习已经成为了谷歌上最热门的搜索词。同时,短短几年时间,深度学习推广到了机器学习的各个领域,包括:图像识别、语音识别、音频处理、自然语言处理、机器人、生物信息处理、搜索引擎、网络广告投放和金融等。

基本概念

        提到深度学习,就不得不提机器学习和人工智能。很多人容易把这三个概念弄混,我们可以参考下面的图来理解这三者的区别和联系。

         人工智能(Artificial Intelligence),英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。

        机器学习(Machine Learning),是指用某些算法指导计算机利用已知数据得出适当的模型,并利用此模型对新的情境给出判断的过程。

        深度学习(Deep Learning),其概念源于人工神经网络的研究,它通过组合低层特征形成更加抽象的高层表示属性类别或特征,以发现数据的分布式特征表示。

        在深度学习中,经常会提到卷积的概念。那么,卷积到底是什么呢?实际上,卷积是通过两个函数f和g生成第三个函数的一种数学算子,表征函数f与g经过翻转和平移的重叠部分的面积。可参考下图进行理解。

         弄清楚了卷积,我们再来看看卷积神经网络(CNN)。一个标准的卷积神经网络,主要包括:输入层(Input Layer)、卷积层(Convolutional Layer)、池化层(Pooling Layer)、激活层(Activation Layer)、全连接层(Fully Connected Layer)、损失层(Loss Layer)。

         下面,我们介绍深度学习中一些常用的层。

        卷积层(Convolutional Layer)

        卷积层由若干卷积单元组成,每个卷积单元的参数都是通过反向传播算法最佳化得到的。卷积运算的目的是提取输入的不同特征,第一层卷积层可能只能提取一些低级的特征,比如:边缘、线条和角等层级,更多层的网路能从低级特征中迭代提取更复杂的特征。

         池化层(Pooling Layer)

        池化实际上是一种形式的降采样。有多种不同形式的非线性池化函数,而其中“最大池化(Max pooling)”是最为常见的。它是将输入的图像划分为若干个矩形区域,对每个子区域输出最大值。直觉上,这种机制能够有效的原因在于,在发现一个特征之后,它的精确位置远不及它和其他特征的相对位置的关系重要。池化层会不断地减小数据的空间大小,因此参数的数量和计算量也会下降,这在一定程度上也控制了过拟合。

         激活层(Activation Layer)

        激活层模拟人的神经系统,只对部分神经元的输入做出反应。激活层主要采用非线性激活函数,如果采用线性函数,那么多层神经网络也只有线性映射能力,输出都是输入的线性组合,无法模拟现实世界中各种复杂的非线性情况。

        非线性激活函数最常用的有sigmoid、tanh和relu。目前主要使用relu函数,因为sigmoid和tanh在x趋于无穷的两侧,都会出现导数为0的现象,从而造成梯度消失,无法更新网络状态。

         全连接层(Fully Connected Layer)

        全连接层的每一个结点都与上一层的所有结点相连,用来把前边提取到的特征综合起来。由于其全相连的特性,一般全连接层的参数也是最多的,计算量和占用内存也是最多的。例如:在VGG16中,第一个全连接层FC1有4096个节点,上一层POOL2是7*7*512 = 25088个节点,则需要4096*25088 = 102760448个权值,需要耗很大的内存。

         损失层(Loss Layer)

        损失层设置了一个损失函数(也叫目标函数)用来比较网络的输出和目标值,通过最小化损失来驱动网络的训练。网络损失通过前向传播计算,网络权重参数相对于损失函数的梯度通过反向传播计算。

        损失函数是在前向传播计算中得到的,同时也是反向传播的起点。损失函数基本都是由真实值和预测值两部分组成。正确的损失函数,可以起到让预测值一直逼近真实值的效果,当预测值和真实值相等时,loss值最小。

经典模型

        2012年深度学习爆火之后,相继出现了很多经典的网络模型,这些模型对深度学习的迅速发展起到了非常重要的作用。

        经典模型之AlexNet

        在2012年ILSVRC(ImageNet Large-Scale Visual Recognition Challenge)赢得了分类识别第一名的好成绩(TOP 5错误率为15.4%)。AlexNet由5层卷积层、最大池化层、dropout层和3层全连接层组成,用于对1000个类别图像进行分类。

        1、在ImageNet数据集上训练网络,其中数据集超过22000个类,总共有大于1500万张注释的图像。

        2、使用ReLU非线性激活函数,并利用dropout方法解决过拟合问题。

        3、在两台GTX 580 GPU上训练了五至六天。

         经典模型之VGGNet

        2014年,牛津大学学者创建了一个新的卷积神经网络模型,19层卷积层,卷积核尺寸为3×3 (TOP 5错误率为7.3%) 。

        1、AlexNet模型中卷积核尺寸11×11,VGG Net的卷积核为3×3。两个3×3的conv层相当于一个5×5的有效感受野,这样就可以用较小的卷积核尺寸模拟更大尺寸的卷积核,好处是可以减少卷积核参数的数量。

        2、三个3×3的conv层拥有7×7的有效感受野。

        3、在4个Nvidia Titan Black GPU上训练两到三周。

         经典模型之GoogleNet

        GoogleNet是一个具有22个conv层的CNN网络,在ILSVRC 2014中以6.7%的TOP5错误率登顶冠军。

        1、在整个架构中使用了Inception模块,总共超过100层。

        2、没有使用全连接层,使用的是average polling。

        3、参数是AlexNet的1/12,原因包括:一是除去了全连接层;二是1×1卷积核降维的效果。

        4、利用一些高端的GPU进行了大概一周的训练。

         经典模型之ResNet

        2015年,微软亚洲研究院创造了一种令人难以置信的152层的深度学习模型ResNet,其在ILSVRC 2015的错误率仅仅为3.6%,已经高于人类肉眼识别的错误率。

        1、微软亚洲研究院的研究小组曾经尝试过1202层的网络结构,但是测试精度很低,可能是由于过拟合的原因导致的。

        2、在8台GPU机器上训练了2到3周。

框架简介

        深度学习的框架非常之多,每个框架的特性和侧重点不同。这里,我们仅选择几个有代表性的框架进行介绍。

         Caffe/Caffe2

        Caffe的全称是Convolutional Architecture for Fast Feature Embedding,它是一个清晰、高效的深度学习框架,核心语言是C++,它支持命令行、Python和MATLAB接口,既可以在CPU上运行,也可以在GPU上运行。Caffe的作者是贾扬清。

        Caffe凭借其易用性、简洁明了的源码、出众的性能和快速的原型设计获取了众多用户,曾经占据深度学习领域的半壁江山。但是在深度学习新时代到来之时,Caffe已经表现出明显的力不从心,诸多问题逐渐显现(包括灵活性缺失、扩展难、依赖众多环境难以配置、应用局限等)。尽管现在在GitHub上还能找到许多基于Caffe的项目,但是新的项目已经越来越少。

        Caffe2继承了Caffe的优点,在速度上令人印象深刻。Facebook 人工智能实验室与应用机器学习团队合作,利用Caffe2大幅加速机器视觉任务的模型训练过程,仅需1小时就训练完ImageNet这样超大规模的数据集。然而尽管已经发布半年多,开发一年多,Caffe2仍然是一个不太成熟的框架,官网至今没提供完整的文档,安装也比较麻烦,编译过程时常出现异常,在GitHub上也很少找到相应的代码。

         TensorFlow

        TensorFlow主要用于进行机器学习和深度神经网络研究,但它是一个非常基础的系统,因此也可以应用于众多领域。由于Google在深度学习领域的巨大影响力和强大的推广能力,TensorFlow一经推出就获得了极大的关注,并迅速成为如今用户最多的深度学习框架。

        TensorFlow编程接口支持Python和C++。随着1.0版本的公布,Java、Go、R和Haskell API的alpha版本也被支持。此外,TensorFlow还可在Google Cloud和AWS中运行。TensorFlow还支持 Windows 7、Windows 10和Windows Server 2016。

        作为当前最流行的深度学习框架,TensorFlow获得了极大的成功,但对它的批评也不绝于耳,总结起来主要有以下四点:1、过于复杂的系统设计;2、频繁变动的接口;3、接口设计过于晦涩难懂;4、文档混乱脱节。

         MXNet

        MXNet是一个深度学习库,支持C++、Python、R、Scala、Julia、MATLAB及JavaScript等语言;支持命令和符号编程;可以运行在CPU、GPU、集群、服务器、台式机或者移动设备上。

        MXNet以其超强的分布式支持,明显的内存、显存优化为人所称道。同样的模型,MXNet往往占用更小的内存和显存,并且在分布式环境下,MXNet展现出了明显优于其他框架的扩展性能。

        由于MXNet最初由一群学生开发,缺乏商业应用,极大地限制了MXNet的使用。2016年11月,MXNet被AWS正式选择为其云计算的官方深度学习平台。2017年1月,MXNet项目进入Apache基金会,成为Apache的孵化器项目。

        尽管MXNet拥有最多的接口,也获得了不少人的支持,但其始终处于一种不温不火的状态,这在很大程度上归结于推广不给力及接口文档不够完善。MXNet长期处于快速迭代的过程,其文档却长时间未更新,导致新手用户难以掌握MXNet,老用户常常需要查阅源码才能真正理解MXNet接口的用法。

        

         PyTorch

        Torch是一个有大量机器学习算法支持的科学计算框架,其诞生已有十年之久,但是真正起势得益于Facebook开源了大量Torch的深度学习模块和扩展。Torch的特点在于特别灵活,但是另一个特殊之处是采用了编程语言Lua,在深度学习大部分以Python为编程语言的大环境之下,一个以Lua为编程语言的框架有着更多的劣势,这一项小众的语言增加了学习使用Torch这个框架的成本。

        PyTorch的前身便是Torch,其底层和Torch框架一样,但是使用Python重新写了很多内容,不仅更加灵活,支持动态图,而且提供了Python接口。它是由Torch7团队开发,是一个以Python优先的深度学习框架,不仅能够实现强大的GPU加速,同时还支持动态神经网络,这是很多主流深度学习框架比如Tensorflow等都不支持的。

基本原理

        神经网络由其权重来参数化

        神经网络中每层对输入数据所做的具体操作保存在该层的权重(weight)中,其本质是一串数字。用术语来说,每层实现的变换由其权重来参数化。权重有时也被称为该层的参数(parameter)。在这种语境下,学习的意思是为神经网络的所有层找到一组权重值,使得该网络能够将每个示例输入与其目标正确地一一对应。但重点来了:一个深度神经网络可能包含数千万个参数。找到所有参数的正确取值可能是一项非常艰巨的任务,特别是考虑到修改某个参数值将会影响其他所有参数的行为。

         损失函数用来衡量网络输出结果的质量

        想要控制一件事物,首先需要能够观察它。想要控制神经网络的输出,就需要能够衡量该输出与预期值之间的距离。这是神经网络损失函数(loss function)的任务。损失函数的输入是网络预测值与真实目标值(即你希望网络输出的结果),然后计算一个距离值,衡量该网络在这个示例上的效果好坏。

         将损失值作为反馈信号来调节权重

        深度学习的基本技巧是利用这个距离值作为反馈信号来对权重值进行微调,以降低当前示例对应的损失值。这种调节由优化器(optimizer)来完成,它实现了所谓的反向传播(back propagation)算法,这是深度学习的核心算法。

         整个学习过程

        一开始对神经网络的权重随机赋值,因此网络只是实现了一系列随机变换。其输出结果自然也和理想值相去甚远,相应地,损失值也很高。但随着网络处理的示例越来越多,权重值也在向正确的方向逐步微调,损失值也逐渐降低,这就是训练循环(training loop)。将这种循环重复足够多的次数,得到的权重值可以使损失函数最小。具有最小损失的网络,其输出值与目标值尽可能地接近,这就是训练好的网络,其输出我们称之为模型。

         前向传播

        输入信号与权重矩阵进行运算,得到每一层的输出,最终到达输出层。

         反向传播(BP算法)

        BP算法(即误差反向传播算法)是适合于多层神经网络的一种学习算法,它建立在梯度下降法的基础上。

        当前向传播完成后,会逐层求出损失函数对各神经元权值的偏导数(链式法则),构成损失函数对权值向量的梯量,作为修改权值的依据,网络的学习在权值修改过程中完成。误差达到所期望值时,网络学习结束。

         梯度下降法的场景假设

        一个人被困在山上,需要从山上下来。但此时山上的浓雾很大,导致可视度很低。因此,下山的路径就无法确定,他必须利用自己周围的信息去找到下山的路径。这个时候,他就可以利用梯度下降算法来帮助自己下山。具体来说就是,以他当前的所处的位置为基准,寻找这个位置最陡峭的地方,然后朝着山的高度下降的地方走。然后每走一段距离,都反复采用同一个方法,最后就能成功的抵达山谷。

        我们同时可以假设这座山最陡峭的地方是无法通过肉眼立马观察出来的,而是需要一个复杂的工具来测量。所以,此人每走一段距离,都需要一段时间来测量所在位置最陡峭的方向,这是比较耗时的。那么为了在太阳下山之前到达山谷,就要尽可能的减少测量方向的次数。这是一个两难的选择,如果测量的频繁,可以保证下山的方向是绝对正确的,但又非常耗时,如果测量的过少,又有偏离轨道的风险。所以需要找到一个合适的测量方向的频率,来确保下山的方向不错误,同时又不至于耗时太多!

         梯度下降法

        梯度下降的基本过程就和下山的场景很类似。

        首先,我们有一个可微分的损失函数,这个函数就代表着一座山。我们的目标就是找到这个函数的最小值,也就是山谷。根据之前的场景假设,最快的下山的方式就是找到当前位置最陡峭的方向,然后沿着此方向向下走,对应到函数中,就是找到给定点的梯度,然后朝着梯度相反的方向,就能让函数值下降的最快!

        所以,我们重复利用这个方法,反复求取梯度,最后就能到达局部的最小值,这就类似于我们下山的过程。而求取梯度就确定了最陡峭的方向,也就是场景中测量方向的手段。

        上面提到,需要找给定点的梯度,那么,梯度是什么?

         微分

        看待微分的意义,可以有不同的角度,最常用的两种是:

        1、函数图像中,某点的切线的斜率。

        2、函数的变化率。

         梯度

        梯度实际上就是多变量微分的一般化。

        我们可以看到,梯度就是分别对每个变量进行微分,然后用逗号分割开,梯度是用<>括起来,说明梯度其实是一个向量。

        梯度是微积分中一个很重要的概念,梯度的意义:

        1、在单变量的函数中,梯度其实就是函数的微分,代表着函数在某个给定点的切线的斜率。

        2、在多变量函数中,梯度是一个向量,向量有方向,梯度的方向就指出了函数在给定点的上升最快的方向。

         梯度下降法的数学公式

        J是关于Θ的一个函数,我们当前所处的位置为Θ0点,要从这个点走到J的最小值点,也就是山谷。首先我们先确定前进的方向,也就是梯度的反向,然后走一段距离的步长,也就是α,走完这个段步长,就到达了Θ1这个点!

        α在梯度下降算法中被称作为学习率或者步长,意味着我们可以通过α来控制每一步走的距离,以保证不要步子跨的太大扯着蛋(其实就是不要走太快,错过了最低点)。同时也要保证不要走的太慢,导致太阳下山了,还没有走到山谷。

         α学习率

        α的选择在梯度下降法中往往是很重要的!α不能太大也不能太小,太小的话,可能导致迟迟走不到最低点,太大的话,会导致错过最低点!

         假设有一个下面的损失函数、起始点以及学习率。现在要通过梯度下降法计算这个函数的最小值。我们通过观察就能发现最小值其实就是(0,0)点。但是接下来,我们会从梯度下降算法开始一步步计算到这个最小值!

  • 41
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 28
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

希望_睿智

您的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值