这一章标题为机器学习的基本原理,其中有很详细的讨论。

4.1 机器学习的4个分支

4.1.1 监督学习

给定样本集合,学习将输入数据映射到已知目标。大部分的都属于这种。

包括optical  character  recognition,  speech  recognition,  image classification, and language translation,Sequence  generation,Syntax tree prediction,Object detection,Image segmentation等。

4.1.2 无监督学习

不设定标签,仅从输入数据中找出有趣的转换(原文interesting transformations)。目标是data visualization, data compression, or data
denoising,  or  to  better  understand  the  correlations  present  in  the  data  at  hand。经常在监督学习前使用无监督学习以更好地理解数据集。降维和聚类(dimensionality reduction and clustering)是其中著名的类别。

4.1.3 自监督学习

不使用人为标签,而是通过如启发式算法,学习从输入数据中推导出自己的分类。如自动编码机和从之前视频帧预测下一帧,从之前单词预测下一单词,监督来自于未来的输入。

4.1.4 强化学习

从其环境中获取信息并学习选择使收益最大化的操作。自从Google DeepMind 成功应用开始获得大量关注,暂时处于研究阶段。

4.2 评估机器学习模型

机器学习中,核心目标是使得模型更为通用,主要的阻碍是过拟合(在测试集上的表现不如训练集)

4.2.1 训练、验证、测试集

我们的数据原始状态为一个集合,首先将其分成训练数据和测试数据,验证数据则是从训练数据中分出部分得来的。

为什么需要验证集?因为模型的训练必然伴随着参数的优化,使用模型在验证集上的表现作为反馈信号,从而逐步将参数调优。

然而,每次由验证集反馈后,就从验证集上产生了信息泄露,即验证集的信息泄露进模型中。经过一定次数(epochs)后,模型在验证集上产生过拟合。

测试集则是用于模型训练好后评估模型是否足够好。

分出验证集,有如下方法:

1.直接从训练集分出

步骤:打乱训练集、分出若干训练集作为验证集

2.K-fold validation

将训练集分出K份等大的部分,依次将一个部分作为验证集,其余部分作为训练集,结果取平均。如果使用简单分出部分策略时,你的模型随着训练-测试集的不同划分而表现出巨大差异时,此方法可能很有帮助。

3.Iterated K-fold validation with shuffling

当你可使用的数据特别少时,此方法可以让你更为准备地评估模型。它包括使用K-fold validation——打乱数据——K-fold validation的若干循环,结果取平均。

4.2.2 需要牢记的事情

数据代表性:使数据在训练集和测试集间保持均匀,打乱数据后再划分。

时间因素:当你是一个基于时间的回归预测问题时,此时不能打乱数据。

数据冗余:保持训练集与验证集的互斥性,即不能在2个区域出现同样的数据。

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

4.3.1 神经网络中的数据预处理

往往收集的数据五花八门,我们需要将其处理成适合神经网络的格式。

向量化:所有的输入和标签都应该是浮点数或整型的张量。

标准化:你的数据应该满足小值均匀的条件。更严格一点,你应该使某个特征的数据具有平均值为0标准差为1的特性。这可以通过如下操作实现:

x -= x.mean(axis=0)
x /= x.std(axis=0)

处理丢失数据:你可以将丢失数据设置为0,当你期望测试数据中出现丢失值时,你可以拷贝后丢失某些特征。

4.3.2 特征工程

神经网络使得你不必费力去提取特征,但是好的特征不仅可以使你快速地训练模型,还可以使用更少的数据。

4.4 过拟合与欠拟合

机器学习中的一个基本问题是优化与通用的平衡。优化代表模型在训练集上的表现提升,通用代表模型在新数据上表现良好。

模型训练开始时,训练集上验证集上的loss都在减少,此时处于欠拟合阶段;当每个临界点过去后,模型在训练集上虽然loss持续减少,但在验证集上的loss却开始上升,此时出现过拟合。过拟合出现时,模型将学习到一些仅属于训练集的行为方式,而这些行为方式在新数据上并不存在。也就是说它开始学习了一些普遍性之外的特性。

最好的方法是获得足够大的训练集,其次是限制模型允许存储的信息种类和数量。过拟合从处理过程称为正则化。

4.4.1 减小网络大小

这是抑制过拟合的最简单方式。因为越大的网络,越容易学习到不必要的东西。

4.4.2 添加权重正则化

包括L1和L2正则化,我觉得不错的解释:L1与L2正则化解释

4.4.3 添加dropout

训练过程中,随机地将谋layer的输出特征进行一些丢弃,一般在20%到50%之间。通过dropout引入噪音可以解决不重要的偶然行为。

4.5 机器学习的普遍流程

4.5.1 定义问题与收集数据

这里引用原文:

1,What will your input data be? What are you trying to predict? You can only learn to predict
something if you have available training data: for example, you can only learn to classify
the sentiment of movie reviews if you have both movie reviews and sentiment annotations
available. As such, data availability is usually the limiting factor at this stage (unless you
have the means to pay people to collect data for you)

2,What type of problem are you facing? Is it binary classification? Multiclass classification?
Scalar regression? Vector regression? Multiclass, multilabel classification? Something else,
like  clustering,  generation,  or  reinforcement  learning?  Identifying  the  problem  type  will
guide your choice of model architecture, loss function, and so on.

非稳定性问题:你不能根据股票的历史价位预测出走势,因为信息不够。也不能根据夏天衣物购买情况预测冬天的情况,因为季节不同。预测的核心假设是未来的行为表现和过去一致。

4.5.2 选择衡量成功的标准

对于平衡分类问题,即每个分类的可能性一样,通用的标准是ROC AUC(接收机工作特性曲线下的面积),对于非平衡问题,可以使用精度或recall,对于排序或多标签问题,可以使用平均精度。

4.5.3 评价方案的选择

如前所述

hold-out validation set:当你又大量数据时

K-fold cross-validation:少量数据时

iterated K-fold validation:少量数据时保持高精度

4.5.4 预准备数据

格式化为张量;缩放到小值;标准化;特征工程(特别是小量数据)

4.5.5 开发优于基线的模型

基线指的是随机情况下的表现。构建模型的关键选择:

最后层的激活函数:sigmod or none

损失函数:可在小批量数据上计算,可微。binary_crossentropy,mse or categorical_crossentropy...

优化器:rmsprop,adam等等

分类标准ROC AUC并不能直接被优化,一般以交叉熵替代。

如图是一个简单介绍:

Deep Q Learning的python代码 deep learning with python second edition_机器学习

 4.5.6 开发过拟合模型

只有经过过拟合,才能知道过拟合的临界点在哪。方式:

添加layers;扩大layers;循环更多次数

4.5.7 正则化和调节超参数

这步是最花时间的。

1,Add dropout.

2,Try different architectures: add or remove layers.

3,Add L1 and/or L2 regularization.

4,Try different hyperparameters (such as the number of units per layer or the learning rate of
the optimizer) to find the optimal configuration.

5,Optionally, iterate on feature engineering: add new features, or remove features that don’t
seem to be informative.

超参数:一些预设的参数,而非学习调整优化的参数。如隐藏层数量及维度,学习率,batch_size,epochs等