应用机器学习技术”这件事情,具体到微观的行为,其实就是:使用机器学习模型来预测数据,得到预测结果。然后,预测结果可能会作为下一步业务逻辑的依据。
要使用机器学习模型,首先要获得它。在有了数据和算法的情况下,我们需要通过一个过程来获得模型,这个过程就叫做:训练。
在前面讲述三要素时我们已经讲过:数据 + 算法 => 模型
获得模型的过程——训练——是将算法应用到数据上进行运算的过程。
笼统而言,为了构建一个模型,我们需要经历以下步骤。
然后按一定规则计算模型质量的衡量指标,比如 Precision、Recall、F1Score 等(后面章节会介绍),根据指标的数值来衡量当前模型的质量。
Step-1.3 中提到我们要将全部数据分割成训练集、验证集和测试集。这些集合都是做什么的呢?
训练集(Train Set):用来做训练的数据的集合。
验证集(Validation Set):在训练的过程中,每个训练轮次结束后用来验证当前模型性能,为进一步优化模型提供参考的数据的集合。
测试集(Test Set):用来测试的数据的集合,用于检验最终得出的模型的性能。
每个集合都应当是独立的,和另外两个没有重叠。
训练集是训练过程的基础,而验证和测试集则是在不同阶段用来评价训练结果的。
在个别情况下验证集和测试集可以合二为一,不过当然最好还是分开。验证可以理解为一个小规模的对于已经生成模型的测试,只不过已生成模型处理的数据不是测试集而是验证集。
这三个集合可以从同一份标注数据中随机选取。三者的比例可以是训练集:验证集:测试集=2:1:1,也可以是7:1:2。总之,训练集占大头。有些情况下(整体数据量不大,模型又相对简单时),验证集和测试集也可以合二为一。
Step-2 训练,又可以细化为几个步骤。
我们来看看上面的 Step-2.5 改进模型。
对照机器学习三要素,模型的优化可以从三个方面来进行:数据、算法和模型。
机器学习的模型质量往往和训练数据有直接的关系。
这种关系首先表现在数量上——同一个模型,在其他条件完全不变的情况下,用 1000 条 Training Data 和 100000 条 Training Data 来训练,正常情况下,结果差异会非常明显。
大量的高质量训练数据,是提高模型质量的最有效手段。
当然,对于有监督学习而言,标注是一个痛点,通常我们可以用来训练的数据量相当有限。
在有限的数据上,我们能做些什么来尽量提高其质量呢?大概有如下手段:
很多机器学习工程师被戏称为调参工程师。这是因为调参,是模型训练过程中必不可少又非常重要的一步。
大家已经知道,我们训练模型的目的就是为了得到模型对应公式中的若干参数。这些参数是训练过程的输出,并不需要我们来调。
除了这些参数外,还有一类被称为超参数的参数,例如用梯度下降方法学习 LR 模型时的步长(Alpha),用 BFGS 方法学习 Linear-chain CRF 时的权重(w)等。
超参数是需要模型训练者自己来设置和调整的。
调参本身有点像一个完整的 Project,需要经历:
这样一个完整的过程,其中 3-5 往往要经由多次迭代。
调参有许多现成的方法可循(比如 Grid Search),应用这些方法,使得制定和调整“调参策略”有章可循,也可以减少许多工作量。
算法库本身对于各个算法的超参数也都有默认值,第一次上手尝试训练模型,可以从默认值开始,一般也能得出结果。
机器学习模型的训练,得出结果容易,得出优质结果(高质量的模型)难。
调参这一步很多时候没有一定之规。特别是在超参数比较多的时候,如何组合调参简直可以称为一门艺术。
遇到这样的时候,只能具体情况具体分析,很多时候其实就是尝试,能否试出一个好的结果确实有一定运气的成分存在。但是,乱调一气最后能够得到好结果的可能性几乎为零。
只有当调参工程师对于模型的理论原理和算法的执行细节有深入了解的时候,才有可能找到正确的调参方向。
方向对了,即使找不到最优解,也总能找到次优解。这也就是我们要特别认真地学习理论的原因。
有的时候,训练数据已经确定,而某个模型再怎么调参,都无法满足在某个特定指标上的要求。那就只好换个模型试试了。
比如,对于某个分类问题,Logistic Regression 不行,可以换 Decision Tree 或者 SVM 试试。
现在还有很多深度学习的模型逐步投入使用。不过一般情况下,DL 模型(CNN、DNN、RNN、LSTM 等等)对于训练数据的需求比我们今天讲的统计学习模型要高至少一个量级。在训练数据不足的情况下,DL 模型很可能性能更差。
而且 DL 模型的训练时间普遍较长,可解释性极弱,一旦出现问题,很难 Debug。因此再次建议大家:在应用场景下,不要迷信 Cutting-edge Technology,无论工具还是方法,选对的,别选贵的。