浅谈神经网络

浅谈神经网络

本文章将会将神经网络的任务——模型评估、数据预处理、特征工程、解决过 拟合——整合为详细的七步工作流程,用来解决任何机器学习任务。


 


一、机器学习的四个分支

1. 监督学习

        监督学习是目前最常见的机器学习类型。给定一组样本(通常由人工标注),它可以学会将 输入数据映射到已知目标[也叫标注(annotation)]。二分类问题、多分类问题和标 量回归问题都属于监督学习。一 般来说,近年来广受关注的深度学习应用几乎都属于监督学习,比如光学字符识别、语音识别、 图像分类和语言翻译。虽然监督学习主要包括分类和回归,但还有更多的奇特变体,主要包括如下几种 

  • 序列生成(sequence generation)。
  • 语法树预测(syntax tree prediction)。

  • 目标检测(object detection)。

  • 图像分割(image segmentation)。


2. 无监督学习

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


3.自监督学习

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

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


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 上的内存分配。训练时,小批量用来为模型权重计算一次梯度下降更新。


 二、评估机器学习模型

        首先来介绍过拟合的概念:过拟合。也就是说,随着训练的进行,模型在训练数据上的性能始终在提高,但在前所未见的 数据上的性能则不再变化或者开始下降。

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


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

1. 简单的留出验证

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

浅谈神经网络

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


2. K 折验证

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

浅谈神经网络


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

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


评估模型的注意事项

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

  • 数据代表性(data representativeness):在将数据划分为训练集和测试集之前,通常应该随机打乱数据。确保训练集和测试集中均包含该任务所涉及到的所有分类。
  • 时间箭头(the arrow of time):果想要根据过去预测未来(比如明天的天气、股票走势 等),那么在划分数据前你不应该随机打乱数据,因为这么做会造成时间泄露(temporal leak)。在这种情况下,你应该始终确保测试集 中所有数据的时间都晚于训练集数据。
  • 数据冗余(redundancy in your data)。一 定要确保训练集和验证集之间没有交集。

三、数据预处理、特征工程和特征学习

1. 神经网络的数据预处理

        数据预处理的目的是使原始数据更适于用神经网络处理,包括向量化、标准化、处理缺失值和特征提取。

  • 向量化:神经网络的所有输入和目标都必须是浮点数张量。

  • 值标准化:对于图像的任务,我们需要将图像数据被编码为 0~255 范围内的整数,表示灰度值。 将这一数据输入网络之前,你需要将其转换为 float32 格式并除以 255,这样就得到 0~1 范围内的浮点数。

  • 处理缺失值: 一般来说,对于神经网络,将缺失值设置为 0 是安全的,只要 0 不是一个有意义的值。网 络能够从数据中学到 0 意味着缺失数据,并且会忽略这个值。如果测试数据中可能有缺失值,而网络是在没有缺失值的数据上训练的,那么网络 不可能学会忽略缺失值。在这种情况下,你应该人为生成一些有缺失项的训练样本:多次复制 一些训练样本,然后删除测试数据中可能缺失的某些特征。


2.特征工程

        特征工程(feature engineering)是指将数据输入模型之前,利用你自己关于数据和机器学 习算法(这里指神经网络)的知识对数据进行硬编码的变换(不是模型学到的),以改善模型的 效果。多数情况下,一个机器学习模型无法从完全任意的数据中进行学习。呈现给模型的数据应该便于模型进行学习。

        我们来看一个直观的例子。假设你想开发一个模型,输入一个时钟图像,模型能够输出对应的时间。

浅谈神经网络


四、过拟合与欠拟合 

        机器学习的根本问题是优化和泛化之间的对立。学会如何处理过拟合对掌握机器学习至关重要。

        优化(optimization)是指调节模型以在训练数据上得到最佳性能(即机器学习中的学习),

        而泛化(generalization)是指训练好的模型在 前所未见的数据上的性能好坏。机器学习的目的当然是得到良好的泛化,但你无法控制泛化, 只能基于训练数据调节模型。

        训练开始时,优化和泛化是相关的:训练数据上的损失越小,测试数据上的损失也越小。这时的模型是欠拟合(underfit)的。但在训练数据上迭代一定次数之后,泛化不再提高,验证指标先是不变,然后开始变差, 即模型开始过拟合。为了防止模型从训练数据中学到错误或无关紧要的模式,最优解决方法是获取更多的训练 数据。模型的训练数据越多,泛化能力自然也越好。

        若无法获得更多训练数据,我们可以通过正则化(regularization)来解决过拟合的问题。

