CNN学习笔记

神经元模型介绍

神经网络中最基本的成分是神经元(neuron)模型。在生物神经网络中,每个神经元与其他神经元相连,当它“兴奋”时,就会像相连的神经元发送化学物质,从而改变这些神经元的电位;如果某神经元的电位超过了一个“阈值”(threshold),那么它就会被激活,即“兴奋”起来,像其他神经元发送化学物质。
将上述情形抽象一下,就得到了一直沿用至今的“M-P神经元模型“,在这个模型中,神经元接收来自n个其他神经元传递过来的输入信号,这些输入信号通过带权重的连接(connection)进行传递,神经元接收到的总输入值将于神经元的阈值进行比较,然后通过”激活函数“(activation function)处理以产生神经元的输出。

M-P神经元模型

从上图M-P神经元模型可以看出,神经元的输出
$$y = f(\sum_{i=1}^{n}w_ix_i-\theta)$$
其\(\theta\)为我们之前提到的神经元的激活阈值,函数\(f(\cdot)\)也被称为是激活函数。我们常用的方法是用sigmodi函数来表示激活函数\(f(\cdot)\).
sigmoid函数的表达式和分布图如下所示:

Sigmoid

$$f(x)=\frac{1}{1+e^{-x}}$$

把多个这样的神经元按一定的层次结构连接起来,就得到了神经网络。

NeuralNetwork

Convolutional Neural Networks卷积神经网络介绍

卷积神经网络是人工神经网络的一种,也是当前语音分析和图像识别领域的研究热点。它采用了权值共享网络结构使之更类似于生物神经网络,降低了网络模型的复杂度,减少了权值的数量。该优点在网络的输入是多维图像时表现的更加明显,使图像可以直接作为网络的输入,避免了传统识别算法中复杂的特征提取和数据重建过程。卷积网络是为识别二维形状而特殊设计的一个多层感知器,这种网络结构对平易、比例缩放、倾斜或者共他形式的变形具有高度不变性。

卷积神经网络的网络结构

卷积神经网络是一个多层的神经网络,煤层由多个二维平面组成,而每个平面由多个独立神经元组成。它是为识别二维形状而特殊设计的一个多层感知器,网络的结构主要有稀疏连接和权值共享两个特点,为了在有监督方式下学会之前提到过的良好性能,网络的结构包含了如下形式的约束:

  • 特征提取:每一个神经元从上一层的局部接受域得到连接输入,因而迫使它提取局部特征。一旦一个特征被提取出来,只要它相对于其他特征的位置被近似地保留下来,它的精确位置就变得没有那么重要了。
  • 特征映射。网络的每一个计算层都是由多个特征映射组成的,每个特征映射都是平面形式的。平面中单独的神经元在约束下共享相同的连接权值集这种结构形式具有如下的有益效果:a.平移不变性。b.自由参数数量的缩减(通过权值共享实现)。
  • 子抽样:每个卷积层后面跟着一个实现局部平均和子抽样的计算层,由此特征映射的分辨率降低。这种操作具有使特征映射的输出对平移和其他形式的变性的敏感度下降的作用。

Cnn-Struct

上图中展示了卷积神经网络的概念示范:输入图像通过和三个可训练的滤波器和可加偏置进行卷积,卷积后在C1层产生三个特征映射图,然后特征映射图中每组的四个像素再进行求和,加权值,加偏置,通过一个Sigmoid函数得到三个S2层的特征映射图。这些映射图再经过滤波得到C3层。这个层级结构再和S2一样产生S4。最终,这些像素值被光栅化,并连接成一个向量输入到传统的神经网络,得到输出。

一般地,C层为特征提取层,每个神经元的输入与前一层的局部感受野相连,并提取该局部的特征,一旦该局部特征被提取后,它与其他特征间的位置关系也随之确定下来;S层是特征映射层,网络的每个计算层由多个特征映射组成,每个特征映射为一个平面,平面上所有神经元的权值相等。特征映射结构采用影响函数核小的sigmoid函数作为卷积网络的激活函数,使得特征映射具有位移不变性。

此外,由于一个映射面上的神经元共享权值,因而减少了网络自由参数的个数,降低了网络参数选择的复杂度。卷积神经网络中的每一个特征提取层(C-层)都紧跟着一个用来求局部平均与二次提取的计算层(S-层),这种特有的两次特征提取结构使网络在识别时对输入样本有较高的畸变容忍能力。

卷积(Convolution)和池化(Pooling)

在讲到参数减少与权值共享之前,需要先讲下卷积和池化的概念,这对于理解后面的步骤有很大的帮助。

卷积

卷积是数学分析中一种重要的运算。在泛函分析中,卷积是通过两个函数f和g生成第三个函数的一种数学算子,它表征了函数f经过反转和平移的g的重叠部分的累积。卷积与数字图像有着紧密的联系。

