内容简介:编译:Bing在这篇文章中,我们会基于该系列的前面几篇文章所得出的结果,尝试不同类型的网络。
来源:Myrtle
编译:Bing
在这篇文章中,我们会基于该系列的前面几篇文章所得出的结果,尝试不同类型的网络。
如何训练你的ResNet(二):Batch的大小、灾难性遗忘将如何影响学习速率
目前为止,我们使用的都是固定网络架构,即在CIFAR10上用单个GPU最快的DAWNBench记录,经过简单改变,我们将网络达到94%精度的时间从341秒缩短至154秒。今天,我们要研究其他的替代性架构。
让我们先回顾下目前所用的网络:
粉色的残差块包含了一个identity shortcut并保留了输入的空间和通道维度:
浅绿色的下采样模块将空间分辨率降低两倍,输出通道的数量增加一倍:
加入残差模块的原因是通过在网络中创建shortcut让优化变得更简单。我们希望较短的路径代表相对容易训练的浅层子网络,而较长的路径可以增加网络的能力和计算深度。这样一来,研究最短路径如何通过网络孤立训练,并且如何采取措施进行改进似乎是合理的。
清除长分支会生成一下主要网络,其中除了第一个网络,所有的卷积网络的步长都为2:
在接下来的实验中,我们会训练20个epoch,利用比之前学习速率更快速的版本训练,因为网络较小,收敛得更快。复现这一结果的代码在此: github.com/davidcpage/cifar10-fast/blob/master/experiments.ipynb
对最短的路径网络训练20个epoch,在36秒内的测试精度仅达到55.9%。删除掉重复的批标准化ReLU群组,将训练时间缩短到32秒,但是测试精度仍然不变。
这一网络有个严重的缺陷,即下采样卷积有1×1的核以及为2的步长,所以与其扩大接受域,它们反而会抛弃信息。如果我们用3×3的卷积替换,测试精度在36秒的训练后达到了85.6%。
我们还能继续对下采样进行优化,使用3×3、步长为1的卷积,并且后面跟一个池化层。我们选择最大池化和2×2的窗口大小,43秒训练后的测试精度为89.7%。用平均池化法得到相似的结果,但时间稍长。
分类器前的最后一个池化层是全局平均池化层和最大池化层的连接,从原始网络中得来。我们用更标准的全局最大池化层替换它,并且将最终的卷积层的输出维度变为原来的两倍,对输入维度进行补偿,最终在47秒内,测试精度达到了90.7%。注意,这一阶段的平均池化层并不如最大池化层。
默认情况下,在PyTorch0.4中,初始批规范化的范围在0到1之间随机选择。初始接近0的通道可能被浪费,所以我们用常数1来替代。这导致通过网络中的信号更大。为了补偿,我们提出了一种整体恒定惩罚对分类器进行重新调整。对这一额外超参数,大致的手动优化值是0.125。经过这些改变,经过20个epoch的训练,网络在47秒内达到了91.1%的测试精度。
下表总结了我们上文中提到的各种改进步骤:
现在的网络看起来没什么问题了,接下来我们要进行收益递减,添加一些图层。目前网络仅有5个图层(四个卷积,一个全连接层),所以还不确定我们是否需要残差分支,或者添加额外的层后能否得到94%的目标精确度。
如果只增加宽度似乎不可行。如果我们让通道维度增加一倍,训练60个epoch后,可以达到93.5%的精确度,但是会用321秒。
在增加网络深度方面,我们还面临着多种问题,例如不同的残差分支类型、深度和宽度以及新的超参数,例如初始范围和残差分支的偏见。为了让结果更进一步,我们要严格限制搜索空间,所以,不能调整任何新的超参数。
特别的是,我们要考虑两种类型的网络。第一种是选择性地在每个最大池化层后添加一个卷积层。第二种是添加一个含有两部分3×3卷积的残差块,其中有identity shortcut,也是在最大池化层之后添加。
我们在最后卷积模块后、全局最大池化层之前插入了一个2×2的最大池化层。是否添加新层要根据不同情况决定,我们还考虑混合两种类型,但这并没有提升性能,所以我们就不在此展开了。
下图是第一种网络示例,其中我们在第二个最大池化层之后添加了额外的卷积:
下图是第二种网络示例,其中我们在第一和第三层之后添加了残差分支:
现在要开始“暴力”架构搜索了!我们训练了15种网络(经过改进的原始网络和上述两类网络中每类的7种变体),各训练20个epoch,另外还对比了训练22个epoch的结果,了解训练时间增长和更深的网络架构之间的差别。如果每个实验仅运行一次,就会花费30分钟的计算时间。但不幸的是,每次最终测试精度的标准偏差约为0.15%。所以为了得出准确的结果,我们会对每个实验运行10次,将每个数据点的标准偏差控制在0.05%左右。即便如此,不同架构之间从20到22个epoch运行后改进率之间的差异主要可能是噪音。
以下是结果,点表示20个epoch和精确度,线条的延伸表示22个epoch的结果:
与运用更深层的架构所得到的进步相比,训练更长时间所得到的进步速度似乎很慢。在测试的框架中,最有前景的或许是Residual:L1+L3。网络在66秒内达到了93.8%的精确度,如果我们将训练扩展到24个epoch,平均精确度为94.08%,训练时间为79秒。
目前为止,我们已经得到了一个9层的深度残差网络,能在79秒内达到94%的训练精确度,几乎将训练时间缩短了一半。最后还有一个问题:我们是否真的需要残差分支才能让测试精确度达到94%?答案显然是否定的。例如,单一的分支网络Extra:L1+L2+L3能在180秒、60个epoch内达到95%的精确度,加上正则化或更宽的版本后,精确度会更高。但是至少在现在最快的是一个残差网络。
结语
本文结束前,让我们再简单回顾一下研究的目的。很多观点认为,训练模型在CIAFR10上达到94%的测试精确度是无意义的行为,应为现在最高的精确度都达到98%了(另外还有人认为现在ImageNet才是“唯一”的数据集,其他实验只是浪费时间罢了)。
事实上,我们可以通过9层网络在24个epoch内达到94%的精确度,这也再次说明我们的目标门槛过低。另一方面,人类在CIFAR10上的表现也在94%左右,所以这一情况并不清楚。
在某种程度上,现在的精确度是一种“病态”的目标,只追求更大的模型、调整更多超参数、更多数据增强或者更长的训练时间,让各种工作之间的比较更难。另外,在训练或结构设计上的创新会带来额外的超参数维度,并且调整这些参数可能会导致有关训练更好的隐式优化,否则这些与研究中的扩展无关。如果基础模型的外显超参数的维度空间较低,那么通常被认为是最佳的对比试验无法解决该问题。这种情况的结果是,最先进的模型难以进行比较、复现、重建。
有了这些问题,我们认为任何能轻易在各项实验中进行比较的都是有益的。我们相信创建有竞争力的基准也是应对挑战的一种方法。资源的限制让各实验之间的比较更公平,减少了为了培训所需要做的调整。模型多余的复杂性可能会受到资源限制基线的惩罚,哪些明确控制相关参数的方法通常会获胜。
最近,根据模型推理时间或模型大小公布曲线越来越多。这对于优化和解决上面的问题来说都是积极的方法,但我们相信训练时间所带来的额外正则化会有更多好处。另一方面,优化训练时间并不考虑推理成本是否是次优的,这也是为什么我们的训练时间结构总是包含测量每个epoch中测试集的时间,并且我们避免了类似测试时间增强等技术,它可以在推理时减少训练时间。
原文地址:www.myrtle.ai/2018/09/24/how-to-train-your-resnet-4/
以上所述就是小编给大家介绍的《[译] 如何训练你的 ResNet(四):网络架构对训练时间的影响》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 如何基于时间的反向传播算法来训练LSTMs?
- InfoQ 专访慎熙鹏教授:将深度学习训练时间缩短 69%
- 谷歌大脑提出“洗发水”二阶优化算法,Transformer训练时间减少40%,Jeff Dean点赞
- 为了不让GPU等CPU,谷歌提出“数据回波”榨干GPU空闲时间,训练速度提升3倍多
- 快速入门PyTorch(3)--训练一个图片分类器和多 GPUs 训练
- 不使用先验知识与复杂训练策略,从头训练二值神经网络!
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。