LeNet-5

LeNet-5 是 Yann LeCun 等人于 1998 年提出的一个卷积神经网络结构,是卷积神经网络应用于视觉识别领域的早期工作之一。 LeNet-5 的作用是从图像中识别单个字符,是论文中所描述的文档识别系统的一个组件。 LeNet-5 的结构相对简单,但也已经包含了卷积神经网络所必需的元素。所以让我们从 LeNet-5 开始,对卷积神经网络及其在图像分类问题中的应用有一个基本的认识。

经典神经网络的优势和问题

从监督学习的角度来看,图像分类需要在图像空间 RN\mathbb{R}^N 和类别空间 Y\mathcal{Y} 之间建立一个映射关系。 由于图像像素和语义之间巨大的差异,这种映射关系必然是复杂且高度非线性的。 因此早期图像识别算法强烈依赖人工设计的图像特征,通过特征降低学习问题的复杂性。

另一方面,多层神经网络在学习复杂、高维度、非线性的映射方面有着先天的优势。 因而对于图像识别问题而言,神经网络是一个非常合适的工具。 LeCun 等人在论文中指出,与其借助手工设计的特征对数据进行表示变换,不如由数据驱动,让神经网络自动学习出这种特征表达。

经典的多层感知器结构如下图所示,

从数学角度来看,多层感知器可以表示为仿射变换与非线性变换的复合。

假设神经网络总共有 NN 层,除最后一层输出层,其余 N1N-1 层均为隐层。记输入变量为 x0Rd0x_0 \in \mathbb{R}^{d_0},第 ii 个隐层变量为 xiRdix_i \in \mathbb{R}^{d_i},输出为 y=xnRdny = x_n \in \mathbb{R}^{d_n}

则相邻隐层之间的映射关系为:

xi=σi(A(xi1;{Wi,bi}))=σi(WiTxi1+bi)x_{i} = \sigma_i(A(x_{i-1}; \{W_i,b_i\})) = \sigma_i(W_i^\mathsf{T} x_{i-1} + b_i)

整个神经网络所表达的映射关系为层间映射的复合:

y=fMLP(x0;{Wi,bi}i=1n)y = f_\text{MLP}(x_0; \{W_i, b_i\}_{i=1}^{n})

其中,

fMLP({Wi,bi}i=1n)=σnAn(Wn,bn)σn1An(Wn1,bn1)σ1A1(W1,b1)f_\text{MLP}(\{W_i, b_i\}_{i=1}^{n}) = \sigma_n \circ A_n(W_n, b_n ) \circ \sigma_{n-1} \circ A_n(W_{n-1}, b_{n-1}) \circ \cdots \circ \sigma_1 \circ A_{1}(W_{1}, b_1)

在多层感知器中,由于隐层中的每个神经元都与前一层的所有神经元相连,这种层也称为全连接层

有全连接层连接而成的神经网络具有非常强的表达能力,但也具有非常明显的问题:

  1. 参数过多

    从上面的表达式可以看出,多层感知器中参数的总数大约是 Nd2N*d^2 量级,这里 dd 是隐层单元数的最大值。对于图像像素少则几千,多则数十万的维度而言,全连接网络中的参数量是非常巨大的。大量参数对计算能力和存储容量都提出了很高的要求。并且对于学习问题而言,巨大量的参数也通常意味着严重的过拟合。

  2. 全连接网络对图像在空间上的微小变化没有鲁棒性

    考虑图像上的一个局部物体或局部特征(例如汽车上的一个轮子),当这个轮子在空间上有微小的位移时,图像的语义(即图像中包含一辆汽车,汽车左下角有个轮子)并没有明显的变化。但这种微小的位移却会对隐层神经元的响应产生巨大的变化。因为这部分图像会与新的位置上的参数相乘,激活另一个隐层神经元。

换句话说,多层感知器并不能以较小的计算代价的有效捕获图像的特征。这与我们起初的愿景有些背离。

卷积网络的优势

