本教程是深度学习简明教程系列的第一部分,旨在提取最精炼且必备的深度学习知识点,供读者快速学习及本人查阅复习所用,大多内容是本人结合个人理解补充细节整合而成,参考链接放在文章最后。
目录
第一章 模型评估
1.1 基础概念
假设有个样本,其中有个样本分类正确,则有:
-
准确率(Accuracy):
-
错误率(Error):
这两个指标虽然常用,但无法满足所有任务需求,我们还会用查准率(Precision)、召回率(Recall)、误检率(Noise Factor)、漏检率(Prob of Miss)来衡量分类效果。在二分类问题中,可以根据样本真实类别和预测类别的组合划分为:
-
真阳(TP):预测为真,实际为真;
-
假阳(FP):预测为真,实际为假;
-
真阴(TN):预测为假,实际为假;
-
假阴(FN):预测为假,实际为真。
因此有:
-
查准率(Precision):,意即预测的正例有几个是对的;
-
召回率(Recall):,意即真正的正例预测了几个;
-
误检率(Noise Factor):,意即预测的正例有几个是错的;
-
漏检率(Prob of Miss):,意即漏掉几个正例没检测出来。
1.2 P-R曲线
查准率和召回率是一对矛盾的度量指标,一般呈现负相关,在很多情况下,我们可以通过绘制出学习器的P-R曲线(Precision - Recall Curve)来比较学习器的好坏。P-R图以查准率为纵轴,召回率为横轴,大致如下图所示:
如果一个学习器的P-R曲线被另一个学习器的P-R曲线完全包住,则可断言外层的学习器性能优于内层,例如上面的A和B优于学习器C。但是A和B的性能无法直接判断,我们可以根据曲线下方的面积大小来进行比较,但更常用的是平衡点或者是F1值:
- 平衡点(BEP)是 P = R 时的取值,如果这个值较大,则说明学习器的性能较好。
- F1 = 2 * P * R /( P + R ),同样,F1值越大,我们可以认为该学习器的性能较好。
注意:一条P-R曲线要对应一个阈值。通过选择合适的阈值,比如50%,对样本进行划分,概率大于50%的就认为是正例,小于50%的就是负例,从而计算相应的精准率和召回率。
1.3 ROC曲线和AUC
1.3.1 ROC曲线
接受者操作特性曲线(Receiver Operating Characteristic Curve),简称ROC曲线,纵轴是击中率(TPR),横轴是虚警率(FPR)。
击中率,也即真正类率(True Postive Rate):TPR = TP/(TP+FN),代表分类器预测的正类中实际正例占所有正例的比例。
虚警率,也即负正类率(False Postive Rate):FPR = FP/(FP+TN),代表分类器预测的正类中实际负例占所有负例的比例。
下图为ROC曲线示意图,因现实任务中通常利用有限个测试样例来绘制ROC图,因此应为无法产生光滑曲线,如右图所示。
绘图过程:给定m个正例子,n个反例子,根据学习器预测结果进行排序,先把分类阈值设为最大,使得所有例子均预测为反例,此时TPR和FPR均为0,在(0,0)处标记一个点,再将分类阈值依次设为每个样例的预测值,即依次将每个例子划分为正例。设前一个坐标为(x,y),若当前为真正例,对应标记点为(x,y+1/m),若当前为假正例,则标记点为(x+1/n,y),然后依次连接各点。
注意:
- ROC曲线也需要相应的阈值才可以进行绘制,原理同上的P-R曲线。
- ROC曲线越左上凸越好,P-R曲线越右上凸越好。
1.3.2 AUC
AUC (Area under Curve):ROC曲线下的面积,介于0.1和1之间,作为数值可以直观的评价分类器的好坏,值越大越好。
- AUC = 1,是完美分类器,采用这个预测模型时,存在至少一个阈值能得出完美预测。绝大多数预测的场合,不存在完美分类器;
- 0.5 < AUC < 1,优于随机猜测。这个分类器(模型)妥善设定阈值的话,能有预测价值;
- AUC = 0.5,跟随机猜测一样(例:丢硬币),模型没有预测价值。
1.4 目标检测评价
1.4.1 mAP
mAP(mean Average Precision)即各类别AP的平均值。由此我们可以知道,要计算mAP必须先绘出各类别P-R曲线,计算出AP。
1)VOC2010之前
只需要选取当Recall >= 0, 0.1, 0.2, ..., 1共11个点时的Precision最大值,然后AP就是这11个Precision的平均值。具体来说,计算precision时采用一种插值方法,即对于某个recall值r,precision值取所有recall>=r中的最大值(这样保证了p-r曲线是单调递减的,避免曲线出现抖动)。
2)VOC2010及其之后
需要针对每一个不同的Recall值r(包括0和1),Precision值取所有recall >= r+1中的最大值,然后计算PR曲线下面积作为AP值。
AP衡量的是对一个类检测好坏,mAP就是对多个类的检测好坏。就是简单粗暴的把所有类的AP值取平均就好了。
1.5 语义分割评价
评价指标一般包含如下三个方面:
- 执行时间(execution time)
- 内存占用(memory footprint)
- 准确度(accuracy)
1.5.1 准确度
1.6 相关面试题
Q:
A:
第二章 深度学习入门
2.1 机器学习到深度学习
机器学习从发展角度来讲可以被分为频率派(统计机器学习)和贝叶斯派(概率图模型)。
- 统计机器学习中主要应用到的四个思想分别是:正则化(L1、L2)、核化(Kernel SVM)、集成化(AdaBoost、RF)和层次化(Neural Network);其中,本文的主角——神经网络主要包括:多层感知机(MLP)、自编码器(AutoEncoder)、卷积神经网络(CNN)和循环神经网络(RNN),随着网络层次的加深,我们统称它们为深度神经网络(DNN)。
- 概率图模型中主要包括三种模型分别是:有向图模型(Beyesian Network)、无向图模型(Markov Network)和混合模型(Mixed Network);其中,加入深度后它们又各自发展成了深度有向网络(Deep Directed Network)、深度玻尔兹曼机(Deep Boltzman Machine)、深度信念网络(Deep Belief Network),我们统称它们为深度生成模型(Deep Generative Model)。
狭义上的深度学习主要指的就是深度神经网络,广义上的深度学习就包括了深度生成模型,思维导图如下:
2.2 前馈神经网络(MLP)
2.2.1 MLP简介
前馈神经网络由输入层、若干个隐层和输出层组成,每层有若干个神经元,前层每个神经元和后层所有神经元均有连接(Fully Connected),连接的边上带有权重,神经元的输出就是输入和权重之积经过激活函数映射之后得到的值。
多层感知器能够学习任意非线性函数,其中非线性是通过引入激活函数来实现的,我们训练神经网络其实就是不断更新权值,使得网络输出结果能够以较小的误差正确拟合我们的数据。
2.2.2 MLP面临的挑战
在利用MLP解决图像分类问题时,首先要将二维图像转换成一维向量,然后再对模型进行训练。这样做有两个缺点:
1)随着图像尺寸的增大,可训练参数的数量会急剧增加;
2)MLP会丢失图像的空间特征。
2.3 卷积神经网络(CNN)
2.3.1 理解卷积
通俗来讲,图像处理中的卷积就是通过一个模板矩阵,在图像上进行滑窗,把对应位置上的元素相乘后加起来,得到最终的结果,可以形象理解为把原图像一块区域“卷”起来融合成新图像的一个像素点,这个模板矩阵即为卷积核。
假设原图像的大小为 ,卷积核大小为 ,往图像两边填充 个像素,滑窗步长为 ,则经过卷积后特征图的大小为:
假设原图像通道数为C1,卷积后通道数为C2,需要训练的参数量为:
浮点数相乘计算的次数为:
2.3.2 CNN简介
卷积神经网络(CNN)目前在深度学习领域非常热门,在图像和视频处理项目中尤其普遍。CNN的核心就在于卷积层,卷积层会使用若干个卷积核,在图像上进行滑窗卷积操作,通过卷积对图像特征进行抽象和提取,这么做有两个特点:
- 稀疏连接:CNN中后层神经元只于前层局部区域有连接;
- 权重共享:同一个卷积核的参数在滑窗计算过程中都是一样的。
卷积核的参数全部都是需要通过学习得到的,和ANN学习权重参数一样,而以上两个特性可以大幅降低训练参数数量,所以非常适合用于处理图像问题。
- 卷积核的厚度 = 被卷积的图像的通道数
- 卷积核的个数 = 卷积操作后输出的通道数
除了卷积层外,CNN中可能还包括池化层、激活层以及全连接层:
1)池化层(Pooling)通常位于卷积操作之后,其作用在于特征融合和降维,其实也是一种类似卷积的操作,只是池化层的所有参数都是超参数(Average Pooling / Max Pooling),都是不用学习得到的,池化操作的降维改变的是图像的宽高,而不改变通道数。
2)激活层的主要作用在于增加非线性,值得注意的是卷积层中的激活过程针对的是每一个像素值,比如某卷积层输出中某个通道的 i 行 j 列像素值为x,只要这个数x>0,则x=x;x<0,则x=0。
3)全连接层:负责逻辑推断,所有的参数都需要学习得到。CNN中的全连接层用于链接卷积层的输出,并去除空间信息(通道数),是一种将三维矩阵变成向量的过程(一种全卷积操作),其操作如下:
输入特征图是W×H×C,那么卷积核的尺寸为W×H×C,这样的话整个输入特征图就变成了一个数,一共有k个数(第一层全连接层的神经元个数),就有K个W×H×C的卷积核,所以全连接层(尤其是第一层)的参数量是非常可怕的。
2.3.3 理解感受野
感受野用来表示神经网络内部的不同位置的神经元对原图像的感受范围的大小。神经元之所以无法对原始图像的全部信息进行感知,是因为在这些网络结构中普遍使用卷积层和pooling层,在层与层之间均为局部相连(通过sliding filter)。神经元感受野的值越大表示其能接触到的原始图像范围就越大,也意味着他可能蕴含更为全局、语义层次更高的特征;而值越小则表示其所包含的特征越趋向于局部和细节。因此感受野的值可以大致用来判断每一层的抽象层次。
由于图像是二维的,具有空间信息,因此感受野的实质其实也是一个二维区域。但业界通常将感受野定义为一个正方形区域,因此也就使用边长来描述其大小了。感受野的抽象公式如下:
其中, 为第n个卷积层的感受野, 和 分别表示第n个卷积层的kernel_size和stride。
2.3.4 特殊卷积结构
1、分组卷积(Group convolution)
分组卷积最早出现在AlexNet中,由于当时的硬件资源有限,训练AlexNet时卷积操作不能全部放在同一个GPU处理,因此作者把feature maps分给多个GPU分别进行处理,最过程中把多个GPU的结果进行通道concat。通过使用分组卷积可以大大减少参数量。
2、Inception结构
传统的层叠式网络,基本上都是一个个卷积层的堆叠,每层只用一个尺寸的卷积核,例如VGG结构中使用了大量的3×3卷积层。事实上,同一层feature map可以分别使用多个不同尺寸的卷积核,以获得不同尺度的特征,再把这些特征结合起来(concat),得到的特征往往比使用单一卷积核的要好,谷歌的GoogleNet,或者说Inception系列的网络,就使用了多个卷积核的结构。
3、Bottleneck结构
发明GoogleNet的团队发现,如果仅仅引入多个尺寸的卷积核,会带来大量的额外的参数,受到Network In Network中1×1卷积核的启发,为了解决这个问题,他们往Inception结构中加入了一些1×1的卷积核,如下图所示:
1×1卷积核也被认为是影响深远的操作,它主要用来改变通道数,降低参数量,往后大型的网络为了降低参数量都会应用上1×1卷积核。我们来做个对比计算,假设输入feature map的维度为256维,要求输出维度也是256维。有以下两种操作:
- 256维的输入直接经过一个3×3×256的卷积层,输出一个256维的feature map,那么参数量为:256×3×3×256 = 589824
- 256维的输入先经过一个1×1×64的卷积层,再经过一个3×3×64的卷积层,最后经过一个1×1×256的卷积层,输出256维,参数量为:256×1×1×64 + 64×3×3×64 + 64×1×1×256 = 69632,足足把第一种操作的参数量降低到九分之一。
4、深度可分离卷积(DepthWise Convolution)
标准的卷积过程如下图所示,一个2×2的卷积核在卷积时,对应图像区域中的所有通道均被同时考虑,问题在于,为什么一定要同时考虑图像区域和通道?我们为什么不能把通道和空间区域分开考虑?
Xception网络就是基于以上的问题发明而来。我们首先对每一个通道进行各自的卷积操作,有多少个通道就有多少个过滤器。得到新的通道feature maps之后,这时再对这批新的通道feature maps进行标准的1×1跨通道卷积操作。这种操作被称为 “DepthWise Convolution” ,缩写“DW”,它的直接作用就在于可以大幅降低参数量。
- 直接接一个3×3×256的卷积核,参数量为:3×3×3×256 = 6912
- DW操作,分两步完成,参数量为:3×3×3 + 3×1×1×256 = 795,又把参数量降低到九分之一。
5、通道洗牌
在AlexNet的Group Convolution当中,特征的通道被平均分到不同组里面,最后再通过两个全连接层来融合特征,这样一来,就只能在最后时刻才融合不同组之间的特征,对模型的泛化性是相当不利的。为了解决这个问题,ShuffleNet在每一次层叠这种Group conv层前,都进行一次channel shuffle,shuffle过的通道被分配到不同组当中。进行完一次group conv之后,再一次channel shuffle,然后分到下一层组卷积当中,以此循环。
经过channel shuffle之后,Group conv输出的特征能考虑到更多通道,输出的特征自然代表性就更高。另外,AlexNet的分组卷积,实际上是标准卷积操作,而在ShuffleNet里面的分组卷积操作是depthwise卷积,因此结合了通道洗牌和分组depthwise卷积的ShuffleNet,能得到超少量的参数以及超越mobilenet、媲美AlexNet的准确率。
6、通道加权
无论是在Inception、DenseNet或者ShuffleNet里面,我们对所有通道产生的特征都是不分权重直接结合的,那为什么要认为所有通道的特征对模型的作用就是相等的呢? 这是一个好问题,于是,ImageNet 2017冠军SENet就出来了。
从上图可以看到,一组特征在上一层被输出,这时候分两条路线,第一条直接通过,第二条进行如下操作:
- 首先进行Squeeze操作(Global Average Pooling),把每个通道二维的特征图压缩成一个一维向量,从而得到一个特征通道向量(每个数字代表对应通道的特征);
- 然后进行Excitation操作,把这一列特征通道向量输入两个全连接层和sigmoid,建模出特征通道间的相关性,得到的输出其实就是每个通道对应的权重;
- 最后,把这些权重通过Scale乘法通道加权到原来的特征上(第一条路),这样就完成了特征通道的权重分配。
7、空洞卷积(Dilated Convolution)
标准的3×3卷积核只能看到对应区域3×3的大小,但是为了能让卷积核看到更大的范围,dilated conv使其成为了可能。dilated conv原论文中的结构如图所示:
上图b可以理解为卷积核大小依然是3×3,但是每个卷积点之间有1个空洞(dilated rate = 1),也就是在绿色7×7区域里面,只有9个红色点位置作了卷积处理,其余点权重为0。这样即使卷积核大小不变,但它看到的区域变得更大了。
8、可变形卷积(Deformable Convolution)
传统的卷积核一般都是长方形或正方形,但MSRA提出了一个相当反直觉的见解,认为卷积核的形状可以是变化的,变形的卷积核能让它只看感兴趣的图像区域 ,这样识别出来的特征更佳。
要做到这个操作,可以直接在原来的卷积核的基础上再加一层卷积核,这层卷积核学习的是下一层卷积核的位置偏移量(offset),实际增加的计算量是相当少的,但能实现可变形卷积核,识别特征的效果更好。
在实际操作时,并不是真正地把卷积核进行扩展,而是对卷积前图片的像素重新整合,变相地实现卷积核的扩张,具体来说可变性卷积的流程为:
- 原始图片大小为b*h*w*c,记为U,经过一个普通卷积,卷积填充为same,对应的输出结果为(b*h*w*2*k*k),记为V,输出的结果是指原图片batch中卷积核在每个像素上的偏移量(k*k的卷积核具有x偏移与y偏移,因此通道数为2*k*k);
- 将U中图片的像素索引值与V相加,得到偏移后的position(即在原始图片U中的坐标值),需要将position值限定为图片大小以内。但position只是一个坐标值,而且还是float类型的,我们需要这些float类型的坐标值获取像素。
- 例如取一个坐标值(a,b),将其转换为四个整数,floor(a), ceil(a), floor(b), ceil(b),将这四个整数进行整合,得到四对坐标(floor(a),floor(b)), ((floor(a),ceil(b)), ((ceil(a),floor(b)), ((ceil(a),ceil(b))。这四对坐标每个坐标都对应U中的一个像素值,而我们需要得到(a,b)的像素值,这里采用双线性差值的方式计算(一方面得到的像素准确,另一方面可以进行反向传播)。
- 在得到position的所有像素后,即得到了一个新图片M,将这个新图片M作为输入数据输入到别的层中,如普通卷积。
9、上采样、上池化和转置卷积
1)上采样(UnSampling)
UnSampling阶段没有使用MaxPooling时的位置信息,而是直接将内容以插值方式来扩充Feature Map,属于人工特征工程,没有要学习的参数。常用上采样方法有:最近邻插值(Nearest neighbor interpolation)、双线性插值(Bi-Linear interpolation)、双立方插值(Bi-Cubic interpolation)
2)上池化(UnPooling)
在Maxpooling的时候保留最大值的位置信息,之后在UnPooling阶段使用该信息扩充Feature Map,除最大值位置以外,其余补0。
3)转置卷积(Deconvolution)
反卷积是一种特殊的正向卷积,先按照一定的比例通过补0来扩大输入图像的尺寸,接着旋转卷积核(参数与之前正向卷积过程中使用到的卷积核参数一致),再进行卷积。具体步骤如下:
- 设卷积核大小为k*k,输入为方形矩阵;
- 对输入进行四边补零,单边补零的数量为k-1;
- 将卷积核旋转180°,在新的输入上进行直接卷积。