机器学习的工作流程

最近在阅读François Chollet写的Deep Learning with Python. 书中有很多经验性的技巧和归纳,其中4.5写的Machine Learning的工作流程归纳的很好,看完深有启发,摘录于此。

机器学习的标准流程可以分为六个步骤:

  1. 定义问题
  2. 确定衡量模型的标准
  3. 确定评估方式
  4. 建立一个比理论平均更好的简单模型
  5. 扩展模型,使其过拟合
  6. 优化模型

一般的机器学习方面的研究主要关注第6步,但最好按照标准流程来做。

定义问题

首先思考,可用的数据有哪些,希望从这些数据中得到什么信息,希望用这些信息预测什么。需要注意预测的内容必须要从training data中能得到信息的,比如要为影评做情绪分类,必须要有影评和它对应的情绪标签作training data才行。

考虑问题的类型:二元分类?多元分类?标量回归?向量回归?多元多标签分类?聚类?……总之明确问题的类型,有助于后面选择模型。

明确输入和输出。时刻记住在使用机器学习的时候,存在两个假设:

  1. 输出可以通过输入预测得到。
  2. 已有的数据足够多以提取出输入和输出的关系。

比如如果做一个模型预测股票价格的走势,在仅有历史价格数据的时候是不够的,因为历史价格不包含未来价格的信息。机器学习只能利用training data中存在的模式(pattern)。

另外如果这个问题是不平稳的(Nonstationary),机器学习也不适用。比如做推荐服装的模型,不同季节对不同服装的喜好程度是不同的,如果用八月的数据训练预测九月的情况,模型效果肯定很差。这时则要采取变通,比如使用多年的数据训练,添加月份标签等。

确定衡量模型的标准

考虑清楚问题并估计可以建模之后,需要确定一个衡量标准,来判断模型是否成功。比如预测值的准确度,客户留存度,正确分类的比例等等。需要注意的是很多时候标准是根据问题自定的,这就需要建模者有经验。可以在Kaggle之类的竞赛网站上拓展视野。

确定评估方式

确定一个评估方式来衡量进度也是很重要的。一般来说有三种方法:

  1. 使用一个hold-out validation set,即将数据集分出一部分专门用来验证模型效果。在有大量数据时可以使用这个方法。
  2. K-fold Cross Validation, 将原始数据分成K组(K-Fold),将每个子集数据分别做一次验证集,其余的K-1组子集数据作为训练集,这样会得到K个模型。这K个模型分别在验证集中评估结果,最后的误差取平均就得到交叉验证误差。在数据量不足以做第一种方法时可以选择。但这种方法计算需求很大。
  3. 循环K-fold validation,每次都进行数据随机排列,然后进行完整的k-fold。适用于数据量很小且对精度要求高的情况。

一般选第一个即可。

建立一个比理论平均更好的简单模型

这一步的目的是较快的找到比理论平均好的简单模型,通常可以进行简单的尝试,比如在MNIST数字分类时用最简单的feed feedforward 模型尝试,得到精确度高于0.1(完全随机分类的平均精度),这样就可以在这个基础上进行下一步的优化了。需要注意的是不是所有时候都能够找得到这样的简单模型的。如果在多次尝试后仍找不到,需要考虑是否是前面的两个假设不成立,即根本不存在输出和输入之间的明确关系,或者这种关系在已有的数据集中不明确。

如果顺利找到这种简单模型,下一步需要考虑三个问题:

  1. 最后一层的激活函数。将模型网络中的倒数第二层输出组合形成最终输出,比如在二元分类时可以使用relu激活,得到一个0-1之间的数字作为选择一类的概率。
  2. loss function,即一个可微的函数,用来衡量模型的精度。可微性是必要的因为使用梯度下降法优化时需要求微分。
  3. 优化方法,比如Adam,RmsProp等。通常可以先尝试用这两种的默认学习率(learning rate)优化。
Problem type Last-layer activation Loss function
Binary classification sigmoid binary_crossentropy
Multiclass, single-label classification softmax categorical_crossentropy
Multiclass, multilabel classification sigmoid binary_crossentropy
Regression to arbitrary values None mse
Regression to values between 0 and 1 sigmoid mse or binary_crossentropy

扩展模型

这一步将模型扩展,使其过拟合,因为上一步得到的简单模型可能没有足够的层数,没有足够多的神经元等等。机器学习问题其实就是平衡拟合能力和泛化能力的问题,我们的目标是找到二者平衡的一个点。既不能让它欠拟合,也不能让它过拟合。一般的做法是先让模型过拟合,然后再进行细节优化。扩展模型有三个方法:

  1. 增加层数。
  2. 增加单层神经元个数。
  3. 训练更多的epochs。

如果你发现验证的精度开始下降了,这时候就说明模型已经过拟合,这一步也可以结束了。

优化模型

最复杂也最耗时的一步,大部分研究的重点。大致逻辑是对模型做小修小改,把数据放进去跑,看模型验证精度的变化,直到优化到不能再优化为止。一般可以尝试的方向有:

  1. 加入Dropout。
  2. 改变结构,比如增加或删除一层。
  3. L1/L2正则化(Regularization)。
  4. 更改不同的超参数(hyperparameter),比如学习率、每层神经元个数等等。
  5. 增加或删除feature。

注意如果多次依据验证精度调整模型,会把验证集的信息泄露给模型(相当于验证集也参与了模型的构建和优化)。少量的次数还可以接受,太多次后会让优化后的模型没有说服力。

当你获得一个满意的优化后的模型,可以使用所有的数据(training 和 validation set)来最后训练一次,再使用test data做最后的测试。如果最后测试结果显著不如validation的结果,则需要考虑是否overfitting,或者时评估方式(第三步)选择不对,可以尝试换一个试试。