人工智能python实现-机器学习基础

4.1 机器学习的四个分支
4.1.1 监督学习
4.1.2 无监督学习
4.1.3 自监督学习
4.1.4 强化学习
4.2 评估机器学习模型
4.2.1 训练集、验证集和测试集
4.2.2 评估模型的注意事项

机器学习基础

本章包括以下内容:

  • 除分类和回归之外的机器学习形式
  • 评估机器学习模型的规范流程
  • 为深度学习准备数据
  • 特征工程
  • 解决过拟合
  • 处理机器学习问题的通用工作流程

学完第 3章的三个实例,你应该已经知道如何用神经网络解决分类问题和回归问题,而且也看到了机器学习的核心难题:过拟合。本章会将你对这些问题的直觉固化为解决深度学习问题的可靠的概念框架。我们将把所有这些概念——模型评估、数据预处理、特征工程、解决过拟合——整合为详细的七步工作流程,用来解决任何机器学习任务。

4.1 机器学习的四个分支

在前面的例子中,你已经熟悉了三种类型的机器学习问题:二分类问题、多分类问题和标量回归问题。这三者都是监督学习(supervised   learning)的例子,其目标是学习训练输入与训练目标之间的关系。

监督学习只是冰山一角——机器学习是非常宽泛的领域,其子领域的划分非常复杂。机器学习算法大致可分为四大类,我们将在接下来的四小节中依次介绍。

4.1.1 监督学习

监督学习是目前最常见的机器学习类型。给定一组样本(通常由人工标注),它可以学会将输入数据映射到已知目标[也叫标注(annotation)]。本书前面的四个例子都属于监督学习。一般来说,近年来广受关注的深度学习应用几乎都属于监督学习,比如光学字符识别、语音识别、图像分类和语言翻译。

虽然监督学习主要包括分类和回归,但还有更多的奇特变体,主要包括如下几种。

  • 序列生成(sequence   generation)。给定一张图像,预测描述图像的文字。序列生成有时可以被重新表示为一系列分类问题,比如反复预测序列中的单词或标记。
  • 语法树预测(syntax  tree prediction)。给定一个句子,预测其分解生成的语法树。
  • 目标检测(object   detection)。给定一张图像,在图中特定目标的周围画一个边界框。这个问题也可以表示为分类问题(给定多个候选边界框,对每个框内的目标进行分类)或分类与回归联合问题(用向量回归来预测边界框的坐标)。
  • 图像分割(image  segmentation)。给定一张图像,在特定物体上画一个像素级的掩模(mask)。

4.1.2 无监督学习

无监督学习是指在没有目标的情况下寻找输入数据的有趣变换,其目的在于数据可视化、数据压缩、数据去噪或更好地理解数据中的相关性。无监督学习是数据分析的必备技能,在解决监督学习问题之前,为了更好地了解数据集,它通常是一个必要步骤。降维(dimensionality reduction)和聚类(clustering)都是众所周知的无监督学习方法。

4.1.3 自监督学习

自监督学习是监督学习的一个特例,它与众不同,值得单独归为一类。自监督学习是没有人工标注的标签的监督学习,你可以将它看作没有人类参与的监督学习。标签仍然存在(因为总要有什么东西来监督学习过程),但它们是从输入数据中生成的,通常是使用启发式算法生成的。

举个例子,自编码器(autoencoder)是有名的自监督学习的例子,其生成的目标就是未经修改的输入。同样,给定视频中过去的帧来预测下一帧,或者给定文本中前面的词来预测下一个词,都是自监督学习的例子[这两个例子也属于时序监督学习(temporally supervised learning),即用未来的输入数据作为监督]。注意,监督学习、自监督学习和无监督学习之间的区别有时很模糊,这三个类别更像是没有明确界限的连续体。自监督学习可以被重新解释为监督学习或无监督学习,这取决于你关注的是学习机制还是应用场景。

注意

本书的重点在于监督学习,因为它是当前深度学习的主要形式,行业应用非常广泛。后续章节也会简要介绍自监督学习。

4.1.4 强化学习