当然就是因为这些话太难懂所以很难理解卷积的具体意义。

通俗一点卷积的物理意义就是一个函数(如:单位相应)在另一个函数(如:输入信号)上的加权叠加。

imageconv

上图展示了对一个5X5图像的卷积过程,通过一个3X3的卷积核在图像上移动,每当模板中心对准一个像素时,就对此像素所在邻域内的像素灰度根据模板进行加权求和,对上述图像的每个邻域依次重复上述过程,得到后边的卷积特征。

对与CNN中卷积的应用这里我们套用UFLDL课程上的说法:自然图像有其固有特性,图像的一部分的统计特性与其他部分是一样的。这也意味着我们在这一部分学习的特征也能拥在另一部分上,所以对于这个图像上的所有位置,我们都能使用同样的学习特征。

当从一个大尺寸图像中随机选取一小块,比如说8x8作为样本,并且从这个小块样本中学习到了一些特征,这时我们可以把从这个8x8样本中学习到的特征作为探测器,应用到这个图像的任意地方中去。特别的是我们可以用从8x8样本中所学习到的特征跟原本的大尺寸图像做卷积,从而对这个大尺寸图像上的任一位置获得一个不同特征的激活值。

下面给出一个具体的例子:假设你已经从一个 96x96 的图像中学习到了它的一个 8x8 的样本所具有的特征,假设这是由有 100 个隐含单元的自编码完成的。为了得到卷积特征,需要对 96x96 的图像的每个 8x8 的小块图像区域都进行卷积运算。也就是说,抽取 8x8 的小块区域,并且从起始坐标开始依次标记为(1,1),(1,2),…,一直到(89,89),然后对抽取的区域逐个运行训练过的稀疏自编码来得到特征的激活值。在这个例子里,显然可以得到 100 个集合,每个集合含有 89x89 个卷积特征。

假设给定了\(r \times c\) 的大尺寸图像,将其定义为\(x{large}\)。首先通过从大尺寸图像中抽取的 \(a \times b\) 的小尺寸图像样本 \(x{small}\) 训练稀疏自编码,计算 \(f = \sigma(W(1)x_{small} + b(1))\)(\(\sigma\) 是一个 sigmoid 型函数)得到了 k 个特征, 其中 W(1) 和 b(1) 是可视层单元和隐含单元之间的权重和偏差值。对于每一个 \(a \times b\) 大小的小图像 \(x_s\),计算出对应的值 \(fs = σ(W(1)xs + b(1))\),对这些 \(f_{convolved}\) 值做卷积,就可以得到 \(k \times (r - a + 1) \times (c - b + 1)\) 个卷积后的特征的矩阵。

池化

在通过卷积获得了特征 (features) 之后,下一步我们希望利用这些特征去做分类。理论上讲,人们可以用所有提取得到的特征去训练分类器,例如 softmax 分类器,但这样做面临计算量的挑战。例如:对于一个 96X96 像素的图像,假设我们已经学习得到了400个定义在8X8输入上的特征,每一个特征和图像卷积都会得到一个 (96 − 8 + 1) (96 − 8 + 1) = 7921 维的卷积特征,由于有 400 个特征,所以每个样例 (example) 都会得到一个 892 400 = 3,168,400 维的卷积特征向量。学习一个拥有超过 3 百万特征输入的分类器十分不便,并且容易出现过拟合 (over-fitting)。

为了解决这个问题,首先回忆一下,我们之所以决定使用卷积后的特征是因为图像具有一种“静态性”的属性,这也就意味着在一个图像区域有用的特征极有可能在另一个区域同样适用。因此,为了描述大的图像,一个很自然的想法就是对不同位置的特征进行聚合统计,例如,人们可以计算图像一个区域上的某个特定特征的平均值 (或最大值)。这些概要统计特征不仅具有低得多的维度 (相比使用所有提取得到的特征),同时还会改善结果(不容易过拟合)。这种聚合的操作就叫做池化 (pooling),有时也称为平均池化或者最大池化 (取决于计算池化的方法)。

Pooling_schematic

上图显示池化如何应用于一个图像的四块不重合区域。

形式上,在获取到我们前面讨论过的卷积特征后,我们要确定池化区域的大小(假定为\(m \times n\)),来池化我们的卷积特征。那么,我们把卷积特征划分到数个大小为 \(m \times n\)的不相交区域上,然后用这些区域的平均(或最大)特征来获取池化后的卷积特征。这些池化后的特征便可以用来做分类。

参数减少和权值共享

稀疏连接(Sparse Connectivity)

