AI机动队
首发于AI机动队
深度学习实战经验——深度学习第十一章

深度学习实战经验——深度学习第十一章

前面几章我们总结了机器学习以及深度学习中一些常用的模型以及训练方法,实际应用中,我们还要知道对于一些特定的情景选择哪种模型,以及如何通过收集模型的反馈结果来不断改善模型。有时候不一定需要采用最新最复杂的模型,而是需要深入的理解一些通用的模型,并更好的应用到我们所处理的具体问题中。这一章会总结一下我们面对一个机器学习问题时的实战步骤:确立性能指标;快速建立端到端的流程;分析模型效果,并不断的对模型进行改进。下面详细解释一下每个步骤。

性能指标

第一步就是确立采取什么metric作为性能指标,以及要达到什么级别的性能。这决定了之后所有的流程。由于我们数据常常无法包含全部信息,或者所研究的系统本身具有一定的随机性,或者数据量有限等因素,通常我们无法使模型得到完美的零误差,所以根据具体问题我们就需要设定一些合理的目标。比如,在学术界,可能我们想要在一些基准测试上超过之前公认的结果,在工业界,则是需要结果比较安全可靠或者对用户有一定的吸引力。

当我们设定了这些目标后,我们还需要决定我们采取什么样的metric作为性能指标。通常,我们用Accuracy来作为性能指标:Accuracy = 模型预测正确的数目/总预测数。但是Accuracy对于某些系统并不能涵盖我们所想要的所有信息。比如说对于垃圾邮件检测来说,模型可能会犯两种错误:错误的将有用的邮件预测为垃圾邮件,和将垃圾邮件当成正常邮件放到收件箱里,对于这个问题,将有用邮件错误的屏蔽掉的后果要严重与没有识别出垃圾邮件,这个时候Accuracy没法体现出我们想要给不同错误的不同权重。

再比如对于类的分布非常不均的分类问题例如罕见病识别,假设只有万分之一的人会得这种疾病,那如果我们只用一个将所有人都判别为不会得病的模型,我们就可以得到99.99%的Accuracy,但这样的模型没有任何意义。这时候我们就需要用新的metric:准确率precision和召回率recall来测量。为了理解precision和recall,我们先要了解二元分类问题中True Positive, False Positive, False Negative以及True Negative的定义,其中的positive/negative指的是预测结果是正例还是反例,而True/False代表了预测结果与真实值之间是否一致,如下所示:

而 precision = TP/(TP + FP)代表了模型做出正例预测时正确的概率

recall = TP/(TP + FN)代表了对于所有实际上正确的例子,模型检测到的比例。precison和recall通常是竞争关系,我们可以改变我们的判别阈值threshold来平衡precision和recall,假如我们需要提高precision,我们通常需要提高阈值,如果我们需要提高recall则需要降低阈值。我们也可以画出在不同的阈值下precision和recall的对应值,这个曲线叫做PR-curve。我们可以用PR-curve下的面积AUC-PR (Area under curve for precision and recall)来大致比较不同模型间的性能,如下图所示

另一种描述方法是ROC curve(receiver operating characteristic curve),它比较的是TPR(True Positive Rate)和 FPR (False Positive Rate):

TPR = TP/(TP + FN)和recall定义相同,

FPR = FP/(FP + TN)。

在不同阈值下画出的TPR和FPR的曲线被称作ROC curve,曲线下的面积被称作AUC,也常常用来比较分类模型的性能。

当然对于其他类型的应用我们还有其他的一些特定的评价标准。只有明确了这些性能指标后,我们才可以确定我们的极其学习系统是否在改进。

模型选择

当确定了模型的性能评价指标后,下一步就是尽快建立一个端到端工作的模型,其初始版本可以是简单的基准模型,之后可以不断的改善。如果是处理一个之前其他人处理过的类似的问题,可以先复制已有的模型,作为基准模型。如果是一个全新的问题,则首先要考虑是否需要深度学习,有些可能可能用线性回归,逻辑回归,SVM或决策树等模型就可以解决。假如需要处理的问题需要更复杂的模型,如图形识别,语音识别,机器翻译等等问题,可以考虑利用深度学习模型。如果数据的结构是定长向量,可以用具有全联通层的前馈神经网络(前馈神经网络初探——深度学习花书第六章(一))来处理,如果输入有一些空间上拓扑结构,则可以考虑用卷积神经网络(卷积神经网络——深度学习第九章),如果输入有序列结构,则可以考虑用循环神经网络(循环神经网络RNN——深度学习第十章)。

