深度学习进阶:手写数字识别99.38%准确率的网络是怎样炼成的?
今天我们来聊聊一个非常经典的话题——加深网络。
之前我们学了很多关于神经网络的知识:各种层、技巧、CNN、最优化方法……现在,是时候把这些技术整合起来,打造一个深度网络,挑战MNIST手写数字识别。你可能会想:MNIST不是已经“玩烂”了吗?但今天这个网络,准确率高达99.38%(错误率仅0.62%),而且它的结构非常有意思,是后续VGG等经典网络的雏形。
让我们一步步拆解这个网络,看看它为什么这么强,以及加深网络到底带来了什么好处。
一、向更深的网络出发
先上图,这就是我们今天要实现的深度CNN(图1)。它比我们之前实现的任何网络都要深,而且结构上参考了后来大名鼎鼎的VGG网络。
这个网络有什么特点?
- 卷积核:全部使用3×3 的小型滤波器。别小看这小东西,后面我们会解释它的好处。
- 通道数:随着层数加深,通道数逐步增加:16 → 16 → 32 → 32 → 64 → 64。这是CNN的常见设计:空间尺寸减小,深度增加。
- 池化层:适当插入池化层,逐步缩小中间数据的空间大小(高和宽)。
- 全连接层 + Dropout:最后接全连接层,并使用了Dropout防止过拟合。
- 激活函数:全部使用ReLU。
- 权重初始化:采用He初始值(针对ReLU的最优初始化方法)。
- 最优化方法:使用Adam(结合了Momentum和AdaGrad的优点)。
把这些技术一组合,效果立竿见影:在MNIST上达到了99.38%的识别精度!错误率仅0.62%。
二、看看那些“识别错误”的图像
是不是觉得0.62%的错误率很低?那我们来看看究竟是哪些图像让网络“翻车”了(图2)。
仔细观察,你会发现这些图像对我们人类来说也很难判断:
- 左上角的“6”,看起来像“0”;
- 旁边的“3”,像“5”;
- “1”和“7”容易混淆;
- “0”和“6”、“3”和“5”也经常认错。
你看,连人类都会犯的错,网络自然也难以避免。不过反过来想,这也说明这个深度CNN已经学到了类似人类的视觉特征——它并不是胡乱猜测,而是抓住了图像的本质。这就是深度学习的魅力:它能模仿甚至超越人类的某些感知能力。
三、还能再提高吗?看看排行榜上的高手
99.38%已经很高了,但总有人追求极致。在 “What is the class of this image ?” 这个网站上,专门有MNIST数据集的精度排行榜(图3)。
排行榜前几名基本都是Neural Networks、Deep、Convolutional的天下。截止2016年6月,最高识别精度是99.79%(错误率0.21%),用的也是CNN,但层数并不特别深(卷积层2层+全连接层2层)。这说明对于MNIST这种简单任务,加深网络的好处并不明显,反而可能导致过拟合或训练困难。
那高手们是怎么进一步提升精度的?几个关键技术:
- 集成学习:组合多个模型,取平均结果。
- 学习率衰减:随着训练进行,逐步降低学习率,让收敛更稳定。
- Data Augmentation(数据扩充):这是最简单却最有效的方法之一。
什么是 Data Augmentation?
简单说,就是人为地“制造”更多训练数据。比如对原始图像施加微小的变化(旋转、平移、翻转、缩放、亮度调整等),生成新的图像(图4)。这样一来,训练集就变大了,模型能学到更多不变性特征,泛化能力自然更强。
对于MNIST,你可以随机平移几个像素、稍微旋转一下,甚至添加噪声。这些操作都不会改变数字的本质,但能极大地丰富训练样本。实现起来也不难,有兴趣的读者可以自己尝试,效果立竿见影。
四、为什么加深网络有效?
虽然目前理论还不完全透彻,但有一些直观的解释和实验数据支持加深网络的好处。
1. 减少参数数量,扩大感受野
你可能听说过:堆叠两个3×3卷积,可以替代一个5×5卷积。这是真的吗?看图5和图6。
一个5×5卷积的输出节点,对应输入数据的5×5区域。而两个3×3卷积(中间有激活函数)堆叠后,第二个卷积的输出节点,对应第一个卷积输出的3×3区域,而这个3×3区域又对应输入数据的5×5区域。所以两个3×3卷积的感受野等同于一个5×5卷积。
参数数量呢?
- 一个5×5卷积:25个参数。
- 两个3×3卷积:2 × 3×3 = 18个参数。
参数减少了!如果再堆叠三个3×3,感受野相当于7×7,参数仅27个,而一个7×7卷积需要49个参数。参数越少,模型越轻量,且不易过拟合。同时,中间夹着的ReLU激活函数增加了非线性,提升了模型的表现力。
2. 分层学习,提高学习效率
还记得CNN的层次化特征提取吗?浅层网络学习边缘、纹理等低级特征;中层学习形状、部件;深层学习物体整体概念(图7)。
如果网络很浅,一个卷积层就需要直接学会从像素到“狗”的映射,这需要海量数据和复杂的学习。但通过加深网络,我们可以把问题分解:
- 第一层:只学边缘(很简单,数据需求少);
- 第二层:利用边缘信息学形状;
- 第三层:利用形状信息学部件;
- ……
这样,每一层只需要解决一个相对简单的子问题,学习效率大大提高。而且,因为低层特征(如边缘)在各种图像中都普遍存在,所以可以用更少的数据学好,然后逐层传递,高层特征自然水到渠成。
五、总结与思考
今天我们通过一个深度CNN的例子,看到了加深网络的威力:
- 用3×3小卷积核堆叠,减少参数,增加非线性;
- 配合He初始化、Adam、Dropout等技巧,在MNIST上达到99.38%的准确率;
- 通过Data Augmentation等方法,还可以进一步提高精度;
- 加深网络的核心好处:减少参数、扩大感受野、分层学习、提高数据效率。
当然,MNIST只是一个起点。在更复杂的任务(如ImageNet大规模图像识别)中,加深网络带来的提升更加明显。从AlexNet到VGG,再到ResNet、DenseNet,网络越来越深,性能也越来越强。这背后正是今天所讲思想的延伸。
希望今天的分享对你有所帮助。如果你对加深网络还有其他疑问,或者想了解某个具体技术的实现,欢迎在评论区留言。我们下期再见!
参考资料
- 原书:《深度学习入门:基于Python的理论与实现》
- 网站:What is the class of this image ?
- 文献[33]:Cireşan, D.C., et al. (2012). Multi-column deep neural networks for image classification.