深度学习主流算法

2018-06-19 16:04:53 SIGAI_CSDN 阅读数 24010

其它机器学习、深度学习算法的全面系统讲解可以阅读《机器学习-原理、算法与应用》,清华大学出版社,雷明著,由SIGAI公众号作者倾力打造。

导言
目标检测的任务是找出图像中所有感兴趣的目标(物体),确定它们的位置和大小,是机器视觉领域的核
心问题之一。由于各类物体有不同的外观,形状,姿态,加上成像时光照,遮挡等因素的干扰,目标检测
一直是机器视觉领域最具有挑战性的问题。本文将针对目标检测(Object Detection)这个机器视觉
中的经典任务进行解析,抛砖引玉。如对文中的内容持不同观点,欢迎到SIGAI公众号发消息给我们,一
起探讨!

什么是目标检测?

目标检测的任务是找出图像中所有感兴趣的目标(物体),确定它们的位置和大小,是机器视觉领域的核心问题之一。由于各类物体有不同的外观,形状,姿态,加上成像时光照,遮挡等因素的干扰,目标检测一直是机器视觉领域最具有挑战性的问题。

计算机视觉中关于图像识别有四大类任务:

  • 分类-Classification:解决“是什么?”的问题,即给定一张图片或一段视频判断里面包含什么类别的目标。
  • 定位-Location:解决“在哪里?”的问题,即定位出这个目标的的位置。
  • 检测-Detection:解决“是什么?在哪里?”的问题,即定位出这个目标的的位置并且知道目标物是什么。
  • 分割-Segmentation:分为实例的分割(Instance-level)和场景分割(Scene-level),解决“每一个像素属于哪个目标物或场景”的问题。
  •  
  •  
  •  

目标检测要解决的核心问题

除了图像分类之外,目标检测要解决的核心问题是:

1.目标可能出现在图像的任何位置。

2.目标有各种不同的大小。

3.目标可能有各种不同的形状。

如果用矩形框来定义目标,则矩形有不同的宽高比。由于目标的宽高比不同,因此采用经典的滑动窗口+图像缩放的方案解决通用目标检测问题的成本太高。

 

目标检测的应用

目标检测在很多领域都有应用需求。其中被广为研究的是人脸检测,行人检测,车辆检测等重要目标的检测。人脸检测在SIGAI上一篇文章“人脸识别算法演化史”中已经简单介绍,后面我们会针对这个问题撰写综述文章。

行人检测

行人检测在视频监控,人流量统计,自动驾驶中都有重要的地位,后续也会有相关综述文章。

 

车辆检测

车辆检测在智能交通,视频监控,自动驾驶中有重要的地位。车流量统计,车辆违章的自动分析等都离不开它,在自动驾驶中,首先要解决的问题就是确定道路在哪里,周围有哪些车、人或障碍物。

其他应用

交通标志如交通灯、行驶规则标志的识别对于自动驾驶也非常重要,我们需要根据红绿灯状态,是否允许左右转、掉头等标志确定车辆的行为。

交通标志检测

除了这些常见目标的检测之外,很多领域里也需要检测自己感兴趣的目标。比如工业中材质表面的缺陷检测,硬刷电路板表面的缺陷检测等。

农业中农作物表面的病虫害识别也需要用到目标检测技术:

农作物病虫害检测

人工智能在医学中的应用目前是一个热门的话题,医学影像图像如MRI的肿瘤等病变部位检测和识别对于诊断的自动化,提供优质的治疗具有重要的意义。

肿瘤检测

 

目标检测相关算法

 

DPM算法

与人脸、行人等特定类型的目标检测不同,通用目标检测要同时检测出图像中的多类目标,难度更大。处理这一问题的经典方法是DPM(Deformable Part Model),正如其名,这是可变形的组件模型,是一种基于组件的检测算法。该模型由Felzenszwalb在2008年提出,并发表了一系列的CVPR,NIPS文章,蝉联三届PASCAL VOC目标检测冠军,拿下了2010年PASCAL VOC的“终身成就奖”。

在深度卷积神经网络(DCNN)出现之前,DPM算法一直是目标检测领域最优秀的算法,它的基本思想是先提取DPM人工特征(如下图所示),再用latentSVM分类。这种特征提取方式存在明显的局限性,首先,DPM特征计算复杂,计算速度慢;其次,人工特征对于旋转、拉伸、视角变化的物体检测效果差。这些弊端很大程度上限制了算法的应用场景。

                                                                                                   DPM目标检测流程

 

Alexnet

现代深度神经网络的想法早在2006年就被 Geoffrey Hinton 提出,直到2012年,Alex Krizhevsky凭借著名的Alexnet卷积神经网络模型以领先第二名10%的成绩夺得ILSVRC2012图像分类比赛冠军,深度学习技术才真正走进主流学术界和工业界的视野。深度神经网络的出现颠覆了传统的特征提取方式,凭借其强大的表达能力,通过丰富的训练数据和充分的训练能够自主学习有用的特征。这相比传统的人工发现特征并根据特征设计算法的方式是质的飞跃。

通过卷积神经网络可以学到物体在各个层次的抽象表达(关于卷积神经网络的原理以及为什么会有效,SIGAI会在接下来的文章中介绍):

深度学习得到的层次特征表达

 

OverFeat

2013年纽约大学Yann LeCun团队中Zhang xiang等提出的OverFeat在ILSVRC2013比赛中获得了多项第一,他们改进了Alexnet,提出了使用同一个卷积网络完成了多个任务的方法。该方法充分利用了卷积神经网络的特征提取功能,它把分类过程中提取到的特征同时又用于定位检测等各种任务,只需要改变网络的最后几层,就可以实现不同的任务,而不需要从头开始训练整个网络的参数。这充分体现和发掘了CNN特征共享的优点。

该文主要的亮点是:

  1. 共享卷基层用于多任务学习。
  2. 全卷积网络思想。
  3. 在特征层进行滑窗操作(Sliding Window)避免大量重复运算,这也是后来的系列算法不断沿用和改进的经典做法。

OverFeat几个明显的缺陷:

  1. 采用了多尺度贪婪的划窗策略,导致计算量还是很大 。
  2. 由于当时并没有太优秀的backbone网络,共享特征层的表征能力不是太强,没有考虑多尺度特征融合,对小目标效果差,整体的检测效果不尽如人意。ILSVRC 2013数据集上的mAP(可以简单的理解为检测准确率)为24.3%。

经典的卷积神经网络有一个问题是它只能接受固定大小的输入图像,这是因为第一个全连接层和它之前的卷积层之间的权重矩阵大小是固定的,而卷积层、全连接层本身对输入图像的大小并没有限制。而在做目标检测时,卷积网络面临的输入候选区域图像大小尺寸是不固定的。

下面用一个例子说明怎么让一个已经设计好的DCNN模型,可以支持任意大小图片输入,其中一种方案是全卷积网络(FCN),即去掉所有全连接层,全部由卷积层来替代:

FCN并不是把5×5的图片展平成一维向量再进行计算,而是直接采用5×5的卷积核对一整张图片进行卷积运算。比如16×16大小的特征图片,那么会是什么样的结果?请看下面的示意图:

 

