Deep Learning读书笔记7--实践方法论

来源:互联网 发布:阈值分割算法 matlab 编辑:程序博客网 时间:2024/06/05 03:30

1. 性能度量

精度是模型报告的检测是正确的比率,而召回率则是真实事件被检测到的比率。 检测器永远报告没有患者,会得到一个完美的精度,但召回率为零。 而报告每个人都是患者的检测器会得到一个完美的召回率,但是精度会等于人群中患有该病的比例(在我们的例子是0.0001%,每一百万人只有一人患病)。 当使用精度和召回率时,我们通常会画PR曲线,y轴表示精度,x轴表示召回率。 如果检测到的事件发生了,那么分类器会返回一个较高的得分。 例如,我们将前馈网络设计为检测一种疾病,估计一个医疗结果由特征x表示的人患病的概率为y^=P(y=1x)。 每当这个得分超过某个阈值时,我们报告检测结果。 通过调整阈值,我们能权衡精度和召回率。 在很多情况下,我们希望用一个数而不是曲线来概括分类器的性能。 要做到这一点,我们可以将精度 p和召回率 r转换为F分数F=2pr/(p+r),另一种方法是报告,PR曲线下方的总面积。

2. 默认的基准模型

首先,根据数据的结构选择一类合适的模型。 如果项目是以固定大小的向量作为输入的监督学习,那么可以使用全连接的前馈网络。 如果输入有已知的拓扑结构(例如,输入是图像),那么可以使用卷积网络。 在这些情况下,刚开始可以使用某些分段线性单元(ReLU,或者其扩展,如,Leaky ReLU、PReLU,和,maxout)。 如果输入或输出是一个序列,可以使用门控循环网络(LSTM,或,GRU)。
具有衰减学习率以及动量的SGD是优化算法一个合理的选择 (流行的衰减方法有,衰减到固定最低学习率的线性衰减、指数衰减,或每次发生验证错误停滞时将学习率降低210倍,这些衰减方法在不同问题上好坏不一)。 另一个非常合理的选择是Adam算法。 批标准化对优化性能有着显著的影响,特别是对卷积网络和具有sigmoid非线性函数的网络而言。 虽然在最初的基准中忽略批标准化是合理的,然而当优化似乎出现问题时,应该立刻使用批标准化。
除非训练集包含数千万以及更多的样本,否则项目应该在一开始就包含一些温和的正则化。 提前终止也被普遍采用。 Dropout~也是一个很容易实现,且兼容很多模型和训练算法的出色正则化项。 批标准化有时也能降低泛化误差,此时可以省略Dropout步骤,因为用于标准化变量的统计量估计本身就存在噪声。

3. 决定是否收集更多数据

首先,确定训练集上的性能是否可接受。 如果模型在训练集上的性能就很差,学习算法都不能在训练集上学习出良好的模型,那么就没必要收集更多的数据。 反之,可以尝试增加更多的网络层或每层增加更多的隐藏单元,以增加模型的规模。 此外,也可以尝试调整学习率等超参数的措施来改进学习算法。 如果更大的模型和仔细调试的优化算法效果不佳,那么问题可能源自训练数据的质量。 数据可能含太多噪声,或是可能不包含预测输出所需的正确输入。 这意味着我们需要重新开始,收集更干净的数据或是收集特征更丰富的数据集。

通常,加入总数目一小部分的样本不会对泛化误差产生显著的影响。 因此,建议在对数尺度上考虑训练集的大小,例如在后续的实验中倍增样本数目。

4. 选择超参数

手动调整超参数

手动搜索超参数的主要目标是调整模型的有效容量以匹配任务的复杂性。 有效容量受限于三个因素:模型的表示容量、学习算法成功最小化训练模型代价函数的能力以及代价函数和训练过程正则化模型的程度。 具有更多网络层,每层有更多隐藏单元的模型具有较高的表示能力——能够表示更复杂的函数。 然而,如果训练算法不能找到某个合适的函数来最小化训练代价,或是正则化项(如权重衰减)排除了这些合适的函数,那么即使模型的表达能力较高,也不能学习出合适的函数。


自动超参数优化算法

通常,网格搜索大约会在对数尺度下挑选合适的值。
网格搜索带来的一个明显问题是,计算代价会随着超参数数量呈指数级增长。 如果有m个超参数,每个最多取n个值,那么训练和估计所需的试验数将是O(nm)


