6万字解决算法面试中的深度学习基础问题(二)

简介: 6万字解决算法面试中的深度学习基础问题(二)

12. 评价指标


506d29b860859d678b323cbd66fff5d7.png


1,准确率和召回率(虚警和漏报)


53c5a1ffdf549810a2a22291fc7a0bb0.png


准确率为预测阳性的病人中真正为阳性的概率

召回率等价于敏感度,即有病的人中被检测到有病的概率(有病且被召回的概率)


4、PR曲线与F1值:纵轴为精确率P,横轴为召回率R

PR曲线围成面积越大越好,但:


c1be2714885b086a8ab2f9e190cebcef.png


5、ROC曲线与AUC值:纵轴为真阳性率TPR,横轴为假阳性率FPR

真阳性率(true positive rate,TPR),又称敏感度 正样本被预测为正样本的概率

假阳性率:无病,但根据筛检被判为有病的百分比


66286a1d9fd0d53b3470b1b2309a0a1f.png


ba40e96d28d7b337a8d6147507510b09.png


6、怎么形成曲线:分类阈值α的调整形成


7、PR和ROC曲线应用场景对比:


ec062d916985d5344b3ded7ec5c390be.png


13.正则化L1,L2


1、什么是正则化


正则化就是一类通过显式设计降低泛化误差,以提升算法通用性的策略的统称。从概率论角度看,许多正则化技术对应的是在模型参数上施加一定的先验分布,其作用是改变泛化误差的结构。正则化在经验风险最小化的基础上(也就是训练误差最小化),尽可能采用简单的模型,可以有效提高泛化预测精度。如果模型过于复杂,变量值稍微有点变动,就会引起预测精度问题。正则化之所以有效,就是因为其降低了特征的权重,使得模型更为简单。


2、L1正则化


而L1正则项就是一个L1范数,即相当于为模型添加了这样一个先验知识:w 服从零均值拉普拉斯分布。


64587bba2e169631dd042e0398c915a0.png


由于引入了先验知识,所以似然函数这样写:


f44e6dc946a4781cca9d75ebbb173739 - 副本.png


取 log 再取负,得到目标函数:


f104c0a8d80867566ab14144f5b508a0.png


3、L2正则化


L2正则项就是一个L2范数,即Ridge 回归,相当于为模型添加了这样一个先验知识:w 服从零均值正态分布。


64587bba2e169631dd042e0398c915a0.png


类似的,似然函数为:


cbb41dc74303c450f7de72773409482d.png


目标函数为:


89c8c6c641348b13d009ed942b9e0f70.png


即L2范数


4、L1和L2正则化的区别


L1 正则化增加了所有权重 w 参数的绝对值之和逼迫更多 w 为零,也就是变稀疏,L2 正则化中增加所有权重 w 参数的平方之和,逼迫所有 w 尽可能趋向零但不为零(L2 的导数趋于零)。


1f80a731e20a0fc013bf884c2a8fcd4a.png



5、总结


给 loss function 加上正则化项,能使新得到的优化目标函数 h=f+||w|| ,需要在 f 和 ||w|| 中做一个权衡,如果还像原来只优化 f 的情况下,那可能得到一组解比较复杂,使得正则项 ||w|| 比较大,那么 h 就不是最优的,因此可以看出加正则项能让解更加简单,符合奥卡姆剃刀理论,同时也比较符合在偏差和方差(方差表示模型的复杂度)分析中,通过降低模型复杂度,得到更小的泛化误差,降低过拟合程度。


L1 正则化就是在 loss function 后边所加正则项为 L1 范数,加上 L1 范数容易得到稀疏解(0 比较多)。L2 正则化就是 loss function 后边所加正则项为 L2 范数的平方,加上 L2 正则相比于 L1 正则来说,得到的解比较平滑(不是稀疏),但是同样能够保证解中接近于 0(但不是等于 0,所以相对平滑)的维度比较多,降低模型的复杂度。


  • 缩小参数空间


  • 防止过拟合


  • 加先验知识


  • 使得求解变得可行(比如样本较少时候OLS的逆矩阵求解)


不用L0正则化的原因


根据上面的讨论,稀疏的参数可以防止过拟合,因此用L0范数(非零参数的个数)来做正则化项是可以防止过拟合的。


从直观上看,利用非零参数的个数,可以很好的来选择特征,实现特征稀疏的效果,具体操作时选择参数非零的特征即可。但因为L0正则化很难求解,是个NP难问题,因此一般采用L1正则化。L1正则化是L0正则化的最优凸近似,比L0容易求解,并且也可以实现稀疏的效果。


不正则化参数b的原因