这个时候就会发现,网络最后的输出是一张2×2大小的特征图片。可以发现采用FCN网络,可以输入任意大小的图片。需要注意的是网络最后输出的特征图片大小不再总是1×1而是一个与输入图片大小相关。

OverFeat有很多创新,但是不能算是目标检测典型的Pipeline,所以我们单独提了出来。下面将从R-CNN开始介绍目前基于DCNN物体检测发展脉络。

卷积神经网络用于目标检测之后,进展神速,在短期内大幅度的提高了算法的精度,推动这一技术走向实用。

 

R-CNN

Region CNN(简称R-CNN)由Ross Girshick(江湖人称RBG大神,Felzenszwalb的学生)提出,是利用深度学习进行目标检测的里程碑之作,奠定了这个子领域的基础。这篇文章思路清奇,在DPM方法经历多年瓶颈期后,显著提升了检测率(ILSVRC 2013数据集上的mAP为31.4%)。RBG是这个领域神一样的存在,后续的一些改进方法如Fast R-CNN、Faster R-CNN、YOLO等相关工作都和他有关。

 

R-CNN检测时的主要步骤为:

1.使用Selective Search算法从待检测图像中提取2000个左右的区域候选框,这些候选框可能包含要检测的目标。

2.把所有侯选框缩放成固定大小(原文采用227×227)。

3.用DCNN提取每个候选框的特征,得到固定长度的特征向量。

4.把特征向量送入SVM进行分类得到类别信息,送入全连接网络进行回归得到对应位置坐标信息。

 

R-CNN不采用滑动窗口方案的原因一是计算成本高,会产生大量的待分类窗口;另外不同类型目标的矩形框有不同的宽高比,无法使用统一尺寸的窗口对图像进行扫描。用于提取特征的卷积网络有5个卷积层和2个全连接层,其输入是固定大小的RGB图像,输出为4096维特征向量。对候选区域的分类采用线性支持向量机,对每一张待检测图像计算所有候选区域的特征向量,送入支持向量机中进行分类;同时送入全连接网络进行坐标位置回归。

 

R-CNN虽然设计巧妙,但仍存在很多缺点:

1.重复计算。R-CNN虽然不再是穷举,但通过Proposal(Selective Search)的方案依然有两千个左右的候选框,这些候选框都需要单独经过backbone网络提取特征,计算量依然很大,候选框之间会有重叠,因此有不少其实是重复计算。

2.训练测试不简洁。候选区域提取、特征提取、分类、回归都是分开操作,中间数据还需要单独保存。

3.速度慢。前面的缺点最终导致R-CNN出奇的慢,GPU上处理一张图片需要十几秒,CPU上则需要更长时间。

4.输入的图片Patch必须强制缩放成固定大小(原文采用227×227),会造成物体形变,导致检测性能下降。

 

SPPNet

此后MSRA的Kaiming He等人在R-CNN的基础上提出了SPPNet,该方法虽然还依赖候选框的生成,但将提取候选框特征向量的操作转移到卷积后的特征图上进行,将R-CNN中的多次卷积变为一次卷积,大大降低了计算量(这一点参考了OverFeat)。

 

R-CNN的卷积网络只能接受固定大小的输入图像。为了适应这个图像尺寸,要么截取这个尺寸的图像区域,这将导致图像未覆盖整个目标;要么对图像进行缩放,这会产生扭曲。在卷积神经网络中,卷积层并不要求输入图像的尺寸固定,只有第一个全连接层需要固定尺寸的输入,因为它和前一层之间的权重矩阵是固定大小的,其他的全连接层也不要求图像的尺寸固定。如果在最后一个卷积层和第一个全连接层之间做一些处理,将不同大小的图像变为固定大小的全连接层输入就可以解决问题。

 

SPPNet引入了Spatial Pyramid pooling层,对卷积特征图像进行空间金字塔采样获得固定长度的输出,可对特征层任意长宽比和尺度区域进行特征提取。具体做法是对特征图像区域进行固定数量的网格划分,对不同宽高的图像,每个网格的高度和宽度是不规定的,对划分的每个网格进行池化,这样就可以得到固定长度的输出。下图是SPP操作示意图:

相比R-CNN,SPPNet的检测速度提升了30倍以上。下图是R-CNN和SPPNet 检测流程的比较:

下图是SPPNet的原理:

                                                                                                     SPPNet 检测框架图

 

SPPNet和R-CNN一样,它的训练要经过多个阶段,中间特征也要进行存储;backbone网络参数沿用了分类网络的初始参数,没有针对检测问题进行优化。

 

Fast RCNN

Ross Girshick 针对SPPNet做了进一步改进提出的FRCNN ,其主要创新是RoI Pooling 层,它将不同大小候选框的卷积特征图统一采样成固定大小的特征。ROI池化层的做法和SPP层类似,但只使用一个尺度进行网格划分和池化。该层可以直接求导,训练时直接将梯度传导到backbone网络进行优化。FRCNN针对R-CNN和SPPNet在训练时是多阶段的和训练的过程中很耗费时间空间的问题进行改进。将深度网络和后面的SVM分类两个阶段整合到一起,使用一个新的网络直接做分类和回归。使得网络在Pascal VOC上的训练时间从R-CNN的84小时缩短到9.5小时,检测时间更是从45秒缩短到0.32秒。

                          

 

重要的是Fast RCNN的backbone网络也可以参与训练了!!!

 

Faster RCNN

SPPNet和Faster RCNN都需要独立的候选区域生成模块,这个模块计算量很大,而且不易用GPU加速。针对这个问题,Shaoqin Ren 等人在Faster RCNN基础上提出Faster R-CNN ,在主干网络中增加了RPN (Region Proposal Network)网络,通过一定规则设置不同尺度的锚点(Anchor)在RPN的卷积特征层提取候选框来代替Selective Search等传统的候选框生成方法,实现了网络的端到端训练。候选区域生成、候选区域特征提取、框回归和分类全过程一气呵成,在训练过程中模型各部分不仅学习如何完成自己的任务,还自主学习如何相互配合。这也是第一个真正意义上的深度学习目标检测算法。

注:Shaoqin Ren实现的matlab版本中RPN阶段和FRCNN阶段是分开训练的,但是在实际的实践中
(RBG实现的Python版本)发现二者可以一起优化训练,而且精度没有损失,可以说Faster RCNN真
正实现了端到端的训练。

 

R-FCN

由于现在的主流网络层数越来越多,基于Faster RCNN检测框架的方法的计算量受到了3个因素的影响:

1.基础网络的复杂度

2.候选框数量的多少

3.分类和位置回归子网络的复杂度(每个候选框的box都会独立进行前向计算)。

一般来说直接优化前两点性价比不太高。如果直接优化RoI-wise subnetwork是否可行呢,将子网络的深度尽可能减少?分类是要增加物体的平移不变性(不同的位置都是同一个物体);目标检测时减少物体的平移变化(目标检测需要得到物体所在的位置)。通常我们所用的网络都是ImageNet的分类任务训练得到的,在目标检测的时候进行Finetune。由于得到的初始模型基于分类任务,那么会偏向于平移不变性,这和目标检测就出现了矛盾。

