深度学习编程时判断模型运行好坏的依据

好久没有写博客了,今天翻开我之前订阅的rss,打算了解下当前深度学习发展的最新情报,突然看到Andrew Ng在NIPS 2016会议上的演讲,立马阅读了全文,Andrew还是那么的接地气,讲了很多干货,完全以纯白板书写的形式来演讲, 内容包括当前工业界在训练模型时常出现的错误以及对当前人工智能领域存在的问题和端到端问题的发展。

下面就我个人的理解总结下好了,我其实比较关注的部分在于Andrew对于如何分析开发中所训练的模型是否正常以及如何判断模型的运行状态,所以接下来应该是以这部分内容为主。

端到端学习的崛起(the rise of end-to-end learning)

end-to-end learning

end-to-end learning

这里的端到端的学习其实就是讲实体数据表达成数字数据,通过机器学习的方法,输出数字数据作为结果,这中间只经过机器学习这一步骤,而没有多余的东西,比如语音识别:输入的是语音,输出的是文本;比如机器翻译:输入的是英语,输出的是其他语言,下图是语音识别中传统的端到端模型和深度学习中的端到端模型: 语音识别中的端到端模型 Ps: >端到端学习:语音识别。传统模型:音频→计算特征—(人工设计的 MFCC 特征)→音素识别器—(被识别出来的音素)→最后的识别器→输出。端到端学习:音频→学习算法→转录结果;在给定了足够的有标注数据(音频、转录)时,这种方法的效果会很好。

机器学习策略

前面只是一些概念上的讲解,接下来开始干货:”机器学习策略:如何有效地处理数据集“

这里Andrew提出了一个问题 >often you will have a lot of ideas for how to improve an AI system , what do you do?

比如,这里以语音识别为例,如果我们的目标是识别出语音,我们可以把我们手上的原语音数据分割成:60%训练集,20%开发集和20%测试集 60-20-20 其中,训练集(training set)是用来训练模型的,开发集(dev set)指的是在开发过程中用于调参、验证(validation)等步骤的数据(保证不被模型提前学习到),测试集(test set)很显然就是指测试时所使用的数据集

有了这三个数据集,就可以得到三个误差值: 三个误差值 其中,人类水平的误差(human level error)是人类自己处理这类问题的误差值;训练集误差(training set error)是指在训练集上跑出来的误差值;开发集误差(dev set error)是指用开发集跑出来的误差值

然而我们并不需要观察这个误差值本身,而是它们之间的差距。人类误差与训练集误差之间的差距成为avoidable bias(可避免的偏差,可以简称为偏差)。之所以说[可避免的(avoidable)] , 是因为这部分误差可以通过进一步的学习/模型调整优化来避免。而训练集和开发集之间的差距成为variance方差,它是因为跑了不同的数据而导致的误差率变化(其实就是泛化能力的表现)。这两种偏差合在一起,就是machine learning中很著名的bias-variance trade-off (偏差-方差权衡)

同样是这三组数据,如果遇到这样的情况: 1-2-6&1-6-10 左边的情况是:训练集误差率与人类自己的误差率只相差1%,然而训练集误差跟测试集误差却差了很多;这就意味着你的新模型在新的数据上表现不好,换句话说,模型过拟合了(也就是对训练数据过度拟合而导致泛化能力变得很差)

对于右边的情况,如果你的训练集跟人类误差值相比就已经差了很多,而测试集误差则更加地多,那么这个模型本身就是有问题的

按照上面实例的方法,就可以科学地量化并且重视误差差值,将会节省很多工业应用开发商的事。

具体的recipe步骤为:

机器学习的基本判断步骤 机器学习的基本recipe:如果训练误差高(偏差) , 就使用更大的模型、训练更长的时间、采用新的模型架构;如果开发误差高(方差),就是用更多数据、正则化、新的模型架构

首先

判断训练集误差率是否过高(相对于human error),如果是的话,说明你遇到了bias危机,你可以(OR的逻辑关系):

  1. 提高你的模型规模
  2. 加长你的模型训练时间
  3. 启用新的模型架构

如果训练集误差率不很高

那么,开发家误差是否很高?如果是的话,说明你遇到了variance危机,可能需要(OR):

  1. 拿更多的数据
  2. 正则化
  3. 启用新的模型

进一步的机器学习策略

Andrew以一个智能后视镜为例:如果我们要做个智能后视镜(语音操作的车内智能助手),那么数据如何处理?

首先这里先假设有50000小时的语音资料(随便在哪里下载来的)和10个小时的车内对着后视镜讲话的语音资料(比如,让客户假装他的后视镜是智能的,然后录下一些语音指令)。面对这些数据,应该如何构造训练集? Training-Dev 有人可能会以这样的方式处理: >5000小时的预料够大,可以分出一些来做开发集(dev set),其他的用来训练,而10小时珍贵的车内语音则做成测试集。

错!这是非常不好的处理方式,因为你的开发集和测试集没能遵从相同的数据分布(distribution).换句话说,开发集和测试集的内容根本就不是一个维度的,这样的结果就是,模型在开发集上用了很多时间去调参,然后放在测试集上后发现并没有什么用。

而一个靠谱的处理方式应该是: 靠谱的处理方式 把10小时的车内语料分成开发集和测试集。同时,你也可以拿出训练集中的一部分内容作为训练-开发集(train-dev set)。这个数据集能帮助你的算法在训练集上做好优化,在转移到真实场景中。

按照这个构架,我们于是可以得到五种不同的误差值: 五种不同的误差值 分别是:人类误差、训练集误差、训练-开发集误差、开发集误差、测试集误差

其中,人类误差与训练集误差之间的差值还是成为bias(偏差);训练集误差与训练-开发误差之间的差值成为[训练集的过拟合](也就是说,它代表了模型单纯在训练集上表现能力);训练-开发误差与开发集误差之间的差值成为[data mismatch]|(数据不匹配,就是刚才说的两组数据不再同一个 宇宙 所带来的偏差);开发集误差与测试集误差之间的差值成为[开发集过拟合]

于是,一个新的处理策略来了 新的处理策略 用于机器学习的新recipe:如果训练误差高(偏置),就使用更大的模型、训练更长时间、使用新的模型架构;如果训练-开发误差高(方差),就使用更多数据、正则化、新的模型架构;如果开发误差高(训练-测试数据不匹配),就使训练数据更近似于测试数据、进行数据合成(域适应)、使用新的模型架构

总结一下

一般的人类/偏差/方差分析 对于人类误差和机器学习误差,有一个规律: 人类误差与机器学习误差规律 当机器学习比人类水平低时,它的准确率的提升是很快的。但是当它超越人类以后,往往准确率提升效率就逐步降低了。并且,在人类水平线的上方,有一个叫Bayes Optimal Error(贝叶斯最优误差的线),这是我们人和机器学习都永远无法超越的 人类级别的表现

原因有二:

  1. 机器学习超越人类后,很快就会靠近贝叶斯最优误差线,这是一条理论上无法逾越的线
  2. 数据带有人类自己做的标签(label),所以本身就含有人类对自己的见解

总结一下

在我个人看来,比较重要的部分就是掌握并熟练应用上文提到的几种误差值以及其代表的意义,并且将其运用到人工智能的模型训练和评价当中,很有意义的文章

热评文章