如果对||b||进行惩罚,其实是没有作用的,因为在对输出结果的贡献中,参数b对于输入的改变是不敏感的,不管输入改变是大还是小,参数b的贡献就只是加个偏置而已。举个例子,如果你在训练集中,w和b都表现得很好,但是在测试集上发生了过拟合,b是不背这个锅的,因为它对于所有的数据都是一视同仁的(都只是给它们加个偏置),要背锅的是w,因为它会对不同的数据产生不一样的加权。


6、稀疏与平滑


f(x) = b + w1x1+w2x2+w3x3+…


稀疏


对于模型而言,稀疏指的是模型中的参数有较少的非零值,其作用有:


1. 去掉冗余特征,使模型更简单,防止过拟合


2. 降低运算量,防止维度爆炸


L1正则化 与 Relu 都能带来稀疏性。


对于样本而言,稀疏指的是样本中存在较多的特征值缺失或为零(文本数据通常是稀疏表示的),也叫作样本的稀疏表示。


稀疏表示的样本可以使得其数据集线性可分,使用SVM方法时能够有很好的性能,并且稀疏矩阵的已经有高效的存储方式,并不会带来额外的负担。


Adagrad 适合处理稀疏数据的原因:Adagrad 中每个参数的学习率:


eb658e38990945dcbbf2c4a313668704.png


假设有10000个样本,其中有9900个样本的特征 x1 的值为0,这就是稀疏的数据。

那么在更新时,x1 的参数 w1 有 9900 次其更新梯度都是 0,仅有 100 次更新梯度非零。假如没有使用 Adagrad,其学习率没有针对过往梯度和做比例调整,那么10000个样本中仅有这100次更新是有效的,相对于非稀疏特征,其收敛速度大减,而使用 Adagrad 后,学习率会被放大,虽然仅有100次更新,但是能够大大加快收敛速度。


平滑


平滑是指模型中的参数都比较小,其函数图像看起来比较平滑,而非陡峭,作用是使模型对样本特征值(也就是 x)的变化不敏感,防止过拟合。


【补】


7、使用场景:


需要对特征进行筛选的场景,那我们可以选择L1正则

L2可让所有特征的系数都缩小,但是不会变成零,会使得优 求解稳定快速;

有些应用场景,也会把L1和L2联合起来使用8、如何解决L1求导困难:坐标下降法


387156e53c034c0780049fb04b69ea79.png


9、坐标下降法缺点:可能会调到局部最优而不是全局最优


14.权重初始化


是否可以将权重初始化为0?


背景:对于简单的网络可以直接随机初始化


但对于深层网络而言,参数如果初始化不合适,就有可能导致输出结果分布在梯度过大或过小的位置,那么经过层层叠加之后就容易发生梯度消失或梯度爆炸的问题。


几种初始化:


1. pretraining


2. raddom initialization, 但若所选分布不当,也会影响收敛


eg,10层网络,激活函数为tanh


a,随机初始化为均值为0,方差为0.1


cb41cb2420fe4a4dab925fddace8ee21.png


4a345b7f2e788cf9e377f7deed2ecdcc.png


b,随机初始化为均值0,方差1


f26d8a10449d7ed83ce9feff83d0a89e.png


Xavier Initialization(其实就是rescale 标准0,1正态分布)

2010年Xavier Glorot提出一般情况下,激活值的方差是逐层衰减的,反向传播梯度也逐层递减。要避免梯度消失,就是要避免激活值方差的衰减。如果能保证每层网络的输入和输出分布保持一致,就perfect了,


13da670c7128043cdd97b1de6b4493f7.png


推导:


529a16c119edef89c7956f2c860d31c5.png


Kaiming Initialization


但Xavier假设网络中没有激活函数,或者为线性激活函数,若使用Relu,输出值依旧会跑偏。


对于Relu函数,若激活前均值为0,那么激活后抛弃掉小于0的值,均值会增大,进而不满足Xavier关于均值为0的前提。何凯明经过推导得出rescale系数应改成


92cdab1758a3c13f9b4b7060bf155a28.png


15. 决策树


15.1 原理


决策树(decision tree) 是一类常见的机器学习方法.一般的,一棵决策树包含一个根结点、若干个内部结点和若干个叶结点,叶结点对应于决策结果,其他每个结点则对应一个属性测试;每个结点包含的样本集合根据属性测试的结果被划分到子结点中;根结点包含样本全集.从根结点到每个叶结点的路径对应了一个判定测试序列。

根据不同的划分方式,衍生出多种不同类型的决策树方法。


15.2 ID3


信息熵:“信息熵” (information entropy)是度量样本集合纯度最常用的一种指标.假定当前样本集合D 中第k 类样本所占的比例为Pk (k = 1, 2,. . . , |Y|) ,则D信息熵定义为