MSRA的Jifeng Dai等人提出了R-FCN,通过position-positive score maps(位置敏感得分图)来解决这个矛盾。位置敏感得分图通过预测RoI中不同部位的类别投票表决产生该RoI的类别预测。引用原文中的例子,“如果我们的算法要识别婴儿,那么把一个目标区域分成九宫格,其中算法认为其中五个格子中的区域分别像婴儿的头、四肢和躯干,那么根据投票机制,就认为这个目标区域里的是一个婴儿。这很符合我们人类的判断逻辑。

R-FCN沿用了 Faster RCNN 的框架结构,不同的是在Faster R-CNN的基础上通过引入位置敏感得分图,将RoI-wise subnetwork消灭了,直接在位置敏感得分图上利用ROI Pooling进行信息采样融合分类和位置信息。

                                                                     ResNet101为例,不同检测框架复用卷积网络层数

 

Mask R-CNN

2017年Kaiming He等提出了Mask R-CNN ,并获得ICCV2017 Best Paper Award。作者指出,Faster R-CNN在做下采样和RoI Pooling时都对特征图大小做了取整操作,这种做法对于分类任务基本没有影响,但对检测任务会有一定影响,对语义分割这种像素级任务的精度影响则更为严重。为此,作者对网络中涉及特征图尺寸变化的环节都不使用取整操作,而是通过双线性差值填补非整数位置的像素。这使得下游特征图向上游映射时没有位置误差,不仅提升了目标检测效果,还使得算法能满足语义分割任务的精度要求。

以上介绍的检测方法都属于two-stage的方案,即分为候选区域生成和区域分类两步,接下来我们将介绍几种single-stage的经典方法。

 

YOLO系列

2015年,随着YOLO算法的出现,深度学习目标检测算法开始有了两步(two-stage)和单步(single-stage)之分。区别于R-CNN系列为代表的两步检测算法,YOLO舍去了候选框提取分支(Proposal阶段),直接将特征提取、候选框回归和分类在同一个无分支的卷积网络中完成,使得网络结构变得简单,检测速度较Faster R-CNN也有近10倍的提升。这使得深度学习目标检测算法在当时的计算能力下开始能够满足实时检测任务的需求。

算法将待检测图像缩放到统一尺寸,为了检测不同位置的目标,将图像等分成的网格,如果某个目标的中心落在一个网格单元中,此网格单元就负责预测该目标。

YOLOv1只针对最后7x7的特征图进行分析,使得它对小目标的检测效果不佳,当多个目标出现在一个Grid Cell时不容易区分。

YOLOv2改进了YOLOv1的网络结构,除加入时下热门的批量归一化层以及残差网络结构以外,还针对性的训练了一个高分辨率的分类网络(448x448)然后利用该网络训练检测网络,单单通过提升输入的分辨率,mAP获得了4%的提升。YOLOv1利用单个grid cell拼接成全连接层完成边框的预测,导致丢失较多的空间信息,定位不准,作者在这一版本中进行了优化改进:

1.借鉴了Faster R-CNN中的Anchor思想,但是作者在实践中发现用基于规则选择的Anchor效果并没有得到提升,实验中作者对Pascal VOC和COCO的数据集进行了统计分析(聚类分析)选择针对行的Anchor的尺寸性能的到了明显提升。

 

2.作者在使用anchor boxes时发现模型收敛不稳定,尤其是在早期迭代的时候。大部分的不稳定现象出现在预测box的 (x,y) 坐标的优化上。因此作者就没有采用直接预测offset的方法,而使用了预测相对于grid cell的坐标位置的办法,利用logistic函数把ground truth归一化到0到1之间,坐标值被归一化后,模型优化会更稳定。

YOLOv3在YOLOv2的基础上使用了全新设计的Darknet53残差网络并结合FPN网络结构,在网络后两个特征图上采样后于网络前期相应尺寸的特征图聚合再经过卷积网络后得到预测结果。这些改进使得YOLOv3用三分之一的时间达到与SSD相当的精确度。在 COCO test-dev 上 mAP@0.5 达到 57.9%,与RetinaNet(FocalLoss论文所提出的单阶段网络)的结果相近,但速度快4倍。

 

YOLOv3的模型比之前的版本复杂了不少,可以通过改变模型结构的大小来权衡速度与精度。

YOLOv3的改进点:

1. 多尺度预测(FPN)

2. 更好的Backbone网络(Darknet53残差网络)

3. 分类损失采用binary cross-entropy损失函数替换Softmax损失函数(Softmax会选择分数最高的类别判定为当前框所属的类别,而现实中一个目标可能属于多个类别标签)

SSD

SSD对YOLO进行了改进,达到了和两阶段方法相当的精度,同时又保持了较快的运行速度。SSD也采用了网格划分的思想,和Faster RCNN不同的是它将所有的操作整合在一个卷积网络中完成。为了检测不同尺度的目标,SSD对不同卷积层的特征图像进行滑窗扫描;在前面的卷积层输出的特征图像中检测小的目标,在后面的卷积层输出的特征图像中检测大的目标。它的主要特点是:

1.基于多尺度特征图像的检测:在多个尺度的卷积特征图上进行预测,以检测不同大小的目标,一定程度上提升了小目标物体的检测精度。

2.借鉴了Faster R-CNN中的Anchor boxes思想,在不同尺度的特征图上采样候选区域,一定程度上提升了检测的召回率以及小目标的检测效果。下图是SSD的原理:

FPN

FPN(Feature Pyramid Network)方法同时利用低层特征高分辨率和高层特征的高语义信息,通过融合这些不同层的特征达到提升预测的效果的作用。FPN中预测是在每个融合后的特征层上单独进行的,这和常规的特征融合方式有所不同。

FPN 网络结构如下图d(其中YOLO使用b结构,SSD使用c结构)所示,它的结构具有相当的灵活性,可以和各种特征提取网络结合作为检测算法的基础网络。在后文中会看到,目前大多数state-of-art的模型都采用了这种结构。其中RetinaNet在FPN的基础上使用了ResNet网络提取特征,并用Focal Loss损失改善单步目标检测算法中普遍存在的前景类和背景类损失不均衡的问题。这些基于FPN结构的检测算法能够在增加网络深度、获取更丰富语义信息的同时从浅层特征图中获取更丰富且高分辨率的图像特征,这使得这种网络结构在实际应用中表现出优异的性能。

目前主流检测框架有4种使用特征的形式:

1.图像金字塔。即将图像缩放到不同的大小,然后不同大小的图像生成对应的特征。这种方法的缺点是增加了时间成本。有些算法会在检测时采用这种图像金字塔的方案。

2.单一尺度特征层。SPPNet,Fast RCNN,Faster RCNN采用这种方式,即仅采用网络最后一层卷积层的特征。

3.SSD采用这种多尺度特征融合的方式,但是没有上采样过程,即从网络不同层抽取不同尺度的特征做预测,这种方式不会增加额外的计算量。SSD算法中没有用到足够低层的特征(在SSD中,最低层的特征是VGG网络的conv4_3),而足够低层的特征对于检测小物体是很有帮助的。