卷积网络通过在相邻两层之间强制使用局部连接模式来利用图像的空间局部特性,在第m层的隐层单元只与第m-1层的输入单元的局部区域有连接,第m-1层的这些局部 区域被称为空间连续的接受域。我们可以将这种结构描述如下:

设第m-1层为视网膜输入层,第m层的接受域的宽度为3,也就是说该层的每个单元与且仅与输入层的3个相邻的神经元相连,第m层与第m+1层具有类似的链接规则,如下图所示。

Sparse-Connectivity

权值共享(Shared Weights)

在卷积网络中,每个稀疏过滤器hi通过共享权值都会覆盖整个可视域,这些共享权值的单元构成一个特征映射,如下图所示。

Shared-Weights

在图中,有3个隐层单元,他们属于同一个特征映射。同种颜色的链接的权值是相同的,我们仍然可以使用梯度下降的方法来学习这些权值,只需要对原始算法做一些小的改动, 这里共享权值的梯度是所有共享参数的梯度的总和。我们不禁会问为什么要权重共享呢?一方面,重复单元能够对特征进行识别,而不考虑它在可视域中的位置。另一方面,权值 共享使得我们能更有效的进行特征抽取,因为它极大的减少了需要学习的自由变量的个数。通过控制模型的规模,卷积网络对视觉问题可以具有很好的泛化能力。

具体实现

之前提到过,CNN的网络结构有稀疏连接和权值共享两个特点,这样就减少了要训练的参数的个数,下面就来说明下它体现在了哪个方面。

NeuralNet

假设我们有一个1000x1000像素的图像,有一百万个隐层神经元,那么它们全连接的话(每个隐层神经元都连接图像的每一个像素点)就有\(1000 \times 1000 \times 1000000=10^{12}\) 个权值参数。然而图像的空间联系是局部的,就像人是通过一个局部的感受野去感受外界图像一样,每一个神经元都不需要对全局图像做感受,每个神经元只感受局部的图像区域,然后在更高层,将这些感受不同局部的神经元综合起来就可以得到全局的信息了。这样我们就可以减少连接的数目,也就是减少神经网络需要训练的权值参数的个数了。如上图右所示:加入局部感受野是 \(10 \times 10\) ,隐层每个感受野只需要与这 \(10 \times 10\) 的局部图像相连接,所以一百万个因层神经元就只有一亿个连接,即 \(10^8\) 个参数。比原来少了四个数量级,这样训练起来就没那么费力了。可是这样感觉还是有点多,还有别的办法吗?

我们知道,隐含层的每一个神经元都连接 \(10 \times 10\) 个图像区域,也就是说每一个神经元存在\(10 \times 10 = 100\) 个连接权值参数。那如果我们每个神经元这100个参数是相同的呢?也就是说每个神经元用的是同一个卷积核去卷积图像。这样我们就只有100个参数,不管隐层的神经元个数有多少,两层间就只有100个参数,这就是权值共享。

当然这样只提取了一种特征,我们需要的是提取多种特征,那么我们只要多加集中滤波器就可以了。假设我们构造了100中滤波器,每种滤波器的参数不一样,表示它提取输入图像的不同特征,例如不同的边缘。这样每种滤波器去卷积图像就得到对图像的不同特征的反映,我们称之为 Feature Map。所以 100 种卷积核就有 100 个 Feature Map。这 100 个 Feature Map 就组成了一层神经元。这时候一层的参数就有 100种卷积核 \(\times\) 每种卷积核共享 100 个参数 \(100 \times 100 = 10k\),也就是1万个参数。如下图右所示,不同的颜色表达不同的滤波器。

Locally-Connec

隐层的参数格式和隐层的神经元无关,只和滤波器的大小和滤波器种类的多少有关。那么如何确定隐层的神经元个数呢?它和原图像,也就是输入的大小(神经元个数)、滤波器的大小和滤波器在图像种的滑动步长都有关。例如,我的图像是 \(1000 \times 1000\) 像素,而滤波器大小是 \(10 \times 10\),假设滤波器没有重叠,也就是步长为 10,这样隐层的神经元个数就是 \((1000 / 10) \times (1000 / 10) = 100 \times 100 \) 个神经元了,假设步长为 5,也就是卷积核会重叠五个像素那么隐层的神经元个数就是 \((1000 / 5) \times (1000 / 5) = 200 \times 200 \),大抵思路如此,这是一个 Feature Map 的神经元个数,如果100个 Feature Map 就是100倍了。由此可见,图像越大,神经元个数和需要训练的权值参数个数的贫富差距就越大。

需要注意的一点是,上面的讨论都没有考虑每个神经元的偏置部分。所以权值个数需要加1 。这个也是同一种滤波器共享的。

这个赞赏我只是放在这里看看的,你愿意帮我测试下这个功能吗?