1. 更小的网络

        防止过拟合的最简单的方法就是减小模型大小,即减少模型中可学习参数的个数(这由层数和每层的单元个数决定)。。同时请 记住,你使用的模型应该具有足够多的参数,以防欠拟合,即模型应避免记忆资源不足。在容 量过大与容量不足之间要找到一个折中。更小的网络开始过拟合的时间要晚于参考网络,而且开始过拟合之后,它的性能变差的速度也更慢。


2. 添加权重正则化

        你可能知道奥卡姆剃刀(Occam’s razor)原理:如果一件事情有两种解释,那么最可能正 确的解释就是最简单的那个,即假设更少的那个。这个原理也适用于神经网络学到的模型:给 定一些训练数据和一种网络架构,很多组权重值(即很多模型)都可以解释这些数据。简单模型比复杂模型更不容易过拟合。

        这里的简单模型(simple model)是指参数值分布的熵更小的模型(或参数更少的模型)。因此,一种常见的降低过拟合的方法就是强制让模型权重只能取较小的值, 从而限制模型的复杂度,这使得权重值的分布更加规则(regular)。这种方法叫作权重正则化

(weight regularization),其实现方法是向网络损失函数中添加与较大权重值相关的成本(cost)。 这个成本有两种形式。

  • L1 正则化(L1 regularization):添加的成本与权重系数的绝对值[权重的 L1 范数(norm)] 成正比。

  • L2 正则化(L2 regularization):添加的成本与权重系数的平方(权重的 L2 范数)成正比。 神经网络的 L2 正则化也叫权重衰减(weight decay)。不要被不同的名称搞混,权重衰减 与 L2 正则化在数学上是完全相同的。


3. 添加 dropout 正则化

        dropout 是神经网络最有效也最常用的正则化方法之一,对某一层使用 dropout,就是在训练过程中随机将该层的一些输出特征舍 弃(设置为 0)。假设在训练过程中,某一层对给定输入样本的返回值应该是向量 [0.2, 0.5, 1.3, 0.8, 1.1]。使用 dropout 后,这个向量会有几个随机的元素变成 0,比如 [0, 0.5, 1.3, 0, 1.1]。dropout 比率(dropout rate)是被设为 0 的特征所占的比例,通常在 0.2~0.5 范围内。

        在每个样本中随机删除不同的部分神 经元,可以阻止它们的阴谋,因此可以降低过拟合。其核心思想是在层的输出值中引入噪声, 打破不显著的偶然模式(Hinton 称之为阴谋)


五、机器学习的通用工作流程

        本节将介绍一种可用于解决任何机器学习问题的通用模板。这一模板将你在本章学到的这些概念串在一起:问题定义、评估、特征工程和解决过拟合。

1. 定义问题

        你的输入数据是什么?你要预测什么?只有拥有可用的训练数据,你才能学习预测某件事情。你面对的是什么类型的问题?是二分类问题、多分类问题、标量回归问题、向量回归问题,还是多分类、多标签问题?或者是其他问题,比如聚类、生成或强化学习?确定问题类型有助于你选择模型架构、损失函数等。


2. 选择衡量成功的指标

        要控制一件事物,就需要能够观察它。要取得成功,就必须给出成功的定义:精度?准确 率(precision)和召回率(recall)?客户保留率?衡量成功的指标将指引你选择损失函数,即 模型要优化什么。它应该直接与你的目标(如业务成功)保持一致。

        对于平衡分类问题(每个类别的可能性相同),精度和接收者操作特征曲线下面积(area under the receiver operating characteristic curve,ROC AUC)是常用的指标。对于类别不平衡的 问题,你可以使用准确率和召回率。对于排序问题或多标签分类,你可以使用平均准确率均值(mean average precision)。自定义衡量成功的指标也很常见。


3. 确定评估方法

        一旦明确了目标,你必须确定如何衡量当前的进展。前面介绍了三种常见的评估方法。只需选择三者之一。大多数情况下,第一种方法足以满足要求。

  • 留出验证集。数据量很大时可以采用这种方法。

  • K 折交叉验证。如果留出验证的样本量太少,无法保证可靠性,那么应该选择这种方法。

  • 重复的 K 折验证。如果可用的数据很少,同时模型评估又需要非常准确,那么应该使用这种方法。


