重排训练样本
信息论中有这样的话——「学习发生的极小概率事件比学习发生的大概率事件更有信息」。类似地,随机排列训练样本的顺序(不同的迭代或批处理中)将导致更快的收敛。当训练样本的顺序不同时,模型的结果会有轻微的提升。
作为正则化的 dropout
考虑到要学习数百万的参数,正则化成为防止 DNN 过度拟合的必然要求。你也可以继续使用 L1/L2 正则化,但是 dropout 是更好的检查 DNN 过拟合的方法。dropout 在实现方法上比较琐碎,它通常能更快地学习模型。默认值 0.5 是一个好的选择,但是这也取决于具体的任务。如果模型较不复杂,则 0.2 的 dropout 也可能就足够了。
在测试阶段,应该相应地标准化权重,同时暂缓使用舍弃方法,如论文《Dropout: A Simple Way to Prevent Neural Networks from Overfitting》中所做的那样。赋予模型舍弃正则化方法,经过一定的训练时间错误肯定会下降。
训练的迭代数
「用多个迭代(epoch)来训练深度学习模型将产生更好的结果」——但是我们如何量化「多少」?原来,有一个简单的策略 - 只要对训练模型设置固定数量的训练样本或迭代,比如 20,000 个样本或 1 个迭代。在每组训练样本训练完成后,将测试误差与训练误差进行比较,如果它们之间的差距正在减小,则继续训练。除此之外,在每个这样的集合之后,保存这组数据训练模型的参数(以便从多个模型中选择)。
可视化
有一千种可能使得训练的深度学习模型出错。我们都有过这样的经历,当模型训练了几个小时或几天后,在训练完成后我们才意识到模型存在一些问题。为了避免这种问题——总是可视化训练过程。最明显的步骤是打印/保存损失(loss)函数值的日志、训练误差或测试误差等。
除此之外,另一个好的做法是在训练一定样本后或在 epoch 之间使用可视化库绘制权重的直方图。这可能有助于跟踪深度学习模型中的一些常见问题,例如梯度消失(Vanishing Gradient)、梯度爆炸(Exploding Gradient)等。
多核计算机,GPU 集群
随着 GPU、提供向量化操作的库(library)、具有更强计算能力的计算机的出现,这些可能是深度学习成功的最重要的因素。如果你足够耐心,你可以尝试在你的笔记本电脑上运行 DNN(这时你甚至不能打开 10 个 Chrome 浏览器标签),并需要等待很长时间才能得到结果。要么你有非常好的硬件(很昂贵)与至少多个 CPU 核和几百个 GPU 核。GPU 已经彻底改变了深度学习研究(难怪 Nvidia 的股票井喷式涨价),主要是因为 GPU 能够更大规模地执行矩阵操作。
因此,以前在正常的机器上花几个星期的训练,由于并行(parallelization)技术,将训练的时间减少到几天甚至几个小时。
使用具有 GPU 计算和自动微分支持的库
幸运的是,对于快速训练,我们有一些很好的库,如 Theano、Tensorflow、Keras 等。几乎所有这些深度学习库提供对 GPU 计算和自动微分(Automatic Differentiation)的支持。所以,你不必深入了解 GPU 的核心编程(除非你想,绝对有趣);你也不必编写自己的微分代码,这在真正复杂的模型中可能会有点费力(虽然你应该能够做到这一点)。TensorFlow 能进一步支持在分布式架构上训练模型。
以上并不是训练 DNN 的详尽列表。它只包括了最常见的做法,上面已经去掉了如数据标准化、批规范化/层规范化、梯度检查(Gradient Check)等概念。