第十一章:Practical Methodology

11. Practical Methodology

实践设计流程

1.确定目标:使用什么样的误差度量(error metric),并为此指定目标值。

2.尽快建立一个端到端的的pipeline,包括估计合适的性能度量(performance metric)。

3.搭建系统,并确定性能瓶颈,检查哪个部分的性能差于预期,以及是否是因为过拟合、欠拟合,或者数据或软件缺陷造成的。

4.根据具体观察反复地进行增量式的改动,如收集新数据、调整超参数或改进算法。

性能度量

如何确定合理的性能期望?

在学术界,可以根据先前公布的基准结果(benchmark)来估计预期错误率;在现实世界中,一个应用的错误率有必要是安全的、具有成本效益的或吸引消费者的。

种类

  • 1.正确率(accuracy)
  • 2.准确率(precision):是指预测结果属于某一类的个体,实际属于该类的比例;
  • 3.召回率(recall):被正确预测为某类的个体,与数据集中该类个体总数的比例;
  • 4.F Score:$F = \frac{2pr}{p+r}$;
  • 5.覆盖(coverage):机器学习系统能够产生响应的样本所占的比率,个系统可以通过拒绝处理任意样本的方式来达到$100%$的精度,但是覆盖降到了$0%$;

默认的基准(baseline)模型

  • 1.首先,根据数据的结构选择一类合适的模型。如果项目是以固定大小的向量作为输入的监督学习,那么可以使用全连接的前馈网络。 如果输入有已知的拓扑结构(例如,输入是图像),那么可以使用卷积网络。
  • 2.选择优化方法:具有衰减学习率以及动量的SGD是优化算法一个合理的选择;另一个非常合理的选择是Adam算法。
  • 3.除非训练集包含数千万以及更多的样本,否则项目应该在一开始就包含一些温和的正则化,提前终止也被普遍采用;Dropout也是一个很容易实现,且兼容很多模型和训练算法的出色正则化项;批标准化有时也能降低泛化误差,此时可以省略Dropout步骤。
  • 是否使用无监督学习?在某些领域,比如自然语言处理,能够大大受益于无监督学习技术,如学习无监督词嵌入;在其他领域,如计算机视觉,除非是在半监督的设定下(标注样本数量很少),目前无监督学习并没有带来益处。

决定是否收集更多数据

  • 1.首先,确定训练集上的性能是否可接受:如果模型在训练集上的性能就很差,学习算法都不能在训练集上学习出良好的模型,那么就没必要收集更多的数据,可以尝试增加更多的网络层或每层增加更多的隐藏单元,以增加模型的规模。
  • 2.如果训练集上的性能是可接受的,那么我们开始度量测试集上的性能。 如果测试集上的性能也是可以接受的,那么就顺利完成了。
  • 3.如果测试集上的性能比训练集的要差得多,那么收集更多的数据是最有效的解决方案之一。

调整超参数

  • 1.手动:手动搜索超参数的主要目标是调整模型的有效容量以匹配任务的复杂性;学习率可能是最重要的超参数;如果你只有时间调整一个超参数,那就调整学习率;如果训练集错误率大于目标错误率,那么只能增加模型容量以改进模型,如果测试集错误率大于目标错误率,可以改变正则化超参数,以减少有效的模型容量。
  • 2.自动:网格搜索(grid search):当有三个或更少的超参数时,常见的超参数搜索方法是网格搜索。 对于每个超参数,使用者选择一个较小的有限值集去探索。

然后,这些超参数笛卡尔乘积得到一组组超参数,网格搜索使用每组超参数训练模型。

挑选验证集误差最小的超参数作为最好的超参数,通常,网格搜索会在对数尺度下挑选合适的值,如{0.1,1,10}。随机搜索:首先,我们为每个超参数定义一个边缘分布,例如,Bernoulli分布或多项式分布(分别对应着二元超参数或离散超参数),或者对数尺度上的均匀分布(对应着正实值超参数)。

https://github.com/applenob/reading_note/raw/master/res/hyperparameter.png

调试策略

  • 1.可视化计算中模型的行为:当训练模型检测图像中的对象时,查看一些模型检测到部分重叠的图像;在训练语音生成模型时,试听一些生成的语音样本。直接观察机器学习模型运行其任务,有助于确定其达到的量化性能数据是否看上去合理。
  • 2.可视化最严重的错误:通过查看训练集中很难正确建模的样本,通常可以发现该数据预处理或者标记方式的问题。
  • 3.根据训练和测试误差检测软件: 我们往往很难确定底层软件是否是正确实现。训练和测试误差能够提供一些线索。 如果训练误差较低,但是测试误差较高,那么很有可能训练过程正常运行,但模型由于算法原因过拟合了。另一种可能是,测试误差没有被正确地度量,可能是由于训练后保存模型再重载去度量测试集时出现问题,或者是因为测试数据和训练数据预处理的方式不同。如果训练和测试误差都很高,那么很难确定是软件错误,还是由于算法原因模型欠拟合。 这种情况需要进一步的测试,如下面所述。
  • 4.拟合极小的数据集:当训练集上有很大的误差时,我们需要确定问题是真正的欠拟合,还是软件错误。 通常,即使是小模型也可以保证很好地拟合一个足够小的数据集。 例如,只有一个样本的分类数据可以通过正确设置输出层的偏置来拟合。 通常,如果不能训练一个分类器来正确标注一个单独的样本,或不能训练一个自编码器来成功地精准再现一个单独的样本,或不能训练一个生成模型来一致地生成一个单独的样本,那么很有可能是由于软件错误阻止训练集上的成功优化。
  • 5.比较反向传播导数和数值导数:如果使用一个需要实现梯度计算的软件框架,或者在添加一个新操作到求导库中,必须定义它的bprop方法,那么常见的错误原因是没能正确地实现梯度表达。验证这些求导正确性的一种方法是比较实现的自动求导和通过有限差分计算的导数。
  • 6.监控激活函数值和梯度的直方图:可视化神经网络在大量训练迭代后(也许是一轮)收集到的激活函数值和梯度的统计量往往是有用的。隐藏单元的预激活值可以告诉我们该单元是否饱和,或者它们饱和的频率如何。

例子:实现多位数字识别的街景转录系统

1.首先要采集数据:街景车收集原始数据,然后操作员手动提供标签。

2.目标是达到人类水平,$98%$的准确率。

为了达到这个级别的准确率,街景转录系统牺牲了覆盖。 因此在保持准确率 $98%$的情况下,覆盖成了这个项目优化的主要性能度量。

随着卷积网络的改进,我们能够降低网络拒绝转录输入的置信度阈值,最终超出了覆盖 $95%$的目标。

3.快速建立一个合理的基准系统。

对于视觉任务而言,基准系统是带有整流线性单元(relu)的卷积网络。

4.当输出序列的概率低于某个值$t$即$p(y\mid x) < t$时,网络拒绝为输入$x$分类。

5.覆盖仍低于$90%$,但该方法没有明显的理论问题了。
因此,我们的方法论建议综合训练集和测试集性能,以确定问题是否是欠拟合或过拟合。 在这种情况下,训练和测试集误差几乎是一样的。

因为训练和测试集的误差是如此相似,这表明要么是这个问题欠拟合,要么是训练数据的问题。 我们使用了推荐的调试策略之一,即可视化模型最糟糕的错误

结果显示,主要是输入图像裁剪得太紧,有些和地址相关的数字被裁剪操作除去了。

6.最终,系统达到了预设的目标。