4.FPN采用bottom-up与top-down的结构,实现了低层特征和高层语义特征的融合,提高了特征映射的信息密度和分辨率,提高了小目标物体的检测效果;区别于SSD,FPN每层都是独立预测的。

COCO2017排行榜

最后我们来看通用目标检测算法的最新进展。下图是MSCOCO 2017年目标检测竞赛的领先算法:

其中排名第一的模型为旷视科技(face++)提交的MegDet。他们的方案没有在检测算法方面做过多优化(采用的是ResNet50+FPN),而是在并行训练规模上做了优化。训练硬件环境是由128个GPU组成的集群,通过改进跨GPU批量归一化算法和学习率变化策略,将batch size增大到256张,这使得批量归一化层中使用的批均值和方差更能够反应总体特征,有效提升了归一化效果,从而大幅提升训练速度并且得到了非常好的结果。

排名第二的方案PAN改进了FPN算法,如下图所示。它在FPN的基础上不仅增加了一个降采样网络(b),还聚合使用了多个不同尺度特征图上的预测候选框(c)。该模型不仅在这一届的COCO目标检测竞赛中名列第二,而且取得了语义分割任务的冠军。

第三名的模型出自MSRA之手,他们同样没有对检测算法本身做过多改进,在FPN基础上使用了Xception网络结构和SoftNMS,但与以往不同的是使用了可变卷积层DCN(deformable convnet)替代了传统卷积,使得卷积层能够根据图片的语义信息调整卷积核感受点的位置,达到提升网络特征提取能力的目的。下图是可变卷积层的原理:

排名第四的结果是用以FPN+ResNeXt网络为作为基础网络的Mask R-CNN算法得到的。后面大多数成绩优异的模型都是R-FCN、FPN、Faster-RCNN等经典模型结合DCN、Attention机制、先进分类网络结构和模型融合等技术而形成的算法。

 

 

 

推荐文章

[1] 机器学习-波澜壮阔40年 SIGAI 2018.4.13.

[2] 学好机器学习需要哪些数学知识?SIGAI.4.17.

[3] 人脸识别算法演化史 SIGAI 2018.4.20.

 

2018-02-22 10:48:47 drilistbox 阅读数 1444

文章列表
1.深度学习基础模型算法原理及编程实现–01.感知机.
2.深度学习基础模型算法原理及编程实现–02.线性单元 .
3.深度学习基础模型算法原理及编程实现–03.全链接 .
4.深度学习基础模型算法原理及编程实现–04.改进神经网络的方法 .
5.深度学习基础模型算法原理及编程实现–05.卷积神经网络.
6.深度学习基础模型算法原理及编程实现–06.循环神经网络.
9.深度学习基础模型算法原理及编程实现–09.自编码网络.

深度学习基础模型算法原理及编程实现–03.全链接

神经网络是由MP神经元(如下图所示)构成,MP神经元是一种多输入单输出的信息处理单元,其实前面讲到的感知机以及线性单元都是MP神经元的一种特例,只是激活函数不同,常见的激活函数有sigmoid、tanh、ReLU、softplus等,后面用到的时候会慢慢介绍各自的特点及差异。

这里写图片描述
图 1 MP神经元模型

将神经元按一定的规则排列可以形成神经网络,首先介绍最基本的全连接神经网络。全链接神经网络可以处理多类分类问题和回归问题,其拓扑结构为单/多隐层、全连接且有向无环,依据拓扑结构及神经元的数学模型构建输入信息与输出标签的映射关系,以标签向量与输出向量差的均方误差(或MSE)为损失函数,通过梯度下降寻找映射关系中各参数信息。
将MP神经元看成一个节点,自然会想到类似于生命体身上的神经链络,近乎于随意连接。但在实际应用中,出于简化问题及高效计算的考虑,主流神经网络模型都是以层为基本单位的,将多个神经元节点并行排列,且同一层中各个节点之间没有连接,我们将这样的组合方式称为“层”。按功能差异,层可细分为“输入层”、“中间层(或隐藏层)”及“输出层”,下图展示了只有一个隐藏层的神经网络模型示意图,它是由多个MP神经网络排列而成,其拓扑结构为:单隐层、全连接且有向无环,也可称其为单隐层前馈神经网络。其中xi(i=1,2,3)为输入层训练数据中i第个标记的值,由于中间层及输出层的结构形式一致(均为数个神经元按列排列而成),且输入层为直接读入的样本数据,所以下面在讨论到第几层中的层仅指中间层及输出层。Hornik等人已经证明:若输出层采用线性激活函数,隐层采用sigmoid函数,则单隐层神经网络能够以任意进度逼近任何有理函数。

这里写图片描述
图 2 单隐层全链接神经网络示意

全链接神经网络出现之前,图像分类算法依赖于复杂的特征工程。常用的特征提取方法包括SIFT(尺度不变特征转换)、HOG(方向梯度直方图)、LBP(局部二值模式)等,常用的分类算法为SVM。虽然全连接在MNIST数据识别上效果不错,但由于全链接神经网络中参数太多,并且有层数限制,没有考虑图像局部的相关性等,一般不适合用来识别图像,也许以后在硬件或算法上有新的突破。

1.1 全连接神经网络的训练

Nk为第k层中神经元的个数;netjk为第k层中第j个节点的加权输入值,维数为1Nkwijk为第k1层中第i个节点到第k层第j个节点的加权系数输入值,维数为Nk1Nk(我个人觉得这样更顺眼,因为由前往后,与前馈神经网络前向传输顺序一致);fk 为第k层中的激活函数;bjk 为第k层中的偏置项到第k层第j个节点的偏置系数,维数为1Nkyjk为第k层中第j个节点的训练输出值,维数为 1Nk
则对第k层有:

这里写图片描述

将其矢量化,有

这里写图片描述

至此前向传导算法介绍完毕,式(3.2)给出其运算表达式。
权重矩阵及偏置项的理解:为了方便理解,假定激活函数都是线性函数(非线性函数可以理解成特征空间的扭变),对于分类问题而言,权重矩阵Wk中的每一列都是一个二分类分类器的系数,而偏差Bk中的每个元素表示分类器曲面相对于原点沿高维法向上的平移。如果偏差为0的话,那么所有分类器的曲面都将过高维空间中的同一点,这显然是不合理的。此外,经过激活函数处理后,设实例点到分类曲面的距离为L,输出的大小是分类准确度以及L的联合表征,所以在多分类问题的中,我们会通过比较输出层的大小来判定类别,因为输出值越大,表示该类有最好的准确度,并且L也最大。
也可将分类过程看做模板匹配:权重矩阵Wk中的每一列都是一个分类模板。通过使用内积(也叫点积)来计算图像与模板的相似度,然后找到相似度最高模板最相似;从另一个角度来看,可以认为还是在高效地使用k-NN(因为没有使用所有的训练图像来比较),每个类别只用了一张图片(Wk中的对应的一列reshape为图像的维度,这张图片是模型通过学习得到图像内在数据结构,不是训练集中的某一张,k-NN算法本身并没有学习到任何的数据内在结构信息)。

3.1.2 梯度计算

