从零开始建立一个机器学习工程,你可能面临很多问题,假如你要做的是一个语音识别问题。开始前你可能会考虑:
1. 环境噪音会不会对识别有影响
2. 男声女生会不会要分别处理
3. 小孩声音会不会要单独处理
4. 回声会不会影响
5. 口吃会不会影响
6. …

机器学习更像是一个实验的科学,而不是一个纯理论的学科。所以,正确的做法是尽快建立你的第一个机器学习系统,不要考虑过多问题。然后定义一个单指标可度量的评价值。并把你的已有数据,划分为训练集,验证集,测试集。保证不同数据集之间是同分布。确定Bayes 误差是多少,也就是你的系统理论最好值是多少。然后分析你的模型在训练集,验证集,以及测试集上的表现。

分析模型的错误

模型在验证集上的错误会给你提出一些改进方向,最好是手动分析了这些错误再开始你下一步的工作。比如你收集了你的模型在验证集上的100个错误,10个是因为噪音,60个是因为声音太小,30个是其他因素。那么你会得到启发,下一步应该让你的模型能更好的处理声音小的问题。原因可能是你训练集里声音小的样本太少了。

标记错误

有可能你的训练数据里有一些样例的label是标记错误的,比如对一个识别猫的程序,你收的数据里有人错误的把一张狗的照片标记为猫。
在应用大量数据来建模,一些小的随机标记错误对系统影响并不大。如果你的数据量太大,人工复查很费事,你可以不去处理。但是如果你在验证集上手动验证时发现很多错误都是因为错误标记引起的,那么可能发生了系统标记错误。这时你就不得不去纠正这些训练集里的标记错误了。比如把某一种类型的狗都标记成了猫,这就是一个系统性的标记错误。
因为一般验证集和测试集的数据量都不大,应该手动修正这里的标记错误。而且不用担心数据分布不同的问题。

训练数据不够

你要做一个应用,用户上传图片,你来识别是不是一只猫。产品发布前,你不知道你的用户用什么手机,什么样的分辨率,图片背景是什么,户外还是室内。可以说你没有真正的训练数据。那么这时你会在网上搜索很多猫的图片来进行训练你的初始模型,做出第一个版本。产品发布后你会得到来自客户的真实数据。
你在网上搜到的图片一般是专业的,清晰的。但是客户的图片可能背景复杂,不清晰的。这时你就有了大量的自己搜集的数据,比如说20万张,然后来自客户的真实业务场景数据1万张。那么你应该怎么应用这21万张图片来进行训练呢?

数据不平衡如何分配

你可能记得我们说过要保证数据在训练集,验证集和测试集里要保证同样的分布。但是在这里并不适用。因为如果平分的话,你只能保证每个数据集里有5%的真实业务场景数据。那么在你评价模型精度的时候,它们占的比例太小了。
正确的做法是尽量把真实业务场景数据放到验证集和测试集里。因为验证集是你模型调整的目标。测试集是评估你模型在真实业务场景下的表现。然后再把剩余数据放入训练集。

不平衡的数据如何分析误差

之前我们分析误差都是基于同分布的数据。现在训练集,验证集,测试集的数据分布不同,我们如何分析呢?比如你的模型在训练数据上错误率为5%,在验证集上为15%。之间有10%的差距,如果不同数据集上的分布是同分布的话,那么你可以说这10%的误差说明数据过拟合,模型需要正则化。但是现在数据分布不一致,你就不能这么肯定了,需要进一步分析了。具体做法就是从训练数据集里再拿出一小部分作为training-dev。这一部分数据并不用来训练模型,只是用来验证模型在训练集上的表现。
加入了训练验证集,我们可能出现下边两种情况:
模型在训练集和训练验证集上表现一致
比如模型在训练集上的错误率是5%,在训练验证集上的错误率为6%, 在验证集上的错误率有15%。那么这就说明确实是因为数据分布不一致引起的模型精度在验证集上不高。
模型在训练验证集上表现差
比如模型在训练集上的错误率是5%,在训练验证集上的错误率为15%, 在验证集上的错误率有16%。这就说明模型是过拟合,需要正则化。

数据分布不一致怎么办?

一句话就是人工处理让它们一致。你可以收集更多的真实数据。你也可以通过技术手段来合成,使得的已有数据更像真实数据。对于语音识别,你可以改变音频音量,增加回声,混入录制的杂音等。但是要注意,你混入的手段要尽量多样化,比如,你不能只用1分钟的提前录制的杂音和你10000个小时的清晰录音来合成训练数据。这可能导致你的模型过拟合那一分钟的杂音。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

%d 博主赞过: