《Deeplearning with python》读书笔记-第一部分 机器学习基础、数据预处理、通用工作流程

《Deeplearning with python》读书笔记-第一部分 机器学习基础、数据预处理、通用工作流程

之前已经提到了几个问题,二分类问题,多分类问题,标量回归问题。这些都是监督学习(supervised learning),目标是学习训练输入与训练目标之间的关系。而机器学习实际上可以分为四类:

监督学习

给定一组样本(通常由人工标注),它可以学会将输入数据映射到已知目标[也叫标注(annotation)]。Ex:光学字符识别、语音识别、 图像分类和语言翻译

主要包括分类和回归,但是还有变体,序列生成(sequence generation:给定一张图像,预测描述图像的文字。序列生成有时可以被重新表示为一系列分类问题,比如反复预测序列中的单词或标记。

语法树预测(syntax tree prediction):给定一个句子,预测其分解生成的语法树

目标检测(object prediction):给定一张图像,在图中特定目标的周围画一个边界框。这个问题也可以表示为分类问题(给定多个候选边界框,对每个框内的目标进行分类)或分类与回归联合问题(用向量回归来预测边界框的坐标)。

图像分割(image segmentation):给定一张图像,在特定物体上画一个像素级的掩模(mask)。

无监督学习

无监督学习是指在没有目标的情况下寻找输入数据的有趣变换,其目的在于数据可视化、 数据压缩、数据去噪或更好地理解数据中的相关性。降维(dimensionality reduction)和聚类(clustering都是众所周知的无监督学习方法。

自监督学习

由输入数据自己采用启发式算法生成标签。举个例子,自编码器(autoencoder)是有名的自监督学习的例子,其生成的目标就是未经修改的输入。同样,给定视频中过去的帧来预测下一帧,或者给定文本中前面的词来预测下一个词, 都是自监督学习的例子[这两个例子也属于时序监督学习(temporally supervised learning), 即用未来的输入数据作为监督]。

强化学习

在强化学习中,智能体(agent)接收有关其环境的信息,并学会选择使某种奖励最大化的行动。例如,神经网络会“观察”视频游戏的屏幕并输出游戏操作,目的是尽可能得高分,这种神经 网络可以通过强化学习来训练。

(强化学习是和我的目标最接近的一种学习方式)

训练集、验证集、测试集

分三个的原因在于开发模型时总是需要调节模型配置,比如选择层数或每层大小[这叫作模型的超参数(hyperparameter),以便与模型参数(即权重)区分开]。这个调节过程需要使用模型在验证数据上的性能作为反馈信号。这个调节过程本质上就是一种学习:在某个参数空间中寻找良好的模型配置。

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

在此基础上,如果数据比较少,就需要使用K折验证K 折验证(K-fold validation)将数据划分为大小相同的K 个分区。对于每个分区 i,在剩余的K-1个分区上训练模型,然后在分区 i 上评估模型。最终分数等于K个分数的平均值。

带有打乱数据的重复K 折验证(iterated K-fold validation with shuffling:具体做法是多次使用 K 折验证,在每次将数据划分为 K个分区之前都先将数据打乱。最终分数是每次K 折验证分数的平均值。注意,这种方法一共要训练和评估P×K个模型(P是重复次数),计算代价很大。

评估模型时应注意数据代表性、时间箭头、数据冗余

 

数据预处理

向量化:神经网络的所有输入和目标都必须是浮点数张量(在特定情况下可以是整数张量)。无论处理什么数据(声音、图像还是文本),都必须首先将其转换为张量,这一步叫作数据向量化(data vectorization)。

值标准化:一般来说,将取值相对较大的数据(比如多位整数,比网络权重的初始值大很多)或异质数据(heterogeneous data,比如数据的一个特征在0~1 范围内,另一个特征在100~200 范围内)输入到神经网络中是不安全的。这么做可能导致较大的梯度更新,进而导致网络无法收敛。为了让网络的学习变得更容易,输入数据应该具有以下特征:

取值较小:大部分值都应该在 0~1 范围内。

同质性(homogenous):所有特征的取值都应该在大致相同的范围内。

更严格的标准:

《Deeplearning with python》读书笔记-第一部分 机器学习基础、数据预处理、通用工作流程

3  处理缺失值

一般将神经网络缺失值设置为0是安全的。网络自己就会学到0意味着缺失数据。如果测试数据中可能有缺失值,而网络是在没有缺失值的数据上训练的,那么网络不可能学会忽略缺失值。在这种情况下,需要人为生成一些有缺失项的训练样本:多次复制一些训练样本,然后删除测试数据中可能缺失的某些特征。

 

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

这里的例子就是时钟例子

《Deeplearning with python》读书笔记-第一部分 机器学习基础、数据预处理、通用工作流程

什么信息都不给直接神经网络 < 读取坐标(xy)然后机器学习 < 坐标变换后给出角度,甚至不需要机器学习,用一个字典查找即可。

 

针对过拟合:

为了防止模型从训练数据中学到错误或无关紧要的模式,最优解决方法是获取更多的训练数据。模型的训练数据越多,泛化能力自然也越好。如果无法获取更多数据,次优解决方法是调节模型允许存储的信息量,或对模型允许存储的信息加以约束。如果一个网络只能记住几个模式,那么优化过程会迫使模型集中学习最重要的模式,这样更可能得到良好的泛化。这种降低过拟合的方法叫作正则化(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正则化在数学上是完全相同的。

在 Keras 中,添加权重正则化的方法是向层传递权重正则化项实例(weight regularizer instance)作为关键字参数。

范例:想IMDB数据中添加L2权重正则化

《Deeplearning with python》读书笔记-第一部分 机器学习基础、数据预处理、通用工作流程

《Deeplearning with python》读书笔记-第一部分 机器学习基础、数据预处理、通用工作流程

可以看到验证集损失函数一直维持在0.4左右,而没有使用正则化的时候,损失函数很快就上升到0.7了

l2(0.001) 的意思是该层权重矩阵的每个系数都会使网络总损失增加 0.001 * weight_ coefficient_value。注意,由于这个惩罚项只在训练时添加,所以这个网络的训练损失会比测试损失大很多。

还有其他的正则化方法

《Deeplearning with python》读书笔记-第一部分 机器学习基础、数据预处理、通用工作流程

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 范围内。测试时没有单元被舍弃,而该层的输出值需要按dropout 比率缩小,因为这时比训练时有更多的单元被**,需要加以平衡。

核心思想是在层的输出值中引入噪声,打破不显著的偶然模式(Hinton 称之为阴谋)。如果没有噪声的话,网络将会记住这些偶然模式

《Deeplearning with python》读书笔记-第一部分 机器学习基础、数据预处理、通用工作流程

添加dropout的方法非常简单,如上所示即可将dropout应用到前一层的输出

 

 

****机器学习通用工作流程

定义问题:输入数据是什么?预测什么?问题的类型是什么?

有些问题可能无法解决,即非平稳问题。

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

确定评估方法:留出验证集;K折交叉验证;重复的K折验证

准备数据:格式化为张量,缩放,数据标准化,特征工程

构建模型:(比随机的好一点即可)

最后一层的**,sigmoid,softmax

损失函数binary_crossentropy,mse

优化配置,学习率,一般使用rmsprop和默认的学习率

《Deeplearning with python》读书笔记-第一部分 机器学习基础、数据预处理、通用工作流程

扩大模型规模(可以过拟合)

模型正则化、调节超参数:添加dropout,尝试不同的架构、添加L1\L2正则化、尝试不同的超参数、反复做特征工程(可选,添加新特征或删除没有信息量的特征)