深度学习(Python)-- 机器学习的基础知识

本章包括:

  1. 超越分类和回归的机器学习形式
  2. 机器学习模型的正式评估程序
  3. 为深度学习准备数据
  4. 特征工程
  5. 解决过度拟合问题
  6. 接近机器学习问题的通用工作流程

一、机器学习的四个分支

机器学习算法通常分为四大类:
1、监督学习
  监督学习主要包括分类和回归,但也有更多的外来变种,包括以下(有例子):
  1) 序列生成 - 给定图片,预测描述它的标题。 序列生成有时可以重新表述为一系列分类问题(例如重复预测序列中的单词或标记)。
  2) 语法树预测 - 给定一个句子,将其分解预测为语法树。
  3) 物体检测 - 给定图片,在图片内的某些对象周围绘制一个边界框。 这也可以表示为分类问题(给定许多候选边界框,对每个边界框的内容进行分类)或者作为联合分类和回归问题,其中边界框坐标是通过矢量回归预测。
  4) 图像分割 - 给定图片,在特定对象上绘制像素级蒙版。
2、无监督学习
  机器学习的这个分支包括在没有任何目标帮助的情况下发现输入数据的有趣变换,用于数据可视化,数据压缩或数据去噪,或者更好地理解手头数据中存在的相关性。
  无监督学习是数据分析的基础,而且在尝试解决监督学习问题之前,通常是更好地理解数据集的必要步骤。维度降低和聚类是无人监督学习的众所周知的类别。
3、自主学习
  自我监督学习是一种没有人工注释标签的监督学习,仍然涉及标签(因为学习必须由某些东西监督),但它们是从输入数据生成的,通常使用启发式算法。 例如,自动编码器。
4、强化学习
  强化学习中,代理人会收到有关其环境的信息,并学会选择最大化某些奖励的行动。 例如,可以通过强化学习来训练“观察”视频游戏屏幕并输出游戏动作以最大化其得分的神经网络。
5、分类和回归词汇表

  • Sample or input(样本或输入)
  • Prediction or output(预测或输出)
  • Target(目标)
  • Prediction error or loss value(预测误差或损失值 - 衡量你的距离模型的预测和目标) Classes(类 - 在分类问题中可供选择的一组可能标签。例如,在对猫和狗图片进行分类时,“dog”和“cat”是两个类)
  • Label(标签 - 分类问题中类注释的特定实例。例如,如果图片#1234注释为包含类“dog”,则“dog”是图片#1234的标签)
  • Ground-truth or annotations(实况或注释 - 数据集的所有目标,通常由人收集
  • Binary classification(二分分类 - 每个输入样本应分为两个独有的类别)
  • Multiclass classification(多类分类 - 每个输入样本应分为两类以上:例如,对手写数字进行分类)
  • Multilabel classification(多标签分类 - 每个输入样本可以分配多个标签。例如,给定的图像可能包含猫和狗,并且应该使用“cat”标签和“dog”标签进行注释。每个图像的标签数量通常是可变的)
  • Scalar regression(标量回归 - 目标是连续标量值的任务。预测房价就是一个很好的例子:不同的目标价格形成了一个连续的空间)
  • Vector regression(向量回归 - 目标是一组连续值的任务:例如,连续向量。对多个值(例如图像中的边界框的坐标)进行回归)
  • Mini-batch or batch(小批量或批量 - 由模型同时处理的一小组样品(通常在8到128之间)。 样本数通常是2的幂,以便于在GPU上进行内存分配。训练时,使用小批量计算应用于模型权重的单个梯度下降更新。)

二、评估机器学习模型

查看GitHub源码

1、训练、验证和测试集
  三个经典的评估方法:
  1) Hold-out validation(保留验证)
  将一部分数据分开作为测试集。训练剩余数据,并在测试集上进行评估。为了防止信息泄漏,不应该根据测试集调整模型,因此还应该保留验证集。
深度学习(Python)-- 机器学习的基础知识_第1张图片
  2)K-fold cross-validation(交叉检验)
  可以将数据拆分为相同大小的K个分区。 对于每个分区i,在剩余的K-1分区上训练模型,并在分区i上进行评估。最终得分是获得的K得分的平均值。
  当模型的性能根据traintest分割显示出显着差异时,此方法很有用。 与Hold-out validation一样,此方法不会免除使用不同的验证集进行模型校准。
深度学习(Python)-- 机器学习的基础知识_第2张图片
  3)iterated K-fold validation with shuffling(带有改组的迭代K-fold验证)
2、要记住的事情
  1)在将数据拆分为训练集和测试集之前,通常应该随机随机地重新调整数据。
  2)时间的箭头 - 试图预测过去的未来(例如,明天的天气,股票走势等),不应该在拆分数据之前随机进行数据清洗,应始终确保测试集中的所有数据都位于训练集中的数据之后。
  3)确保您的训练集和验证集不相交。

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

