深度学习-基础
概述
深度学习
核心要素:
- 数据(data)
- 样本
- 独立同分布
- 包含特征(feature)
- 模型(model)
- 目标函数(objective function)、损失函数:优化的目标
- 平方误差
- 学习算法(algorithm):优化目标的算法
2. 梯度下降
学习方式
监督学习
离线学习,输入是从环境取出处理的
- 回归
- 分类
- 标签分类(多结果)
- 序列预测
无监督学习
- 聚类
- PCA
- 因果分析
- GAN
强化学习

|
|
深度学习的发展
大约 2010 年开始,那些在计算上看起来不可行的神经网络算法变得热门起来,实际上是以下两点导致的: 其一,随着互联网的公司的出现,为数亿在线用户提供服务,大规模数据集变得触手可及; 另外,廉价又高质量的传感器、廉价的数据存储(克莱德定律)以及廉价计算(摩尔定律)的普及,特别是 GPU 的普及,使大规模算力唾手可得。
表: 数据集 vs 计算机内存和计算能力
| 年代 | 数据规模 | 内存 | 每秒浮点运算 |
|---|---|---|---|
| 1970 | 100 (鸢尾花卉) | 1 KB | 100 KF (Intel 8080) |
| 1980 | 1 K (波士顿房价) | 100 KB | 1 MF (Intel 80186) |
| 1990 | 10 K (光学字符识别) | 10 MB | 10 MF (Intel 80486) |
| 2000 | 10 M (网页) | 100 MB | 1 GF (Intel Core) |
| 2010 | 10 G (广告) | 1 GB | 1 TF (Nvidia C2050) |
| 2020 | 1 T (社交网络) | 100 GB | 1 PF (Nvidia DGX-2) |
很明显,随机存取存储器没有跟上数据增长的步伐。 与此同时,算力的增长速度已经超过了现有数据的增长速度。 这意味着统计模型需要提高内存效率(这通常是通过添加非线性来实现的),同时由于计算预算的增加,能够花费更多时间来优化这些参数。 因此,机器学习和统计的关注点从(广义的)线性模型和核方法转移到了深度神经网络。 这也造就了许多深度学习的中流砥柱,如多层感知机 (McCulloch and Pitts, 1943) 、卷积神经网络 (LeCun et al., 1998) 、长短期记忆网络 (Graves and Schmidhuber, 2005) 和 Q 学习 (Watkins and Dayan, 1992) ,在相对休眠了相当长一段时间之后,在过去十年中被“重新发现”。
最近十年,在统计模型、应用和算法方面的进展就像寒武纪大爆发——历史上物种飞速进化的时期。 事实上,最先进的技术不仅仅是将可用资源应用于几十年前的算法的结果。 下面列举了帮助研究人员在过去十年中取得巨大进步的想法(虽然只触及了皮毛)。
-
新的容量控制方法,如 dropout (Srivastava et al., 2014),有助于减轻过拟合的危险。这是通过在整个神经网络中应用噪声注入 (Bishop, 1995) 来实现的,出于训练目的,用随机变量来代替权重。
-
注意力机制解决了困扰统计学一个多世纪的问题:如何在不增加可学习参数的情况下增加系统的记忆和复杂性。研究人员通过使用只能被视为可学习的指针结构 (Bahdanau et al., 2014) 找到了一个优雅的解决方案。不需要记住整个文本序列(例如用于固定维度表示中的机器翻译),所有需要存储的都是指向翻译过程的中间状态的指针。这大大提高了长序列的准确性,因为模型在开始生成新序列之前不再需要记住整个序列。
-
多阶段设计。例如,存储器网络 (Sukhbaatar et al., 2015) 和神经编程器 - 解释器 (Reed and De Freitas, 2015)。它们允许统计建模者描述用于推理的迭代方法。这些工具允许重复修改深度神经网络的内部状态,从而执行推理链中的后续步骤,类似于处理器如何修改用于计算的存储器。
-
另一个关键的发展是生成对抗网络 (Goodfellow et al., 2014) 的发明。传统模型中,密度估计和生成模型的统计方法侧重于找到合适的概率分布(通常是近似的)和抽样算法。因此,这些算法在很大程度上受到统计模型固有灵活性的限制。生成式对抗性网络的关键创新是用具有可微参数的任意算法代替采样器。然后对这些数据进行调整,使得鉴别器(实际上是一个双样本测试)不能区分假数据和真实数据。通过使用任意算法生成数据的能力,它为各种技术打开了密度估计的大门。驰骋的斑马 (Zhu et al., 2017) 和假名人脸 (Karras et al., 2017) 的例子都证明了这一进展。即使是业余的涂鸦者也可以根据描述场景布局的草图生成照片级真实图像( (Park et al., 2019) )。
-
在许多情况下,单个 GPU 不足以处理可用于训练的大量数据。在过去的十年中,构建并行和分布式训练算法的能力有了显著提高。设计可伸缩算法的关键挑战之一是深度学习优化的主力——随机梯度下降,它依赖于相对较小的小批量数据来处理。同时,小批量限制了 GPU 的效率。因此,在 1024 个 GPU 上进行训练,例如每批 32 个图像的小批量大小相当于总计约 32000 个图像的小批量。最近的工作,首先是由 (Li, 2017) 完成的,随后是 (You et al., 2017) 和 (Jia et al., 2018) ,将观察大小提高到 64000 个,将 ResNet-50 模型在 ImageNet 数据集上的训练时间减少到不到 7 分钟。作为比较——最初的训练时间是按天为单位的。
-
并行计算的能力也对强化学习的进步做出了相当关键的贡献。这导致了计算机在围棋、雅达里游戏、星际争霸和物理模拟(例如,使用 MuJoCo)中实现超人性能的重大进步。有关如何在 AlphaGo 中实现这一点的说明,请参见如 (Silver et al., 2016) 。简而言之,如果有大量的(状态、动作、奖励)三元组可用,即只要有可能尝试很多东西来了解它们之间的关系,强化学习就会发挥最好的作用。仿真提供了这样一条途径。
-
深度学习框架在传播思想方面发挥了至关重要的作用。允许轻松建模的第一代框架包括 Caffe、Torch 和 Theano。许多开创性的论文都是用这些工具写的。到目前为止,它们已经被 TensorFlow(通常通过其高级 API Keras 使用)、CNTK、Caffe 2 和 Apache MXNet 所取代。第三代工具,即用于深度学习的命令式工具,可以说是由 Chainer 率先推出的,它使用类似于 Python NumPy 的语法来描述模型。这个想法被 PyTorch、MXNet 的 Gluon API 和 Jax 都采纳了。
“系统研究人员构建更好的工具”和“统计建模人员构建更好的神经网络”之间的分工大大简化了工作。 例如,在 2014 年,对卡内基梅隆大学机器学习博士生来说,训练线性回归模型曾经是一个不容易的作业问题。 而现在,这项任务只需不到 10 行代码就能完成,这让每个程序员轻易掌握了它。
张量
范数
- 最简单范数:欧几里得距离 $|x|=|x|2=\sqrt{\sum\limits{i=1}^{n}{x_i^2}}$
- 一般 p 范数:$|x|p=\sqrt[p]{\sum\limits{i=1}^{n}{x_i^p}}$
- 矩阵的 Frobenius 范数:$|\mathbf{X}|F=\sqrt{\sum\limits{i=1}^{m}\sum\limits_{j=1}^{n}{x_i^2}}$
范数和目标
在深度学习中,我们经常试图解决优化问题: 最大化分配给观测数据的概率; 最小化预测和真实观测之间的距离。 用向量表示物品(如单词、产品或新闻文章),以便最小化相似项目之间的距离,最大化不同项目之间的距离。 目标,或许是深度学习算法最重要的组成部分(除了数据),通常被表达为范数。
梯度
因为线性模型表现能力的限制,引入了隐藏层,这里会用上标来表示第几层的参数 $\mathbf{W^{(i)}}$
- 每一层的维度变化和前一层的连接有关系,但是如果只是这样的话,增加层数所代表的含义还是 $\mathbf{y=wx+b}$
- 所以要在每层之间加入激活函数,去除线性关系
- ReLU:$\mathbf{ReLU(x) = \max(x,0)}$ 更好训练
- pReLU 加了一个参数
- Sigmoid:$\displaystyle{\mathbf{sigmoid(x)=\frac{1}{1+\exp{(-x)}}}}$
- tanh:
- ReLU:$\mathbf{ReLU(x) = \max(x,0)}$ 更好训练
- 实践还证明,多层的深度递进,能够比广度增加更容易训练
概率
线性回归
本质是找一个输入的仿射变换(缩放,平移)矩阵
使用 Loss Function 找到最优化值。
- 数据集的平均损失函数:$L(w,b)=\frac{1}{n}\sum\limits_{i=1}^nl^{(i)}(w,b)$
- $l(w,b)=\frac{1}{2}\sqrt{(\hat y - y)^2}$
- 最优值:$(w^,b^)$ => $w^, b^=\mathop{\arg\min}\limits_{w,b};L(w,b)$
- 损失函数本身是对误差的描述,这里是引入了一个服从正态分布的高斯误差作为预测值和真实值差异的原因。$\mathbf{y=Wx+b+\epsilon},\quad \epsilon \sim \mathcal N(0,\sigma^2)$
解析解 (与数值解相对应,解析解是逻辑推导的,数值解是求职计算的):
- $w^*=(\mathbf{X}^\top \mathbf{X})^{-1}\mathbf{X}^\top y$
- 如果将小批量的总损失替换为小批量损失的平均值,需要如何更改学习率?
- 学习率要增大,使用 sum 权重的变动值比 mean 的大
矩阵微分
本质是找一个输入的仿射变换(缩放,平移)矩阵
使用 Loss Function 找到最优化值。
- 数据集的平均损失函数:$L(w,b)=\frac{1}{n}\sum\limits_{i=1}^nl^{(i)}(w,b)$
- $l(w,b)=\frac{1}{2}\sqrt{(\hat y - y)^2}$
- 最优值:$(w^,b^)$ => $w^, b^=\mathop{\arg\min}\limits_{w,b};L(w,b)$
- 损失函数本身是对误差的描述,这里是引入了一个服从正态分布的高斯误差作为预测值和真实值差异的原因。$\mathbf{y=Wx+b+\epsilon},\quad \epsilon \sim \mathcal N(0,\sigma^2)$
解析解 (与数值解相对应,解析解是逻辑推导的,数值解是求职计算的):
- $w^*=(\mathbf{X}^\top \mathbf{X})^{-1}\mathbf{X}^\top y$
- 如果将小批量的总损失替换为小批量损失的平均值,需要如何更改学习率?
- 学习率要增大,使用 sum 权重的变动值比 mean 的大
Softmax 回归
多层感知机
因为线性模型表现能力的限制,引入了隐藏层,这里会用上标来表示第几层的参数 $\mathbf{W^{(i)}}$
- 每一层的维度变化和前一层的连接有关系,但是如果只是这样的话,增加层数所代表的含义还是 $\mathbf{y=wx+b}$
- 所以要在每层之间加入激活函数,去除线性关系
- ReLU:$\mathbf{ReLU(x) = \max(x,0)}$ 更好训练
- pReLU 加了一个参数
- Sigmoid:$\displaystyle{\mathbf{sigmoid(x)=\frac{1}{1+\exp{(-x)}}}}$
- tanh:
- ReLU:$\mathbf{ReLU(x) = \max(x,0)}$ 更好训练
- 实践还证明,多层的深度递进,能够比广度增加更容易训练
Pytorch
训练相关
Pytorch 自带的很多 loss 函数已经做了计
- eval():评估模式,只 forward,不计算梯度,反向传播
网络结构相关
使用 torch 的 API 能够更简单的搭建网络结构
绘图
d2l 的很多绘图思路可以学习,用于后续的理论研究
权重衰减
也叫 L2 正则化,为了避免过拟合,而又不想增加数据或者减少特征或权重数量,就给损失函数加入权重的范数作为惩罚。
公式:$\displaystyle{L + \frac{\lambda}{2}|\mathbf w|^2}$
-
$\lambda$ 是超参数,表面权重衰减的影响程度
为什么我们首先使用𝐿2 范数,而不是𝐿1 范数。 事实上,这个选择在整个统计领域中都是有效的和受欢迎的。 𝐿2 正则化线性模型构成经典的 _ 岭回归 _(ridge regression)算法, 𝐿1 正则化线性回归是统计学中类似的基本模型, 通常被称为 _ 套索回归 _(lasso regression)。 使用𝐿2 范数的一个原因是它对权重向量的大分量施加了巨大的惩罚。 这使得我们的学习算法偏向于在大量特征上均匀分布权重的模型。 在实践中,这可能使它们对单个变量中的观测误差更为稳定。 相比之下,𝐿1 惩罚会导致模型将权重集中在一小部分特征上, 而将其他权重清除为零。 这称为 _ 特征选择 _(feature selection),这可能是其他场景下需要的。
除了这种启发式方法,数学中还有更严格的方式(再生核希尔伯特空间(RKHS) ),不过不太好应用。
Dropout
偏差 - 方差权衡:偏差和方差不可兼得
原理暂时略(属于无偏的噪声注入技术)
公式:$h^{’}=\frac{h}{1-p}$ 按照 p 概率去除神经元,h 是中间层的活性值
简单说就是按照一定概率屏蔽部分神经元上的权重
- 训练时候使用,是为了避免过拟合,所以测试时候不需要用
初始化和稳定
- 梯度消失和爆炸:在某个初始状态或者某个网络结构或算法下出现的问题
- 因素
- 网络层数很深
- 计算精度有限
- 消失
- sigmoid:激活函数的梯度在除 0 附近之外都趋近于零
- ReLU 就是解决这个问题的
- sigmoid:激活函数的梯度在除 0 附近之外都趋近于零
- 爆炸
- 太多次矩阵乘法
- 所以才要尽可能约束参数值(包括输入特征的标准归一化和权重的正则)
- 因素
- 初始化方法
- Xavier 初始化方法
共享参数
可以在网络结构中把一层进行共享,可以在多个地方使用
|
|