再举个例子。当初阿尔法狗与李世石一战成名。如果说前三盘的结果令各路专家大跌眼镜的话。那第四盘可能是让所有人都大跌眼镜了。阿尔法狗连出昏招,几乎是将这一局拱手相让。那阿尔法狗出bug了?DeepMind团队说,这是一个系统问题。那我们来看看这个系统到底有什么问题。根据当时公布出来的数据我们发现阿尔法狗的养成方法是这样的。
阿尔法狗如何养成
1.整理过去人类对弈的80多万盘棋局
2.拿1的棋谱,训练一只狗狗,能够预测人类下一步会下在哪里
3.拿2得到的狗狗,每天自己和自己下100万盘棋
4.拿1和3的棋谱,再训练一只狗狗,这就是阿尔法狗。
阿尔法狗是基于1亿+盘机器棋局和80万人类棋局训练出来的狗狗。问题出在哪?我们看到,训练阿尔法狗所用的棋谱,只有80万是人类棋局,总数上亿的棋局是机器对弈的。它下的每一步,都是将局面导向历史上(也就是80万人类棋局和1亿自己对弈的棋局)胜率最大的局面。
问题就恰恰出在这里,80万和1亿。相差甚多。那么阿尔法狗选择的所谓胜率最大,一定是赢自己的概率最大,而不是赢人类的概率最大。这样的标准在顺丰棋尚且不容易出问题,一旦遇到逆风局,它的选择就变成了,选择对手犯错概率最大的棋,而这个对手恰恰就是它自己。
这就是为什么当初阿尔法狗在逆风局中下出一些匪夷所思的棋。当然这些都只是行业内的人的猜测。但从这个例子就可以看到数据的重要性。数据出现偏差会直接导致不可估计的后果。
所以我们总结出的第一个突破口就是数据测试。保证我们用来建模的数据是正确的。在这里的数据测试会跟我们以往的测试有些不一样。
首先是数据规模的增长。数据大了里面的有些数据可能会发生一些很诡异的事情。然后是存储介质和技术栈的变化,我们用来训练模型的数据都会存放在hadoop集群上,所以一般都会用spark或者Hbase来编写测试脚本。最后是验证方式的变化,之前我们测试的时候都是精确的测试每条数据的正确性。 但是现在我们需要根据业务设定每一个字段的规则。然后扫描每一行数据,如果这条数据超出了这个字段的规定范围,会发出报警。 假如用户年龄这个字段,正常值可能是0~100岁。如果突然出现个300岁,那么这条数据肯定是有问题的。我们之前曾经碰见过这样的数据。本来这条数据应该是30岁的,但却多了个0。
针对这方面的测试,一般都是使用spark或者Hbase这种大数据处理框架把任务提交到集群上去扫描每一张表。
分层测试
虽然我们能测试用来做训练的数据是正确的。但是一个人工智能系统是很复杂的, 我们只是保证了作为源头的数据貌似是不够的。以前我们测试的时候都知道把系统拆解开做分层测试,所以我们的第二个突破口就是基于这个思路。我们先来了解一下,一个模型的诞生都经理了哪些步骤。
模型诞生的步骤:
·数据引入
·数据处理(清洗,拆分,拼接等)
·特征工程
·模型训练
·模型上线
数据引入:将历史数据引入到系统中,并做第一步的预处理。例如处理一些明显的异常的行为。
数据处理: 其中又包含很多种操作。 例如对数据进行清洗,拆分。 把两张表进行拼接等。
特征工程:我们从数据中按一定规律提取一些特征出来。之后需要将提取的样本表传递给机器学习算法进行训练。
可以看到我们把数据引入到系统后,先是用SQL算子对数据做了拼接,然后清洗一些无效数据。 再把数据拆分为训练集和测试集。分别对两个数据集做特征抽取。之后训练集传递给逻辑回归这个机器学习算法进行训练。训练之后使用测试集来测试一下模型的效果。大家看到这个图了,这是创建一个模型比较常见的流程。
图中的逻辑归回就是一种机器学习算法,也是一种最简单的二分类算法,其他的算法诸如 GBDT,SVM,DNN等算法的模型都是这个流程。我们可以看到算法上面的流程。全部与机器学习无关。他们都属于大数据处理范畴。而且一个成型的系统在每一个模块都会提供一些固定的接口。