1、神经网络的数据预处理
  数据预处理旨在使手头的原始数据更适合神经网络。 这包括矢量化,标准化,处理缺失值和特征提取。
  神经网络中的所有输入和目标必须是浮点数据的张量(或者,在特定情况下,是整数的张量)。 无论需要处理什么数据 - 声音,图像,文本 - 必须首先转变为张量,这一步称为数据矢量化。
  一般来说,输入采用相对较大值的神经网络数据(例如,多位数整数,比网络权重所采用的初始值大得多)或异构数据(对于例如,一个特征在0-1范围内而另一个特征在100-200范围内的数据。这样做会触发大的梯度更新,从而阻止网络收敛。为了使网络更容易学习,数据应具有以下特征:

  • Take small values - 通常,大多数值应在0-1范围内。
  • Be homogenous - 也就是说,所有特征都应该在大致相同的范围内取值

  此外,以下更严格的规范化实践很常见并且可以提供帮助,但并不总是必要的(例如,您没有在数字分类示例中执行此操作):

  • 单独标准化每个特征,使其平均值为0。
  • 单独标准化每个特征以使标准偏差为1。
    在这里插入图片描述
      注意,如果你期望测试数据中缺少值,但网络已经过数据训练而没有任何缺失值,则网络将不会学会忽略缺失值! 在这种情况下,应该人为地生成缺少条目的训练样本:多次复制一些训练样本,并删除测试数据中可能缺少的一些功能。

2、特征工程
  特征工程是使用自己的数据知识和手头的机器学习算法的过程,通过在数据进行之前对数据应用硬编码(非学习)转换,使算法更好地工作进入模型。在许多情况下,期望机器学习模型能够从完全任意的数据中学习是不合理的。需要以一种使模型工作更容易的方式将数据呈现给模型。

四、过度拟合和欠拟合

查看GitHub源码

  机器学习的根本问题是优化和泛化之间的紧张关系。优化是指调整模型以在训练数据(机器学习中的学习)上获得最佳性能的过程,而泛化是指训练模型对之前从未见过的数据的执行情况。
  在训练开始时,优化和泛化是相关的:训练数据的损失越低,测试数据的损失越低。在对训练数据进行了一定数量的迭代之后,泛化停止了改进,验证指标停滞了然后开始降级:模型开始过度拟合。
  最好的解决方案是获得更多的训练数据。如果无法做到这一点,调整允许模型存储的信息量,或者为允许存储的信息添加约束。以这种方式对抗过度拟合的处理称为正则化。回顾一些最常见的正则化技术,并在实践中应用它们来改进前面的电影分类模型。
  减少过度拟合的四种方法:

  • Getting more training data
  • Reducing the capacity of the network
  • Adding weight regularization
  • Adding dropout.

1、 缩小网络的大小
  防止过度拟合的最简单方法是减小模型的大小:模型中可学习参数的数量(由层数和每层单元数决定)。在深度学习中,模型中可学习参数的数量通常被称为模型的容量。具有更多参数的模型具有更多的记忆能力,因此可以容易地在训练样本和它们的目标之间学习完美的字典式映射 - 没有任何泛化能力的映射。始终牢记这一点:深度学习模型倾向于擅长拟合训练数据,但真正的挑战是泛化,而不是拟合。模型不应该缺乏记忆资源,在容量过大和容量不足之间存在折衷。
  但是,没有确定的公式来确定每层的正确数量或正确的大小。必须评估一组不同的体系结构(当然不在测试集上,在验证集上),以便为数据找到正确的模型大小。查找适当模型大小的一般工作流程是从相对较少的图层和参数开始,并增加图层的大小或添加新图层,直到看到有关验证丢失的收益递减。
电影评论分类网络的例子试一试:

  1)原始网络和较小网络的验证loss的比较:
深度学习(Python)-- 机器学习的基础知识_第3张图片
  结果:较小的网络开始过度拟合的时间晚于原网络(在6个时期之后而不是4个时期),并且一旦开始过度拟合,其性能就会降低得慢得多。
  具有更高容量的模型版本:
深度学习(Python)-- 机器学习的基础知识_第4张图片
深度学习(Python)-- 机器学习的基础知识_第5张图片
  在一个epoch之后,更大的网络几乎立即开始过度拟合,并且更严重地过度拟合。它的验证loss也更加嘈杂。
  较大的网络很快就会使其训练loss接近于零。网络容量越大,能够越快地对训练数据进行建模(导致训练loss低),但过度拟合的可能性越大(导致训练loss和验证loss之间的差异很大)。
