说明:
1. Keras学习记录的参考书是:《Python深度学习》;
2. 本篇记录的是第一部分(3-4章)的知识点汇总,详情见书;
1. 机器学习基础:
基础概念:
1. 监督学习:
给定一组带标注的样本,模型可以学会将输入数据映射到标注上。
**监督学习可分为:分类和回归;**具体主要包括:序列生成 (sequence generation)、语法树预测 (syntax tree prediction)、目标检测 (object detection) 和 图像分割 (image segmentation)。
2. 无监督学习:
在没有标注的情况下,模型根据输入数据,从中寻找出规律;其目的在于数据可视化、数据压缩、数据去燥或者更好地理解数据中的相关性。
无监督学习可以分为:降维 (dimensionality reduction) 和 聚类 (clustering)。
3.自监督学习:
自监督学习 是没有人工标注的标签的监督学习(本质还是监督学习,只是没有人为参与。标签依然存在,但是由模型自己从输入数据中学到的)。
比如:给定视频中的过去帧来预测下一帧,或者给定文本中前面的词来预测下一个词。
4. 强化学习:
在强化学习中,智能体 (agent) 接收与其相关的环境信息,并学会选择使用某种奖励最大化的行动。
5. 模型评估:
1. 数据集划分:
将数据集划分为 训练集、验证集和测试集。由于模型由多个超参数(比如 层数、每层大小、训练次数、学习率等)需要确定,所以需要利用模型在验证集上的性能作为反馈信号,以此调节模型超参数,得到最优的超参数组合。
测试集是绝对不可以用到模型训练中的。
2. 留出验证 (hold-out validation):
从训练集中留出一定比例的数据作为测试集,剩余数据作为训练集训练模型,然后在测试集上评估模型。
优点:操作简单;缺点:如果数据较少,那么验证集和测试集的数据就很少,不具有统计学上的意义。
3. K折交叉验证 (K-fold cross validation):
将数据集分为大小相同的 K 份,对每一份而言,每次选一份作为验证集,剩下的 K-1 份作为训练集。最终得到 K 个评估分数,取均值作为最终得分。
4. 带有打乱数据的重复 K 折验证 (iterated K-fold validation with shuffling):
如果数据相对较少,但又要尽可能精确地评估模型,那么可以选择该方法。
具体做法就是多次使用 K 折验证,每次将数据集划分为 K 份之前,先将顺序打乱。最终分数是每次可这验证分数的平均值。
这个方法一共要训练和评估 P x K 个模型 (P为训练次数),计算代价很大。
5. 模型评估的注意事项:
**1. 数据代表性:**尽可能确保训练 (验证集) 和测试集中样本标签包含全部标签种类,所以在划分训练集和测试集之前,通常需要将数据随机打乱。
**2. 时间箭头:**如果想用过去的数据预测未来,那么不能直接将数据进行随机打乱,而是要确保测试集中所有数据的时间都晚于测试集数据。
**3. 数据冗余:**一定要保证训练集和测试集之间没有交集。
6. 数据预处理:
1. 数据向量化 (data vectorization):
神经网络的所有输入和目标必须都是浮点数张量。无论是声音、图像还是文本,都需要转化成浮点数张量的形式。
2. 值标准化:
不同来源的数据或者不同的特征,有不同的取值范围,这种情况下需要对特征值进行标准化处理。
输入数据应该具有:取值较小(大部分值在0-1之间)和同质性(所有特征取值都应该在大致相同的范围内)。
通常用的标准化处理方法是:将每个特征分别标准化,都变成均值为0,标准差为1的数值分布。
3. 处理缺失值:
如果数据中存在缺失值,那么一般来说将缺失值设置为 0 是可以的(只要 0 不是一个有意义的值)。
4. 特征工程:
将数据输入模型之前,利用先验知识对数据进行 硬编码 的变换(不是模型自己学到的),以改善模型的效果。
特征工程对于传统的统计机器学习比较重要,而对于现代深度学习而言,大部分情况下是不需要特征工程的,但是良好的特征仍有助于提升模型性能。
7. 过拟合 (underfit)和欠拟合(overfit):
过拟合存在于所有的机器学习模型中,因此如何处理过拟合对于掌握机器学习至关重要。
**机器学习的根本问题是:优化和泛化之间的对立。
优化 (optimization) 指调节模型以在训练集上得到最佳性能 (即 学习的过程)。
泛化 (generalization) 指的是训练好的模型在前所未见的数据上的性能好坏。
训练开始时,优化和泛化是相关的:训练数据上的损失越小,测试数据上的损失也越小,这时模型是欠拟合的,模型仍有改进空间。
随着训练次数增加,泛化不在提高,验证指标先不变,然后开始变差,模型开始过拟合。
为降低模型过拟合,需要用到一些正则化方法 (regularization),如下所述:
- 减小网络大小 (减小模型的层数、隐藏单元个数等);
- 添加权重正则化 (强制让模型权重只能去较小的值,从而限制模型的复杂度。比如 L1 正则化、L2正则化);
- 添加 dropout 正则化 (对某一层使用dropout,就是在训练过程中随机将该层的一些输出特征舍弃 (设置为0)。dropout比率 指的是被设置为0的特征所占的比例,通常刚在0.2-0.5之间)
机器学习的通用流程:
- 定义问题,收集数据。
- 选择衡量指标 (精度 accuracy、准确率 precision、召回率 recall等)。对于平衡分类问题,精度和AUC是常用指标;对于类别不平衡的问题,可以用准确率和召回率;对于排序问题或多标签分类,可以用平均准确率均值 (mean average precision)。
- 确定评估方法 (留出验证 (数据量很大时),K折交叉验证 (样本量较少),重复的K折验证 (样本量太少))。
- 准备数据以及数据预处理。
- 开发比基准更好的模型 (用一个小模型,可以优于纯随机的基准;最后一层激活函数的选取、损失函数的选取、优化器的选取)。
问题类型 | 最后一层激活 | 损失函数 |
---|---|---|
二分类问题 | sigmoid | binary_crossentropy |
多分类、单标签问题 | softmax | categorical_crossentropy |
多分类、多标签问题 | sigmoid | binary_crossentropy |
回归到任意值 | 无 | mse |
回归到0-1之间的值 | sigmoid | mse 或者 binary_crossentropy |
- 扩大模型规模 (增加层数、增加隐藏单元个数、训练更多次数)。
- 模型正则化与超参数调节 (降低模型过拟合,添加 drop、添加 L1或L2正则化、尝试不同超参数 (比如每层隐藏单元个数、优化器的学习率)、尝试不同的架构 (增加或减少层数)、重复做特征工程 (可选项))。
- 得到最优的模型配置之后,用完整的训练集 (包括训练集和测试集) 训练最终的模型,并在测试集做最后的评估。
2. 神经网络入门:
基础概念:
1. 层(基础组件):
神经网络的基本数据结构是层。
层是一个数据处理的模块。
有些层是无状态的,但大多数层是有状态的(即 层的权重)。
不同的张量格式与不同的数据处理类型需要用不同的层:
2D (samples, features)张量数据(比如简单的向量数据),用全连接层 fully connected layer(也称为 密集层 dense layer);
3D (samples, timesteps, features)张量数据(比如 序列数据),用循环层 recurrent layer(比如 LSTM);
4D (samples, height, width, channels)张量数据(比如图像数据),用二维卷积层 convolution layer(比如 Conv2D);
2. 模型(层构成的网络):
最常见的模型是层的线性堆叠,但是也有一些其他的网络拓扑结构(比如 双分支 two-branch 网络、多头 multihead 网络、Inception 模块)。
3. 损失函数与优化器:
损失函数(目标函数)——训练过程中需要将其最小化,衡量当前任务是否成功完成。
优化器——如何基于损失函数对网络进行更新。
关于损失函数的选择:
二分类问题 – 二元交叉熵 (binary crossentropy) 损失函数;
多分类问题 – 分类交叉熵 (categorical crossentropy) 损失函数;
回归问题 – 均方误差 (mean-squared error) 损失函数;
序列学习问题 – 联结主义时序分类 (CTC, connectionist temporal classification) 损失函数;
4. 网络架构:
Keras中定义模型的方法有两种:使用Sequential
类(仅适用于 层的线性堆叠);使用 函数式 API
(funational API,用于 层组成的有向无环图,可以构建任意形式的架构)。
实例:
1. 二分类问题:
以电影评论分类为例,将影评的文字内容划分为正面或负面。
详见:http://t.csdn.cn/Y8mIm
2. 多分类问题:
以路透社新闻为例,将其划分为46个互斥的主题。
详见:http://t.csdn.cn/5aieG
3. 回归问题:
以波士顿房价预测为例。
详见:http://t.csdn.cn/M3YBm