专栏介绍:本栏目为 “2022春季中国科学院大学王亮老师的深度学习” 课程记录,这门课程与自然语言处理以及机器学习有部分知识点重合,重合的部分不再单独开博客记录了,有需要的读者可以移步 💗自然语言处理专栏和💗机器学习专栏。 如果感兴趣的话,就和我一起入门DL吧🥰
0 重要概念回顾
这一部分参考博客:机器学习:算法中的泛化误差、偏差、方差、噪声的理解(超详细)
0.1 泛化误差 Generalization error
- 泛化误差用来衡量一个学习机器推广未知数据的能力,即根据从样本数据中学习到的规则能够应用到新数据的能力。泛化误差越小,表示模型的推广能力越强,泛化性能越优。
- 训练误差:训练过程中的误差,就是训练误差。训练完毕、调参完毕的模型。
- 测试误差:在新的测试集上的误差,就是测试误差。
- 泛化误差:假如所有的数据来自一个整体,模型在这个整体上的误差,就是泛化误差。
- 通常说来,测试误差的平均值或者说期望就是泛化误差。
0.2 偏差 Bias
- 偏差:度量了学习算法的期望预期与真实结果的偏离程度,即刻画了学习算法本身的拟合能力。
- 把模型比喻成一支猎枪,预测的目标是靶心,假设射手不会手抖且视力正常,那么这支枪(模型)的能力就可以用多次射击后的中心(相当于预测值的期望,即和靶心的距离来衡量(偏离了靶心有多远)。当猎枪(模型)和子弹(样本)质量都很好时,就能得到方差和偏差都比较低的结果。
- 但是如果猎枪是没有校准的或者目标超出有效射程,那么偏差就会更高(击中点离靶心比较远)。
- 子弹(样本)也可能出问题,比如子弹的形状、重量等因素,导致瞄准一个点多次射击在靶上会散开一片,这就是高方差的情况。
0.3 方差 Variance
- 方差:度量了同样大小的训练集的变动所导致的学习性能的变化,反映了在不同样本集上模型输出值的变异性.
- 方差的大小反应了样本在总体数据中的代表性,或者说不同样本下模型预测的稳定性。即刻画了数据扰动所造成的的影响。
- 比如现在要通过一些用户属性去预测其消费能力,结果有两个样本,一个样本中大多数都是高等级活跃会员,另一个则是大部分是低质量用户,两个样本预测出来的数据的差异就非常大,也就是模型在两个样本上的方差很大。
- 如果模型在多个样本下的训练误差(经验损失)“抖动”比较厉害,则有可能是样本有问题。
1 正则化 Regularization
介绍
- 正则化对学习算法进行修改的目的是为了降低泛化误差而不是训练误差,解决模型过拟合问题。
- 机器学习中的许多标准正则化概念可以很容易地扩展到深度学习模型中。
- 在深度学习中,大多数正则化策略都是基于正则估计的。这是通过减少方差variance以增加估计器的偏差bias来实现的。
- 一个有效的正则化器应该显著减少方差而不过度增加偏差。
动机
- 在深度学习的大多数应用中,数据生成过程几乎肯定是在所选模型家族之外的。
- 这意味着控制模型的复杂性不是简单地找到合适的模型大小和合适的参数数量的问题。
- 相反,深度学习依赖于寻找最佳拟合模型作为一个已被适当正则化的大型模型。
方法一:参数惩罚 arameter Norm Penalties
- 适用于深度学习的最传统的正则化形式是参数范数惩罚。
- 这种方法通过在目标函数中加入惩罚 Ω ( θ ) \Omega(\theta) Ω(θ)来限制模型的容量,所谓『惩罚』是指对损失函数中的某些参数做一些限制。
1. L2参数正则化
- J ~ ( θ ) = J ( θ ) + α Ω ( θ ) \tilde{J}(\theta)=J(\theta)+\alpha \Omega(\theta) J~(θ)=J(θ)+αΩ(θ)
- Ω ( w ) = 1 2 ∥ w ∥ 2 2 = 1 2 w T w \Omega(\mathbf{w})=\frac{1}{2}\|\mathbf{w}\|_{2}^{2}=\frac{1}{2} \mathbf{w}^{T} \mathbf{w} Ω(w)=21∥w∥22=21wTw
- L2正则化,也称为权值衰减,通过添加正则化项使w更靠近原点。
- L2正则化是指权值向量中各个元素的平方和然后再求平方根,通常表示为 ∥ w ∥ 2 \|w\|_{2} ∥w∥2
- L2正则化之后将会获得一个所有参数都比较小的模型,解决过拟合问题
2. L1参数正则化
-
J ~ ( w ; X , y ) = α ∥ w ∥ 1 + J ( w ; X , y ) \tilde{J}(\boldsymbol{w} ; \boldsymbol{X}, \boldsymbol{y})=\alpha\|\boldsymbol{w}\|_{1}+J(\boldsymbol{w} ; \boldsymbol{X}, \boldsymbol{y}) J~(w;X,y)=α∥w∥1+J(w;X,y)
-
Ω ( θ ) = ∥ w ∥ = ∑ i ∣ w i ∣ \Omega(\theta)=\|\mathbf{w}\|=\sum_{i}\left|w_{i}\right| Ω(θ)=∥w∥=∑i∣wi∣
-
L1正则化之后将会获得一个稀疏模型,利于特征选择。
-
L1正则化是指权值向量w ww中各个元素的绝对值之和,通常表示为 ∥ w ∥ 1 \|w\|_{1} ∥w∥1
方法二:数据集增强 Dataset Augmentation
- 获得更好泛化的最好方法是训练更多的数据。
- 问题是,在大多数情况下,数据是有限的。此外,打标签是一项极其乏味的任务。
- 数据集增强提供了一种廉价而简单的方法来增加训练数据的数量。
1. 色彩抖动
- 色彩抖动是一种非常有效的增强数据集的方法。它也非常容易应用。
- Fancy PCA 是在图像上执行颜色抖动的方法。
2. 水平翻转
- 水平翻转应用于显示水平不对称的数据。
- 水平翻转可以应用于自然图像和点云。基本上,通过水平翻转可以使数据量翻倍。
方法三:噪声鲁棒性 Noise Robustness
- 噪声注入可以被认为是正则化的一种形式。
- 在模型的输入处加入方差为无穷小的噪声,相当于对权值范数施加惩罚.
- 可以在深度模型的不同级别注入噪声。
- 权重的噪声注入
- 输出的噪声注入
- 标签平滑 :机器学习的样本中通常会存在少量错误标签,这些错误标签会影响到预测的效果。标签平滑采用如下思路解决这个问题:在训练时即假设标签可能存在错误,避免“过分”相信训练样本的标签。当目标函数为交叉熵时,这一思想有非常简单的实现,称为标签平滑(Label Smoothing)。
方法四:提前停止 Early Stopping
- Early stopping的使用可以通过在模型训练整个过程中截取保存结果最优的参数模型,防止过拟合。
- 迭代次数增多后,达到一定程度后产生过拟合。从下图中可以看出,训练集精度一直在提升,但是test set的精度在上升后下降。若是在early stopping的位置保存模型,则不必反复训练模型,即可找到最优解。
方法五:参数共享 Parameter Sharing
- 在正则化的过程中,我们可能不知道参数位于哪个区域,但知道它们之间存在一些依赖关系。
- 最常见的依赖关系:一些参数应该彼此接近。
- 参数共享通过强制参数集相等来对参数施加更强的假设。
方法六:参数绑定 Parameter Tying
- Parameter Tying 是指通过惩罚显式地迫使两个模型的参数相互接近:
- ∥ w ( A ) − w ( B ) ∥ \left\|\mathbf{w}^{(A)}-\mathbf{w}^{(B)}\right\| ∥∥w(A)−w(B)∥∥
- W ( A ) \mathrm{W}^{(A)} W(A), W ( B ) \mathrm{W}^{(B)} W(B) 分别表示两个模型的参数。
方法七:多任务学习 Multitask Learning
- 多任务学习是一种通过汇集多个任务中产生的示例来提高泛化能力的方法。
- 通常,多任务学习最常见的形式是通过一个分为两部分的体系结构来完成的:
- 任务特定的参数:这只能从特定的任务示例中获益,以达到良好的泛化。
- 通用参数:跨所有任务共享(受益于所有任务的数据池)。
- 多任务学习是参数共享的一种形式。
- 与单任务模型的情况相比,随着共享参数示例数量的增加,统计强度可以大大提高。
方法八:Bagging
- Bagging是一种通过组合多个模型来减少泛化误差的技术
- Bagging有效的原因是不同的模型在测试集中通常不会犯相同的错误。这是对训练数据的k个不同子集进行训练的直接结果,其中每个子集缺少原始数据集中的一些示例。
- 使用bagging技术的模型被称为ensemble models:平均而言,ensemble models的表现至少会和其他成员一样好,如果成员有独立的错误,整体的表现会比其他成员好得多。
方法九:Dropout
- Dropout:在前向传播的过程中,通过让某个神经元以一定的概率P停止工作,从而减少隐藏层结点之间的依赖关系,增强模型泛化性。
- Dropout提供了一种计算上便宜但功能强大的方法来泛化模型。
- Dropout可以直观地解释为强迫模型在缺少输入和隐藏单元的情况下学习。
- dropout可以作为训练深度神经网络的一种trick供选择。在每个训练批次中,通过忽略一半的特征检测器(让一半的隐层节点值为0),可以明显地减少过拟合现象。这种方式可以减少特征检测器(隐层节点)间的相互作用,检测器相互作用是指某些检测器依赖其他检测器才能发挥作用。
- Dropout的优点是计算成本非常低。
- 它适用于几乎任何使用分布式表示的模型,可以用随机梯度下降训练。
方法十:对抗式训练 Adversarial Training
- 在很多情况下,即使网络已经达到了人类的准确率,但对于有意构造的用来“愚弄”网络的示例也有100%的错误率,这些样本被称为对抗性样本。
- 可以通过对抗性训练减少原始测试集的错误率,对抗性训练指的是对训练集中的对抗性样本进行训练。
2 优化 Optimization
- 最小化(或最大化)任何数学表达式的过程称为优化(比如说优化损失函数)
方法一:批量梯度下降 Batch Gradient Descent
- 批量梯度下降法BGD:针对的是整个数据集,通过对所有的样本的计算来求解梯度的方向。
- 每迭代一步,都要用到训练集所有的数据,
- 优点:全局最优解;易于并行实现;
- 缺点:当样本数目很多时,训练过程会很慢。
方法二:小批量梯度下降 Minibatching Gradient Descent
- 每次迭代求解所有样本需要花费大量的计算成本,小批量梯度下降法在每次的迭代过程中利用部分样本代替所有的样本。
- 假设训练集中的样本的个数为1000,每个mini-batch中含有10个样本,这样,整个训练数据集可以分为100个mini-batch。
方法三:随机梯度下降 Stochastic Gradient Descent
- 随机梯度下降算法可以看成是小批量梯度算法的一个特殊的情形
- 在随机梯度下降法中每次仅根据一个样本对模型中的参数进行调整,等价于上述的b=1情况下的mini-batch gradient descent,即每个mini-batch中只有一个训练样本。
- 优点:训练速度快;
- 缺点:准确度下降,并不是全局最优;不易于并行实现。
方法四:动量算法 Momentum
以下内容参考:深度学习中的Momentum算法原理
- 传统梯度下降存在的问题:训练轨迹会呈现锯齿状,这无疑会大大延长训练时间。同时,由于存在摆动现象,学习率只能设置的较小,才不会因为步伐太大而偏离最小值。
- 优化思路:一个很朴素的想法便是让纵向的摆动尽量小,同时保持横向的运动方向比较平稳(使用指数加权平均)。为此,需要知道梯度在过去的一段时间内的大致走向,以消除当前轮迭代梯度向量存在的方向抖动。
- 动量算法的本质:该算法将一段时间内的梯度向量进行了加权平均,分别计算得到梯度更新过程中 w 和 b 的大致走向,一定程度上消除了更新过程中的不确定性因素(如摆动现象),使得梯度更新朝着一个越来越明确的方向前进。
方法五:自适应学习率方法
参考:深度学习 — 优化入门二
- 随机梯度和动量随机梯度算法都是使用全局的学习率,所有的参数都是统一步伐的进行更新的,实际上针对每个参数设置学习率可能会更好,让他根据情况进行调整,于是就有了几个自适应学习率的优化方法。
1. AdaGrad
- 将每一维各自的历史梯度的平方叠加起来,然后更新的时候除以该历史梯度值即可。
2. RMSProp
- RMSProp算法在AdaGrad基础上引入了衰减因子
- RMSProp在梯度累积的时候,会对“过去”与“现在”做一个平衡,通过超参数进行调节衰减量。
3. Adam
- Adam是基于动量和RMSProp的微调版本
- 该方法是目前深度学习中最流行的优化方法,在默认情况尽量使用Adam作为参数的更新方式。
方法六:批标准化 Batch Normalization
- Batch Normalization, 批标准化, 和普通的数据标准化类似, 是将分散的数据统一的一种做法。
优点:
- 可以选择比较大的初始学习率,训练速度飙涨
- 不用去理会过拟合中drop out、L2正则项参数的选择问题,采用BN算法后,可以移除这两项参数,或者可以选择更小的L2正则约束参数,因为BN具有提高网络泛化能力的特性。
- 可以把训练数据彻底打乱,防止每批训练的时候,某一个样本都经常被挑选到。
Batch Normalization的计算方法:
- 批标准化和普通的数据标准化类似,是将分散的数据统一的一种做法。
- H = [ h 11 h 12 h 13 … h 1 k h 21 h 22 h 23 … h 2 k ⋮ ⋮ ⋮ ⋱ ⋮ h m 1 h m 2 h m 3 … h m k ] H=\left[\begin{array}{ccccc}h_{11} & h_{12} & h_{13} & \ldots & h_{1 k} \\ h_{21} & h_{22} & h_{23} & \ldots & h_{2 k} \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ h_{m 1} & h_{m 2} & h_{m 3} & \ldots & h_{m k}\end{array}\right] H=⎣⎢⎢⎢⎡h11h21⋮hm1h12h22⋮hm2h13h23⋮hm3……⋱…h1kh2k⋮hmk⎦⎥⎥⎥⎤
- 每个mini-batch中有m个样本,体现在矩阵H中的每一列
- Batch Normalization的过程为使用 H ′ H^{\prime} H′代替 H H H
- H ′ = H − μ σ H^{\prime}=\frac{H-\mu}{\sigma} H′=σH−μ
- μ \mu μ:每个单元的平均值
- σ \sigma σ:标准差
终于结束了,内容实在是太多了,博文中很多东西都只是一句话带过,还需要深入学习😭