基于模型的超参数优化

我们可以对验证集误差建模,然后通过优化该模型来提出新的超参数猜想。 大部分基于模型的超参数搜索算法,都是使用贝叶斯回归模型来估计每个超参数的验证集误差期望和该期望的不确定性。 因此,优化涉及到探索(探索高度不确定的超参数,可能带来显著的效果提升,也可能效果很差)和使用(使用已经确信效果不错的超参数——通常是先前见过的非常熟悉的超参数)之间的权衡。

大部分超参数优化算法比随机搜索更复杂,并且具有一个共同的缺点,在它们能够从实验中提取任何信息之前,它们需要运行完整的训练实验。 相比于人类实践者手动搜索,考虑实验早期可以收集的信息量,这种方法是相当低效的,因为手动搜索通常可以很早判断出某组超参数是否是完全病态的。

5. 调试策略

可视化计算中模型的行为:

当训练模型检测图像中的对象时,查看一些模型检测到部分重叠的图像。 在训练语音生成模型时,试听一些生成的语音样本。 这似乎是显而易见的,但在实际中很容易只注意量化性能度量,如准确率或对数似然。 直接观察机器学习模型运行其任务,有助于确定其达到的量化性能数据是否看上去合理。 错误评估模型性能可能是最具破坏性的错误之一,因为它们会使你在系统出问题时误以为系统运行良好。

可视化最严重的错误:

大多数模型能够输出运行任务时的某种置信度量。 例如,基于softmax函数输出层的分类器给每个类分配一个概率。 因此,分配给最有可能的类的概率给出了模型在其分类决定上的置信估计值。 通常,相比于正确预测的概率最大似然训练会略有高估。 但是由于实际上模型的较小概率不太可能对应着正确的标签,因此它们在一定意义上还是有些用的。 通过查看训练集中很难正确建模的样本,通常可以发现该数据预处理或者标记方式的问题。

根据训练和测试误差检测软件:

我们往往很难确定底层软件是否是正确实现。 训练和测试误差能够提供一些线索。 如果训练误差较低,但是测试误差较高,那么很有可能训练过程是在正常运行,但模型由于算法原因过拟合了。 另一种可能是,测试误差没有被正确地度量,可能是由于训练后保存模型再重载去度量测试集时出现问题,或者是因为测试数据和训练数据预处理的方式不同。 如果训练和测试误差都很高,那么很难确定是软件错误,还是由于算法原因模型欠拟合。 这种情况需要进一步的测试,如下面所述。

拟合极小的数据集:

当训练集上有很大的误差时,我们需要确定问题是真正的欠拟合,还是软件错误。 通常,即使是小模型也可以保证很好地拟合一个足够小的数据集。 例如,只有一个样本的分类数据可以通过正确设置输出层的偏置来拟合。 通常,如果不能训练一个分类器来正确标注一个单独的样本,或不能训练一个自编码器来成功地精准再现一个单独的样本,或不能训练一个生成模型来一致地生成一个单独的样本,那么很有可能是由于软件错误阻止训练集上的成功优化。 此测试可以扩展到只有少量样本的小数据集上。

比较反向传播导数和数值导数:

如果读者正在使用一个需要实现梯度计算的软件框架,或者在添加一个新操作到求导库中,必须定义它的bprop方法,那么常见的错误原因是没能正确地实现梯度表达。 验证这些求导正确性的一种方法是比较实现的自动求导和通过有限差分计算的导数。

监控激活函数值和梯度的直方图:

可视化神经网络在大量训练迭代后(也许是一个轮)收集到的激活函数值和梯度的统计量往往是有用的。 隐藏单元的预激活值可以告诉我们该单元是否饱和,或者它们饱和的频率如何。 例如,对于整流器,它们多久关一次?是否有单元一直关闭? 对于双曲正切单元而言,预激活绝对值的平均值可以告诉我们该单元的饱和程度。 在深度网络中,传播梯度的快速增长或快速消失,可能会阻碍优化过程。 最后,比较参数梯度和参数的量级也是有帮助的。 我们希望参数在一个小批量更新中变化的幅度是参数量值1%这样的级别,而不是50%或者0.001%(这会导致参数移动得太慢)。 也有可能是某些参数以良好的步长移动,而另一些停滞。 如果数据是稀疏的(比如自然语言),有些参数可能很少更新,检测它们变化时应该记住这一点。

阅读全文
0 0
原创粉丝点击