前言:
这就是用写笔记的方式鞭笞自己学习,顺便梳理自己的思路,也尽量整理得有逻辑一点。标记了*的是有代码可以参考的部分
本书框架:
第一部分:深度学习基础
- 深度学习简介
- 数学基础
- 神经网络入门
- 机器学习基础
第二部分:深度学习实践
- 计算机视觉
- 文本与序列
- 高级深度学习实践
- 生成式深度学习
- 总结
第一部分:深度学习基础
1. 简介:
1.1 人工智能,机器学习,深度学习:
大概介绍了3中定义的差别,和神经网络的几个参数和专有名词,适合刚入门的孩子仔细看看。
1.2 机器学习简史:
- 概率建模:朴素贝叶斯方法/逻辑回归
- 早期神经网络
- 核方法:svm(数据映射到高纬度,映射到高平面,且使所有点之间间距最大,其中的核心为核函数(人为选择):计算点之间的距离,只有分割超平面是学习得到。缺点:适用于小数量级
- 决策树:随机森林,梯度提升(gradient boosting machine)
结论:多混迹kaggle
1.3 why now:
- 硬件
- 数据
- 算法改进
2. 数学基础:
2.1 神经网络结构*
神经网络主要参数:
- 损失函数:
- 优化器:
- 在训练和测试中需要监控的指标:
2.2 数据表示:
张量的特殊属性:
- 轴的个数
- 形状
- 数据类型
2.3 张量运算:
- 逐元素运算
- 广播:较小的张量会被广播(broadcast),以匹配较大张量的形状。
- (1) 向较小的张量添加轴(叫作广播轴),使其ndim与较大的张量相同。
- (2) 将较小的张量沿着新轴重复,使其形状与较大的张量相同。
- 点积
- 变形(reshape)
深度学习的目的:为复杂的、高度折叠的数据流形找到简洁的表示。 :它将复杂的几何变换逐步分解 为一长串基本的几何变换,这与人类展开纸球所采取的策略大致相同。深度网络的每一层都通 过变换使数据解开一点点——许多层堆叠在一起,可以实现非常复杂的解开过程
2.4 梯度(优化):
- mini-batch stochastic gradient descent 梯度优化:
- 动量方法(解决梯度问题的难点:收敛速度和局部极小点): w 不仅要考虑当前的梯度值,还要考虑上一次的参数更新
总结:
- 学习是指找到一组模型参数,使得在给定的训练数据样本和对应目标值上的损失函数最 小化。
- 学习的过程:随机选取包含数据样本及其目标值的批量,并计算批量损失相对于网络参 数的梯度。随后将网络参数沿着梯度的反方向稍稍移动(移动距离由学习率指定)。
- 整个学习过程之所以能够实现,是因为神经网络是一系列可微分的张量运算,因此可以 利用求导的链式法则来得到梯度函数,这个函数将当前参数和当前数据批量映射为一个 梯度值。
- 后续几章你会经常遇到两个关键的概念:损失和优化器。将数据输入网络之前,你需要 先定义这二者。
- 损失是在训练过程中需要最小化的量,因此,它应该能够衡量当前任务是否已成功解决。
- 优化器是使用损失梯度更新参数的具体方式,比如 RMSProp 优化器、带动量的随机梯度下降(SGD)等。
3. 神经网络入门
3.1 神经网络结构简介:
- 二分类问题,你可以使用二元交叉熵(binary crossentropy)损 失函数
- 对于多分类问题,可以用分类交叉熵(categorical crossentropy)损失函数
- 对于回归 问题,可以用均方误差(mean-squared error)损失函数
- 对于序列学习问题,可以用联结主义 时序分类(CTC,connectionist temporal classification)损失函数
3.2 keras:
Keras 有三个后端实现:TensorFlow 后端、 Theano 后端和微软认知工具包(CNTK,Microsoft cognitive toolkit)后端,可以实现随时切换。
3.3 如何运行:
3.4 二分类问题*
- 通常需要对原始数据进行大量预处理,以便将其转换为张量输入到神经网络中。单词序
列可以编码为二进制向量,但也有其他编码方式。 - 带有 relu 激活的 Dense 层堆叠,可以解决很多种问题(包括情感分类),你可能会经常用到这种模型。
- 对于二分类问题(两个输出类别),网络的最后一层应该是只有一个单元并使用 sigmoid激活的 Dense 层,网络输出应该是 0~1 范围内的标量,表示概率值。
- 对于二分类问题的 sigmoid 标量输出,你应该使用 binary_crossentropy 损失函数。
- 无论你的问题是什么,rmsprop 优化器通常都是足够好的选择。这一点你无须担心。
- 随着神经网络在训练数据上的表现越来越好,模型最终会过拟合,并在前所未见的数据上得到越来越差的结果。一定要一直监控模型在训练集之外的数据上的性能。
3.5 多分类问题*
最后的输出变成了46
- 网络的最后一层是大小为 46 的 Dense 层。这意味着,对于每个输入样本,网络都会输出一个 46 维向量。这个向量的每个元素(即每个维度)代表不同的输出类别。
- 最后一层使用了 softmax 激活。你在 MNIST 例子中见过这种用法。网络将输出在 46个不同输出类别上的概率分布——对于每一个输入样本,网络都会输出一个 46 维向量,其中 output[i] 是样本属于第 i 个类别的概率。46 个概率的总和为 1。
损失 函数 categorical_crossentropy,标签应该遵循分类编码。(分类label)
对于整数标签,你应该使用 sparse_categorical_crossentropy。(整数?)
中间维度需要足够大:信息瓶颈(中间信息压缩太过于明显)
总结:
- 如果要对 N 个类别的数据点进行分类,网络的最后一层应该是大小为 N 的 Dense 层。
- 对于单标签、多分类问题,网络的最后一层应该使用 softmax 激活,这样可以输出在 N个输出类别上的概率分布。
- 这种问题的损失函数几乎总是应该使用分类交叉熵。它将网络输出的概率分布与目标的真实分布之间的距离最小化。
- 处理多分类问题的标签有两种方法。
- 通过分类编码(也叫 one-hot 编码)对标签进行编码,然后使用 categorical_ crossentropy 作为损失函数。
- 将标签编码为整数,然后使用 sparse_categorical_crossentropy 损失函数。
- 如果你需要将数据划分到许多类别中,应该避免使用太小的中间层,以免在网络中造成信息瓶颈。
3.6 回归问题*
构建回归问题的时候,最后一层可以不要激活函数。
- 回归问题使用的损失函数与分类问题不同。回归常用的损失函数是均方误差(MSE)。
- 同样,回归问题使用的评估指标也与分类问题不同。显而易见,精度的概念不适用于回归问题。常见的回归指标是平均绝对误差(MAE)。
- 如果输入数据的特征具有不同的取值范围,应该先进行预处理,对每个特征单独进行缩放。
- 如果可用的数据很少,使用 K 折验证可以可靠地评估模型。
- 如果可用的训练数据很少,最好使用隐藏层较少(通常只有一到两个)的小型网络,以避免严重的过拟合。
4. 机器学习基础
4.1 四个主要分支:
- 监督学习:序列生成,语法树预测,目标监测,图像分割
- 无监督学习:降维/聚类
- 自监督学习:时序监督学习,前面的预测之后的
- 强化学习:暂时停留于理论
4.2 评估:
注意:
- 基于模型在验证集上的性能来调节模型配置,会很快导致模型在验 证集上过拟合,即使你并没有在验证集上直接训练模型也会如此(信息泄漏)
- 如果是标签类特征,需要按层抽样
- 符合时间顺序,用过去预测未来
- 重复数据:保证训练集与测试集的独立性
重复K折验证(iterated K-fold validation with shuffling):
具体做法是多次使用K折验证,在每次将数据划分为K个分区之前都先将数据打乱。最终分数是每次 K 折验证分数的平均值。注意,这种方法一共要训练和评估 P×K 个模型(P 是重复次数),计算代价很大
4.3 数据预处理,特征工程:
神经网络的数据预处理:
- 向量化
- 标准化:取值较小且在同个区间范围
- 缺失值:设置成0是很安全的
- 特征工程:用更简单的方式表述问题,从而使问题变得更容易
特征工程对神经网络的提升不大?
- 良好的特征仍然可以让你用更少的资源更优雅地解决问题。例如,使用卷积神经网络来 读取钟面上的时间是非常可笑的。
- 良好的特征可以让你用更少的数据解决问题
4.4 过拟合与欠拟合*
模型好坏的评价之一:
- 优化(optimization)是指调节模型以在训练数据上得到最佳性能
- 泛化(generalization)是指训练好的模型在 前所未见的数据上的性能好坏
过拟合:
训练数据上迭代一定次数之后,泛化不再提高,测试集测试时先是不变,然后开始变差, 即模型开始过拟合
降低过拟合的方法:正则化
- 获取更多数据
- 减少网络大小:
- 模型中可学习参数的个数通常被称为模型的容量 (capacity),模型越大容量越大
- 工作流程:前期选择简单模型,然后逐渐增加层数,优化
- 权重正则化
- dropout方法
4.5 机器学习的通用工作流程:
- 定义问题与要训练的数据。收集这些数据,有需要的话用标签来标注数据。注意非平稳的周期性数据,需要把时间维度作为输入。
- 选择衡量问题成功的指标。你要在验证数据上监控哪些指标?
- 确定评估方法:留出验证? K 折验证?你应该将哪一部分数据用于验证?
- 开发第一个比基准更好的模型,即一个具有统计功效的模型。
- 开发过拟合的模型。
- 基于模型在验证数据上的性能来进行模型正则化与调节超参数。
- 一旦开发出令人满意的模型配置,你就可以在所有可用数据(训练数据 + 验证数据)上训 练最终的生产模型