在计算机视觉领域,MNIST训练任务是一个经典的案例。使用PyTorch的标准代码训练CNN通常需要约3分钟的时间。然而,现在在一台配备GeForce GTX 1660 Ti GPU的笔记本上,训练时间已经缩短至令人惊讶的0.76秒,实现了超过200倍的速度提升。那么,如何在仅一次epoch的训练中便达到99%的准确率呢?
以下是八个步骤,实现训练速度的显著提升:
一、提前停止训练
当测试准确率在经历3到5个epoch后达到99%时,可以选择提前停止训练。这一调整将训练时间减少约1/3,最终耗时57.4秒 ± 6.85秒。
二、缩小网络规模并应用正则化技巧
在第一个卷积层后添加一个2×2的最大池化层,从而将全连接层的参数减少4倍以上。同时,删去一个dropout层,使收敛所需的epoch数减少到3个以下,训练时间降至30.3秒 ± 5.28秒。
三、优化数据加载
通过使用data_loader.save_data(),将整个数据集以之前的处理方式保存到磁盘的PyTorch数组中,避免重复从磁盘读取数据。这样可以一次性加载整个数据集到GPU内存中,使平均训练时间降至7.31秒 ± 1.36秒。
四、增加Batch Size
将Batch Size从64增加至128,平均训练时间进一步减少到4.66秒 ± 583毫秒。
五、提高学习率
采用Superconvergence策略替代指数衰减。在训练初期将学习率设置为0,逐步线性增加到最高值(4.0),再缓慢降低至0。这一方法使训练时间缩短至3.14秒 ± 4.72毫秒。
六、再次增加Batch Size并缩小网络规模
重复第二步,将Batch Size增至256,去掉剩余的dropout层,并通过减小卷积层的宽度进行补偿,最终将平均训练时间压缩至1.74秒 ± 18.3毫秒。
七、最后的微调
将最大池化层移至ReLU激活函数之前,再将卷积核大小从3增至5。最后,调整超参数:将学习率设置为0.01(默认为0.001),beta1设置为0.7(默认为0.9),Beta2保持为0.9(默认为0.999)。经过这些调整后,训练时间降至762毫秒 ± 24.9毫秒,准确率达到99.04%。
对于这样的结果,有人认为这些优化措施是常识,比如优化数据加载时间、缩小模型尺寸以及使用ADAM替代SGD等。因此,他们指出,许多人并不会特别关注如何加速MNIST的训练,因为这只是机器学习的“Hello World”案例,主要目的是帮助用户熟悉框架。而另一些人则认为,实际工作中更多的关注应放在真正缩短训练时间的措施上。
[[[IMG_1]]]
[[[IMG_2]]]
[[[IMG_3]]]