对于前馈神经网络,可以从两到三层的神经网络开始,激活函数选择ReLU函数,optimizer(深度学习优化算法比较——深度学习第八章(一))选择Adam,优化时也可以应用batch normalization(Batch Normalization深度学习第八章(二)),正则化方法(深度学习中的正则化方法总结——深度学习第七章)可以利用Early stopping, dropout等。

对于卷积神经网络,基准模型可以利用一些已有的效果较好的模型,如Inception, ResNet等,对于CNN来说,batch normalization可以极大的提高优化效率。

对于循环神经网络,基准模型可以用LSTM或GRU,注意为防止gradient explode可以采用gradient clipping方法。

当然,机器学习中,模型本身并不是决定最终效果的唯一因素,原始数据的数量和质量也很大的影响模型的最终效果。我们怎么决定我们已有的数据量已经足够,什么时候需要收集更多的数据呢?首先,我们可以看看在训练集上的模型性能是否令人满意,我们可以增加模型的复杂度如加入更多层或每层用更多的节点,也可以调节模型的超参数,如果仍无法达到满意的效果,我们就需要检查一下数据的质量,可能数据噪声太多或者数据没有包含有用的信息,这时就需要重新收集有用的数据,同时我们也可以检查是否是软件中出现了bug等。

当训练集上的效果已达到满意的程度,我们可以检查模型在测试集上的效果,如果测试集上效果不尽如人意,则可考虑用正则化方法如增加penalty项或dropout等减小泛化误差,或者收集更多的数据。

超参数选择

深度学习模型中常常有若干个超参数,它们的具体数值的选择会影响模型训练的速度以及性能。常见的一些超参数如下:

  • 隐藏层节点数量。当增加时,模型capacity增大,可以处理更复杂的任务,但同时会增加训练时间以及存储要求。
  • 层数。当增加时,模型capacity增大,同时会增加训练时间以及存储要求。
  • 学习率,过大或过小的学习率会降低模型capacity,需要选择合适的学习率。
  • Dropout Rate。当增加时,模型capacity减小,为了防止过拟合。如果欠拟合时可以减小该超参数。
  • 权重衰减参数。同样作为正则化超参数会使capacity减小。
  • 卷积网络中卷积核宽度。增加时,考虑更多空间信息,模型capacity增大,但同时增加训练时间及存储要求。

如果已有类似的公认的模型,则可以选择这些模型中的超参数值作为一个较好的设置。其中学习率可能是最为重要的超参数,如果仅有时间调节一项超参数的话,可以考虑先调节学习率。这些超参数可以不断的训练检查训练效果手动调节,也可以设置一定的参数范围利用grid search或random search来检查不同的超参数组合下模型的效果,近来也有一些利用机器学习如贝叶斯优化算法来自动调节超参数的系统,例如谷歌的Vizier系统(ai.google/research/pubs)。

模型Debug

当机器学习系统性能较差时,如何找到模型的缺陷是个难题,我们可以采取以下几种方式Debug:

  • 模型可视化:模型的单一数字化指标例如accuracy常常会隐藏一些问题而且无法直观的看出模型效果,这时我们有必要利用可视化方法来帮助理解,例如图像识别时可以将模型识别的物体叠加显示在原图上,对于语音合成我们可以听听模型产生的一些样本质量。
  • 检查效果最差的数据组:我们可以检查模型在哪些类数据上效果最差来发现问题,例如多分类中哪些类效果明显差于其他类别,可能是由于该类数据量有限或者做数据预处理时错误的处理这些特定类别等。
  • 检查小数据样本:有的时候模型本身可能效果不错,但是在我们实施模型的软件逻辑中有错误,我们可以通过模型在一些小样本上的训练过程及结果来检查该类错误。
  • 检查激活值及梯度直方图:我们可以收集模型经历了若干次迭代过程中激活值及梯度的统计信息,看看有多少节点激活值消失或饱和,梯度是消失还是爆炸,并作出相应的超参数调节。

总结

这一章结合了第六到十章的内容,对于深度学习的实际应用,提出了可实施的计划步骤与注意事项,对于解决实际问题很有帮助。

发布于 2018-09-16

文章被以下专栏收录