这是深度学习笔记第十二篇,完整的笔记目录可以点击这里查看。
在神经网络的训练过程中,有许多有用的量需要监控。下面介绍的几种曲线图是分析训练过程的有用工具,可以用来获得关于不同超参数设置的直观信息,以及如何更改这些参数以提高训练效率。
下面的图的x轴都是以epoch为单位,用来衡量每个样本在预期训练中被使用的次数(例如,一个epoch意味着每个例子都被使用了一次)。由于迭代次数取决于batch大小的设置,因此最好跟踪epoch而不是迭代次数。
1. Loss function
在训练过程中,第一个有用的跟踪量是损失(loss),因为它是在前向传播过程中对各个batch进行评估的。
其中左图是不同学习率下损失的变化,右图是正常训练时损失随着epoch的变化情况。在右图中,损失中的“抖动”量与batch大小有关。当batch大小为1时,抖动将相对较高。当batch大小为完整数据集时,抖动将最小,因为每次梯度更新都应单调地改进损失函数(除非学习速率设置得太高)。
有些人喜欢在log域中绘制损失函数,因为学习进度通常呈指数形式。
如果将多个交叉验证模型绘制在同一损失图上,它们之间的差异将变得更加明显。
从这个网站上可以看到一些有趣的损失函数图。
2. Train/Val accuracy
训练分类器时要跟踪的第二个重要指标是验证/训练(validation/training)精度。此图可以让你深入了解模型中过度拟合的程度:
训练和验证精度之间的差距表明了过度拟合的程度。两种可能的情况如上图所示。蓝色的validation accuracy曲线显示,与training accuracy相比,validation accuracy非常小,表明过拟合很严重(注意,validation accuracy甚至可能在某个点之后开始下降)。在实践中看到这种过拟合时,可以通过增加正则化(更强的L2权重惩罚、更多的dropout等)或收集更多的数据来解决。另一种可能的情况是validation accuracy很好地跟踪了training accuracy(绿线所示)。这种情况表明你的模型不够大(欠拟合):可以通过增加参数的数量使模型变大。
3. Ratio of weights: updates
可以独立地为每组参数计算和跟踪此比率。一个粗略的推断是这个比率应该在1e-3左右。如果低于此值,则学习率可能太低。如果高于此值,那么学习率可能太高。下面是一个具体的例子:
# assume parameter vector W and its gradient vector dW
param_scale = np.linalg.norm(W.ravel())
update = -learning_rate*dW # simple SGD update
update_scale = np.linalg.norm(update.ravel())
W += update # the actual update
print update_scale / param_scale # want ~1e-3
与跟踪最小值或最大值不同,有些人更喜欢计算和跟踪梯度的范数及其更新。这些指标通常是相关的,通常会给出大致相同的结果。
4. Activation / Gradient distributions per layer
不正确的初始化可能会减慢甚至使学习过程完全停止。幸运的是,这个问题相对容易诊断。一种方法是绘制网络所有层的激活/梯度直方图。看到任何奇怪的分布不是一个好的迹象。例如,对于tanh神经元,我们希望看到神经元激活值分布在整个[-1,1]范围,而不是看到所有的神经元输出零,或所有的神经元集中于-1或1。
5. First-layer Visualizations
最后,如果处理的是图像像素时,可以直观地将第一层特征绘制出来:
上图是神经网络第一层的权值可视化示例。左:噪声特征表明网络存在问题:网络未融合,学习率设置不当,权重正则化惩罚过低。右图:漂亮、流畅、干净和多样的特征很好地表明训练进展顺利。
*本博客翻译总结自CS231n课程作业网站,该网站需要翻墙才能访问。