类似于SVM,CNN为代表的DNN方法的边缘参数随着多类和高精度的要求必然增长。比如向量机方法,使用可以映射到无穷维的高斯核,即使进行两类分类,在大数据集上得到高精度,即保持准确率和高精度的双指标,支持向量的个数会随着数据集增长,SVM三层网会变得非常宽。CNN方法的多层结构,在保留边缘映射的数目的同时可以有效地降低“支持向量”的个数,是通过函数复合—因式分解得到的,至于要使用多少层的网络,每一层网神经元的个数,两层之间的链接方式,理论上也应该有一般的指导规则。
参考链接:人工机器:作为归纳系统的深度学习 ,参考文章:卷积神经网络.卷积层和池化层学习 ,原始CNN论文,对摘抄段落有大量修改,如有疑问,请参考原文。16年的小总结.
特征学习与结构学习
深度学习以“数据驱动”范式颠覆了“人造特征”范式,完成“特征学习”,这是一个重大的进步。但与此同时,它自己又陷入了一个“人造结构”窠臼中。06年hinton教授发表在nature上的最初的论文,多层压缩映射。给出的深度学习的方案是无监督学习获取网络结构,之后再通过有监督学习优化参数,DNN网络的引爆点恰恰是结构学习。大量利用未标记数据学习网络结构是深度学习最初的构想。
但无论Hinton教授组最初设计的AlexNet,还是后来的VGG,GoogLeNet,ResNet等等,都是富有经验的专家人工设计出来的。给定一个新问题,到底什么样的网络结构是最佳的(如多少卷积层)却不得而知,这在一定程度上阻碍了深度学习在更多智能任务上的普及和应用。因此,同时学习网络结构和网络参数是一个值得大力关注的研究方向。( 假设空间问题难以突破,至于过拟合欠拟合都没有统一简单的评判准则,也因此难以使用机器自动完成,相对于给定结构后使用数据结构优化参数, 优化结构是个更加复杂且更高层的问题。多年已过,众人发现,ALexNet并非最优结构,这是一个经过大量专家枚举结构很长时间才得到的结果)。
而2006年Hinton教授等人倡导的却恰恰是利用无监督学习来对深层神经网络进行预训练。利用超量的数据学习网络结构是一个更耗费时间和计算能力的事情。此后,特别是DCNN兴起之后,无监督的预训练似乎已经被很多研究者所抛弃( 特别是在CV领域,因为耗日持久,远不如使用专家经验代价更小)。
直接从大量无监督数据中学习模型确实是非常困难的,即便是人这部“机器”,也有“狼孩”的例子警告我们“无师自通”似乎是不现实的。但“少量有导师数据+大量无导师数据”的模式也许是更值得大力研究的。
Hinton教授提出的使用无监督训练确定网络结构,使用编码/解码器,对每次编码/解码进行分解/重建,使用残差逐层优化编码器,保证每一层对无标签样本的压缩函数的紧邻特性,在理论上是可行的,但在实际运用中是极难实现的。这种方法需要比有标签样本多更多的无标签样本,以分析海量样本中隐藏的模式,甚至需要高出一个或几个级别的样本数量,甚至是遍历级别的样本。在不停的调整网络结构,预训练结束之前,凭专家知识可能已经得到了近似最优网络结构。
这是一个人脑分支定界法法和计算机遍历方法的PK,现阶段计算机遍历的方法还是不现实的。
而工业上广为流行的CNN结构一般使用了ImageNet的分类模型,再通过微调使其适用于使用者自身研究的问题。这个众人使用的ImageNet模型,便相当于已经通过非监督学习学习了网络结构的预训练模型。
CNN的结构分析—卷积层
CNN的二维结构天然适合图像特征提取和识别过程,卷积运算的计算过程及功能相当于反向模板匹配。CNN通过卷积层,训练不同的卷积核来提取图像中隐含的模式。CNN训练得到的是滤波器-卷积核,本质上是对于某种特定的模式有响应,反之无响应,所以全卷积一直到最后一层,响应最强的特征图。
网如其名,CNN方法必然包含了一个卷积算子层。还是拿LeNet为例,结构图为:
LeNet使用了两个卷积层,C1层和C3层。C1层,输入图片:32*32 ;卷积核大小:5*5 ;卷积核种类:6 ;输出featuremap大小:28*28 (32-5+1);神经元数量: 28 *28 *6; 可训练参数:(5*5+1)*6(每个滤波器5*5=25个unit参数和一个bias参数,一共6个滤波器);连接数:(5*5+1)*6*28*28。
C3层也是一个卷积层,输入:S2中所有6个或者几个特征map组合; 卷积核大小:5*5;卷积核种类:16; 输出featureMap大小:10*10;C3中的每个特征map是连接到S2中的所有6个或者几个特征map的,表示本层的特征map是上一层提取到的特征map的不同组合,存在的一个方式是:C3的前6个特征图以S2中3个相邻的特征图子集为输入。接下来6个特征图以S2中4个相邻特征图子集为输入。然后的3个以不相邻的4个特征图子集为输入,最后一个将S2中所有特征图为输入;则:可训练参数:6*(3*25+1)+6*(4*25+1)+3*(4*25+1)+(25*6+1)=1516;连接数:10 *10 *1516 = 151600。
卷积层的作用:卷积神经网络中每层卷积层由若干卷积单元组成,每个卷积单元的参数都是通过反向传播算法优化得到的。卷积运算的目的是提取输入的不同特征。使用不同的卷积核的组合,可实现梯度计算、尺度计算(配合maxpooling层)等作用,,可以对显著性进行选择。第一层卷积层可能只能提取一些低级的特征如边缘、线条和角等层级,更多层的网络能从低级特征中迭代提取更复杂的特征(这也是深度的要求)。
图片来自:卷积神经网络.卷积层和池化层学习 ,抠图于原始CNN论文
卷积层的更新模型:卷积层类似于BP网络的二维描述,依然使用前向传播计算输出,使用反向传播在训练过程中调整权重和偏置,更新网络。参考卷积核的反传算法。一般前向计算,把卷积方法转换为图像矩阵和卷积核矩阵的乘法形式,直接计算。
卷积层的Caffe表示:caffe直接给出了卷积层的参数调整方法,不需要自己设计卷积神经元。
AlexNet模型配置文件:输出256个卷积图,使用5*5的卷积核,使用高斯核,标准偏差为0.1。此层附带了ReLu激活函数层。上层输入为96.
layer {
name: "conv2"
type: "Convolution"
bottom: "norm1"
top: "conv2"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
convolution_param {
num_output: 256
pad: 2
kernel_size: 5
group: 2
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 1
}
}
}
layer {
name: "relu2"
type: "ReLU"
bottom: "conv2"
top: "conv2"
}
CNN的结构分析—Pooling层
使用卷积核提取的大量特征,产生超高的维度,面临着表示困难的问题,且直接叠加的卷积层会产生更庞大的卷积特征集合。Pooling层一般作为显著性选取和降维的作用存在。
Pooling明显地降低了特征图的维度
使用MeanPooling的方式,相当于平均化特性,用于简化函数模型,同时丧失了一些特异性准确性,增加泛化性能,即是把复杂模型转化为一个平均模型,得失都很明显。而maxpooling则描述为提取特征本身的显著性作用,同时进行数据压缩。
MeanPooling可以用网络加深来替换其数据压缩的作用,一个MeanPooling层相当于网络深度增加两倍,而MeanPooling自身模型简单化的特点丧失了准确性表示,逐渐被取代一般不再被使用。上图中,同样地采用一个2*2的filter,max pooling是在每一个区域中寻找最大值,这里的stride=2,最终在原特征图中提取主要特征得到右图。概率意义上, MaxPooling 过程之后,特征更小且相对表示性更强。
参考文章:http://ufldl.stanford.edu/wiki/index.php/池化
池化的平移不变性:如果人们选择图像中的连续范围作为池化区域,并且只是池化相同(重复)的隐藏单元产生的特征,那么,这些池化单元就具有平移不变性 (translation invariant)。这就意味着即使图像经历了一个小的平移之后,依然会产生相同的 (池化的) 特征。在很多任务中 (例如物体检测、声音识别),我们都更希望得到具有平移不变性的特征,因为即使图像经过了平移,样例(图像)的标记仍然保持不变。例如,如果你处理一个MNIST数据集的数字,把它向左侧或右侧平移,那么不论最终的位置在哪里,你都会期望你的分类器仍然能够精确地将其分类为相同的数字。(*MNIST 是一个手写数字库识别库: http://yann.lecun.com/exdb/mnist/)
池化的方式:可使用划分池化的形式,也可以使用Overlap池化的形式。此外可以使用金字塔池化的形式,每层使用不同的池化单元,形成一个金字塔特征,也用于缩放不变性,同时可以处理一定的形变。
金字塔池化,可用于处理一定的仿射形变。
CNN的结构分析—全链接层
使用卷积核提取的大量特征,产生超高的维度,同时使用MaxPooling层进行维度压缩同时选取明显特征。CNN网络通常反复堆叠Conv+MaxPooling层,变得更深,因此能提取更加全局更加高层的特征,同时不会产生太高的特征维度。对一个图片输入产生一个特征集合。
全链接层,连接所有的特征,把多个Map压缩为1个X维向量,将输出值送给分类器(如softmax分类器)
layer {
name: "fc7"
type: "InnerProduct"
bottom: "fc6"
top: "fc7"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
inner_product_param {
num_output: 4096
weight_filler {
type: "gaussian"
std: 0.005
}
bias_filler {
type: "constant"
value: 1
}
}
}
layer {
name: "relu7"
type: "ReLU"
bottom: "fc7"
top: "fc7"
}
layer {
name: "drop7"
type: "Dropout"
bottom: "fc7"
top: "fc7"
dropout_param {
dropout_ratio: 0.5
}
}
layer {
name: "fc8"
type: "InnerProduct"
bottom: "fc7"
top: "fc8"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
inner_product_param {
num_output: 1000
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 0
}
}
}
第7层全链接层输出参数为4096,默认表示输出4096个维度向量。此外,设置的dropout率为0.5,则意味着使用了另外0.5的链接冗余,用于增强泛化能力。
CNN的结构分析—SoftMax分类器
CNN多数分类模型最终选择了MLP+SoftMax分类器,使用MLP-全连接层进行特征降维,SoftMax函数进行分类。是否因为SoftMax分类器在多分类上的无偏性,便利性?训练时参数更新的更快。
为什么一定要把最后的分类器设置为处理向量空间的SoftMax分类器,而不是直接使用x*x—>1*1或者x*1—>1*1的卷积方式呢?。
使用Softmax回归模型,该模型是logistic回归模型在多分类问题上的推广,在多分类问题中,类标签 可以取两个以上的值。 Softmax回归模型对于诸如MNIST手写数字分类等问题是很有用的,该问题的目的是辨识10个不同的单个数字。Softmax回归是有监督的。
SoftMax分类器: http://ufldl.stanford.edu/wiki/index.php/Softmax......
SoftMax层计算过程:
Caffe配置文件:
layer {
name: "fc8"
type: "InnerProduct"
bottom: "fc7"
top: "fc8"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
inner_product_param {
num_output: 1000
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 0
}
}
}
layer {
name: "accuracy"
type: "Accuracy"
bottom: "fc8"
bottom: "label"
top: "accuracy"
include {
phase: TEST
}
}
layer {
name: "loss"
type: "SoftmaxWithLoss"
bottom: "fc8"
bottom: "label"
top: "loss"
}
第8层全链接层输出参数为1000,表示AlexNet模型默认输出1000个类别。
CNN结构总结
CNN方法对输入图像不停的卷积、pooling,提取更多的特征图,使用全链接层映射到特定维度的特征向量空间,再通过MLP或者softmax分类器获得图像目标分类。
检测可以视为选取BoundingBox和分类的结合,而后出现的DarkNet更是直接产生了回归模型。
下图为典型的DeepID模型。
Car的图片经过CNN层层特征提取和Polling过程,最后生成的Map经过压缩为m维向量,经过SoftMax函数,压缩为n维浮点数,然后经过Max()函数,取得分类结果。