按照机器学习的通用套路,先确定损失函数,然后用(随机)梯度下降算法迭代寻优获取获取最佳的权重系数以及偏置系数,即损失函数最小时的参数值。不失一般性,取神经网络输出值方差的一半作为损失函数,即以标签向量与输出向量差的二范数平方和的一半做为损失函数,即有:

这里写图片描述

其中L为训练标签向量, Yk为输出层的输出向量
梯度下降法的关键就是求取每个参数的偏导数,可以利用链式求导计算损失函数对每个权重及偏置项的偏导数(即梯度),通过设置学习速率,利用梯度下降公式更新权重系数及偏置系数,具体实现流程如下:

3.1.2.1 偏导数计算
3.1.2.1.1 对权重系数的偏导数


这里写图片描述

式中δjk称为误差项。误差项计算较为复杂,后面会在1.2.3小节中详细介绍。将上式整理成向量形式:

这里写图片描述

3.1.2.1.2 对偏置量的偏导数


这里写图片描述

整理成向量形式:

这里写图片描述

3.1.2.1.3 误差项
3.1.2.1.3.1输出层误差项

对于输出层,有k=K,且由下图不难发现,输出层的每个加权输入节点处的误差仅由对应节点的输出决定:

这里写图片描述
这里写图片描述

整理成向量形式:

这里写图片描述

上式给出了损失函数为二次型误差项且输出层激活函数为sigmoid的情况,如果将误差项采用交叉项:
这里写图片描述

如果将激活函数改为softmax且误差项不变,这样的组合称为softmax-loss,那么输出层的误差项为:

这里写图片描述

可见对分类问题,对任意激活函数,采用交叉熵损失函数只要算一个神经元节点的偏导数即可,计算量减小;如果将激活函数再改为softmax函数,那么误差项只要一个相减操作,计算量更小。

3.1.2.1.3.2隐藏层误差项

对于隐藏层,有1≤k≤K-1,且由下图的拓扑结构不难发现,中间层的每个加权输入对下一层的所有节点都会产生影响,因此在求偏微分时,有:


这里写图片描述

这里写图片描述

整理成向量形式:

这里写图片描述

上式给出了隐藏层激活函数为sigmoid的情况,如果将激活函数改为softmax,那么输出层的误差项为:

这里写图片描述

可见,隐藏层用softmax做激活函数在计算上并没有太大的优势,但在输出层中,如果激活函数用softmax并配合交叉熵损失函数来使用,那么计算量会非常小

3.1.3 系数更新:

梯度下降法,学习速率为


这里写图片描述

整理成向量形式:


这里写图片描述

1.1.4小结

上面只是最简单的全连接神经网络,下一节会讲述改进神经网络的方法。

1.2 编程实现

现在尝试利用上面的全连接神经网络模型来识别手写数字,采用MNIST数据集来检测算法性能,MNIST数据集有60000个手写字母的训练样本,我们使用它训练我们的神经网络,然后再用训练好的模型去对MNIST数据集中的10000个测试样本进行测试。编程实现的全连接神经网络只有一个隐藏层,输入为1*784的向量数据(经28*28的图片转换而成),向量中的每个元素表示图像中对应像素的灰度值,输出为长度为10的向量,向量中最大的值所在位置及表示识别的数字,中间层神经元节点数目选为100。有几个经验公式可供参考:

这里写图片描述

单隐层前馈全连接神经网络实现起来较为简单,我已经将实现好的程序放在网上,只要有一定的C++及python语法基础都可以看懂程序,由于个人也是刚刚系统的接触深度学习,感觉程序跑的有点慢,有不对的地方还希望广大同学告诉我,希望大家多多指导。
python版本:https://pan.baidu.com/s/1qZLJ7Gg
C++版本:https://pan.baidu.com/s/1qZLJ7Gg

C++版本运算特别慢,应该是权重矩阵太大了,计算比较耗时,主要还是我自己编的不行;下篇卷积神经网络中矩阵比较小,计算速度会快很多。这里给出了python版本的测试数据准确率:94.6%
这里写图片描述

2019-03-12 19:59:40 qq_38588806 阅读数 1443

四、图像分类之后发展
这里只做简介,并给出引用,因为别人已经写得很好了,概念类东西不是本系列的重点,我主要写的是在之后章给出的一些自己的tip
CNN进化图
图像分类模型叙述步骤如下:CNN之前模型->leNet->AlexNet->VGG系列->GoogLeNet->Inception系列->ResNet系列->Inception-Resnet系列->SENet。现在讲AlexNet

4.1 AlexNet
论文中alexnet如下定义
dd
这算是跨时代的模型了,提出了dropout思想,Relu,LRN,最大池化。
1.dropout就是训练过程随机忽略一些神经元(输出设置为0),防止过拟合
2.Relu激活函数,解决梯度弥散,效果远超sigmoid
3.LRN就是局部正则化,对局部神经元的活动创建竞争机制,使得响应较大的值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力。引自论文:(目的是增强泛化能力)
ss
通过第i个核输出的点(x,y)由相邻核的输出进行正则化运算得到b,n是相邻区间,n/2就是下区间。k, n, α和β是超参数。
4.数据增强,225255截取224224,减轻过拟合,提升了泛化能力
5.最大值池化:之前是平均池化,并不能很好的滤掉噪点,如用最大值池化,去噪效果可以得到极大的提升,因此增强了泛化能力。
详见:AlexNet详细解读AlexNet实现。这里别人已经说的很详细了。

4.2 VGG系列
图像分类模型叙述步骤如下:CNN之前模型->leNet->AlexNet->VGG系列->GoogLeNet->Inception系列->ResNet系列->Inception-Resnet系列->SENet。现在讲VGG
VGG16一般结构如图(引自论文)
ss
不过VGG论文对比了四种配置,其中D就是VGG16,E就是VGG19,同样,前两个FC可以用dropout。
dd
其改变如下:
1.卷积核统一用3X3的核。
2.池化核统一用2X2。
3.也有比如C级用到了1X1的卷积核
4.指出AlexNet常用的LRN用处不大
5.使用预训练好的参数初始化可以加速训练。

之前我们就说过卷积核的大小决定了是不是更多地考虑相邻像素之间的关系,但卷积核太大泛化能力就会下降,且特征图容易产生噪点,这里只采用了3*3的核,实际上,拟合能力可以用深度得到弥补,而1X1的核只是为了对图像进行一个线性变换,主要是1. 实现跨通道的交互和信息整合;2. 进行卷积核通道数的降维和升维。

值得注意的是这里用了连续卷积,这是为了提取更加丰富的特征,但连续卷积到一定程度必将造成质量下降,这里还是用maxpool,这是实验后得出的构造。实现见VGG实现