fc0e12a52e729c5ada25cc9bc063c76e.png


Ent(D) 的值越小,则D 的纯度越高.


信息增益:


626d8f3ff00904421bb9412a703b8936.png


一般而言,信息增益越大,则意味着使用属性a来进行划分所获得的"纯度提升"越大。


15.3 C4.5


增益率:


85d6f56797ce2e82ecc230f9a4af94cc.png6f605d720b1e967f29240242e0ba820e.png




需注意的是,增益率准则对可取值数目较少的属性有所偏好,因此,C4.5算法并不是直接选择增益率最大的候选划分属性,而是使用了一个启发式:先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的.


15.4 CART决策树


“基尼指数” (Gini index):


bd5d64f27c16dab5a4deb8265229c703.pngb2a7c7c18dcc26516232bbdfae848140.png


我们在候选属性集合A 中,选择那个使得划分后基尼指数最小的属性作为最优划分属性


15.5 剪枝处理o


预剪枝:生成树时对某一节点的划分用验证集对比精度,没提高则剪枝。预剪枝降低了过拟合,但基于贪心的本质禁止这些分支展开,有欠拟合的风险。


5477eb657db320ff3d25ed5c47a428a9.png


后剪枝:生成完整决策树后,自底向上判断结点剪枝与否在验证集精度是否提高。

一般情形下,后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝决策树,但后剪枝过程是在生成完全决策树之后进行的,并且要自底向上地对树中的所有非叶结点进行逐一考察,因此其训练时间开销比未剪枝决策树和预剪枝决策树都要大得多。


15.6 连续值处理(回归树)


一般选用相邻连续值的中点作为候选划分点,判断最优点进行划分。且与离散属性不同,若当前结点划分属性为连续属性,该属性还可作为其后代结点的划分属性。


15.7 缺失值处理


1. 如何在属性值缺失的情况F进行划分属性选择?


推广的信息增益公式:


b2a7c7c18dcc26516232bbdfae848140.png69fc15355d0252762a1ccccd678aeb87.png




2. 给定划分属性?若样本在该属性上的值缺失,如何对样本进行划分?


若样本x划分属性a上的取值己知,则将x划入与其取值对应的子结点,且样本权值在于结点中保持为ω. 若样本x在划分属性a上的取值未知,则将x同时划入所有子结点,且样本权值在与属性值a_v对应的子结点中调整为凡ω·r_v。


15.8 多变量决策树


使用多变量将每一个非叶结点用一个线性分类器进行划分。


32ed410518df25c2dd1e6637dfe85340.png


15.9 LR、决策树、SVM的选择与对比


逻辑回归的优点:


1. 便利的观测样本概率分数;


2. 已有工具的高效实现;


3. 对逻辑回归而言,多重共线性并不是问题,它可以结合L2正则化来解决;


4. 逻辑回归广泛的应用于工业问题上(这一点很重要)。


逻辑回归的缺点:


1. 当特征空间很大时,逻辑回归的性能不是很好;


2. 不能很好地处理大量多类特征或变量;


3. 对于非线性特征,需要进行转换;


4. 依赖于全部的数据(个人觉得这并不是一个很严重的缺点)。


决策树的优点:


1. 直观的决策规则


2. 可以处理非线性特征


3. 考虑了变量之间的相互作用


决策树的缺点:


1. 训练集上的效果高度优于测试集,即过拟合[随机森林克服了此缺点]


2. 没有将排名分数作为直接结果


SVM的优点:


1. 能够处理大型特征空间


2. 能够处理非线性特征之间的相互作用


3. 无需依赖整个数据


SVM的缺点:


1. 当观测样本很多时,效率并不是很高


2. 有时候很难找到一个合适的核函数


何时选择这三种算法,流程如下:

首当其冲应该选择的就是逻辑回归,如果它的效果不怎么样,那么可以将它的结果作为基准来参考;然后试试决策树(随机森林)是否可以大幅度提升模型性能。即使你并没有把它当做最终模型,你也可以使用随机森林来移除噪声变量;如果特征的数量和观测样本特别多,那么当资源和时间充足时,使用SVM不失为一种选择。