我们知道,图像在局部空间有着很强的相关性,许多手工设计的特征都基于局部的图像像素,且并不受位置的影响。例如,图像边缘特征的计算仅仅依赖相邻的 3x3 像素,在不同位置检测边缘所使用的滤波器是相同的。

这就促使我们思考,如果我们希望让神经网络的隐层学习出某种特征,那么每个神经元或许并不需要与图片中全部像素相连,而且不同神经元连接前层的权重可以是相同的。 我们可以利用对图像数据的这种特点,对神经网络的结构进行一定的限制,使之可以更有效的学习图像的特征。

这种想法的出现就促成了卷积神经网络的出现。在卷积神经网络中,隐层神经元仅与空间上相近的一些像素相连,并且不同神经元连接的权重是相同的。

卷积网络通过局部链接与共享参数解决了多层感知器所面临的问题。

  1. 参数大大减少

    受益于局部链接和共享参数,一个隐层所包含的全部参数只有卷积核,整个卷积网络所包含的参数也只有 NkF2N*k*F^2 量级,这里 FF 为所有层的卷积核的边长的最大值,nn 为卷积核的个数,使用多个卷积核是为了学习不同的图像特征。由于卷积核通常较小,在 lenet-5 中仅有 5x5 像素,因而整个神经网络的参数大大减少。参数过多所引起的计算、内存开销,以及过拟合问题大大缓解。

  2. 空间鲁棒性增强

    同样由于共享参数,当图像中的局部特征出现位移时,特征中的响应并不会变化,仅仅在位置上有所偏移。

卷积网络还引入了“降采样”操作。 在 lenet-5 中,相邻 2x2 单元中的特征会进行平均,产生分辨率仅有一般的新的特征图。 通过这种降采样操作,即便原图中的图像特征有所位移,在降采样后的特征图上,响应的位置也不会产生变化。 这就使得卷积网络具有较强的空间鲁棒性。

将局部链接、共享参数、降采样三者结合,就可以得到适用于图像识别的卷积神经网络。

LeNet-5 的网络结构

LeNet-5 是一个 7 层的网络结构,包含两个卷积层,两个降采样层,和三个全连接层。 前两个卷积层使用 5x5 的局部链接,分别有 6 和 10 个卷积核,使用 tanh 作为激活函数。 两个降采样层均为 2x2 的均值降采样层。 这两个部分组成了需要学习的特征提取模块。 后面的三个全连接层与经典的多层感知器相同,以前几层输出的特征为输入,最终输出 10 维的向量,作为输入图像包含 10 个数字的条件概率。

如果我们遵循更为现代的说法,在计算神经网络层数的时候仅考虑有可学习参数的卷积层和全连接层,LeNet-5 是一个 5 层的结构。

网络训练

卷积网络的训练与多层感知器相同,均依赖回传算法(back propagation)与(随机)梯度下降。由于局部链接和共享参数的存在,回传算法在数学计算上与全连接网络有所不同。

(具体的数学推导暂时从略。)

LeNet-5 的 Pytorch 实现

Lenet-5 的结构相对简单,对于现代的神经网络框架而言,实现 Lenet-5 结构非常容易。

在 PyTorch 中,我们借助 torch.nn.Sequential 类按顺序堆叠每一个神经网络层,就可以简单实现这个 7 层的结构,如下:

lenet5 = nn.Sequential(
    nn.Conv2d(in_channels=1, out_channels=6, kernel_size=5, stride=1),
    nn.Tanh(),
    nn.AvgPool2d(kernel_size=2),
    nn.Conv2d(in_channels=6, out_channels=16, kernel_size=5, stride=1),
    nn.Tanh(),
    nn.AvgPool2d(kernel_size=2),
    nn.Flatten(),
    nn.Linear(in_features=16*5*5, out_features=120),
    nn.Tanh(),
    nn.Linear(in_features=120, out_features=84),
    nn.Tanh(),
    nn.Linear(in_features=84, out_features=10),
)

modified from source

参考资料

论文

Last updated