一、深度学习介绍
深度学习是以不少于两个隐含层的神经网络对输入进行非线性变换或表示学习的技术,通过构建深层神经网络,进行各项分析活动。深层神经网络由一个输入层,数个隐层,以及一个输出层构成。每层有若干个神经元,神经元之间有连接权重。每个神经元模拟生物的神经细胞,而结点之间的连接模拟神经细胞之间的连接。
深度学习实践的四个关键要素:计算能力、算法、数据和应用场景,就像四大护法神兽一样保证了深度学习的应用和实践,缺一不可。
计算能力
首先,深度神经网络复杂,训练数据多,计算量大。深度神经网络中神经元多,神经元间连接数量也相当惊人。从数学的角度看,每个神经元都要包含数学计算(如Sigmoid、ReLU或者Softmax函数),需要估计的参数量也极大。语音识别和图像识别应用中,神经元达数万个,参数数千万,模型复杂导致计算量大。所以计算能力是深度学习应用的基础。
计算能力越强,同样时间内积累的经验就越多、迭代速度也越快,计算能力这种对于深度学习的支撑与推动作用是不可替代的。
算法
在计算能力变得日益廉价的今天,深度学习试图建立大得多也复杂得多的神经网络,我们可以把算法理解为深度学习的神经网络或是计算思维,这种神经网络越复杂,捕捉到的信号就越精确,目前比较常见的算法包括深度信念网络(Deep Belief Networks)、卷积神经网络(ConvolutionalNeural Networks)、受限玻尔兹曼机(Restricted BoltzmannMachine)和堆栈式自动编码器(Stacked Auto-encoders),以深度卷积神经网络为代表的监督学习方法目前来说是最有效也是使用最多的。
数据
如今深度学习正迅速成为高级数据分析领域的热门话题,而数据的绝对量是促进深度学习工具和技术发展的一个关键因素。
应用场景
深度学习技术目前应用的场景不多,最普遍也是最成功的领域就是语音识别和图像处理这两个应用场景了,之前提到的三大神兽——计算能力、算法和数据属于开发端,应用场景则属于消费端层面,随着未来深度学习技术的不断发展以及用户的需求提升,深度学习的应用场景将越来越多,比如许多智能手机内置的人脸识别功能来对照片进行分类,已经可以达到相当的准确率;支付宝等金融工具也很可能采用人脸识别以提高安全性……未来的深度学习一定不仅仅局限于语音识别和图像识别这两个领域,还有更多的可能性。
二、模型优化
调参方法
1.样本要随机化,防止大数据淹没小数据
2.样本要做归一化。关于归一化的好处请参考:为何需要归一化处理
3.激活函数要视样本输入选择(多层神经网络一般使用relu)
4.mini batch很重要,几百是比较合适的(很大数据量的情况下)
5.学习速率(learning rate)很重要,比如一开始可以lr设置为0.01,然后运行到loss不怎么降的时候,学习速率除以10,接着训练
6.权重初始化,可用高斯分布乘上一个很小的数,这个可以看:权值初始化
7.Adam收敛速度的确要快一些,可结果往往没有sgd + momentum的解好(如果模型比较复杂的话,sgd是比较难训练的,这时候adam的威力就体现出来了)
8.Dropout的放置位置以及大小非常重要
9.early stop,发现val_loss没更新,就尽早停止
模型压缩与优化加速
模型压缩算法能够有效降低参数冗余,从而减少存储占用、通信带宽和计算复杂度,有助于深度学习的应用部署,具体可划分为如下几种方法:
1. 线性或非线性量化:1/2bits, int8 和 fp16等;
2. Op-level的快速算法:FFT Conv2d (7x7, 9x9), Winograd Conv2d (3x3, 5x5) 等;
3. Layer-level的快速算法:Sparse-block net [1] 等;
4. 优化工具与库:TensorRT (Nvidia), Tensor Comprehension (Facebook) 和 Distiller (Intel) 等;
5. 通道剪枝(channel pruning):结构或非结构剪枝:deep compression, channel pruning 和 network slimming等; 在CNN网络中,通过对特征图中的通道维度进行剪枝,可以同时降低模型大小和计算复杂度,并且压缩后的模型可以直接基于现有的深度学习框架进行部署。
6. 权重稀疏化(weight sparsification):通过对网络权重引入稀疏性约束,可以大幅度降低网络权重中的非零元素个数;压缩后模型的网络权重可以以稀疏矩阵的形式进行存储和传输,从而实现模型压缩。
7. 权重量化(weight quantization):通过对网络权重引入量化约束,可以降低用于表示每个网络权重所需的比特数;我们同时提供了对于均匀和非均匀两大类量化算法的支持,可以充分利用ARM和FPGA等设备的硬件优化,以提升移动端的计算效率,并为未来的神经网络芯片设计提供软件支持。
8. 网络蒸馏(network distillation):对于上述各种模型压缩组件,通过将未压缩的原始模型的输出作为额外的监督信息,指导压缩后模型的训练,在压缩/加速倍数不变的前提下均可以获得0.5%-2.0%不等的精度提升。
9. 多GPU训练(multi-GPU training):深度学习模型训练过程对计算资源要求较高,单个GPU难以在短时间内完成模型训练,因此我们提供了对于多机多卡分布式训练的全面支持,以加快使用者的开发流程。无论是基于ImageNet数据的Resnet-50图像分类模型还是基于WMT14数据的Transformer机器翻译模型,均可以在一个小时内训练完毕。
10. 超参数优化(hyper-parameter optimization)部分可以通过强化学习或者AutoML,在整体压缩率一定的情况下,搜索出每一层最合适的压缩比例使得整体的精度最高。多数开发者对模型压缩算法往往了解较少,调节压缩算法参数需要长期的学习和实验才能有所经验, 但超参数取值对最终结果往往有着巨大的影。
三、神经网络模型
1、卷积神经网络(CNN)
卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习(deep learning)的代表算法之一 。卷积神经网络具有表征学习(representation learning)能力,能够按其阶层结构对输入信息进行平移不变分类(shift-invariant classification),因此也被称为“平移不变人工神经网络。
1)卷积:对图像元素的矩阵变换,是提取图像特征的方法,多种卷积核可以提取多种特征。一个卷积核覆盖的原始图像的范围叫做感受野(权值共享)。一次卷积运算(哪怕是多个卷积核)提取的特征往往是局部的,难以提取出比较全局的特征,因此需要在一层卷积基础上继续做卷积计算 ,这也就是多层卷积。
2)池化:降维的方法,按照卷积计算得出的特征向量维度大的惊人,不但会带来非常大的计算量,而且容易出现过拟合,解决过拟合的办法就是让模型尽量“泛化”,也就是再“模糊”一点,那么一种方法就是把图像中局部区域的特征做一个平滑压缩处理,这源于局部图像一些特征的相似性(即局部相关性原理)。
3) 全连接:softmax分类
训练过程:
卷积核中的因子(×1或×0)其实就是需要学习的参数,也就是卷积核矩阵元素的值就是参数值。一个特征如果有9个值,1000个特征就有900个值,再加上多个层,需要学习的参数还是比较多的。
对卡在局部极小值的处理方法:
1. 调节步伐:调节学习速率,使每一次的更新“步伐”不同;
2. 优化起点:合理初始化权重(weights initialization)、预训练网络(pre-train),使网络获得一个较好的“起始点”,如最右侧的起始点就比最左侧的起始点要好。常用方法有:高斯分布初始权重(Gaussian distribution)、均匀分布初始权重(Uniform distribution)、Glorot 初始权重、He初始权、稀疏矩阵初始权重(sparse matrix)。
浅层VS深层:
浅层神经网络可以模拟任何函数,但数据量的代价是无法接受的。深层解决了这个问题。相比浅层神经网络,深层神经网络可以用更少的数据量来学到更好的拟合。深层的前提是:空间中的元素可以由迭代发展而来的。
1. 为什么神经网络高效:并行的先验知识使得模型可用线性级数量的样本学习指数级数量的变体
2. 学习的本质是什么:将变体拆分成因素和知识(Disentangle Factors of Variation)
i. 为什么深层神经网络比浅层神经网络更高效:迭代组成的先验知识使得样本可用于帮助训练其他共用同样底层结构的样本。
ii. 神经网络在什么问题上不具备优势:不满足并行与迭代先验的任务
3. 非迭代:该层状态不是由上层状态构成的任务(如:很深的CNN因为有max pooling,信息会逐渐丢失。而residual network再次使得迭代的先验满足)
详细内容请参看:
https://blog.csdn.net/sinat_35821976/article/details/81503953#2.1.1%20Padding
2、循环神经网络(Recurrent Neural Network,RNN)
尽管从多层感知器(MLP)到循环神经网络(RNN)的扩展看起来微不足道,但是这对于序列的学习具有深远的意义。循环神经网络(RNN)的使用是用来处理序列数据的。在传统的神经网络中模型中,层与层之间是全连接的,每层之间的节点是无连接的。但是这种普通的神经网络对于很多问题是无能为力的。比如,预测句子的下一个单词是什么,一般需要用到前面的单词,因为一个句子中前后单词并不是独立的。循环神经网络(RNN)指的是一个序列当前的输出与之前的输出也有关。具体的表现形式为网络会对前面的信息进行记忆,保存在网络的内部状态中,并应用于当前输出的计算中,即隐含层之间的节点不再无连接而是有链接的,并且隐含层的输入不仅包含输入层的输出还包含上一时刻隐含层的输出。理论上,循环神经网络能够对任何长度的序列数据进行处理,但是在实践中,为了减低复杂性往往假设当前的状态只与前面的几个状态相关。
下图展示的是一个典型的循环神经网络(RNN)结构。
将循环神经网络(RNN)可视化的一种有效方法是考虑将其在时间上进行展开,得到如图2结构。
3、双向长短时记忆循环神经网络详解(Bi-directional LSTM RNN)
双向循环神经网络(BRNN)的基本思想是提出每一个训练序列向前和向后分别是两个循环神经网络(RNN),而且这两个都连接着一个输出层。这个结构提供给输出层输入序列中每一个点的完整的过去和未来的上下文信息。下图展示的是一个沿着时间展开的双向循环神经网络。六个独特的权值在每一个时步被重复的利用,六个权值分别对应:输入到向前和向后隐含层(w1, w3),隐含层到隐含层自己(w2, w5),向前和向后隐含层到输出层(w4, w6)。值得注意的是:向前和向后隐含层之间没有信息流,这保证了展开图是非循环的。
对于整个双向循环神经网络(BRNN)的计算过程如下:向前推算(Forward pass):对于双向循环神经网络(BRNN)的隐含层,向前推算跟单向的循环神经网络(RNN)一样,除了输入序列对于两个隐含层是相反方向的,输出层直到两个隐含层处理完所有的全部输入序列才更新:向后推算(Backward pass):双向循环神经网络(BRNN)的向后推算与标准的循环神经网络(RNN)通过时间反向传播相似,除了所有的输出层δδ项首先被计算,然后返回给两个不同方向的隐含层。
BRNN和LSTM相比,另一个用的最成功的RNN就是BRNN了,该结构中,有2层隐藏层,其中每个隐藏层都连接到输出和输入。这2个隐藏层可以微分,且都有自循环连接,不过一个是朝着下一个时间步连接的,另一个是朝着上一个时间步连接的。
给定一个输入序列和一个目标序列,BRNN可以先基于时间维度展开,然后采用传统的BP方法来训练。BRNN的训练相对RNN稍微有点计算量,大致是2倍。BRNN的一个限制是他不能连续的运行,因为他需要在序列的开始和结束都各有一个固定的占位符,而且该模型也没法用在ML中的在线环境,因为你没法得到未来的数据。不过对于如词性标注任务,或者给定一个句子,用来做其中某个单词基于其前后单词基础上是否合理的评价等任务还是很好的。
4、长短期记忆模型(LSTM)
循环神经网路(RNN)在工作时一个重要的优点在于,其能够在输入和输出序列之间的映射过程中利用上下文相关信息。然而不幸的是,标准的循环神经网络(RNN)能够存取的上下文信息范围很有限。这个问题就使得隐含层的输入对于网络输出的影响随着网络环路的不断递归而衰退。因此,为了解决这个问题,长短时记忆(LSTM)结构诞生了。与其说长短时记忆是一种循环神经网络,倒不如说是一个加强版的组件被放在了循环神经网络中。具体地说,就是把循环神经网络中隐含层的小圆圈换成长短时记忆的模块。这个模块的样子如下图所示:
5、MLP(多层神经网络)
MLP(Multi-Layer Perception),即多层感知器,是一种趋向结构的人工神经网络,映射一组输入向量到一组输出向量。MLP可以被看做是一个有向图,由多个节点层组成,每一层全连接到下一层。除了输入节点,每个节点都是一个带有非线性激活函数的神经元(或称处理单元)。一种被称为反向传播算法的监督学习方法常被用来训练MLP。MLP是感知器的推广,克服了感知器无法实现对线性不可分数据识别的缺点。
具体算法以及数学公式请参考:
https://www.cnblogs.com/ooon/p/5577241.html
四、深度学习框架
1、自动化模型压缩框架PocketFlow
如何根据实际应用场景,选择合适的模型压缩与加速算法以及相应的超参数取值,往往需要较多的专业知识和实践经验,这无疑提高了这项技术对于一般开发者的使用门槛。
在此背景下,腾讯AI Lab机器学习中心研发了PocketFlow开源框架,以实现自动化的深度学习模型压缩与加速,助力AI技术在更多移动端产品中的广泛应用。通过集成多种深度学习模型压缩算法,并创新性地引入超参数优化组件,极大地提升了模型压缩技术的自动化程度。开发者无需介入具体的模型压缩算法及其超参数取值的选取,仅需指定设定期望的性能指标,即可通过PocketFlow得到符合需求的压缩模型,并快速部署到移动端应用中。
PocketFlow支持通道剪枝的分组finetune/retrain功能,通过实验我们发现此方法可以使原本压缩后的模型精度有明显的提升。
通过引入超参数优化组件,不仅避免了高门槛、繁琐的人工调参工作,同时也使得PocketFlow在各个压缩算法上全面超过了人工调参的效果,PocketFlow对ResNet和MobileNet等多种CNN网络结构进行有效的模型压缩与加速。
五、目标检测与目标识别
目前可以将现有的基于深度学习的目标检测与识别算法大致分为以下三大类:
1. 基于区域建议的目标检测与识别算法,如R-CNN, Fast-R-CNN, Faster-R-CNN;
2. 基于回归的目标检测与识别算法,如YOLO, SSD;
3. 基于搜索的目标检测与识别算法,如基于视觉注意的AttentionNet,基于强化学习的算法.
1、R-CNN
基本工作流程:
1) 接收一个图像, 使用Selective Search选择大约2000个从上到下的类无关的候选区域(proposal)
2) 将提取出来的候选区域转换为统一大小的图片(拉升/压缩等方法), 使用CNN模型提取每一个候选区域的固定长度的特征.
3) 使用特定类别的线性SVM分类器对每一个候选区域进行分类.
4) Bounding Box回归.
2、SPP Net
SPP Net的金字塔池化
我们使用三层的金字塔池化层pooling,分别设置图片切分成多少块,论文中设置的分别是(1,4,16),然后按照层次对这个特征图feature A进行分别处理(用代码实现就是for(1,2,3层)),也就是在第一层对这个特征图feature A整个特征图进行池化(池化又分为:最大池化,平均池化,随机池化),论文中使用的是最大池化,得到1个特征。
第二层先将这个特征图feature A切分为4个(20,30)的小的特征图,然后使用对应的大小的池化核对其进行池化得到4个特征,
第三层先将这个特征图feature A切分为16个(10,15)的小的特征图,然后使用对应大小的池化核对其进行池化得到16个特征.
最后将这1+4+16=21个特征输入到全连接层,进行权重计算. 当然了,这个层数是可以随意设定的,以及这个图片划分也是可以随意的,只要效果好同时最后能组合成我们需要的特征个数即可.
3、Fast R-CNN
Fast R-CNN主要作用是实现了对R-CNN的加速, 它在R-CNN的基础上主要有以下几个方面的改进:
① 借鉴了SPP Net的思路, 提出了简化版的ROI池化层(没有使用金字塔), 同时加入了候选框映射的功能, 使得网络能够进行反向传播, 解决了SPP的整体网络训练的问题.
② 多任务Loss层. 1) 使用了softmax代替SVM进行多分类. 2) SmoothL1Loss取代了 Bounding Box回归.
基本工作流程
1) 接收一个图像, 使用Selective Search选择大约2000个从上到下的类无关的候选区域(proposal).
2) 对整张图片进行卷积操作提取特征, 得到feature map.
3) 找到每个候选框在feature map中的映射patch. 将patch作为每个候选框的特征输入到ROI池化层及后面的层.
4) 将提取出的候选框的特征输入到softmax分类器中进行分类.==>替换了R-CNN的SVM分类.
5) 使用SmoothL1Loss回归的方法对于候选框进一步调整位置.
4、Faster R-CNN
基本工作流程
1. 对整张图片输进CNN网络,得到feature map.
2. 卷积特征输入到RPN,得到候选框的特征信息.
3. 对候选框中提取出的特征,使用分类器判别是否属于一个特定类.
4. 对于属于某一特征的候选框,用回归器进一步调整其位置.
RPN
用于提取region proposal的神经网络叫做Region Proposal Network(简称RPN).
RPN网络的特点在于通过滑动窗口的方式实现候选框的提取,每个滑动窗口位置生成9个候选窗口(不同尺度、不同宽高), 提取对应9个候选窗口(anchor)的特征,用于目标分类和边框回归,与FastRCNN类似。目标分类只需要区分候选框内特征为前景或者背景。
5、Mask R-CNN
Mask R-CNN,它通过在每个感兴趣区域(RoI)上添加一个分支来预测分割掩模,继承自Faster R-CNN [28],这个分支与现有的分类和边框回归并行。如图1所示:掩模分支是作用于每个感兴趣区域(RoI)的小全卷积神经网络(FCN),以像素到像素到方式预测分割掩模。Mask R-CNN是基于Faster R-CNN的,它易于实现和训练,并且为广泛灵活的架构设计提供了便利。此外,掩模分支只增加了一个小的计算开销,使快速系统和快速实验成为可能。
Mask R-CNN采用相同的两级,第一级是完全相同的(既RPN)。在第二级,与预测(类和边框偏移)并行,Mask R-CNN还会为每一个RoI输出一个二进制掩模。这与最近的其他系统相反,其分类取决于掩模预测(例如,[26,7,20])。我们的方法遵循于Fast R-CNN[9],边框分类和回归并行(这在很大程度上简化了R-CNN[10]的多级流水线)。
6、YOLO
(1) 给个一个输入图像,首先将图像划分成7*7的网格
(2) 对于每个网格,我们都预测2个边框(包括每个边框是目标的置信度以及每个边框区域在多个类别上的概率)
(3)根据上一步可以预测出7*7*2个目标窗口,然后根据阈值去除可能性比较低的目标窗口,最后非极大值抑制去除冗余窗口即可。
7、SSD
首先第一步和其他方法一样利用卷积操作提取卷积特征,在最后级层卷积时候开始对与每一种尺度上的特征图运用archor方法进行候选框提取,依据archor在不同尺度上得到的候选框,进行目标种类和位置的判断。
8、Residual Attention Network
9、RetinaNet检测框架
背景
one stage系
代表性算法 YOLOv1、SSD、YOLOv2、YOLOv3
检测精度 低 但速度快
two stage系 R-CNN、SPPNet、Fast R-CNN、Faster R-CNN
检测速度 慢但精度高
这种鱼(speed)与熊掌(accuracy)不可兼得的局面一直成为Detection的瓶颈。
究其原因,就是因为one-stage受制于万恶的 “类别不平衡” 。
1、什么是“类别不平衡”呢?
检测算法在早期会生成一大波的bbox。而一幅常规的图片中,顶多就那么几个object。这意味着,绝大多数的bbox属于background。
2、“类别不平衡”又如何会导致检测精度低呢?
因为bbox数量爆炸。
正是因为bbox中属于background的bbox太多了,所以如果分类器无脑地把所有bbox统一归类为background,accuracy也可以刷得很高。于是乎,分类器的训练就失败了。分类器训练失败,检测精度自然就低了。
3、那为什么two-stage系就可以避免这个问题呢?
因为two-stage系有RPN罩着。
第一个stage的RPN会对anchor进行简单的二分类(只是简单地区分是前景还是背景,并不区别究竟属于哪个细类)。经过该轮初筛,属于background的bbox被大幅砍削。虽然其数量依然远大于前景类bbox,但是至少数量差距已经不像最初生成的anchor那样夸张了。就等于是 从 “类别 极 不平衡” 变成了 “类别 较 不平衡” 。
不过,其实two-stage系的detector也不能完全避免这个问题,只能说是在很大程度上减轻了“类别不平衡”对检测精度所造成的影响。
接着到了第二个stage时,分类器登场,在初筛过后的bbox上进行难度小得多的第二波分类(这次是细分类)。这样一来,分类器得到了较好的训练,最终的检测精度自然就高啦。但是经过这么两个stage一倒腾,操作复杂,检测速度就被严重拖慢了。
4、那为什么one-stage系无法避免该问题呢?
因为one stage系的detector直接在首波生成的“类别极不平衡”的bbox中就进行难度极大的细分类,意图直接输出bbox和标签(分类结果)。而原有交叉熵损失(CE)作为分类任务的损失函数,无法抗衡“类别极不平衡”,容易导致分类器训练失败。因此,one-stage detector虽然保住了检测速度,却丧失了检测精度。
“类别不平衡”是one-stage detector在精度上逊于two-stage detector的病结所在。
那么,只要通过将原先训练 回归任务 惯用的 交叉熵误差 (CE(pt)=−αtlog(pt)CE(pt)=−αtlog(pt)) 改为 FL (focal loss) 即可。
RetinaNet本质上是Resnet + FPN + 两个FCN子网络。
以下为RetinaNet目标框架框架图。RetinaNet的detector部分是两条平行pipe-line,且 设计相同 (除了尾部的output不一样) 但 参数不共享 (Faster R-CNN中第一层的参数是共享的) 。
reg_pipe-line直接输出target,所以是采用了无分类的bbox regressior(Faster R-CNN是每个类各一个bbox regressor)。2
10、目标检测方法最新进展
1、结合上下文特征进行目标检测。对于某一类物体,它的周围出现的内容将很好的对其位置进行锁定。
2、多特征融合。除了利用高维的卷积操作之后的特征之外,同时应该结合低维的卷积特征进行目标检测检测,以便更好的利用细节信息。
3、使用循环神经网络(RNN)进行目标检测。目前主流的图像处理方法一般都是基于cnn的,其实RNN的很多特性或许能在目标检测问题上产生意想不到的效果。例如Girshick的Inside-Outside-Net。