`

参考:机器学习,第四章 周志华 (本节1-8点)

https://blog.csdn.net/weixin_41712499/article/details/88149170 (本节9点)


16. Boosting vs Bagging


1. Boosting vs Bagging (3)


Bagging和Boosting的区别:


1)样本选择上:Bagging:训练集是在原始集中有放回选取的,从原始集中选出的各轮训练集之间是独立的。Boosting:每一轮的训练集不变,只是训练集中每个样例在分类器中的权重发生变化。而权值是根据上一轮的分类结果进行调整。

2)样例权重:Bagging:使用均匀取样,每个样例的权重相等。Boosting:根据错误率不断调整样例的权值,错误率越大则权重越大。

3)预测函数:Bagging:所有预测函数的权重相等。Boosting:每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重。

4)并行计算:Bagging:各个预测函数可以并行生成。Boosting:各个预测函数只能顺序生成,因为后一个模型参数需要前一轮模型的结果。


1. XGBoost、AdaBoost、 GBDT (2)


2. 决策树、GBDT、XGBoost 区别与联系


https://blog.csdn.net/quiet_girl/article/details/88756843


1. XGBoost (5)


16.1 集成学习


结合多个“好而不同”的学习器,来获得优于单一学习器的泛化性能。


a5d31762cc205e8c6086a8e1efeb588c.png


学习器之间应“好而不同”,“好而同”则集成不起作用,“坏而不同”则起副作用。(“好”可以理解为至少优于随机瞎猜)


16bc21d1430169472a55a02e44e6ad06.png


16.2 Boosting


个体学习器之间存在强依赖关系,串行生成。

主要关注减低偏差,可以将弱分类器提升为强分类器。

先从原始训练集训练得到一个基学习器,再提高对错误样本的权重比例,使用新的样本分布来重新训练学习器,重复进行T次,最终将T个学习器加权结合。


AdaBoost


cea523733c76f8f3b248ff9b69fab034.png


16.3 Bagging


通过自助采样法得到T个互有交集的训练集,基于每个训练集训练出基学习器,最后结合。Bagging在最后结合时,通常对分类任务做简单投票法,对回归任务做简单平均法。

由于每个学习器使用的样本都只是原始训练集的一个子集(约有63.2% 的样本),所以剩下的样本可以用作验证集,来对泛化性能做“包外估计”。

Bagging的复杂度与训练一个学习器的复杂度同阶(可以简单看做O(Tn),T是一个不大的常数)

主要关注降低方差,在不剪枝决策树、神经网络等易受样本扰动的学习器上效用明显。


f095ab7770ae1f39cd4ca058edbf7c5e.png


16.4从减小偏差和方差来解释Boosting和Bagging


Bagging:减小方差


Bagging就是对数据随机采样,训练若干基分类器,对所有基分类器取平均。

假设n个基分类器,方差为σ2,若两两相互独立,则取平均后的方差为σ2/n。但模型之间不可能完全独立,假设模型之间的相关性为p,则取平均后的方差为:


5bb08df295fab5ebf0b0a10229118093.png


可以看出,相关性越低,方差越小。


因此,bagging时要尽可能降低模型之间的相关性:


1. 随机森林算法中,每次选取节点分裂属性时,会随机抽取一 个属性子集,而不是从所有属性中选取最优属性


2. 训练集的重采样


Boosting:减小偏差


Boosting在训练好一个弱分类器后,我们需要计算弱分类器的错误或者残差,作为下一个分类器的输入。学习过程中不断减小损失函数,使模型不断逼近靶心。

可以看出,此时基分类器之间强相关,所以不会显著降低方差。


16.5 随机森林(RF)


随机选取样本+特征

是Bagging的扩展变体,在以决策树为基学习器的Bagging集成上,在决策树的训练过程中引入随机属性选择(原本是选择最优的属性,改为先随机选择k个属性,再从中选择最优属性,推荐值 k=log2d, d为属性数)。

相比Bagging的多样性仅来自于样本扰动,RF还增加了属性扰动,进一步提升学习器之间的差异性,从而提升泛化性能。随机森林简单、易实现、计算开销小,实现效率比Bagging还低(每次属性选择时只考虑了子集,而非全集。)


17.优化算法


在机器学习算法中,对于很多监督学习模型,需要对原始的模型构建损失函数,之后通过优化算法对损失函数进行优化,寻找到最优的参数。求解机器学习参数的优化算法中,使用较多的是基于梯度下降的优化算法(Gradient Descent, GD)。

梯度下降法的含义是通过当前点的梯度方向寻找到新的迭代点。

基本思想可以这样理解:我们从山上的某一点出发,找一个最陡的坡走一步(也就是找梯度方向),到达一个点之后,再找最陡的坡,再走一步,直到我们不断的这么走,走到最“低”点(最小花费函数收敛点)。


d3015212a270e6fcc5cec3f56c6d5c28.png


梯度下降法的变形形式


1. 批量梯度下降法 (Batch Gradient Descent)


批梯度下降法(Batch Gradient Descent)针对的是整个数据集,通过对所有的样本的计算来求解梯度的方向。

梯度和参数更新公式如下:


80b9be03347e00bc832ef342d9a13005.png


其中,是η学习率,是g_t梯度。


每迭代一步,都要用到训练集所有的数据,如果样本数目很大,这种方法的迭代速度很慢!


优点:理论上讲,可以得到全局最优解,参数更新比较稳定,收敛方向稳定;可以并行实现;


缺点:计算量大,参数更新慢,对内存的要求很高,不能以在线的形式训练模型,也就是运行时不能加入新样本。


从迭代的次数上来看,批量梯度下降法迭代的次数相对较少。其迭代的收敛曲线示意图可以表示如下:


1981694a721dd59274483cc38cf0d4f2.png


2. 随机梯度下降(Stochastic Gradient Descent)


为了加快收敛速度,并且解决大数据量无法一次性塞入内存(显存)的问题,每次只训练一个样本去更新参数,这就是随机梯度下降法。


如果我们的数据集很大,比如几亿条数据, 基本上设置1,2,(10以内的就足够了)就可以。但是SGD也有缺点,因为每次只用一个样本来更新参数,会导致不稳定性大些,每次更新的方向,不像batch gradient descent那样每次都朝着最优点的方向逼近,会在最优点附近震荡)。因为每次训练的都是随机的一个样本,会导致导致梯度的方向不会像BGD那样朝着最优点。


在代码中的随机把数据打乱很重要,因为这个随机性相当于引入了“噪音”,正是因为这个噪音,使得SGD可能会避免陷入局部最优解中。


优点:训练速度快;同时能够在线学习。


缺点:


1、参数更新的过程震荡很大,目标函数波动剧烈,参数更新方向有很大的波 动。

2、其较大的波动可能收敛到比批量梯度下降更小的局部极小值,因为会从一个极小值跳出来

3、不易并行实现。


从迭代的次数上来看,SGD迭代的次数较多,在解空间的搜索过程看起来很盲目。其迭代的收敛曲线示意图可以表示如下:


23f48a6647f1bf0350b4638ed96fdef8.png33bb04a0c2594043e3f2c27aa78de50a.png



下面来对比下SGD和BGD的代价函数随着迭代次数的变化图:


bc309ec154ea86546b6f49e0cad35e2c.png


可以看到SGD的代价函数随着迭代次数是震荡式的下降的(因为每次用一个样本,有可能方向是背离最优点的)


小批量梯度下降(Mini-Batch Gradient Descent)

在上述的批梯度的方式中每次迭代都要使用到所有的样本,对于数据量特别大的情况,如大规模的机器学习应用,每次迭代求解所有样本需要花费大量的计算成本。所以出现了mini-batch梯度下降,其思想是:可以在每次的迭代过程中利用部分样本代替所有的样本。batch通常设置为2的幂次方,通常设置(很少设置大于512)。因为设置成2的幂次方,更有利于GPU加速。现在深度学习中,基本上都是用 mini-batch gradient descent,(在深度学习中,很多直接把mini-batch gradient descent(a.k.a stochastic mini-batch gradient descent)简称为SGD,所以当你看到深度学习中的SGD,一般指的就是mini-batch gradient descent)。

假设每个batch有64个样本,如下图所示:


0103263397a8ffde24dc75d8fdc41c99.png


mini-batch gradient descent 和 stochastic gradient descent 在下降时的对比图:


33bb04a0c2594043e3f2c27aa78de50a.png


mini-batch gradient descent的代价函数随着迭代次数的变化图:


4444444.png


mini-batch gradient descent 相对SGD在下降的时候,相对平滑些。不像SGD那样震荡的比较厉害。mini-batch gradient descent的一个缺点是增加了一个超参数。


优点:


1、降低了更新参数的方差,使得收敛过程更加的稳定

2、能够利用高度优化的矩阵运算,很高效的求得每小批数据的梯度


SGD容易收敛到局部最优,并且在某些情况下可能被困在鞍点,【在合适的初始化和step size的情况下,鞍点的影响不是很大。】


122f34d3eb646c52c661400996c589ae.png


【上述梯度下降法方法面临的主要挑战】:


  • 选择合适的学习率较为困难,太小的学习率会导致收敛缓慢,太大的学习率导致波动较大,可能跳出局部最小值


目前可采用的方法是在训练过程中调整学习率的大小,

例如模拟退火法:预定义一个迭代次数m,每次执行完m次训练便减小学习率,

或者当损失函数的值低于一个阈值时,减小学习率,迭代次数和损失函数的阈值必须训练前先定义好。


  • 上述方法中,每个参数的学习率都是相同的,但这种方法是不合理的,如果训练数据是稀疏的,并且不同特征的出现频率差异较大,那么比较合理的做法是对于出现频率较低的特征设置较大的学习率,对于出现频率较大的特征设置较小的学习率。


  • 近期研究表明[1],深层网络之所以比较难以训练,并不是因为容易进入局部最优,因为网络结构十分复杂,即使进入了局部最优也可以得到很好的效果,难以训练的原因在于学习的过程很容易落入鞍点,也就是在一个维度是极小值,另一个维度却是极大值的点,而这种情况比较容易出现在平坦区域,在这种区域中,所有方向的梯度几乎都是0,但有的方向的二阶导小于0,即出现极大值。


动量法(Momentum)


SGD(一般指小批量梯度下降)的一个缺点在于,其更新的方向完全依赖于当前batch计算出的梯度,因而十分不稳定。


Momentum算法借用了物理中的动量的概念,模拟物体运动时候的惯性,即在更新的时候在一定程度上保留之前更新的方向,同时利用当前batch的梯度对之前的梯度进行微调,这样一来,可以在一定程度上增加稳定性,从而学习的更快,并且有一定的摆脱局部最优的能力。


7470989ed1321a5c8b58055d40c018b9.png


更新后的梯度 = 动量项(折损系数(gamma)) x 更新前的梯度+当前的梯度


9d832185649d503b427367f61400321a.png


注意:


ad37f781dfc5aebb4fc58fb41eead6bf.png


表示之前所有步骤所累积的动量和,而不仅仅是上一个更新梯度。


3bca255917f812701a4e551b84cd71c2.png


红色为SGD+momentum,黑色为SGD


【注意】:


  • 动量项是表示在多大程度上保留原来的更新方向,值在0~1之间,是自己设置的超参数,训练开始时,由于梯度可能会很大,所以初始值一般选为0.5,当梯度慢慢减小的时候,改为0.9。


  • 刚开始的时候,梯度方向变化很大,原始梯度起的作用较小,当前时刻的梯度方向减弱,则动量项较小,动量小则步长小


xwn:SGD其实就是摸着石头下山,动量项越大,则越难转向。初始时尚在找路阶段,原始梯度方向借鉴意义比较小,所以可以动量项设置小一些,后期经过积累基本已锁定正确优化方向,则动量项可以设置大一些,使得每次的当前梯度只是使总方向微调而已。


  • 后面的时候,梯度方向变化较小了,原始梯度起的作用大,当前时刻的梯度方向增强,则动量项较大,动量大则步长大


  • 动量项的解释:物体运动都是有惯性的,随机梯度下降和批量梯度下降的梯度之和本时刻的梯度有关,可以立刻改变方向,但如果加上动量的话,方向不可能骤转。


  • 当动量项分别设置为0.5,0.9,0.99的时候,分别表示最大速度2倍、10倍、100倍于SGD的算法


  • xwn: pytorch 中用的SGD其实为加入动量的mini-batch SGD


f8f80bfdd78763ebaacc93624cbd7d54.png


5. Nesterov Momentum(Nesterov Accelerated Gradient)


在预测参数下一次的位置之前,我们已有当前的参数和动量项,先用


eabb32f69b5911ebe91772574b4b67a6.png


作为参数下一次出现位置的预测值,虽然不准确,但是大体方向是对的,之后用我们预测到的下一时刻的值来求偏导,让优化器高效的前进并收敛。


197e760e3ae916bc3836af5f65029fea.png


6578acfeea83fee802a22421ee5e0dbe.png


其中:


ad37f781dfc5aebb4fc58fb41eead6bf.png


表示之前所有步骤所累积的动量和,θ表示参数,一般 γ 仍取值 0.9 左右。

【注意】:在计算梯度时,不是在当前位置,而是未来的位置上

NAG 可以使 RNN 在很多任务上有更好的表现。


15c03705099dc8c59f152424eee19dde.png


【自适应学习率的方法】


Adagrad法[2]


该方法是基于梯度的优化方法,其主要功能是:对于不同的参数使用不同的学习率,频繁变化的参数以更小的步长进行更新,而稀疏的参数以更大的步长进行更新,

适合于处理稀疏数据。


02ba9e703fc164ac5bb73f801b23b127.png


对g_t从1到t进行一个递推形成一个对学习率约束项 , 用来保证分母非0。


eb658e38990945dcbbf2c4a313668704.png


xwn:不同参数的梯度不同,但之前的方法所有参数的学习率是相同的。

对于稀疏数据而言,每当该参数所对应的特征缺失或者为0时,其基本就不更新了,所以稀疏的那部分特征所对应参数更新频率较低,收敛较慢。(累积的梯度也较小)

此方法通过学习率除以累积梯度的方法,增大稀疏参数的学习率,降低稠密的


超参数设定值:一般η选取0.01


直观感受AdaGrad:


假设我们现在采用的优化算法是最普通的梯度下降法mini-batch。它的移动方向如下面蓝色所示:


6669995f926c2ea5d1dcebf47866afe0.png


假设我们现在就只有两个参数w,b,我们从图中可以看到在b方向走的比较陡峭,这影响了优化速度。


而我们采取AdaGrad算法之后,我们在算法中使用了累积平方梯度n_t=n_(t-1)+g2。

从上图可以看出在b方向上的梯度g要大于在w方向上的梯度。


那么在下次计算更新的时候,r是作为分母出现的,越大的反而更新越小,越小的值反而更新越大,那么后面的更新则会像下面绿色线更新一样,明显就会好于蓝色更新曲线。


6669995f926c2ea5d1dcebf47866afe0.png


结论:在参数空间更为平缓的方向,会取得更大的进步(因为平缓,所以历史梯度平方和较小,对应学习下降的幅度较小),并且能够使得陡峭的方向变得平缓,从而加快训练速度。


特点:


1. 前期较小的时候, 学习率约束项较大,能够放大梯度


2. 后期较大的时候,学习率约束项较小,能够约束梯度


缺点:


1. 由公式可以看出,仍依赖于人工设置一个全局学习率


2. 设置过大的话,会使学习率约束项过于敏感,对梯度的调节太大


3. 中后期,分母上梯度平方的累加将会越来越大,使参数更新梯度区域0,使得训练提前结束


【补充】:


It adapts the learning rate to the parameters, performing smaller updates (i.e. low learning rates) for parameters associated with frequently occurring features, and larger updates (i.e. high learning rates) for parameters associated with infrequent features. For this reason, it is well-suited for dealing with sparse data.


高频出现特征的相关参数有较小的更新,低频出现特征的相关参数有较大的更新,适合处理稀疏数据。


原论文对稀疏数据的解释:sparse data (input sequences where g_t has many zeros)

网上对于适合稀疏数据的解释:


580b80d4a63a192b5f6811e59ac3c4b4.png


Adadelta/RMSprop


Adadetla是Adagrad的一个延伸,它旨在解决Adagrad学习率不断急剧单调下降的问题,Adagrad是利用之前所有梯度的平方和,Adadelta法仅计算在一个时间区间内的梯度值的累积和。

此处的梯度累积和定义为:关于过去梯度值的指数衰减均值,当前时间的梯度均值是基于过去梯度的均值和当前梯度值平方的加权平均,γ是权重。

xwn:每一次都会在之前的梯度积累值上乘γ,越久远的梯度值,被乘γ的次数就越大,被遗忘的就越多。


e96a0369f28030fe25f5d9789bdccd33.png


7.1

09f8364175e7098768791cbc223177a3.png

7.2


这个分母相当于梯度的均方根 root mean squared (RMS),在数据统计分析中,将所有值平方求和,求其均值,再开平方,就得到均方根值 ,所以可以用 RMS 简写:


508635ba20cf2e46c8fe9304a7a329cf.png


RMSprop可以算作Adadelta的一个特例,γ=0.9


ba837c9ef8f0cb91de1518d4eca3a7a7.png


RMSprop提出者Hinton 建议设定γ为0.9, 学习率η为 0.001。

RMSprop和Adadelta都是大约在同一时间独立开发的,它们都是为了解决Adagrad的学习率急剧下降的问题。


总体算法图,可能会对全局有把握:


8b0450b34b6f820e4e835d8653bf6005.png


RMSProp算法不是像AdaGrad算法那样直接暴力地累加平方梯度,而是加了一个衰减系数来控制历史信息的获取多少。见公式7.1。γ作用相当于加了一个指数衰减系数来控制历史信息的获取多少,通俗理解,见https://zhuanlan.zhihu.com/p/29895933


优点:


1、RMSprop算是Adagrad的一种发展,和Adadelta的变体,效果趋于二者之间

2、适合处理非平稳目标-对于RNN效果很好


Adam:Adaptive Moment Estimation自适应矩估计


矩估计


08378c9961ddcba5d88c51d97abf244a.png


二阶矩估计:


2f9584642920d056c68c61d39d82cacf.png722c87f1620d4558d6c8f429c04644d8.png


Adam(Adaptive Moment Estimation)本质上是带有动量项的RMSprop,它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。Adam的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳。公式如下:


fcf12ddf392097277a7f00d2ef160339.png

c6d6271d89af4d8fe52e87a149ee1f69.png

S{TX@{$9VDD5CMGBZF4EXW9.png

特点:

8DW~{]%AH`A}D%%QRH0_5QH.png