4.3 GoogLeNet及inception系列
图像分类模型叙述步骤如下:CNN之前模型->leNet->AlexNet->VGG系列->GoogLeNet->Inception系列->ResNet系列->Inception-Resnet系列->SENet。现在讲GoogLeNet。其结构如下,最后结果是3个softmax加权。
dd
LRN这些AlexNet的东西都没变,关键是多了inception结构如下。
dd
以及多出去的辅助分类器,3个softmax会进行加权判定。
ff
GoogleNet参数比VGG小36倍,但性能却比VGG好,而inception结构经历了V1,V2,V3,V4四个版本。
Inception结构如图:
dd
充分利用了1X1,3X3,5X5核的特性,所以既能增加神经网络表现,又能保证计算资源的使用效率。即多尺度的提取,不过问题仍然是如何权衡各个尺度的关系。然后为了减小参数,我们可以用一个1X1的核进行降维,减少参数量,这个原理就如我之前举的canny算子粒子,既然都是提取梯度,RGB在边缘处都有突变,不就可以直接低维嵌入?(激活函数仍然是ReLu)
修改后的InceptionV1如图:
dd
当然,这肯定还不够,为了进一步减少计算量,GoogleNet又提出卷积分解概念,5X5的卷积可以由两个3X3的卷积替代,实际上大家可以仔细想一下,把图像矩阵先收缩再进行3X3卷积,完全可以替代5X5卷积。
进而有inceptionV2:
sd
普遍意义来说,任意nxn的卷积都可以通过1xn卷积后接nx1卷积来替代,进而有InceptionV3:
ff
InceptionV4是与resnet结合的网络,我们之后说
4.4 ResNet
ResNet算是深度学习的革命,网络的深度提升不能通过层与层的简单堆叠来实现。由于臭名昭著的梯度消失问题,深层网络很难训练。因为梯度反向传播到前面的层,重复相乘可能使梯度无穷小。结果就是,随着网络的层数更深,其性能趋于饱和,甚至开始迅速下降。于是resnet用了跳跃连接的方法,先上图:
ffff
这里要注意:resnet学习的是残差函数F(x) = H(x) - x,是让残差与目标函数尽可能拟合,而非函数,这样在计算反向传播的时候就缓解了梯度消失的情况。其18层到152层的配置如下:
dd
代码实现见ResNet实现,原理见ResNet原理

4.5 Inception-resnet系列
说白了就是resnet的残差与inception结构结合罢了。论文中结构如下:
dddddddddddd
具体见INCEPTION-RESNET介绍代码实现

4.6 SENet
即压缩激活网络,除了SE模块其他与之前讲的相同。其表述如下:
ddd
考虑了特征通道之间的相互依赖关系,所谓压缩可以理解为一个pooling只不过是有全局感受野的,而激活即通过参数 w 来为每个特征通道生成权重,其中参数 w 被学习用来显式地建模特征通道间的相关性。最后是一个 Reweight 的操作,将 Excitation 的输出的权重看做是进过特征选择后的每个特征通道的重要性,然后通过乘法逐通道加权到先前的特征上,完成在通道维度上的对原始特征的重标定。与inception ,resnet结合后结构如下:
dd
其效果如下,可以看出通过加入SEmodule让分类结果得到了有效的提升。
dd
4.7 其他网络

4.7.1 DenseNet
dd
建立的是前面所有层与后面层的密集连接,另一大特色是通过特征在channel上的连接来实现特征重用,相比于减少了参数数量且性能更好,配置如下:(引用自论文)
dd具体见DenseNet原理

4.7.2 Residual Attention Networks
就是引用了注意力机制,花书上面已经讲得太多了。结构如下:
dd
配置表如下:
dd
也可见注意力残差网络论文笔记

2018-02-07 16:09:42 vbskj 阅读数 3378

1.       深度学习

        深度学习是机器学习研究中的一个新的领域,其动机在于建立、模拟人脑进行分析学习的神经网络,它模仿人脑的机制来解释数据,例如图像,声音和文本。深度学习典型应用为图像识别和语音识别。(由于本人不是深度学习专业人士,对深度学习理论知识不多介绍,说多了就班门弄斧了,后面主要介绍下这些深度学习算法如何进行并行化设计和优化)

2.       CPU+GPU异构协同计算简介

         近年来,计算机图形处理器(GPU,GraphicsProcess Unit)正在以大大超过摩尔定律的速度高速发展(大约每隔半年 GPU 的性能增加一倍),远远超过了CPU 的发展速度。

         CPU+GPU异构协同计算模式(图1),利用CPU进行复杂逻辑和事务处理等串行计算,利用 GPU 完成大规模并行计算,即可以各尽其能,充分发挥计算系统的处理能力。

图1 CPU+GPU异构体系结构

        目前,主流的GPU具有强大的计算能力和内存带宽,如图2所示,无论性能还是内存带宽,均远大于同代的CPU。对于GPU, Gflop/$和Gflops/w均高于CPU。

图2 GPU计算能力

3.       深度学习中的CPU+GPU集群架构

        CPU+GPU集群工作模式(图3),每个节点内采用CPU+GPU异构模式,并且每个节点可以配置多块GPU卡。节点间采用高速InfiniBand网络互连,速度可以达到双向56Gb/s,实测双向5GB/s。后端采用并行文件系统。采用数据划分、任务划分的方式对应用进行并行化,适用于大规模数据并行计算。

图3 CPU+GPU集群架构

4.       利用GPU加速深度学习算法


4.1.       单GPU并行

图4 单GPU计算流程

        针对每次训练数据,模型内计算通过多次GPU 内核的调用完成计算。权重W值一直存在GPU内存中,直到所有训练数据计算完毕之后回传到系统内存中。Data为图像或语音数据。

4.2.       多GPU卡并行

       多GPU并行计算时,各GPU有自己独立的内存,卡之间的并行属于分布式计算模式。针对深度学习算法,采用多GPU卡计算可以采用两种并行方法:数据并行和模型并行。

4.2.1.       数据并行

       数据并行是指不同的GPU计算不同的训练数据,即把训练数据划分给不同的GPU进行分别计算,由于训练是逐步训练的,后一个训练数据的计算需要前一个训练数据更新的W,数据并行改变了这个计算顺序,多GPU计算需要进行W的互相通信,满足训练的特点,使训练可以收敛。

       数据并行如图5所示,多GPU训练不同的数据,每训练一次需要同步W,使得后面的训练始终为最新的W。

图5 数据并行

数据并行的特点:

1)        优点

            a)        实现比较容易,也比较容易扩展

            b)        只需要进行W的通信,模型内的数据不需要通信

2)        缺点

           a)        当模型较大时,GPU内存无法满足存储要求,无法完成计算

        根据多GPU卡之间的W通信,下面介绍两种通信方法:主从模式和令牌环模式。

1)        主从模式

       主从模式:选择一个进程或线程作为主进程或线程,各个GPU把每次训练得到的ΔW发给主进程或线程,主进程或线程进行W更新,然后再发送给GPU,GPU再进行下一个数据的训练。如图6所示。

图6 主从模式

2)        令牌环模式

       令牌环模式:每个GPU把自己训练得到的ΔW更新到W上,并且发送到下一个GPU,保证令牌环上的W始终为最新的W。如图7所示。

图7 令牌环模式

两种模式对比如表1

表1 主从模式和令牌环模式对比

模式

优点

缺点

主从模式

收敛速度更快

GPU计算需要等待,影响GPU计算;主进程或线程压力较大

令牌环模式

GPU计算不需要等待通信,性能更好

通信速度影响收敛的速度

