1.2 机器学习应用的核心开发流程

我们经常听到机器学习的研究人员开口“特征”,闭口“模型”,也听过他们调侃自己是“调参”师,然而,他们口中的这些术语到底指什么呢?若想了解这些术语,就先要清楚机器学习应用开发的核心流程。

图1-1把机器学习应用的核心开发流程划分为4个阶段,实际上,基本上所有机器学习项目的开发流程都是按照这4个阶段来划分和实施的。

图1-1 机器学习的基本流程

下面对图1-1所示的4个阶段进行解释。

1.数据预处理(Preprocessing)

机器学习的第1阶段就是处理原始数据。从图1-1可以看出,我们需要处理带有标签的原始数据,形成用于模型训练的训练数据集和用于验证模型效果的测试数据集,包含如下两项核心工作。

(1)特征提取。我们要处理的原始数据往往是以多种形式存在的,可以是来自MySQL数据库的不同字段,也可以是原始的文本文件或图像、视频、音频等多媒体文件。然而,绝大部分机器学习算法的输入通常是某种浮点数矩阵形式或者向量形式的。把这些多样化的原始数据转化为符合算法数据的数据格式,是工作的第1步,我们通常可以把这一步称为“特征提取”。而从原始数据中挑选出来进行转换,并最终用于机器学习的数值就被称为“特征值”。例如,我们要识别花的种类,从花的图片中将花瓣颜色、花瓣形状、花瓣长度、花瓣宽度、叶片长度、叶片形状等属性数值化,这些数值就被定义为花的“特征”。注意,我们在这里是通过经验去选取我们觉得重要且有用的特征值的,因为在现实场景下可能会有成百上千种数据类型(例如一个业务中所有数据表的字段)备选,我们不太可能将它们全部用于机器学习,必须有所取舍,这就是特征工程的目的。然而,依赖经验选择并不是100%可靠的。在实际工作中,我们需要和业务专家一起不断讨论和尝试验证,直到确认我们选取的特征值的确能达到业务要求。

(2)数据清洗。有时,我们哪怕是把数据转化为符合算法输入的形式,也会出现很多问题,例如,需要输入的某些特征可能不存在、不同特征的数值区间差别太大、某些特征可能是文字形式等,这时我们需要根据情况处理这些不规范的特征值。例如,将不存在的特征设为0或取平均值,对文字形式的特征进行编码,或者对数值区间较大的特征进行归一化(Normalization)等。数据清洗的目的是让算法训练所用的数据集尽量理想化,不包含不必要的干扰数值,从而提高模型训练的精度。

在数据集处理完成后,我们通常需要把数据集划分为训练数据集和测试数据集,这样的划分通常是随机的,随机挑选80%的数据用于训练,将剩下的20%用于测试验证。数据集其实在不同的机器学习框架中均有对应的API进行快速划分,这里不做详述。

2.学习(Learning)

这个阶段也是我们常说的训练阶段。我们已经在数据预处理阶段构建了合适的数据集,在这个阶段就需要根据自己的最终目标选择合适的算法模型,并根据我们的数据集进行合理的参数设置,开始模型训练。

什么是模型训练?我们在中学都学过多元函数,例如:

其中,y 就是标签,在数据集中已经标注好;x1x2x3就是前面提到的特征值。我们可以这样描述:

花的类别=a×花蕊颜色+b×花瓣颜色 +c×叶片颜色

这里,y就是花的类别,x1x2x3就分别是花蕊颜色、花瓣颜色和叶片颜色。

假设这个公式正确,我们接下来需要做的就是通过训练集中的数据输入,把abc反推出来。当然,一般来说我们不可能找到100%完美的abc,使以上算法得到的结果和训练集中所有的输入都一致,所以我们只能让结果尽量接近原始数据,并设定损失函数(Loss Function),设法使整体误差最小。在实际场景中,我们通常使用MSE(Mean Squared Error,均方误差)作为损失函数的误差计算。

当然,上面的例子非常简单,所要推导的参数也不多。在实际的深度学习模型中,我们需要推导的参数是以万甚至百万为单位的,这些参数通常被称为“权重”(Weight)并被存为特定格式的文件(不同框架所存的权重文件格式各不相同)。我们将在第2章深入接触深度学习并了解其训练过程。

3.评价(Evaluation)

我们在学习阶段将误差降到足够小之后,就可以停止训练,将训练好的模型用在数据预处理阶段生成的测试数据集上验证效果。因为测试数据集的所有数据都没有在训练阶段出现过,所以我们可以把测试数据视为“新”数据,用来模拟真实环境的输入,从而预估模型被部署到真实环境后的效果。

4.预测(Prediction)

我们在评价阶段确认模型达到了预期的准确率和覆盖率(召回率)之后,就可以将模型部署上线。注意,在小规模研究中,我们可以直接使用训练后的模型;但在真正大流量的产品环境中,我们往往需要使用专门的模型服务框架(如TensorFlow Serving[4])将模型转换为专有的格式,并在该框架下进行高效服务。我们将在第9章学习如何在TensorFlow Serving上进行模型的部署与验证。