参考:


[1] Adolphs, Leonard, Hadi Daneshmand, Aurelien Lucchi, and Thomas Hofmann. “Local Saddle Point Optimization: A Curvature Exploitation Approach.” ArXiv:1805.05751 [Cs, Math, Stat], February 14, 2019.


http://arxiv.org/abs/1805.05751.


[2] Duchi, J., Hazan, E., & Singer, Y. (2011). Adaptive Subgradient Methods for Online Learning and Stochastic Optimization. Journal of Machine Learning Research, 12, 2121–2159. Retrieved from


http://jmlr.org/papers/v12/duchi11a.html


https://blog.csdn.net/u012328159/article/details/80252012


https://blog.csdn.net/cs24k1993/article/details/79120579


https://zhuanlan.zhihu.com/p/22252270


https://blog.csdn.net/jiaoyangwm/article/details/81457623


https://www.jiqizhixin.com/graph/technologies/f41c192d-9c93-4306-8c47-ce4bf10030dd Adam

相关文章
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的优化算法及其应用
【10月更文挑战第8天】 本文将探讨深度学习中常用的优化算法,包括梯度下降法、Adam和RMSProp等,介绍这些算法的基本原理与应用场景。通过实例分析,帮助读者更好地理解和应用这些优化算法,提高深度学习模型的训练效率与性能。
149 63
|
12天前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
垃圾识别分类系统。本系统采用Python作为主要编程语言,通过收集了5种常见的垃圾数据集('塑料', '玻璃', '纸张', '纸板', '金属'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对图像数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。然后使用Django搭建Web网页端可视化操作界面,实现用户在网页端上传一张垃圾图片识别其名称。
43 0
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
|
12天前
|
机器学习/深度学习 人工智能 算法
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
手写数字识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Flask框架,开发网页端操作平台,实现用户上传一张图片识别其名称。
44 0
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
|
12天前
|
机器学习/深度学习 人工智能 算法
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
蔬菜识别系统,本系统使用Python作为主要编程语言,通过收集了8种常见的蔬菜图像数据集('土豆', '大白菜', '大葱', '莲藕', '菠菜', '西红柿', '韭菜', '黄瓜'),然后基于TensorFlow搭建卷积神经网络算法模型,通过多轮迭代训练最后得到一个识别精度较高的模型文件。在使用Django开发web网页端操作界面,实现用户上传一张蔬菜图片识别其名称。
52 0
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
|
1月前
|
算法 Java 数据库
美团面试:百亿级分片,如何设计基因算法?
40岁老架构师尼恩分享分库分表的基因算法设计,涵盖分片键选择、水平拆分策略及基因法优化查询效率等内容,助力面试者应对大厂技术面试,提高架构设计能力。
美团面试:百亿级分片,如何设计基因算法?
|
1月前
|
算法 前端开发 Java
数据结构与算法学习四:单链表面试题,新浪、腾讯【有难度】、百度面试题
这篇文章总结了单链表的常见面试题,并提供了详细的问题分析、思路分析以及Java代码实现,包括求单链表中有效节点的个数、查找单链表中的倒数第k个节点、单链表的反转以及从尾到头打印单链表等题目。
33 1
数据结构与算法学习四:单链表面试题,新浪、腾讯【有难度】、百度面试题
|
28天前
|
机器学习/深度学习 人工智能 算法
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
车辆车型识别,使用Python作为主要编程语言,通过收集多种车辆车型图像数据集,然后基于TensorFlow搭建卷积网络算法模型,并对数据集进行训练,最后得到一个识别精度较高的模型文件。再基于Django搭建web网页端操作界面,实现用户上传一张车辆图片识别其类型。
72 0
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
|
1月前
|
机器学习/深度学习 算法 Java
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
|
1月前
|
算法 Java 数据库
美团面试:百亿级分片,如何设计基因算法?
40岁老架构师尼恩在读者群中分享了关于分库分表的基因算法设计,旨在帮助大家应对一线互联网企业的面试题。文章详细介绍了分库分表的背景、分片键的设计目标和建议,以及基因法的具体应用和优缺点。通过系统化的梳理,帮助读者提升架构、设计和开发水平,顺利通过面试。
美团面试:百亿级分片,如何设计基因算法?
|
1月前
|
机器学习/深度学习 数据采集 算法
如何在一夜之间成为模型微调大师?——从零开始的深度学习修炼之旅,让你的算法功力飙升!
【10月更文挑战第5天】在机器学习领域,预训练模型具有强大的泛化能力,但直接使用可能效果不佳,尤其在特定任务上。此时,模型微调显得尤为重要。本文通过图像分类任务,详细介绍如何利用PyTorch对ResNet-50模型进行微调,包括环境搭建、数据预处理、模型加载与训练等步骤,并提供完整Python代码。通过调整超参数和采用早停策略等技巧,可进一步优化模型性能。适合初学者快速上手模型微调。
101 8
下一篇
无影云桌面