4.准备数据

        一旦知道了要训练什么、要优化什么以及评估方法,那么你就几乎已经准备好训练模型了。 但首先你应该将数据格式化,使其可以输入到机器学习模型中(这里假设模型为深度神经网络)。

  • 如前所述,应该将数据格式化为张量。
  • 这些张量的取值通常应该缩放为较小的值,比如在 [-1, 1] 区间或 [0, 1] 区间。
  • 如果不同的特征具有不同的取值范围(异质数据),那么应该做数据标准化。
  • 你可能需要做特征工程,尤其是对于小数据问题。

准备好输入数据和目标数据的张量后,你就可以开始训练模型了。


5. 开发比基准更好的模型

        这一阶段的目标是获得统计功效(statistical power),即开发一个小型模型,它能够打败纯 随机的基准(dumb baseline)。我们首先需要做以下两个假设

        假设输出是可以根据输入进行预测的。

        假设可用的数据包含足够多的信息,足以学习输入和输出之间的关系。

        如果一切顺利,你还需要选择三个关键参数来构建第一个工作模型。

  • 最后一层的**。它对网络输出进行有效的限制。例如,IMDB 分类的例子在最后一层 使用了 sigmoid,回归的例子在最后一层没有使用**,等等。

  • 损失函数。它应该匹配你要解决的问题的类型。例如,IMDB 的例子使用binary_ crossentropy、回归的例子使用 mse,等等。

  • 优化配置。你要使用哪种优化器?学习率是多少?大多数情况下,使用 rmsprop 及其 默认的学习率是稳妥的。

        于损失函数的选择,需要注意,直接优化衡量问题成功的指标不一定总是可行的。有时 难以将指标转化为损失函数,要知道,损失函数需要在只有小批量数据时即可计算(理想情况 下,只有一个数据点时,损失函数应该也是可计算的),而且还必须是可微的(否则无法用反向 传播来训练网络)。 

列出了常见问题类型的最后一层**和损失函数,可以帮你进行选择。

浅谈神经网络


6.扩大模型规模:开发过拟合的模型

        一旦得到了具有统计功效的模型,问题就变成了:模型是否足够强大?它是否具有足够多 的层和参数来对问题进行建模?要搞清楚你需要多大的模型,就必须开发一个过拟合的模型,这很简单:

  • 添加更多的层。
  • 让每一层变得更大。

  • 训练更多的轮次。

        要始终监控训练损失和验证损失,以及你所关心的指标的训练值和验证值。如果你发现模型在验证数据上的性能开始下降,那么就出现了过拟合。下一阶段将开始正则化和调节模型,以便尽可能地接近理想模型,既不过拟合也不欠拟合 。


7. 模型正则化与调节超参数

        这一步是最费时间的:你将不断地调节模型、训练、在验证数据上评估(这里不是测试数据)、 再次调节模型,然后重复这一过程,直到模型达到最佳性能。你应该尝试以下几项。

  • 添加 dropout。

  • 尝试不同的架构:增加或减少层数。

  • 添加 L1 和 / 或 L2 正则化。

  • 尝试不同的超参数(比如每层的单元个数或优化器的学习率),以找到最佳配置

  • 反复做特征工程:添加新特征或删除没有信息量的特征。

        每次使用验证过程的反馈来调节模型,都会将有关验证过程的信息泄露到模型中。如果只重复几次,那么无关紧要;但如果系统性地迭代许多次,最终会导致模型对验证过程过 拟合(即使模型并没有直接在验证数据上训练)。这会降低验证过程的可靠性。


总结

  • 定义问题与要训练的数据。收集这些数据,有需要的话用标签来标注数据。

  •  选择衡量问题成功的指标。你要在验证数据上监控哪些指标?

  •  确定评估方法:留出验证? K 折验证?你应该将哪一部分数据用于验证?

  •  开发第一个比基准更好的模型,即一个具有统计功效的模型。

  •  开发过拟合的模型。

  •  基于模型在验证数据上的性能来进行模型正则化与调节超参数。许多机器学习研究往往只关注这一步,但你一定要牢记整个工作流程。