4.2.2.       模型并行

        模型并行是指多个GPU同时计算同一个训练数据,多个GPU对模型内的数据进行划分,如图8所示。Kernel计算和通信流程如图9所示,在一次训练数据多层计算过程中,每个GPU内核计算之后需要互相交换数据才能进行下一次的计算。

图8 模型并行

图9 模型并行:多GPU计算内核和通信示意图

模型并行特点:

1)        优点

           a)        可以处理大模型的情况

2)        缺点

           a)        需要更频繁的通信,增加通信压力

           b)        实现难度较大

4.3.       GPU集群并行

          GPU集群并行模式即为多GPU并行中各种并行模式的扩展,如表2所示。节点间采用InfiniBand通信,节点间的GPU通过RMDA通信,节点内多GPU之间采用P2P通信。

表2 GPU集群并行模式

模式

节点间

节点内

特点

模式1

令牌环

单一模式的缺点放大

模式2

主从

模式3

模型并行

模式4

令牌环

主从

结合各种模式的有点,避免某一模式的缺点放大

模式5

主从

令牌环

模式6

令牌环

模型并行

模式7

主从

模型并行

4.4.       性能分享

4.4.1.       基于GPU集群的Caffe并行加速

图10 Caffe性能

8节点GPU服务器,2 K20mGPU/节点,56Gb/s InfiniBand网络,Lustre并行文件系统

4.4.2.       基于GPU集群的DNN并行加速

图11 DNN测试性能

4节点GPU服务器,4 K20mGPU/节点,56Gb/s InfiniBand网络

5.       CPU+FPGA协同计算加速线上计算

        相对于训练计算,线上识别的计算是小而众多的任务计算,每次请求的计算比较小,但请求的任务数十分庞大,GPU计算虽然获得很好的性能,但功耗仍然是个严峻的问题。

        目前主流的FPGA卡功耗只有主流GPU的十分之一,性能相差2-3倍,FPGA相对于GPU具有更高的GFlops/W。

利用FPGA解决线上识别计算可以采用分布式+FPGA计算的模式,如图12所示,上层可以采用Hadoop或Spark调度,底层利用FPGA进行计算。

图12 分布式计算+FPGA计算

        目前,FPGA已开始支持高级语言,如AlteraFPGA支持OpenCL,Xilinx FPGA支持HLS,这对程序员利用FPGA开发减低了难度。这些新平台的支持还有很多问题,也许后面会支持的越来越好。

 

备注:由于对深度学习算法了解比较肤浅,以上内容难免无误,请大家理解并提出修改意见。

 QQ:331526010

Email:zhang03_11@163.com

2019-07-25 09:22:08 weixin_43612023 阅读数 1257

本文首发自 easyAI - 人工智能知识库
原文地址:《一文看懂深度学习(白话解释+8个优缺点+4个典型算法)

一文看懂深度学习

深度学习有很好的表现,引领了第三次人工智能的浪潮。目前大部分表现优异的应用都用到了深度学习,大红大紫的 AlphaGo 就使用到了深度学习。

本文将详细的给大家介绍深度学习的基本概念、优缺点和主流的4个典型算法。

深度学习、神经网络、机器学习、人工智能的关系

深度学习、机器学习、人工智能

简单来说:

  1. 深度学习是机器学习的一个分支(最重要的分支)
  2. 机器学习是人工智能的一个分支

深度学习、机器学习、人工智能的关系

目前表现最好的一些应用大部分都是深度学习,正是因为深度学习的突出表现,引发了人工智能的第三次浪潮。详情可以看《人工智能的发展史——3次 AI 浪潮

深度学习、神经网络

深度学习的概念源于人工神经网络的研究,但是并不完全等于传统神经网络。

不过在叫法上,很多深度学习算法中都会包含"神经网络"这个词,比如:卷积神经网络、循环神经网络。

所以,深度学习可以说是在传统神经网络基础上的升级,约等于神经网络。

深度学习和神经网络的关系

大白话解释深度学习

看了很多版本的解释,发现李开复在《人工智能》一书中讲的是最容易理解的,所以下面直接引用他的解释:

我们以识别图片中的汉字为例。

假设深度学习要处理的信息是“水流”,而处理数据的深度学习网络是一个由管道和阀门组成的巨大水管网络。网络的入口是若干管道开口,网络的出口也是若干管道开口。这个水管网络有许多层,每一层由许多个可以控制水流流向与流量的调节阀。根据不同任务的需要,水管网络的层数、每层的调节阀数量可以有不同的变化组合。对复杂任务来说,调节阀的总数可以成千上万甚至更多。水管网络中,每一层的每个调节阀都通过水管与下一层的所有调节阀连接起来,组成一个从前到后,逐层完全连通的水流系统。

深度学习类似一个水流系统

那么,计算机该如何使用这个庞大的水管网络来学习识字呢?

比如,当计算机看到一张写有“田”字的图片,就简单将组成这张图片的所有数字(在计算机里,图片的每个颜色点都是用“0”和“1”组成的数字来表示的)全都变成信息的水流,从入口灌进水管网络。

深度学习-将图片数字化

我们预先在水管网络的每个出口都插一块字牌,对应于每一个我们想让计算机认识的汉字。这时,因为输入的是“田”这个汉字,等水流流过整个水管网络,计算机就会跑到管道出口位置去看一看,是不是标记由“田”字的管道出口流出来的水流最多。如果是这样,就说明这个管道网络符合要求。如果不是这样,就调节水管网络里的每一个流量调节阀,让“田”字出口“流出”的水最多。

这下,计算机要忙一阵了,要调节那么多阀门!好在计算机的速度快,暴力的计算加上算法的优化,总是可以很快给出一个解决方案,调好所有阀门,让出口处的流量符合要求。

深度学习-识别田字

下一步,学习“申”字时,我们就用类似的方法,把每一张写有“申”字的图片变成一大堆数字组成的水流,灌进水管网络,看一看,是不是写有“申”字的那个管道出口流水最多,如果不是,我们还得再调整所有的阀门。这一次,要既保证刚才学过的“田”字不受影响,也要保证新的“申”字可以被正确处理。

深度学习-学习申字

如此反复进行,知道所有汉字对应的水流都可以按照期望的方式流过整个水管网络。这时,我们就说,这个水管网络是一个训练好的深度学习模型了。当大量汉字被这个管道网络处理,所有阀门都调节到位后,整套水管网络就可以用来识别汉字了。这时,我们可以把调节好的所有阀门都“焊死”,静候新的水流到来。

深度学习-学习所有汉字

与训练时做的事情类似,未知的图片会被计算机转变成数据的水流,灌入训练好的水管网络。这时,计算机只要观察一下,哪个出水口流出来的水流最多,这张图片写的就是哪个字。

深度学习大致就是这么一个用人类的数学知识与计算机算法构建起来的整体架构,再结合尽可能多的训练数据以及计算机的大规模运算能力去调节内部参数,尽可能逼近问题目标的半理论、半经验的建模方式。

传统机器学习 VS 深度学习

传统机器学习和深度学习的相似点

传统机器学习和深度学习的相似点

在数据准备和预处理方面,两者是很相似的。

他们都可能对数据进行一些操作:

  • 数据清洗
  • 数据标签
  • 归一化
  • 去噪
  • 降维