强化学习一直以来被人们所忽视,但最近随着  Google的  DeepMind公司将其成功应用于学习玩 Atari游戏(以及后来学习下围棋并达到最高水平),机器学习的这一分支开始受到大量关注。在强化学习中,智能体(agent)接收有关其环境的信息,并学会选择使某种奖励最大化的行动。例如,神经网络会“观察”视频游戏的屏幕并输出游戏操作,目的是尽可能得高分,这种神经网络可以通过强化学习来训练。

目前,强化学习主要集中在研究领域,除游戏外还没有取得实践上的重大成功。但是,我们期待强化学习未来能够实现越来越多的实际应用:自动驾驶汽车、机器人、资源管理、教育等。强化学习的时代已经到来,或即将到来。

分类和回归术语表

分类和回归都包含很多专业术语。前面你已经见过一些术语,在后续章节会遇到更多。这些术语在机器学习领域都有确切的定义,你应该了解这些定义。

  • 样本(sample)或输入(input):进入模型的数据点。
  • 预测(prediction)或输出(output):从模型出来的结果。
  • 目标(target):真实值。对于外部数据源,理想情况下,模型应该能够预测出目标。
  • 预测误差(prediction  error)或损失值(loss value):模型预测与目标之间的距离。
  • 类别(class):分类问题中供选择的一组标签。例如,对猫狗图像进行分类时,“狗”和“猫”就是两个类别。
  • 标签(label):分类问题中类别标注的具体例子。比如,如果   1234号图像被标注为包含类别“狗”,那么“狗”就是 1234号图像的标签。
  • 真值(ground-truth)或标注(annotation):数据集的所有目标,通常由人工收集。
  • 二分类(binary   classification):一种分类任务,每个输入样本都应被划分到两个互斥的类别中。
  • 多分类(multiclass   classification):一种分类任务,每个输入样本都应被划分到两个以上的类别中,比如手写数字分类。
  • 多标签分类(multilabel   classification):一种分类任务,每个输入样本都可以分配多个标签。举个例子,如果一幅图像里可能既有猫又有狗,那么应该同时标注“猫”标签和“狗”标签。每幅图像的标签个数通常是可变的。
  • 标量回归(scalar   regression):目标是连续标量值的任务。预测房价就是一个很好的例子,不同的目标价格形成一个连续的空间。
  • 向量回归(vector   regression):目标是一组连续值(比如一个连续向量)的任务。如果对多个值(比如图像边界框的坐标)进行回归,那就是向量回归。
  • 小批量(mini-batch)或批量(batch):模型同时处理的一小部分样本(样本数通常为 8~128)。样本数通常取 2的幂,这样便于   GPU上的内存分配。训练时,小批量用来为模型权重计算一次梯度下降更新。

4.2 评估机器学习模型

在第 3章介绍的三个例子中,我们将数据划分为训练集、验证集和测试集。我们没有在训练模型的相同数据上对模型进行评估,其原因很快显而易见:仅仅几轮过后,三个模型都开始过拟合。也就是说,随着训练的进行,模型在训练数据上的性能始终在提高,但在前所未见的数据上的性能则不再变化或者开始下降。

机器学习的目的是得到可以泛化(generalize)的模型,即在前所未见的数据上表现很好的模型,而过拟合则是核心难点。你只能控制可以观察的事情,所以能够可靠地衡量模型的泛化能力非常重要。后面几节将介绍降低过拟合以及将泛化能力最大化的方法。本节重点介绍如何衡量泛化能力,即如何评估机器学习模型。

4.2.1 训练集、验证集和测试集

评估模型的重点是将数据划分为三个集合:训练集、验证集和测试集。在训练数据上训练模型,在验证数据上评估模型。一旦找到了最佳参数,就在测试数据上最后测试一次。

你可能会问,为什么不是两个集合:一个训练集和一个测试集?在训练集上训练模型,然后在测试集上评估模型。这样简单得多!

原因在于开发模型时总是需要调节模型配置,比如选择层数或每层大小[这叫作模型的超参数(hyperparameter),以便与模型参数(即权重)区分开]。这个调节过程需要使用模型在验证数据上的性能作为反馈信号。这个调节过程本质上就是一种学习:在某个参数空间中寻找良好的模型配置。因此,如果基于模型在验证集上的性能来调节模型配置,会很快导致模型在验证集上过拟合,即使你并没有在验证集上直接训练模型也会如此。