2、 加权正则化
  给定一些训练数据和网络架构,有多组权重值(多个模型)可以解释数据,而简单模型比复杂模型更不容易过度拟合。“简单模型”是一个具有较少参数的模型。因此,减轻过度拟合的常见方法是通过强制其权重仅采用较小的值来对网络的复杂性施加约束,这使得权重值的分布更“规则”。这被称为“权重正则化”,并且通过向网络的损失函数添加与具有大权重相关联的cost来完成。这个cost有两种:

  • L1正则化,其中所添加的成本与权重系数的绝对值成比例。
  • L2正则化,其中所添加的成本与权重系数的值的平方成比例。L2正则化在神经网络的背景下也称为权重衰减。

  在Keras中,通过将权重正则化实例作为关键字参数传递给层来添加权重正则化。
  以电影评论分类网络中添加L2权重正则化为例:
深度学习(Python)-- 机器学习的基础知识_第6张图片
  结果:具有L2正则化(点)的模型已经变得比参考模型(交叉)更能抵抗过度拟合,即使两个模型具有相同数量的参数。作为L2正规化的替代方案,可以使用以下Keras重量正则化器之一:
深度学习(Python)-- 机器学习的基础知识_第7张图片
3、 添加dropout
  dropout应用于层,包括在训练期间随机“退出”(即设置为零)该层的多个输出特征。假设一个给定的层通常会在训练期间为给定的输入样本返回一个向量[0.2,0.5,1.3,0.8,1.1]; 在应用了丢失之后,该向量将具有随机分布的几个零条目,例如:[0,0.5,1.3,0,1.1]。
  "dropout rate” 是被淘汰的特征的一部分; 它通常设置在0.2和0.5之间。在测试时,图层的输出值按照等于dropout rate的因子按比例缩小。
  在IMDB网络中添加两个Dropout图层,看看它们在减少过度拟合方面做得如何:
深度学习(Python)-- 机器学习的基础知识_第8张图片

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

1、定义问题并组装数据集
  1)输入数据是什么? 想要预测什么?
  2) 面临什么类型的问题? 是二元分类吗? 多类分类? 标量回归? 矢量回归? 多类,多标签分类?识别问题类型将指导我们去选择模型体系结构,损失函数等。
2、选择成功的衡量标准
  对于balanced-classification问题,每个类别同样可能,接收器操作特性曲线(ROC AUC)下的准确度和面积是常见的度量标准。
  对于class-imbalanced的问题,可以使用precision and recall。
  对于ranking问题或multilabel classification分类,可以使用average precision。
  或者定义自己的自定义指标,Kaggle(https://kaggle.com)浏览数据科学竞赛展示了广泛的问题和评估指标。

3、决定评估方案
  三种常见的评估协议:

  • Maintaining a hold-out validation set:拥有大量数据时的方法。
  • Doing K-fold cross-validation:样本太少时的方法。
  • Doing iterated K-fold validation:当有少量数据可用时,执行高度精确的模型评估只需选择其中一个即可。 在大多数情况下,第一个将足够好。

4、准备数据

  • 数据应格式化为张量。
  • 这些张量所取的值通常应缩放为较小的值:例如,在[-1,1]范围或[0,1]范围内。
  • 如果不同的特征采用不同范围的值(异构数据),则应对数据进行标准化。
  • 可能需要进行一些特征工程,尤其是小数据问题。

  一旦输入数据和目标数据的张量准备就绪,就可以开始训练模型。

5、开发一个比baseline更好的模型
  需要做出三个关键选择来构建第一个工作模型:

  • Last-layer activation:例如,IMDB分类示例在最后一层使用了sigmoid; 回归示例没有使用任何最后一层激活; 等等。
  • Loss function:例如,IMDB示例使用binary_crossentropy,回归示例使用mse,依此类推。
  • Optimization configuration:在大多数情况下,使用rmsprop及其默认学习速率是安全的。
    深度学习(Python)-- 机器学习的基础知识_第9张图片
    6、扩大规模:开发一个过度拟合的模型
      要弄清楚你需要多大的模型,你必须开发一个过度拟合的模型。方法:
  • Add layers.
  • Make the layers bigger.
  • Train for more epochs.

  当看到模型在验证数据上的性能开始下降时,就已经实现了过度拟合。下一阶段是开始正规化和调整模型,以尽可能接近理想的模型,既不欠拟合也不过度拟合。

7、调整模型和超参数
  方法:

  • Add dropout.
  • Try different architectures: add or remove layers.
  • Add L1 and/or L2 regularization.
  • Try different hyperparameters(例如每层的单位数或优化程序的学习率)以找到最佳配置
  • Optionally, iterate on feature engineering:添加新功能,或删除似乎没有提供信息的功能。

本章总结

  1. 定义手头上的问题和要训练的数据。收集这些数据,或者在需要时用标签对其进行注释。
  2. 选择如何衡量问题的成功。将监控验证数据的哪些指标?
  3. 确定评估方案:hold-out验证?K-fold验证?应该使用数据的哪个部分进行验证?
  4. 开发比基本baseline更好的第一个模型:具有统计能力的模型。
  5. 开发一个过度拟合的模型。
  6. 根据验证数据的性能调整模型并调整其超参数。很多机器学习研究倾向于只关注这一步,但要记住大局。

你可能感兴趣的:(Deep,Learning,with,Python)