1. Deep Learning 与 Nueral NetWork
1.1 Deep learning本身算是machine learning的一个分支,简单可以理解为neural network的发展。大约二三十年前,neural network曾经是ML领域特别火热的一个方向,但是后来确慢慢淡出了,原因包括以下几个方面:
比较容易过拟合,参数比较难tune,而且需要不少trick;
训练速度比较慢,在层次比较少(小于等于3)的情况下效果并不比其它方法更优;
1.2 Deep learning与传统的神经网络之间有相同的地方也有很多不同。
-
二者的相同在于deep learning采用了神经网络相似的分层结构,系统由包括输入层、隐层(多层)、输出层组成的多层网络,只有相邻层节点之间有连接,同一层以及跨层节点之间相互无连接,每一层可以看作是一个logistic regression模型;这种分层结构,是比较接近人类大脑的结构的。
- 而为了克服神经网络训练中的问题,DL采用了与神经网络很不同的训练机制。传统神经网络中,采用的是back propagation的方式进行,简单来讲就是采用迭代的算法来训练整个网络,随机设定初值,计算当前网络的输出,然后根据当前输出和label之间的差去改变前面各层的参数,直到收敛(整体是一个梯度下降法)。而deep learning整体上是一个layer-wise的训练机制。这样做的原因是因为,如果采用back propagation的机制,对于一个deep network(7层以上),残差传播到最前面的层已经变得太小,出现所谓的gradient diffusion(梯度扩散)。
2. 卷积神经网络
2.1 卷积
对于给定的一幅图像来说,给定一个卷积核,卷积就是根据卷积窗口,进行像素的加权求和。
卷积运算一个重要的特点就是: 通过卷积运算,可以使原信号特征增强,并且降低噪音。
2.2 池化
CNN的池化(图像下采样)方法很多:Mean pooling(均值采样)、Max pooling(最大值采样)、Overlapping (重叠采样)、L2 pooling(均方采样)、Local Contrast Normalization(归一化采样)、Stochasticpooling(随即采样)、Def-pooling(形变约束采样)。其中最经典的是最大池化,
-
最大化池化
如上图所示,然后图片中每个像素点的值是上面各个格子中的数值。然后我要对这张44的图片进行池化,池化的大小为(2,2),跨步为2,那么采用最大池化也就是对上面44的图片进行分块,每个块的大小为2*2,然后统计每个块的最大值,作为下采样后图片的像素值,具体计算如下图所示:
也就是说我们最后得到下采样后的图片为:
2.3 feature map
其实一张图片经过一个卷积核进行卷积运算,我们可以得到一张卷积后的结果图片,而这张图片就是特征图。
2.4 经典结构
LeNet-5
- 输入:32*32的手写字体图片,这些手写字体包含0~9数字,也就是相当于10个类别的图片
- 输出:分类结果,0~9之间的一个数
因此我们可以知道,这是一个多分类问题,总共有十个类,因此神经网络的最后输出层必然是SoftMax问题,然后神经元的个数是10个。LeNet-5结构: - 输入层:32*32的图片,也就是相当于1024个神经元
- C1层:paper作者,选择6个特征卷积核,然后卷积核大小选择55,这样我们可以得到6个特征图,然后每个特征图的大小为32-5+1=28,也就是神经元的个数由1024减小到了2828=784。
- S2层:这就是下采样层,也就是使用最大池化进行下采样,池化的size,选择(2,2),也就是相当于对C1层2828的图片,进行分块,每个块的大小为22,这样我们可以得到1414个块,然后我们统计每个块中,最大的值作为下采样的新像素,因此我们可以得到S1结果为:1414大小的图片,共有6个这样的图片。
- C3层:卷积层,这一层我们选择卷积核的大小依旧为55,据此我们可以得到新的图片大小为14-5+1=10,然后我们希望可以得到16张特征图。那么问题来了?这一层是最难理解的,我们知道S2包含:6张1414大小的图片,我们希望这一层得到的结果是:16张10*10的图片。这16张图片的每一张,是通过S2的6张图片进行加权组合得到的,具体是怎么组合的呢?
- S4层:下采样层,比较简单,也是知己对C3的16张1010的图片进行最大池化,池化块的大小为22。因此最后S4层为16张大小为55的图片。至此我们的神经元个数已经减少为:165*5=400。
- C5层:我们继续用5*5的卷积核进行卷积,然后我们希望得到120个特征图。这样C5层图片的大小为5-5+1=1,也就是相当于1个神经元,120个特征图,因此最后只剩下120个神经元了。这个时候,神经元的个数已经够少的了,后面我们就可以直接利用全连接神经网络,进行这120个神经元的后续处理.
CNN 实现
theano