造成这一现象的关键在于信息泄露(information  leak)。每次基于模型在验证集上的性能来调节模型超参数,都会有一些关于验证数据的信息泄露到模型中。如果对每个参数只调节一次,那么泄露的信息很少,验证集仍然可以可靠地评估模型。但如果你多次重复这一过程(运行一次实验,在验证集上评估,然后据此修改模型),那么将会有越来越多的关于验证集的信息泄露到模型中。

最后,你得到的模型在验证集上的性能非常好(人为造成的),因为这正是你优化的目的。你关心的是模型在全新数据上的性能,而不是在验证数据上的性能,因此你需要使用一个完全不同的、前所未见的数据集来评估模型,它就是测试集。你的模型一定不能读取与测试集有关的任何信息,既使间接读取也不行。如果基于测试集性能来调节模型,那么对泛化能力的衡量是不准确的。

将数据划分为训练集、验证集和测试集可能看起来很简单,但如果可用数据很少,还有几种高级方法可以派上用场。我们先来介绍三种经典的评估方法:简单的留出验证、    K折验证,以及带有打乱数据的重复 K折验证。

1.简单的留出验证

留出一定比例的数据作为测试集。在剩余的数据上训练模型,然后在测试集上评估模型。如前所述,为了防止信息泄露,你不能基于测试集来调节模型,所以还应该保留一个验证集。

留出验证(hold-out validation)的示意图见图 4-1。代码清单 4-1给出了其简单实现。

图 4-1 简单的留出验证数据划分

代码清单 4-1 留出验证

这是最简单的评估方法,但有一个缺点:如果可用的数据很少,那么可能验证集和测试集包含的样本就太少,从而无法在统计学上代表数据。这个问题很容易发现:如果在划分数据前进行不同的随机打乱,最终得到的模型性能差别很大,那么就存在这个问题。接下来会介绍 K折验证与重复的 K折验证,它们是解决这一问题的两种方法。

2. K折验证

K折验证(K-fold   validation)将数据划分为大小相同的  K个分区。对于每个分区 i,在剩余的 K  1个分区上训练模型,然后在分区i上评估模型。最终分数等于K个分数的平均值。对于不同的训练集 – 测试集划分,如果模型性能的变化很大,那么这种方法很有用。与留出验证一样,这种方法也需要独立的验证集进行模型校正。

K折交叉验证的示意图见图  4-2。代码清单 4-2给出了其简单实现。

图 4-2 3折验证

代码清单 4-2 K折交叉验证

3.带有打乱数据的重复  K折验证

如果可用的数据相对较少,而你又需要尽可能精确地评估模型,那么可以选择带有打乱数据的重复 K折验证(iterated  K-fold validation  with shuffling)。我发现这种方法在 Kaggle竞赛中特别有用。具体做法是多次使用K折验证,在每次将数据分为K个分区之前都先将数据打乱。最终分数是每次  K折验证分数的平均值。注意,这种方法一共要训练和评估    P×K个模型(P是重复次数),计算代价很大。

4.2.2 评估模型的注意事项

选择模型评估方法时,需要注意以下几点。

  • 数据代表性(data   representativeness)。你希望训练集和测试集都能够代表当前数据。例如,你想要对数字图像进行分类,而图像样本是按类别排序的,如果你将前 80%作为训练集,剩余 20%作为测试集,那么会导致训练集中只包含类别   0~7,而测试集中只包含类别 8~9。这个错误看起来很可笑,却很常见。因此,在将数据划分为训练集和测试集之前,通常应该随机打乱数据。
  • 时间箭头(the  arrow of time)。如果想要根据过去预测未来(比如明天的天气、股票走势等),那么在划分数据前你不应该随机打乱数据,因为这么做会造成时间泄露(temporalleak):你的模型将在未来数据上得到有效训练。在这种情况下,你应该始终确保测试集中所有数据的时间都晚于训练集数据。
  • 数据冗余(redundancy   in your data)。如果数据中的某些数据点出现了两次(这在现实中的数据里十分常见),那么打乱数据并划分成训练集和验证集会导致训练集和验证集之间的数据冗余。从效果上来看,你是在部分训练数据上评估模型,这是极其糟糕的!一定要确保训练集和验证集之间没有交集。

作者:

喜欢围棋和编程。

 
发布于 分类 编程标签

发表评论

电子邮件地址不会被公开。