对于数据预处理感兴趣的可以看看《AI 数据集最常见的6大问题(附解决方案)

传统机器学习和深度学习的核心区别

传统机器学习和深度学习的核心区别

传统机器学习的特征提取主要依赖人工,针对特定简单任务的时候人工提取特征会简单有效,但是并不能通用。

深度学习的特征提取并不依靠人工,而是机器自动提取的。这也是为什么大家都说深度学习的可解释性很差,因为有时候深度学习虽然能有好的表现,但是我们并不知道他的原理是什么。

深度学习的优缺点

深度学习的优缺点

优点1:学习能力强

从结果来看,深度学习的表现非常好,他的学习能力非常强。

优点2:覆盖范围广,适应性好

深度学习的神经网络层数很多,宽度很广,理论上可以映射到任意函数,所以能解决很复杂的问题。

优点3:数据驱动,上限高

深度学习高度依赖数据,数据量越大,他的表现就越好。在图像识别、面部识别、NLP 等部分任务甚至已经超过了人类的表现。同时还可以通过调参进一步提高他的上限。

优点4:可移植性好

由于深度学习的优异表现,有很多框架可以使用,例如 TensorFlowPytorch。这些框架可以兼容很多平台。

缺点1:计算量大,便携性差

深度学习需要大量的数据很大量的算力,所以成本很高。并且现在很多应用还不适合在移动设备上使用。目前已经有很多公司和团队在研发针对便携设备的芯片。这个问题未来会得到解决。

缺点2:硬件需求高

深度学习对算力要求很高,普通的 CPU 已经无法满足深度学习的要求。主流的算力都是使用 GPU 和 TPU,所以对于硬件的要求很高,成本也很高。

缺点3:模型设计复杂

深度学习的模型设计非常复杂,需要投入大量的人力物力和时间来开发新的算法和模型。大部分人只能使用现成的模型。

缺点4:没有"人性",容易存在偏见

由于深度学习依赖数据,并且可解释性不高。在训练数据不平衡的情况下会出现性别歧视、种族歧视等问题。

4种典型的深度学习算法

4种典型的深度学习算法

卷积神经网络 - CNN

CNN 的价值:

  1. 能够将大数据量的图片有效的降维成小数据量(并不影响结果)
  2. 能够保留图片的特征,类似人类的视觉原理

CNN 的基本原理:

  1. 卷积层 – 主要作用是保留图片的特征
  2. 池化层 – 主要作用是把数据降维,可以有效的避免过拟合
  3. 全连接层 – 根据不同任务输出我们想要的结果

CNN 的实际应用:

  1. 图片分类、检索
  2. 目标定位检测
  3. 目标分割
  4. 人脸识别
  5. 骨骼识别

了解更多《一文看懂卷积神经网络-CNN(基本原理+独特价值+实际应用)

循环神经网络 - RNN

RNN 是一种能有效的处理序列数据的算法。比如:文章内容、语音音频、股票价格走势…

之所以他能处理序列数据,是因为在序列中前面的输入也会影响到后面的输出,相当于有了“记忆功能”。但是 RNN 存在严重的短期记忆问题,长期的数据影响很小(哪怕他是重要的信息)。

于是基于 RNN 出现了 LSTM 和 GRU 等变种算法。这些变种算法主要有几个特点:

  1. 长期信息可以有效的保留
  2. 挑选重要信息保留,不重要的信息会选择“遗忘”

RNN 几个典型的应用如下:

  1. 文本生成
  2. 语音识别
  3. 机器翻译
  4. 生成图像描述
  5. 视频标记

了解更多《一文看懂循环神经网络-RNN(独特价值+优化算法+实际应用)

生成对抗网络 - GANs

假设一个城市治安混乱,很快,这个城市里就会出现无数的小偷。在这些小偷中,有的可能是盗窃高手,有的可能毫无技术可言。假如这个城市开始整饬其治安,突然开展一场打击犯罪的「运动」,警察们开始恢复城市中的巡逻,很快,一批「学艺不精」的小偷就被捉住了。之所以捉住的是那些没有技术含量的小偷,是因为警察们的技术也不行了,在捉住一批低端小偷后,城市的治安水平变得怎样倒还不好说,但很明显,城市里小偷们的平均水平已经大大提高了。

警察们开始继续训练自己的破案技术,开始抓住那些越来越狡猾的小偷。随着这些职业惯犯们的落网,警察们也练就了特别的本事,他们能很快能从一群人中发现可疑人员,于是上前盘查,并最终逮捕嫌犯;小偷们的日子也不好过了,因为警察们的水平大大提高,如果还想以前那样表现得鬼鬼祟祟,那么很快就会被警察捉住。为了避免被捕,小偷们努力表现得不那么「可疑」,而魔高一尺、道高一丈,警察也在不断提高自己的水平,争取将小偷和无辜的普通群众区分开。随着警察和小偷之间的这种「交流」与「切磋」,小偷们都变得非常谨慎,他们有着极高的偷窃技巧,表现得跟普通群众一模一样,而警察们都练就了「火眼金睛」,一旦发现可疑人员,就能马上发现并及时控制——最终,我们同时得到了最强的小偷和最强的警察。

同时得到了最强的小偷和最强的警察

了解更多《什么是生成对抗网络 - GAN?(基本概念+工作原理)

深度强化学习 - RL

强化学习算法的思路非常简单,以游戏为例,如果在游戏中采取某种策略可以取得较高的得分,那么就进一步「强化」这种策略,以期继续取得较好的结果。这种策略与日常生活中的各种「绩效奖励」非常类似。我们平时也常常用这样的策略来提高自己的游戏水平。

在 Flappy bird 这个游戏中,我们需要简单的点击操作来控制小鸟,躲过各种水管,飞的越远越好,因为飞的越远就能获得更高的积分奖励。

这就是一个典型的强化学习场景:

  • 机器有一个明确的小鸟角色——代理
  • 需要控制小鸟飞的更远——目标
  • 整个游戏过程中需要躲避各种水管——环境
  • 躲避水管的方法是让小鸟用力飞一下——行动
  • 飞的越远,就会获得越多的积分——奖励

游戏是典型的强化学习场景

你会发现,强化学习和监督学习、无监督学习 最大的不同就是不需要大量的“数据喂养”。而是通过自己不停的尝试来学会某些技能。

了解更多:《一文看懂什么是强化学习?(基本概念+应用场景+主流算法)

总结

深度学习属于机器学习的范畴,深度学习可以说是在传统神经网络基础上的升级,约等于神经网络。

深度学习和传统机器学习在数据预处理上都是类似的。核心差别在特征提取环节,深度学习由机器自己完成特征提取,不需要人工提取。

深度学习的优点:

  1. 学习能力强
  2. 覆盖范围广,适应性好
  3. 数据驱动,上限高
  4. 可移植性好

深度学习的缺点:

  1. 计算量大,便携性差
  2. 硬件需求高
  3. 模型设计复杂
  4. 没有"人性",容易存在偏见

深度学习的4种典型算法:

  1. 卷积神经网络 - CNN
  2. 循环神经网络 - RNN
  3. 生成对抗网络 - GANs
  4. 深度强化学习 - RL