【关于 BatchNorm vs LayerNorm】那些你不知道的事
一、动机篇
1.1 独立同分布(independent and identically distributed)与白化
- 独立同分布
- 为什么?
- 独立同分布的数据可以简化常规机器学习模型的训练、提升机器学习模型的预测能力
- 相关性:
- 强相关:Naive Bayes 模型就建立在特征彼此独立的基础之
- 弱相关:Logistic Regression 和 神经网络 则在非独立的特征数据上依然可以训练出很好的模型
- 为什么?
- 白化【数据预处理步骤】
- 作用:
- 去除特征间的相关性 -> 独立;
- 使所有特征具有相同的均值和方差 -> 同分布
- 作用:
1.2 ( Internal Covariate Shift,ICS)
- 动机:深度神经网络涉及到很多层的叠加,而每一层的参数更新会导致上层的输入数据分布发生变化,通过层层叠加,高层的输入分布变化会非常剧烈,这就使得高层需要不断去重新适应底层的参数更新。为了训好模型,我们需要非常谨慎地去设定学习率、初始化权重、以及尽可能细致的参数更新策略。
- 模型训练对于数据的一个假设:“源空间(source domain)和目标空间(target domain)的数据分布(distribution)是一致的”。如果不一致,那么就出现了新的机器学习问题,如 transfer learning / domain adaptation 等。而 covariate shift 就是分布不一致假设之下的一个分支问题,它是指源空间和目标空间的条件概率是一致的,但是其边缘概率不同;
- ICS 【每个神经元的输入数据不再是“独立同分布”】导致的后果:
- 上层参数需要不断适应新的输入数据分布,降低学习速度;
- 下层输入的变化可能趋向于变大或者变小,导致上层落入饱和区,使得学习过早停止;
- 每层的更新都会影响到其它层,因此每层的参数更新策略需要尽可能的谨慎;
1.3 ICS问题带来的后果是什么?
- 上层参数需要不断适应新的输入数据分布,导致学习速度下降;
- 下层输入的变化可能趋于变大或变小,导致上层落入饱和区,从而学习过早停止;
- 每层的更新都会影响到其他层,因此每层参数更新策略需要尽可能谨慎;
二、Normalization 篇
2.1 Normalization 的通用框架与基本思想
- 前言
假设 神经元的输入:
输出的结果:
-
ICS 问题: X 的 分布可能相差很大
-
解决方法:
- 方法:对每一层的数据做白化操作
- 存在问题:成本高,因为要保证 白化操作是可微的
-
基本思想:在将 x 送给神经元之前,先对其做平移和伸缩变换, 将 x 的分布规范化成在固定区间范围的标准分布;
-
变换框架:
参数介绍:
μ:平移参数
δ:缩放参数
- 步骤:
- 对 x 进行 shift 和 scale 变换
得到的数据符合均值为 0、方差为 1 的标准分布
- b 是再平移参数(re-shift parameter), g 是再缩放参数(re-scale parameter),再进一步变换为
得到的数据符合均值为 b 、方差为 g 2 g^2 g2 的分布
三、Batch Normalization 篇
3.1 Batch Normalization(纵向规范化)是什么?
- 方式:针对单个神经元进行,利用网络训练时一个 mini-batch 的数据来计算该神经元 x i x_i xi 的均值和方差,因而称为 Batch Normalization。
其中 M 是 mini-batch 的大小。
3.2 Batch Normalization(纵向规范化)存在什么问题?
- BN 独立地规范化每一个输入维度 x i x_i xi ,但规范化的参数是一个 mini-batch 的一阶统计量和二阶统计量。这就要求 每一个 mini-batch 的统计量是整体统计量的近似估计,或者说每一个 mini-batch 彼此之间,以及和整体数据,都应该是近似同分布的。分布差距较小的 mini-batch 可以看做是为规范化操作和模型训练引入了噪声,可以增加模型的鲁棒性;但如果每个 mini-batch的原始分布差别很大,那么不同 mini-batch 的数据将会进行不一样的数据变换,这就增加了模型训练的难度。
- 由于 BN 需要在运行过程中统计每个 mini-batch 的一阶统计量和二阶统计量,因此不适用于 动态的网络结构 和 RNN 网络
3.3 Batch Normalization(纵向规范化)适用的场景是什么?
每个 mini-batch 比较大,数据分布比较接近。在进行训练之前,要做好充分的 shuffle. 否则效果会差很多。
3.4 BatchNorm 存在什么问题?![图 145](https://i-blog.csdnimg.cn/blog_migrate/e389e46c340c3c7a9b9a3a303b59534e.png)
- BN特别依赖Batch Size;当Batch size很小的时候,BN的效果就非常不理想了。在很多情况下,Batch size大不了,因为你GPU的显存不够。所以,通常会有其他比较麻烦的手段去解决这个问题,比如MegDet的CGBN等;
- BN对处理序列化数据的网络比如RNN是不太适用的;So,BN的应用领域减少了一半;
- BN只在训练的时候用,inference的时候不会用到,因为inference的输入不是批量输入。
四、Layer Normalization(横向规范化) 篇
4.1 Layer Normalization(横向规范化)是什么?
- 方式:综合考虑一层所有维度的输入,计算该层的平均输入值和输入方差,然后用同一个规范化操作来转换各个维度的输入。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o1r9z6Ut-1677244916184)(img/20201223132538.png)]
其中 i 枚举了该层所有的输入神经元。对应到标准公式中,四大参数 μ, δ, g, b 均为标量(BN中是向量),所有输入共享一个规范化变换。
4.2 Layer Normalization(横向规范化)有什么用?
LN 针对单个训练样本进行,不依赖于其他数据,因此可以避免 BN 中受 mini-batch 数据分布影响的问题,可以用于 小mini-batch场景、动态网络场景和 RNN,特别是自然语言处理领域。此外,LN 不需要保存 mini-batch 的均值和方差,节省了额外的存储空间。
五、BN vs LN 篇
BN 的转换是针对单个神经元可训练的——不同神经元的输入经过再平移和再缩放后分布在不同的区间,而 LN 对于一整层的神经元训练得到同一个转换——所有的输入都在同一个区间范围内。如果不同输入特征不属于相似的类别(比如颜色和大小),那么 LN 的处理可能会降低模型的表达能力。
六、主流 Normalization 方法为什么有效?
- Normalization 的权重伸缩不变性
- 介绍:权重 W 按照常量 λ 进行伸缩时,得到的规范化后的值保持不变
其中:W’ = λW
-
原因:当权重 W 伸缩时,对应的均值和标准差均等比例伸缩,分子分母相抵。
-
优点:
- 权重伸缩不变性可以有效地提高反向传播的效率
注:因此,权重的伸缩变化不会影响反向梯度的 Jacobian 矩阵,因此也就对反向传播没有影响,避免了反向传播时因为权重过大或过小导致的梯度消失或梯度爆炸问题,从而加速了神经网络的训练。
- 权重伸缩不变性还具有参数正则化的效果,可以使用更高的学习率。
因此,下层的权重值越大,其梯度就越小。这样,参数的变化就越稳定,相当于实现了参数正则化的效果,避免参数的大幅震荡,提高网络的泛化性能。
- Normalization 的数据伸缩不变性
- 介绍:当数据 x 按照常量 λ 进行伸缩时,得到的规范化后的值保持不变
注:x’= λx
- 优点:
- 数据伸缩不变性可以有效地减少梯度弥散,简化对学习率的选择
对于某一层神经元 :
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HWL21amK-1677244919405)(null)]
可得:
每一层神经元的输出依赖于底下各层的计算结果。如果没有正则化,当下层输入发生伸缩变化时,经过层层传递,可能会导致数据发生剧烈的膨胀或者弥散,从而也导致了反向计算时的梯度爆炸或梯度弥散。
加入 Normalization 之后,不论底层的数据如何变化,对于某一层神经元 而言,其输入 x i x_i xi 永远保持标准的分布,这就使得高层的训练更加简单。从梯度的计算公式来看:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8dZxeMFS-1677244916191)(img/20201223140304.png)]
数据的伸缩变化也不会影响到对该层的权重参数更新,使得训练过程更加鲁棒,简化了对学习率的选择。
【关于 归一化】那些你不知道的事
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gCTo33GE-1677244916192)(img/微信截图_20210203230623.png)]
一、动机篇
1.1 为什么要归一化?
因为 每一列 数据的量纲不同,导致 数据分布区间存在差异。
举例:(人的身高可以是 180cm,也可以是 1.8m,这两个虽然表示意义相同,但是由于单位的不同,导致 机器学习在计算过程中也容易出现差异,所以就需要对数据进行归一化)。
二、介绍篇
2.1 归一化有哪些方法?
- 线性比例变换法:
- 极差变换法:
- 0 均值标准化(z-score 方法):
2.2 归一化各方法特点?
- 线性比例变换法 and 极差变换法
- 特点:将原始数据线性化的方法转换到[0 1]的范围,该方法实现对原始数据的等比例缩放。通过利用变量取值的最大值和最小值(或者最大值)将原始数据转换为界于某一特定范围的数据,从而消除量纲和数量级影响,改变变量在分析中的权重来解决不同度量的问题。由于极值化方法在对变量无量纲化过程中仅仅与该变量的最大值和最小值这两个极端值有关,而与其他取值无关,这使得该方法在改变各变量权重时过分依赖两个极端取值。
- 0 均值标准化(z-score 方法)
- 特点:即每一变量值与其平均值之差除以该变量的标准差。虽然该方法在无量纲化过程中利用了所有的数据信息,但是该方法在无量纲化后不仅使得转换后的各变量均值相同,且标准差也相同,即无量纲化的同时还消除了各变量在变异程度上的差异,从而转换后的各变量在聚类分析中的重要性程度是同等看待的。而实际分析中,经常根据各变量在不同单位间取值的差异程度大小来决定其在分析中的重要性程度,差异程度大的其分析权重也相对较大。
2.3 归一化 的 意义?
每个维度都是去量纲化的,避免了不同量纲的选取对距离计算产生的巨大影响。
三、应用篇
3.1 哪些机器学习算法 需要做 归一化?
- 机器学习算法算法:
- 基于距离计算的模型:KNN;
- 通过梯度下降法求解的模型:线性回归、逻辑回归、支持向量机、神经网络
3.2 哪些机器学习算法 不需要做 归一化?
- 机器学习算法算法:
- 树形模型:决策树、随机森林(Random Forest)
- 为什么:
- 原因1:因为它们不关心变量的值,而是关心变量的分布和变量之间的条件概率;
- 原因2:因为数值缩放不影响分裂点位置,对树模型的结构不造成影响。按照特征值进行排序的,排序的顺序不变,那么所属的分支以及分裂点就不会有不同。而且,树模型是不能进行梯度下降的,因为构建树模型(回归树)寻找最优点时是通过寻找最优分裂点完成的,因此树模型是阶跃的,阶跃点是不可导的,并且求导没意义,也就不需要归一化。
【关于 过拟合和欠拟合】那些你不知道的事
一、过拟合和欠拟合 是什么?
欠拟合和过拟合属于对立情况,都是导致模型泛化能力不高的两种常见原因,均是模型学习能力和数据复杂性失调的表现
二、过拟合/高方差(overfiting / high variance)篇
2.1 过拟合是什么及检验方法?
- 问题表现方式:高方差
- 如果 训练集 和 测试集 的 误差间 呈现较大的差异时,即为高方差;
- 在 高方差 时,训练集 训练效果很好, 但是 验证集 的验证效果很差的时候, 即 训练集 和 验证集 呈现出 较大的差异,即模型的泛化能力差。这种现象 称为 过拟合;
- 检验方法:此时,观察模型在训练集和测试集上的损失函数值随着epoch的变化情况,当 模型 在 测试集 上的 损失函数值 出现 先下降后上升,那么此时可能出现过拟合。
2.2 导致过拟合的原因是什么?
- 训练集数量不足,样本类型单一。例如:如果 我们 利用 只包含 负样本的训练集 训练 模型,然后利用训练好的模型 预测 验证集中 的 正样本时,此时就会出现,模型 在 训练的时候,效果特别好,但是在验证的时候效果下降问题。因此,在选取训练集时,应当覆盖所有的数据类型;
- 训练集中存在噪声。噪声指的是 训练数据中 的 干扰数据,噪声数据 会 误导模型 记录 较多 的 错误特征,而 忽略了 真实样本 中 的正确特征信息;
- 模型复杂度过高。当模型过于复杂时,会导致 模型 过于充分 的 学习到 训练数据集中特征信息,但是遇到没有见过的数据的时候不能够变通,泛化能力太差。我们希望模型对不同的数据都有稳定的输出。模型太复杂是过拟合的重要因素。
2.3 过拟合的解决方法是什么?
- 标注不同类型的样本,是 样本尽可能的均衡。数据经过清洗之后再进行模型训练,防止噪声数据干扰模型;
- 降低训练模型复杂度。在训练和建立模型的时候,从相对简单的模型开始,不要一开始就把特征做的非常多,模型参数挑的非常复杂;
- 正则化。在模型算法中添加惩罚函数来防止模型出现过拟合问题。常见的有L1,L2,dropout 正则化等。而且 L1正则还可以自动进行特征选择;
- 采用 bagging(如随机森林等)集成学习方法 来 防止过拟合;
- 减少特征个数(不是太推荐,但也是一种方法)。可以使用特征选择,减少特征数或使用较少的特征组合,对于按区间离散化的特征,增大划分的区间;
- 交叉检验。利用 交叉检验的方法,来让模型得到充分的训练,以得到较优的模型参数;
- 早停策略。本质上是交叉验证策略,选择合适的训练次数,避免训练的网络过度拟合训练数据;
- DropOut策略。核心思想就是bagging,可以看作是低成本的集成学习。所谓的Dropout指的是在用前向传播算法和反向传播算法训练DNN模型时,一批数据迭代时,随机的从全连接DNN网络中去掉一部分隐藏层的神经元。 在对训练集中的一批数据进行训练时,我们随机去掉一部分隐藏层的神经元,并用去掉隐藏层的神经元的网络来拟合我们的一批训练数据。使用基于dropout的正则化比基于bagging的正则化简单,这显而易见,当然天下没有免费的午餐,由于dropout会将原始数据分批迭代,因此原始数据集最好较大,否则模型可能会欠拟合。
三、欠拟合/高偏差(underfiting / high bias)篇
3.1 欠拟合是什么及检验方法?
- 问题表现:高偏差
- 如果 训练集 和 测试集 的 误差 收敛 但是收敛值 很高时,即为高偏差;
- 虽然 训练集 和 测试集 都可以收敛,但是偏差很高,训练集和验证集的准确率都很低,这种现象 称为 欠拟合;
- 检验方法:模型 无法很好的拟合数据,导致 训练集和测试集效果都不佳。
3.2 导致欠拟合的原因是什么?
- 原因:模型没有 充分 学习到 数据中的特征信息,使得 模型 无法很好地拟合数据
3.3 欠拟合的解决方法是什么?
- 特征工程。添加更多的特征项,eg:特征组合、高次特征 等,来增大假设空间;
- 集成学习方法。 boosting(如GBDT)能有效解决 high bias;
- 提高 模型复杂度。当 所采用的模型比较简单,不能够应对复杂的任务。可以考虑 提升 模型复杂度,选用复杂度更好、学习能力更强的模型。比如说可以使用 SVM 的核函数,增加了模型复杂度,把低维不可分的数据映射到高维空间,就可以线性可分,减小欠拟合;
- 减小正则化系数。
参考资料
【关于 激活函数】那些你不知道的事
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dZvGdFrH-1677244916197)(img/激活函数.png)]
一、动机篇
1.1 为什么要有激活函数?
- 数据角度:由于数据是线性不可分的,如果采用线性化,那么需要复杂的线性组合去逼近问题,因此需要非线性变换对数据分布进行重新映射;
- 线性模型的表达力问题:由于线性模型的表达能力不够,引入激活函数添加非线性因素
二、激活函数介绍篇
2.1 sigmoid 函数篇
2.1.1 什么是 sigmoid 函数?
- 公式
σ ( x ) = 1 1 + e − x \sigma(x)=\frac {1}{1+e^{-x}} σ(x)=1+e−x1
- 图像
2.1.2 为什么选 sigmoid 函数 作为激活函数?
sigmoid 函数 能够把输入的连续实值变换为0和1之间的输出,特别的,如果是非常大的负数,那么输出就是0;如果是非常大的正数,输出就是1.
2.1.3 sigmoid 函数 有什么缺点?
- 如果我们初始化神经网络的权值为[0,1]之间的随机数,由反向传播算法的数学推导可以知道,梯度从后向前传播时,每传递一层梯度值都会下降为原来原来的0.25倍,如果神经网络层比较多是时,那么梯度会穿过多层之后变得接近于0,也就出现梯度消失问题,当权值初始化为 [1,+]期间内的值时,则会出现梯度爆炸问题;
- output 不是0均值(即zero-centered);
- 后果:会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入。 产生的一个结果就是:x>0, f=wTx+b那么对w求局部梯度则都为正,这样在反向传播的过程中w要么都往正方向更新,要么都往负方向更新,导致有一种捆绑的效果;
- 幂函数耗时;
2.2 tanh 函数篇
2.2.1 什么是 tanh 函数?
- 公式:
t a n h ( x ) = e x − e − x e x + e − x tanh(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}} tanh(x)=ex+e−xex−e−x
- 图像
2.2.2 为什么选 tanh 函数 作为激活函数?
tanh 函数 能够 解决 sigmoid 函数 非 0 均值 问题
2.2.3 tanh 函数 有什么缺点?
- 梯度爆炸和梯度消失;
- 幂函数耗时;
2.3 relu 函数篇
2.3.1 什么是 relu 函数?
- 公式
f ( x ) = m a x ( 0 , x ) f(x)=max(0, x) f(x)=max(0,x)
- 图像
2.3.2 为什么选 relu 函数 作为激活函数?
- 解决了gradient vanishing问题 (在正区间)
- 计算速度非常快,只需要判断输入是否大于0
- 收敛速度远快于sigmoid和tanh
2.3.3 relu 函数 有什么缺点?
- ReLU的输出不是zero-centered;
- Dead ReLU Problem,指的是某些神经元可能永远不会被激活,导致相应的参数永远不能被更新;
三、激活函数选择篇
- 深度学习往往需要大量时间来处理大量数据,模型的收敛速度是尤为重要的。所以,总体上来讲,训练深度学习网络尽量使用zero-centered数据 (可以经过数据预处理实现) 和zero-centered输出。所以要尽量选择输出具有zero-centered特点的激活函数以加快模型的收敛速度;
- 如果使用 ReLU,那么一定要小心设置 learning rate,而且要注意不要让网络出现很多 “dead” 神经元,如果这个问题不好解决,那么可以试试 Leaky ReLU、PReLU 或者 Maxout;
- 最好不要用 sigmoid,你可以试试 tanh,不过可以预期它的效果会比不上 ReLU 和 Maxout.
【关于 判别式(discriminative)模型 vs. 生成式(generative)模型】 那些你不知道的事
一、判别式模型篇
1.1 什么是判别式模型?
判别模型是直接对P(Y|X)建模,就是说,直接根据X特征来对Y建模训练。
1.2 判别式模型是思路是什么?
- 对P(Y|X)建模;
- 对所有的样本只构建一个模型,确认总体判别边界;
- 观测到输入什么特征,就预测最可能的label;
1.3 判别式模型的优点是什么?
对数据量要求没生成式的严格,速度也会快,小数据量下准确率也会好些。
二、生成式模型篇
2.1 什么是生成式模型?
在模型训练中,我学习到的是X与Y的联合模型 P(X,Y) ,也就是说,我在训练阶段是只对 P(X,Y) 建模,我需要确定维护这个联合概率分布的所有的信息参数。完了之后在inference再对新的sample计算 P(Y|X) ,导出 Y,但这已经不属于建模阶段了。
2.2 生成式模型是思路是什么?
- 1.对 P(X,Y) 建模;
- 这里我们主要讲分类问题,所以是要对每个label( yi)都需要建模,最终选择最优概率的label为结果,所以没有什么判别边界。(对于序列标注问题,那只需要构件一个model);
- 中间生成联合分布,并可生成采样数据。
2.3 生成式模型的优点是什么?
所包含的信息非常齐全,我称之为“上帝信息”,所以不仅可以用来输入label,还可以干其他的事情。生成式模型关注结果是如何产生的。
2.4 生成式模型的缺点是什么?
但是生成式模型需要非常充足的数据量以保证采样到了数据本来的面目,所以速度相比之下较慢。
【关于 优化算法】那些你不知道的事
一、动机篇
1.1 为什么需要 优化函数?
在机器学习算法中,通常存在很多问题并没有最优的解,或是要计算出最优的解要花费很大的计算量,面对这类问题一般的做法是利用迭代的思想尽可能的逼近问题的最优解。将解决此类优化问题的方法叫做优化算法,优化算法本质上是一种数学方法。
1.2 优化函数的基本框架是什么?
- 基本框架:定义当前时刻待优化参数为 θ t ∈ R d \theta_t\in R^{d} θt∈Rd,损失函数为 J ( θ ) J(\theta) J(θ),学习率为 η \eta η,参数更新框架为:
- 计算损失函数关于当前参数的梯度: g t = ∇ J ( θ t ) g_t=\nabla J(\theta_t) gt=∇J(θt);
- 根据历史梯度计算一阶动量(一次项)和二阶动量(二次项): m t = ϕ ( g 1 , g 2 , . . . , g t ) , V t = ψ ( g 1 , g 2 , . . . , g t ) m_t=\phi(g_1,g_2,...,g_t),V_t=\psi(g_1,g_2,...,g_t) mt=ϕ(g1,g2,...,gt),Vt=ψ(g1,g2,...,gt);
- 计算当前时刻的下降梯度: Δ θ t = − η ⋅ m t V t \Delta\theta_t=-\eta\cdot\cfrac{m_t}{\sqrt{V_t}} Δθt=−η⋅Vtmt
- 根据下降梯度更新参数: θ t + 1 = θ t + Δ θ t \theta_{t+1}=\theta_t+\Delta\theta_t θt+1=θt+Δθt
二、优化函数介绍篇
2.1 梯度下降法是什么?
每次使用一批数据进行梯度的计算,而非计算全部数据的梯度,因为如果每次计算全部数据的梯度,会导致运算量加大,运算时间变长,容易陷入局部最优解,而随机梯度下降可能每次不是朝着真正最小的方向,这样反而可以跳出局部的最优解。
2.2 随机梯度下降法是什么?
-
介绍:由于SGD没有动量的概念,也即没有考虑历史梯度,所以当前时刻的动量即为当前时刻的梯度 m t = g t m_t=g_t mt=gt,且二阶动量 V t = E V_t=E Vt=E,所以SGD的参数更新公式为
Δ θ t = − η ⋅ g t \Delta\theta_t=-\eta\cdot g_t Δθt=−η⋅gt
θ t + 1 = θ t − η ⋅ g t \theta_{t+1}=\theta_t-\eta\cdot g_t θt+1=θt−η⋅gt
-
优点:每次使用一批数据进行梯度的计算,而非计算全部数据的梯度,因为如果每次计算全部数据的梯度,会导致运算量加大,运算时间变长,容易陷入局部最优解,而随机梯度下降可能每次不是朝着真正最小的方向,这样反而可以跳出局部的最优解。
-
缺点:下降速度慢,而且可能会在沟壑(还有鞍点)的两边持续震荡,停留在一个局部最优点。
2.3 Momentum 是什么?
-
介绍:为了抑制SGD的震荡,SGDM认为梯度下降过程可以加入惯性。下坡的时候,如果发现是陡坡,那就利用惯性跑的快一些。SGDM全称是SGD with momentum,在SGD基础上引入了一阶动量。而所谓的一阶动量就是该时刻梯度的指数加权移动平均值: η ⋅ m t : = β ⋅ m t − 1 + η ⋅ g t \eta\cdot m_t:=\beta\cdot m_{t-1}+\eta\cdot g_t η⋅mt:=β⋅mt−1+η⋅gt(其中当前时刻的梯度 g t g_t gt并不严格按照指数加权移动平均值的定义采用权重 1 − β 1-\beta 1−β,而是使用我们自定义的学习率 η \eta η),那么为什么要用移动平均而不用历史所有梯度的平均?因为移动平均存储量小,且能近似表示历史所有梯度的平均。由于此时仍然没有二阶动量,所以 V t = E V_t=E Vt=E,那么SGDM的参数更新公式为
Δ θ t = − η ⋅ m t = − ( β m t − 1 + η g t ) \Delta\theta_t=-\eta\cdot m_t=-\left(\beta m_{t-1}+\eta g_t\right) Δθt=−η⋅mt=−(βmt−1+ηgt)
θ t + 1 = θ t − ( β m t − 1 + η g t ) \theta_{t+1}=\theta_t-\left(\beta m_{t-1}+\eta g_t\right) θt+1=θt−(βmt−1+ηgt)
-
所以,当前时刻参数更新的方向不光取决于当前时刻的梯度,还取决于之前时刻的梯度,特别地,当 β = 0.9 \beta=0.9 β=0.9时, m t m_t mt近似表示的是前10个时刻梯度的指数加权移动平均值,而且离得越近的时刻的梯度权重也越大。
-
优点:在随机梯度下降法的基础上,增加了动量(Momentum)的技术。其核心是通过优化相关方向的训练和弱化无关方向的振荡,来加速SGD训练。Momentum的方法能够在一定程度上缓解随机梯度下降法收敛不稳定的问题,并且有一定的摆脱陷入局部最优解的能力。
-
缺点:对于比较深的沟壑有时用Momentum也没法跳出
-
指数加权移动平均值(exponentially weighted moving average,EWMA):假设 v t − 1 v_{t-1} vt−1是 t − 1 t-1 t−1时刻的指数加权移动平均值, θ t \theta_t θt是 t t t时刻的观测值,那么 t t t时刻的指数加权移动平均值为
v t = β v t − 1 + ( 1 − β ) θ t = ( 1 − β ) θ t + ∑ i = 1 t − 1 ( 1 − β ) β i θ t − i \begin{aligned} v_t&=\beta v_{t-1}+(1-\beta)\theta_t \\ &=(1-\beta)\theta_t+\sum_{i=1}^{t-1}(1-\beta)\beta^i\theta_{t-i} \end{aligned} vt=βvt−1+(1−β)θt=(1−β)θt+i=1∑t−1(1−β)βiθt−i
其中 0 ≤ β < 1 , v 0 = 0 0 \leq \beta < 1,v_0=0 0≤β<1,v0=0。显然,由上式可知, t t t时刻的指数加权移动平均值其实可以看做前 t t t时刻所有观测值的加权平均值,除了第 t t t时刻的观测值权重为 1 − β 1-\beta 1−β外,其他时刻的观测值权重为 ( 1 − β ) β i (1-\beta)\beta^i (1−β)βi。由于通常对于那些权重小于 1 e \frac{1}{e} e1的观测值可以忽略不计,所以忽略掉那些观测值以后,上式就可以看做在求加权移动平均值。那么哪些项的权重会小于 1 e \frac{1}{e} e1呢?由于
lim n → + ∞ ( 1 − 1 n ) n = 1 e ≈ 0.3679 \lim_{n \rightarrow +\infty} \left(1-\frac{1}{n}\right)^n = \frac{1}{e} \approx 0.3679 n→+∞lim(1−n1)n=e1≈0.3679
若令 n = 1 1 − β n=\frac{1}{1-\beta} n=1−β1,则
lim n → + ∞ ( 1 − 1 n ) n = lim β → 1 ( β ) 1 1 − β = 1 e ≈ 0.3679 \lim_{n \rightarrow +\infty} \left(1-\frac{1}{n}\right)^n =\lim_{\beta \rightarrow 1} \left(\beta\right)^{\frac{1}{1-\beta}}=\frac{1}{e} \approx 0.3679 n→+∞lim(1−n1)n=β→1lim(β)1−β1=e1≈0.3679
所以,当 β → 1 \beta\rightarrow 1 β→1时,那些 i ≥ 1 1 − β i\geq\frac{1}{1-\beta} i≥1−β1的 θ t − i \theta_{t-i} θt−i的权重 ( 1 − β ) β i (1-\beta)\beta^i (1−β)βi一定小于 1 e \frac{1}{e} e1。代入计算可知,那些权重小于 1 e \frac{1}{e} e1的观测值就是近 1 1 − β \frac{1}{1-\beta} 1−β1个时刻之前的观测值。例如当 t = 20 , β = 0.9 t=20,\beta=0.9 t=20,β=0.9时, θ 1 , θ 2 , . . , θ 9 , θ 10 \theta_1,\theta_2,..,\theta_9,\theta_{10} θ1,θ2,..,θ9,θ10的权重都是小于 1 e \frac{1}{e} e1的,因此可以忽略不计,那么此时就相当于在求 θ 1 1 , θ 1 2 , . . , θ 1 9 , θ 20 \theta_11,\theta_12,..,\theta_19,\theta_{20} θ11,θ12,..,θ19,θ20这最近10个时刻的加权移动平均值。所以指数移动平均值可以近似看做在求最近 1 1 − β \frac{1}{1-\beta} 1−β1个时刻的加权移动平均值, β \beta β常取 ≥ 0.9 \geq 0.9 ≥0.9。由于当 t t t较小时,指数加权移动平均值的偏差较大,所以通常会加上一个修正因子 1 − β t 1-\beta^t 1−βt,加了修正因子后的公式为
$$v_t=\cfrac{\beta v_{t-1}+(1-\beta)\theta_t}{1-\beta^t} \$$
显然,当 t t t很小时,修正因子 1 − β t 1-\beta^t 1−βt会起作用,当 t t t足够大时 ( 1 − β t ) → 1 (1-\beta^t)\rightarrow 1 (1−βt)→1,修正因子会自动退场。
-
2.4 SGD with Nesterov Acceleration 是什么?
-
介绍:除了利用惯性跳出局部沟壑以外,我们还可以尝试往前看一步。想象一下你走到一个盆地,四周都是略高的小山,你觉得没有下坡的方向,那就只能待在这里了。可是如果你爬上高地,就会发现外面的世界还很广阔。因此,我们不能停留在当前位置去观察未来的方向,而要向前一步、多看一步、看远一些。NAG全称Nesterov Accelerated Gradient,是在SGD、SGD-M的基础上的进一步改进,改进点在于当前时刻梯度的计算,我们知道在时刻t的主要下降方向是由累积动量决定的,自己的梯度方向说了也不算,那与其看当前梯度方向,不如先看看如果跟着累积动量走了一步,那个时候再怎么走。也即在Momentum的基础上将当前时刻的梯度 g t g_t gt换成下一时刻的梯度 ∇ J ( θ t − β m t − 1 ) \nabla J(\theta_t-\beta m_{t-1}) ∇J(θt−βmt−1),由于此时也没有考虑二阶动量,所以 V t = E V_t=E Vt=E,NAG的参数更新公式为
Δ θ t = − η ⋅ m t = − ( β m t − 1 + η ∇ J ( θ t − β m t − 1 ) ) \Delta\theta_t=-\eta\cdot m_t=-\left(\beta m_{t-1}+\eta\nabla J(\theta_t-\beta m_{t-1})\right) Δθt=−η⋅mt=−(βmt−1+η∇J(θt−βmt−1))
θ t + 1 = θ t − ( β m t − 1 + η ∇ J ( θ t − β m t − 1 ) ) \theta_{t+1}=\theta_t-\left(\beta m_{t-1}+\eta\nabla J(\theta_t-\beta m_{t-1})\right) θt+1=θt−(βmt−1+η∇J(θt−βmt−1))
-
优点:在Momentum的基础上进行了改进,比Momentum更具有前瞻性,除了利用历史梯度作为惯性来跳出局部最优的沟壑以外,还提前走一步看看能否直接跨过沟壑。
2.5 Adagrad 是什么?
-
介绍:此前我们都没有用到二阶动量。二阶动量的出现,才意味着“自适应学习率”优化算法时代的到来。SGD及其变种以同样的学习率更新每个维度的参数(因为 θ t \theta_t θt通常是向量),但深度神经网络往往包含大量的参数,这些参数并不是总会用得到(想想大规模的embedding)。对于经常更新的参数,我们已经积累了大量关于它的知识,不希望被单个样本影响太大,希望学习速率慢一些;对于偶尔更新的参数,我们了解的信息太少,希望能从每个偶然出现的样本身上多学一些,即学习速率大一些。因此,AdaGrad则考虑对于不同维度的参数采用不同的学习率,具体的,对于那些更新幅度很大的参数,通常历史累计梯度的平方和会很大,相反的,对于那些更新幅度很小的参数,通常其累计历史梯度的平方和会很小(具体图示参见:https://zhuanlan.zhihu.com/p/29920135 )。所以在一个固定学习率的基础上除以历史累计梯度的平方和就能使得那些更新幅度很大的参数的学习率变小,同样也能使得那些更新幅度很小的参数学习率变大,所以AdaGrad的参数更新公式为
v t , i = ∑ t = 1 t g t , i 2 v_{t,i}=\sum_{t=1}^{t}g_{t,i}^2 vt,i=t=1∑tgt,i2
Δ θ t , i = − η v t , i + ϵ g t , i \Delta\theta_{t,i}=-\frac{\eta}{\sqrt{v_{t,i}+\epsilon}}g_{t,i} Δθt,i=−vt,i+ϵηgt,iθ t + 1 , i = θ t , i − η v t , i + ϵ g t , i \theta_{t+1,i}=\theta_{t,i}-\frac{\eta}{\sqrt{v_{t,i}+\epsilon}}g_{t,i} θt+1,i=θt,i−vt,i+ϵηgt,i
其中 g t , i 2 g_{t,i}^2 gt,i2表示第 t t t时刻第 i i i维度参数的梯度值, ϵ \epsilon ϵ是防止分母等于0的平滑项(常取一个很小的值 1 e − 8 1e-8 1e−8)。显然,此时上式中的 η v t , i + ϵ \frac{\eta}{\sqrt{v_{t,i}+\epsilon}} vt,i+ϵη这个整体可以看做是学习率,分母中的历史累计梯度值 v t , i v_{t,i} vt,i越大的参数学习率越小。上式仅仅是第 t t t时刻第 i i i维度参数的更新公式,对于第 t t t时刻的所有维度参数的整体更新公式为
V t = diag ( v t , 1 , v t , 2 , . . . , v t , d ) ∈ R d × d V_{t}=\operatorname{diag}\left(v_{t,1},v_{t,2},...,v_{t,d}\right)\in R^{d\times d} Vt=diag(vt,1,vt,2,...,vt,d)∈Rd×d
Δ θ t = − η V t + ϵ ⊙ g t \Delta\theta_{t}=-\frac{\eta}{\sqrt{V_{t}+\epsilon}}\odot g_t Δθt=−Vt+ϵη⊙gt
θ t + 1 = θ t − η V t + ϵ ⊙ g t \theta_{t+1}=\theta_{t}-\frac{\eta}{\sqrt{V_{t}+\epsilon}}\odot g_t θt+1=θt−Vt+ϵη⊙gt
注意,由于 V t V_t Vt是对角矩阵,所以上式中的 ϵ \epsilon ϵ只用来平滑 V t V_t Vt对角线上的元素。
- 优点:Adagrad即adaptive gradient,是一种自适应学习率的梯度法。它通过记录并调整每次迭代过程中的前进方向和距离,使得针对不同问题都有一套自适应学习率的方法。Adagrad最大的优势是不需要手动来调整学习率,但与此同时会降低学习率。
- 缺点:随着时间步的拉长,历史累计梯度平方和 v t , i v_{t,i} vt,i会越来越大,这样会使得所有维度参数的学习率都不断减小(单调递减),无论更新幅度如何。而且,计算历史累计梯度平方和时需要存储所有历史梯度,而通常神经网络的参数不仅多维度还高,因此存储量巨大。
2.6 RMSProp/AdaDelta 是什么?
-
介绍a:由于AdaGrad单调递减的学习率变化过于激进,我们考虑一个改变二阶动量计算方法的策略:不累积全部历史梯度,而只关注过去一段时间窗口的下降梯度,采用Momentum中的指数加权移动平均值的思路。这也就是AdaDelta名称中Delta的来历。首先看最简单直接版的RMSProp,RMSProp就是在AdaGrad的基础上将普通的历史累计梯度平方和换成历史累计梯度平方和的指数加权移动平均值,所以只需将AdaGrad中的 v t , i v_{t,i} vt,i的公式改成指数加权移动平均值的形式即可,也即
v t , i = β v t − 1 , i + ( 1 − β ) g t , i 2 v_{t,i}=\beta v_{t-1,i}+(1-\beta)g_{t,i}^2 vt,i=βvt−1,i+(1−β)gt,i2
V t = diag ( v t , 1 , v t , 2 , . . . , v t , d ) ∈ R d × d V_{t}=\operatorname{diag}\left(v_{t,1},v_{t,2},...,v_{t,d}\right)\in R^{d\times d} Vt=diag(vt,1,vt,2,...,vt,d)∈Rd×d
Δ θ t = − η V t + ϵ ⊙ g t \Delta\theta_{t}=-\frac{\eta}{\sqrt{V_{t}+\epsilon}}\odot g_t Δθt=−Vt+ϵη⊙gt
θ t + 1 = θ t − η V t + ϵ ⊙ g t \theta_{t+1}=\theta_{t}-\frac{\eta}{\sqrt{V_{t}+\epsilon}}\odot g_t θt+1=θt−Vt+ϵη⊙gt
而AdaDelta除了对二阶动量计算指数加权移动平均以外,还对当前时刻的下降梯度 Δ θ t \Delta\theta_{t} Δθt也计算一个指数加权移动平均,具体地
E [ Δ θ 2 ] t , i = γ E [ Δ θ 2 ] t − 1 , i + ( 1 − γ ) Δ θ t , i 2 \operatorname{E}[\Delta\theta^2]_{t,i}=\gamma\operatorname{E}[\Delta\theta^2]_{t-1,i}+(1-\gamma)\Delta\theta^2_{t,i} E[Δθ2]t,i=γE[Δθ2]t−1,i+(1−γ)Δθt,i2
由于 Δ θ t , i 2 \Delta\theta^2_{t,i} Δθt,i2目前是未知的,所以只能用 t − 1 t-1 t−1时刻的指数加权移动平均来近似替换,也即
E [ Δ θ 2 ] t − 1 , i = γ E [ Δ θ 2 ] t − 2 , i + ( 1 − γ ) Δ θ t − 1 , i 2 \operatorname{E}[\Delta\theta^2]_{t-1,i}=\gamma\operatorname{E}[\Delta\theta^2]_{t-2,i}+(1-\gamma)\Delta\theta^2_{t-1,i} E[Δθ2]t−1,i=γE[Δθ2]t−2,i+(1−γ)Δθt−1,i2
除了计算出 t − 1 t-1 t−1时刻的指数加权移动平均以外,AdaDelta还用此值替换我们预先设置的学习率 η \eta η,因此,AdaDelta的参数更新公式为
v t , i = β v t − 1 , i + ( 1 − β ) g t , i 2 v_{t,i}=\beta v_{t-1,i}+(1-\beta)g_{t,i}^2 vt,i=βvt−1,i+(1−β)gt,i2
V t = diag ( v t , 1 , v t , 2 , . . . , v t , d ) ∈ R d × d V_{t}=\operatorname{diag}\left(v_{t,1},v_{t,2},...,v_{t,d}\right)\in R^{d\times d} Vt=diag(vt,1,vt,2,...,vt,d)∈Rd×d
E [ Δ θ 2 ] t − 1 , i = γ E [ Δ θ 2 ] t − 2 , i + ( 1 − γ ) Δ θ t − 1 , i 2 \operatorname{E}[\Delta\theta^2]_{t-1,i}=\gamma\operatorname{E}[\Delta\theta^2]_{t-2,i}+(1-\gamma)\Delta\theta^2_{t-1,i} E[Δθ2]t−1,i=γE[Δθ2]t−2,i+(1−γ)Δθt−1,i2
Θ t = diag ( E [ Δ θ 2 ] t − 1 , 1 , E [ Δ θ 2 ] t − 1 , 2 , . . . , E [ Δ θ 2 ] t − 1 , d ) ∈ R d × d \Theta_{t}=\operatorname{diag}\left(\operatorname{E}[\Delta\theta^2]_{t-1,1},\operatorname{E}[\Delta\theta^2]_{t-1,2},...,\operatorname{E}[\Delta\theta^2]_{t-1,d}\right)\in R^{d\times d} Θt=diag(E[Δθ2]t−1,1,E[Δθ2]t−1,2,...,E[Δθ2]t−1,d)∈Rd×d
Δ θ t = − Θ t + ϵ V t + ϵ ⊙ g t \Delta\theta_{t}=-\frac{\sqrt{\Theta_{t}+\epsilon}}{\sqrt{V_{t}+\epsilon}}\odot g_t Δθt=−Vt+ϵΘt+ϵ⊙gt
θ t + 1 = θ t − Θ t + ϵ V t + ϵ ⊙ g t \theta_{t+1}=\theta_{t}-\frac{\sqrt{\Theta_{t}+\epsilon}}{\sqrt{V_{t}+\epsilon}}\odot g_t θt+1=θt−Vt+ϵΘt+ϵ⊙gt
显然,对于AdaDelta算法来说,已经不需要我们自己预设学习率 η \eta η了,只需要预设 β \beta β和 γ \gamma γ这两个指数加权移动平均值的衰减率即可。
- 优点:和AdamGrad一样对不同维度的参数采用不同的学习率,同时还改进了AdamGrad的梯度不断累积和需要存储所有历史梯度的缺点(因为移动平均不需要存储所有历史梯度)。特别地,对于AdaDelta还废除了预设的学习率,当然效果好不好还是需要看实际场景。
2.7 Adam 是什么?
- 介绍:Adam即Adaptive Moment Estimation,是能够自适应时刻的估计方法,能够针对每个参数,计算自适应学习率。这是一种综合性的优化方法,在机器学习实际训练中,往往能够取得不错的效果。
Adam=adagrad(用于处理稀疏的梯度)+RMSPro(处理非常态数据)
- 流程:
- 首先计算一阶动量
m t = β 1 m t − 1 + ( 1 − β 1 ) g t m_t = \beta_1 m_{t-1} + (1 - \beta_1) g_t mt=β1mt−1+(1−β1)gt
- 类似AdaDelta和RMSProp计算二阶动量
v t , i = β 2 v t − 1 , i + ( 1 − β 2 ) g t , i 2 v_{t,i}=\beta_2 v_{t-1,i}+(1-\beta_2)g_{t,i}^2 vt,i=β2vt−1,i+(1−β2)gt,i2
V t = diag ( v t , 1 , v t , 2 , . . . , v t , d ) ∈ R d × d V_{t}=\operatorname{diag}\left(v_{t,1},v_{t,2},...,v_{t,d}\right)\in R^{d\times d} Vt=diag(vt,1,vt,2,...,vt,d)∈Rd×d
- 分别加上指数加权移动平均值的修正因子
m ^ t = m t 1 − β 1 t v ^ t , i = v t , i 1 − β 2 t V ^ t = diag ( v ^ t , 1 , v ^ t , 2 , . . . , v ^ t , d ) ∈ R d × d \begin{aligned} \hat{m}_t &= \dfrac{m_t}{1 - \beta^t_1} \\ \hat{v}_{t,i} &= \dfrac{v_{t,i}}{1 - \beta^t_2} \\ \hat{V}_{t}&=\operatorname{diag}\left(\hat{v}_{t,1},\hat{v}_{t,2},...,\hat{v}_{t,d}\right)\in R^{d\times d} \end{aligned} m^tv^t,iV^t=1−β1tmt=1−β2tvt,i=diag(v^t,1,v^t,2,...,v^t,d)∈Rd×d
所以,Adam的参数更新公式为
Δ θ t = − η V ^ t + ϵ ⊙ m ^ t \Delta\theta_{t}=-\frac{\eta}{\sqrt{\hat{V}_{t}+\epsilon}}\odot \hat{m}_t Δθt=−V^t+ϵη⊙m^t
θ t + 1 = θ t − η V ^ t + ϵ ⊙ m ^ t \theta_{t+1}=\theta_{t}-\frac{\eta}{\sqrt{\hat{V}_{t}+\epsilon}}\odot \hat{m}_t θt+1=θt−V^t+ϵη⊙m^t
- 问题:
- 问题一、某些情况不收敛:由于Adam中的二阶动量非单调变化,导致Adam在训练后期容易出现学习率震荡,使得模型收敛不了【这也是为什么现在 SGD还被使用的原因】;
- 问题二、有可能错过全局最优解。由于后期Adam学习率太低,影响其收敛;
2.8 Nadam 是什么?
- 介绍:Adam只是将Momentum和Adaptive集成了,但是没有将Nesterov集成进来,而Nadam则是在Adam的基础上将Nesterov集成了进来,也即Nadam = Nesterov + Adam。具体思想如下:由于NAG 的核心在于,计算当前时刻的梯度 g t g_t gt时使用了「未来梯度」 ∇ J ( θ t − β m t − 1 ) \nabla J(\theta_t-\beta m_{t-1}) ∇J(θt−βmt−1)。NAdam 提出了一种公式变形的思路,大意可以这样理解:只要能在梯度计算中考虑到「未来因素」,就算是达到了 Nesterov 的效果。既然如此,我们就不一定非要在计算 g t g_t gt时使用「未来因素」,可以考虑在其他地方使用「未来因素」。具体地,首先NAdam在Adam的基础上将 m ^ t \hat{m}_t m^t展开
θ t + 1 = θ t − η V ^ t + ϵ ⊙ m ^ t = θ t − η V ^ t + ϵ ⊙ ( β 1 m t − 1 1 − β 1 t + ( 1 − β 1 ) g t 1 − β 1 t ) \begin{aligned} \theta_{t+1}&=\theta_{t}-\frac{\eta}{\sqrt{\hat{V}_{t}+\epsilon}}\odot \hat{m}_t \\ &= \theta_{t} - \frac{\eta}{\sqrt{\hat{V}_{t}+\epsilon}} \odot(\frac{\beta_1 m_{t-1}}{1 - \beta^t_1} + \dfrac{(1 - \beta_1) g_t}{1 - \beta^t_1}) \\ \end{aligned} θt+1=θt−V^t+ϵη⊙m^t=θt−V^t+ϵη⊙(1−β1tβ1mt−1+1−β1t(1−β1)gt)
此时,如果我们将第 t − 1 t-1 t−1时刻的动量 m t − 1 m_{t-1} mt−1用第 t t t时刻的动量 m t m_{t} mt近似代替的话,那么我们就引入了「未来因素」,所以将 m t − 1 m_{t-1} mt−1替换成 m t m_{t} mt即可得到Nadam的表达式
θ t + 1 = θ t − η V ^ t + ϵ ⊙ ( β 1 m t 1 − β 1 t + ( 1 − β 1 ) g t 1 − β 1 t ) = θ t − η V ^ t + ϵ ⊙ ( β 1 m ^ t + ( 1 − β 1 ) g t 1 − β 1 t ) \begin{aligned} \theta_{t+1}&= \theta_{t} - \frac{\eta}{\sqrt{\hat{V}_{t}+\epsilon}} \odot(\frac{\beta_1 m_{t}}{1 - \beta^t_1} + \dfrac{(1 - \beta_1) g_t}{1 - \beta^t_1}) \\ &= \theta_{t} - \frac{\eta}{\sqrt{\hat{V}_{t}+\epsilon}} \odot(\beta_1\hat{m}_t+ \dfrac{(1 - \beta_1) g_t}{1 - \beta^t_1}) \end{aligned} θt+1=θt−V^t+ϵη⊙(1−β1tβ1mt+1−β1t(1−β1)gt)=θt−V^t+ϵη⊙(β1m^t+1−β1t(1−β1)gt)
【关于 正则化】那些你不知道的事
一、L0,L1,L2正则化 篇
1.1 正则化 是什么?
我们所说的正则化,就是在原来的loss function的基础上,加上了一些正则化项或者称为模型复杂度惩罚项。
1.2 什么是 L0 正则化 ?
-
介绍:指向量中非零元素的个数,希望参数中大部分元素为0,希望参数是稀疏的;
-
公式: ∑ j = 1 , θ j ≠ 0 m θ j 0 \sum_{j=1, \theta_{j} \neq 0}^{m} \theta_{j}^{0} ∑j=1,θj=0mθj0
-
直观理解:即将所有的非零项都作为1加起来,然后再用步长 λ \lambda λ调节。意思很明显,每一个对预测产生了贡献的参数,我都惩罚一次,不多不少,大家都一样。
就像一个法官判决,你偷了一毛钱,他杀了一个人,法官均以“价值观不正确”为由,把你们判一样的罪……只有一点都没参与的人,才不会被判刑。
- 缺点:难以优化(存在NP难问题)
1.3 什么是 L1 (稀疏规则算子 Lasso regularization)正则化 ?
- 介绍:指向量中各元素绝对值之和,是 L0 正则项的最优凸近似;
- 公式:
∑ j = 1 m ∣ θ j ∣ \sum_{j=1}^{m}\left|\theta_{j}\right| ∑j=1m∣θj∣
- 直观理解:即将所有的绝对值值相加。
拿法官举例子,就是,法官要按照你们的罪行量刑判罪,但是都得判,无论你影响最终是好是坏(比如你杀了个人,这个人也是个坏人,但是你还是犯了杀人罪得判刑)都按照罪行判罪。于是就都取个绝对值,表示都判,然后按照罪行大小判罪了……
- 优点:
- 比 L0 容易优化求解,L0存在NP难问题,所以 使用 较多;
- L1范数是L0范数的最优凸近似;
- 参数稀疏 的 优点:
- 特征选择:通过将无用特征所对应的权重设为0,以去除无用特征;
- 可解释性:因为无用特征的权重对应权重都为0,所以只需要介绍权重不为 0 的特征;
1.4 什么是 L2 正则化(岭回归 Ridge Regression 或者 权重衰减 Weight Decay)正则化 ?
- 介绍:向量各元素的平方和然后求平方根,防止模型出现过拟合的问题
- 公式:
∑ j = 1 m θ j 2 \sum_{j=1}^{m} \theta_{j}^{2} ∑j=1mθj2
- 直观理解:所有项目的平方和相加最后开根
- 作用:防止过拟合问题
- 优点:
- 防止过拟合,提升模型的泛化能力;
- 有助于处理 condition number 不好的情况下矩阵求逆很困难的问题。
二、对比篇
2.1 什么是结构风险最小化?
在经验风险最小化的基础上(也就是训练误差最小化),尽可能采用简单的模型,以此提高泛化预测精度。
下面是一个图像解释(假设X为一个二维样本,那么要求解参数 w w w也是二维):
- 原函数曲线等高线(同颜色曲线上,每一组 w 1 , w 2 w_1,w_2 w1,w2带入值都相同)
2.2 从结构风险最小化的角度理解L1和L2正则化
-
L1和L2加入后的函数图像:
从上面两幅图中我们可以看出:
-
如果不加L1和L2正则化的时候,对于线性回归这种目标函数凸函数的话,我们最终的结果就是最里边的紫色的小圈圈等高线上的点。
-
当加入L1正则化的时候,我们先画出以下函数的图像:
∣ ω 1 ∣ + ∣ ω 2 ∣ = F \left|\omega_{1}\right|+\left|\omega_{2}\right|=F ∣ω1∣+∣ω2∣=F
该图像也就是一个菱形,代表这些曲线上的点算出来的1范数 ∣ ω 1 ∣ + ∣ ω 2 ∣ \left|\omega_{1}\right|+\left|\omega_{2}\right| ∣ω1∣+∣ω2∣ 都为F,那我们现在的目标是不仅是原曲线算得值要小(越来越接近中心的紫色圈圈),还要使得这个菱形越小越好(F越小越好)。那么还和原来一样的话,过中心紫色圈圈的那个菱形明显很大,因此我们要取到一个恰好的值。那么如何求值呢?
-
以同一条原曲线目标等高线来说,现在以最外圈的红色等高线为例,我们看到,对于红色曲线上的每个点都可以做一个菱形,根据上图可知,当这个菱形与某条等高线相切(仅有一个交点)的时候,这个菱形最小。用公式说这个时候能使得在相同的 1 / N ∗ ∑ i = 1 N ( y i − ω T x i ) 2 1 / N * \sum_{i=1}^{N}\left(y_{i}-\omega^{T} x_{i}\right)^{2} 1/N∗∑i=1N(yi−ωTxi)2下,由于相切的时候的 C ∥ ω ∥ 1 C\|\omega\|_{1} C∥ω∥1,即 ∣ ω 1 ∣ + ∣ ω 2 ∣ \left|\omega_{1}\right|+\left|\omega_{2}\right| ∣ω1∣+∣ω2∣小,所以:能够使得 1 / N ∗ ∑ i = 1 N ( y i − ω T x i ) 2 + C ∥ ω ∥ 1 1 / N * \sum_{i=1}^{N}\left(y_{i}-\omega^{T} x_{i}\right)^{2}+C\|\omega\|_{1} 1/N∗∑i=1N(yi−ωTxi)2+C∥ω∥1更小。
-
有了上述说明,我们可以看出,最终加入L1范数得到的解,一定是某个菱形和某条原函数等高线的切点。现在有个比较重要的结论来了,我们经过观察可以看到,几乎对于很多原函数等高曲线,和某个菱形相交的时候及其容易相交在坐标轴(比如上图),也就是说最终的结果,解的某些维度及其容易是0,比如上图最终解是
ω = ( 0 , x ) \omega=(0, x) ω=(0,x)
这也就是我们所说的L1更容易得到稀疏解(解向量中0比较多)的原因。 -
当然了,光看着图说,L1的菱形更容易和等高线相交在坐标轴,一点都没说服力,只是个感性的认识,不过不要紧,其实是很严谨的,我们直接用求导来证明,具体的证明这里有一个很好的答案了,简而言之就是假设现在我们是一维的情况下
h ( ω ) = f ( ω ) + C ∣ ω ∣ h(\omega)=f(\omega)+C|\omega| h(ω)=f(ω)+C∣ω∣
其中$ h(\omega) 是目标函数, 是目标函数, 是目标函数,f(\omega) 是没加 L 1 正则化的目标函数, 是没加L1正则化的目标函数, 是没加L1正则化的目标函数,C|\omega|$是L1正则项,那么要使得0点成为最值的可能得点,,虽然在0点不可导,但是我们只需要让0点左右的导数异号,即
h 左 ′ ( 0 ) ∗ h 右 ′ ( 0 ) = ( f ′ ( 0 ) + C ) ( f ′ ( 0 ) − C ) < 0 h_{\mathrm{左}}^{\prime}(0) * h_{\mathrm{右}}^{\prime}(0)=\left(f^{\prime}(0)+C\right) \quad\left(f^{\prime}(0)-C\right)<0 h左′(0)∗h右′(0)=(f′(0)+C)(f′(0)−C)<0
也就是 C > ∣ f ′ ( 0 ) ∣ C>\left|f^{\prime}(0)\right| C>∣f′(0)∣的情况下,0点都是可能得最值点。
-
-
当加入L2正则化的时候,分析和L1正则化是类似的,也就是说我们仅仅是从菱形变成了圆形而已,同样还是求原曲线和圆形的切点作为最终解。当然与L1范数比,我们这样求的L2范数的从图上来看,不容易交在坐标轴上,但是仍然比较靠近坐标轴。因此这也就是我们老说的,L2范数能让解比较小(靠近0),但是比较平滑(不等于0)。
综上所述,我们可以看见,加入正则化项,在最小化经验误差的情况下,可以让我们选择解更简单(趋向于0)的解。
2.3 L1 vs L2
L1 | L2 | |
目标 | 绝对值最小化 | 平方值最小化 |
下降速度 | 以绝对值函数方式下降,较快 | 以二次函数函数方式下降,较慢 |
规则化的代价函数 | 图 1 | 图 2 |
最优解是 w1 和 w2 的取值 | L1在和每个坐标轴相交的地方都有“角”出现,而目标函数的测地线除非位置摆得非常好,大部分时候都会在角的地方相交。注意到在角的位置就会产生稀疏性,例如图中的相交点就有w1=0,而更高维的时候(想象一下三维的L1-ball 是什么样的?)除了角点以外,还有很多边的轮廓也是既有很大的概率成为第一次相交的地方,又会产生稀疏性 | 因为没有角,所以第一次相交的地方出现在具有稀疏性的位置的概率就变得非常小了。这就从直观上来解释了为什么L1-regularization 能产生稀疏性,而L2-regularization 不行的原因了 |
总结 | L1 会趋向于产生少量的特征,而其他的特征都是0 | L2 会选择更多的特征,这些特征都会接近于0 |
特点 | Lasso在特征选择时候非常有用 | Ridge就只是一种规则化而已 |
使用选择方面 | 特征多,但是其作用的特征少的情况【自动选择特征】 | 特征中起作用的特征多的情况 |
分布类型 | 拉普拉斯分布 | 高斯分布 |
三、dropout 篇
3.1 什么是 dropout?
- 方式:通过以概率p主动临时性地忽略掉神经网站中的部分隐藏节点来防止过拟合,即让这些神经元以一定概率不工作;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RVeYWyFh-1677244916204)(img/20200812203815.png)]
3.2 dropout 在训练和测试过程中如何操作?
- 训练过程:在训练开始时,随机删除一些隐藏层神经元,即认为这些神经元不存在,同时保持输入层与输出层的神经元个数不变,按照反向传播学习算法对神经网络中的参数进行学习更新(被删除的节点不参与更新)。在这个“残缺”的网络中,让神经网络学习数据中的局部特征(即部分分布式特征)。在多个“残缺”之网(相当于多个简单网络)中实施特征,总要比仅在单个健全网络上进行特征学习,其泛化能力来得更加健壮。这里的“泛化”,实际上就是适应各种情况的能力。如果神经网络仅仅在训练集合上表现好(好比“窝里横”),而在应对其他新情况表现不佳,就表明陷入“过拟合”状态,其实就是泛化能力差。
- 在测试阶段,将参与学习的节点和那些被隐藏的节点以一定的概率p加权求和,综合计算得到网络的输出。对于这样的“分分合合”的学习过程,有学者认为,“丢弃学习”可视为一种集成学习(Ensemble Learning)。
3.3 dropout 如何防止过拟合?
- 先回到正常的模型(没有dropout),我们用相同的训练数据去训练5个不同的神经网络,一般会得到5个不同的结果,此时我们可以采用 “5个结果取均值”或者“多数取胜的投票策略”去决定最终结果。(例如 3个网络判断结果为数字9,那么很有可能真正的结果就是数字9,其它两个网络给出了错误结果)。这种“综合起来取平均”的策略通常可以有效防止过拟合问题。因为不同的网络可能产生不同的过拟合,取平均则有可能让一些“相反的”拟合互相抵消。dropout掉不同的隐藏神经元就类似在训练不同的网络(随机删掉一半隐藏神经元导致网络结构已经不同),整个dropout过程就相当于 对很多个不同的神经网络取平均。而不同的网络产生不同的过拟合,一些互为“反向”的拟合相互抵消就可以达到整体上减少过拟合。
- dropout减少神经元之间复杂的共适应关系:因为dropout程序导致两个神经元不一定每次都在一个dropout网络中出现。(这样权值的更新不再依赖于有固定关系的隐含节点的共同作用,阻止了某些特征仅仅在其它特定特征下才有效果的情况)。迫使网络去学习更加鲁棒的特征 (这些特征在其它的神经元的随机子集中也存在)。换句话说假如我们的神经网络是在做出某种预测,它不应该对一些特定的线索片段太过敏感,即使丢失特定的线索,它也应该可以从众多其它线索中学习一些共同的模式,提升模型鲁棒性,从这个角度看 dropout就有点像L1,L2正则,减少权重使得网络对丢失特定神经元连接的鲁棒性提高)