自从 2011 年深度卷积神经网络(CNN)在图像分类任务中优于人类开始,它们就成为了计算机视觉任务中的行业标准,这些任务包括图像分割、目标检测、场景标记、跟踪以及文本检测等等。
然而,训练神经网络的技巧并不容易掌握。与之前的机器学习方法一样,细节是最恐怖的地方,然而在卷积神经网络中有更多的细节需要去管理:你所用的数据和硬件的限制是什么?你应该以哪种网络作为开始呢?AlexNet、VGG、GoogLeNet 还是 ResNet 呢?甚至 ResNet 里面还有 ResNet 分支选项。你应当建立多少与卷积层相对应的密集层?你使用哪种激活函数?即使你选择了广为流行的 ReLU,你也还要选择是不是使用普通的 ReLU、Very Leaky ReLU、RReLU、PReLU 或通用版本的 ELU。
最难优化的参数之一就是学习率(learning rate),它是调节神经网络训练的最重要的超参数。学习率太小,可能导致你永远不会收敛到一个解决方案,学习率太大,可能导致你刚好跳过了最优解。即便是适应性学习率的方法,也可能在计算上过于昂贵,这取决于你的硬件资源。
设计的选择和超参数的设定会严重地影响 CNN 的训练和表现,然而对于刚进入深度学习领域的人而言,建立一种设计架构的直觉所需要的资源是稀缺的,而且是分散的。
每个人都知道 VGG 是缓慢而庞大的,但是,倘若你正确地调节它,你仍然可以生成最先进的结果以及高性能的商用应用。图片来源:Canziani, et al
着重于实际调节的主要书籍是《神经网络:权衡技巧(Neural Networks: Tricks Of The Trade)》,作者:Orr & Muller,最初出版于 2003 年,再版于 2012 年。关于深度学习的热潮始于 2012 年《纽约时报》报导的 Geoffrey Hinton 的团队在 Merck Drug Discovery Challenge 上的惊人成功,所以最近几年先进的研究是缺失的。
幸运的是,美国海军研究室的研究员 Leslie Smit 等人已经发表了关于卷积神经网络架构改进和技术提升的系统性研究。下面列举一些他所强调的最重要的一些设计模式。
关于图像分类的卷积神经网络设计模式
根据 Smith 的观点,这「14 种原创设计模式可以帮助没有经验的研究者去尝试将深度学习与各种新应用相结合」。尽管高级人工智能研究员可以依靠直觉、经验以及针对性的实验,但这些建议对于剩下的没有机器学习博士学位的人来说是一个很好的起点。
1)架构要遵循应用
你也许会被 Google Brain 或者 DeepMind 这些奇特的实验室所发明的那些耀眼的新模型所吸引,但是其中许多在你的用例或者业务环境中要么是不可能实现,要么是实现起来非常不现实。你应该使用对你的特定应用最有意义的模型,这种模型或许比较简单,但是仍然很强大,例如 VGG。
较新的架构可能在学术性的基准测试上会更加准确,但是你应该选择你自己理解的并且最适合你的应用的架构。图片来源:Canziani 等。
2)网络路径的激增
每年的 ImageNet Challenge 的冠军都会使用比上一届冠军更加深层的网络。从 AlexNet 到 Inception,再到 ResNet,Smith 注意到了「网络中路径数量倍增」的趋势,并且「ResNet 可以是不同长度的网络的指数集合」。
3)争取简单
然而,更大的并不一定是更好的。在名为「Bigger is not necessarily better」的论文中,Springenberg 等人演示了如何用更少的单元实现最先进的结果。参考:https://arxiv.org/pdf/1412.6806.pdf
4)增加对称性
无论是在建筑上,还是在生物上,对称性被认为是质量和工艺的标志。Smith 将 FractalNet 的优雅归功于网络的对称性。
5)金字塔式的形状
你也许经常在表征能力和减少冗余或者无用信息之间权衡。卷积神经网络通常会降低激活函数的采样,并会增加从输入层到最终层之间的连接通道。
6)过度训练
另一个权衡是训练准确度和泛化能力。用类似 drop-out 或者 drop-path 的方法进行正则化可以提高泛化能力,这是神经网络的重要优势。请在比你的实际用例更加苛刻的问题下训练你的网络,以提高泛化性能。
7)全面覆盖问题空间
为了扩展你的训练数据和提升泛化能力,请使用噪声和数据增强,例如随机旋转、裁剪和一些图像操作。
8)递增的特征构造
随着网络结构越来越成功,它们进一部简化了每一层的「工作」。在非常深层的神经网络中,每一层仅仅会递增的修改输入。在 ResNets 中,每一层的输出和它的输入时很相似的,这意味着将两层加起来就是递增。实践中,请在 ResNet 中使用较短的跳变长度。
9)标准化层的输入
标准化是另一个可以使计算层的工作变得更加容易的方法,在实践中被证明可以提升训练和准确率。批量标准化(batch normalization)的发明者认为原因在于处理内部的协变量,但是 Smith 认为,「标准化把所有层的输入样本放在了一个平等的基础上(类似于一种单位转换),这允许反向传播可以更有效地训练」。
10)输入变换
研究表明,在 Wide ResNets 中,性能会随着连接通道的增加而增强,但是你需要权衡训练代价与准确度。AlexNet、VGG、Inception 和 ResNets 都在第一层使用了输入变换以让输入数据能够以多种方式被检查。
11)可用的资源决指引着层的宽度
然而,可供选择的输出数量并不是显而易见的,这依赖于你的硬件能力以及期望的准确度。
12)Summation Joining
Summation 是一种常用的合并分支的方式。在 ResNets 中,使用总和作为连接的机制可以让每一个分支都能计算残差和整体近似。如果输入跳跃连接一直存在,那么 summation 会让每一层学到正确地东西(例如与输入的差别)。在任何分支都可以被丢弃的网络(例如 FractalNet)中,你应该使用这种方式类保持输出的平滑。
13)下采样变换
在池化的时候,利用级联连接(concatenation joining)来增加输出的数量。当使用大于 1 的步长时,这会同时处理连接并增加连接通道的数量。
14)用于竞争的 Maxout
Maxout 被用在你只需要选择一个激活函数的局部竞争网络中。使用求和以及平均值会包含所有的激活函数,所以不同之处在于 maxout 只选择一个「胜出者」。Maxout 的一个明显的用例是每个分支具有不同大小的内核,而 Maxout 可以包含尺度不变性。
提示与技巧
除了这些设计模式之外,还出现了几个最新的技巧和诀窍,以减少架构的复杂性和训练时间,并且可以使用有噪声的标签。
1)使用调优过的预训练网络
「如果你的视觉数据和 ImageNet 相似,那么使用预训练网络会帮助你学习得更快」,机器学习公司 Diffbot 的 CEO Mike Tung 解释说。低水平的卷积神经网络通常可以被重复使用,因为它们大多能够检测到像线条以及边缘这些模式。将分类层用你自己的层替换,并且用你特定的数据去训练最后的几个层。
2)使用 freeze-drop-path
Drop-path 会在训练的迭代过程中随机地删除一些分支。Smith 测试了一种相反的方法,它被称为 freeze-path,就是一些路径的权重是固定的、不可训练的,而不是整体删除。因为下一个分支比以前的分支包含更多的层,并且正确的内容更加容易近似得到,所以网络应该会得到更好的准确度。
3)使用循环的学习率
关于学习率的实验会消耗大量的时间,并且会让你遇到错误。自适应学习率在计算上可能是非常昂贵的,但是循环学习率不会这样。使用循环学习率(CLR)时,你可以设置一组最大最小边界,在边界范围内改变学习率。Smith 甚至还在论文《Cyclical Learning Rates for Training Neural Networks》中提供了计算学习率的最大值和最小值的方法。参考:https://arxiv.org/pdf/1506.01186.pdf
4)在有噪声的标签中使用 bootstrapping
在现实中,很多数据都是混乱的,标签都是主观性的或者是缺失的,而且预测的对象可能是训练的时候未曾遇到过的。Reed 等人在文章《TRAINING DEEP NEURAL NETWORKS ON NOISY LABELS WITH BOOTSTRAPPING》中描述了一种给网络预测目标注入一致性的方法。直观地讲,这可以奏效,通过使网络利用对环境的已知表示(隐含在参数中)来过滤可能具有不一致的训练标签的输入数据,并在训练时清理该数据。参考:https://arxiv.org/pdf/1412.6596
5)采用有 Maxout 的 ELU,而不是 ReLU
ELU 是 ReLU 的一个相对平滑的版本,它能加速收敛并提高准确度。与 ReLU 不同,ELU 拥有负值,允许它们以更低的计算复杂度将平均单位激活推向更加接近 0 的值,就像批量标准化一样参考论文《FAST AND ACCURATE DEEP NETWORK LEARNING BY EXPONENTIAL LINEAR UNITS (ELUS)》,https://arxiv.org/pdf/1511.07289.pdf。如果您使用具有全连接层的 Maxout,它们是特别有效的。