我室友打了两把csgo就搞懂了梯度,梯度下降,随机梯度下降(SGD),动量法,ADAM


梯度

一个多元函数的梯度方向是该函数值增大最陡的方向。具体化到1元函数中时,梯度方向首先是沿着曲线的切线的,然后取切线向上增长的方向为梯度方向,

比如说如果损失函数是一个二次函数那么最低点就是箭头指向部分
在这里插入图片描述
在这里插入图片描述

也就是f’(x)=0的地方,无论从哪开始都能找到函数最低点。而真实的损失函数更像一个崎岖的山坡

图片来源于 https://www.youtube.com/watch?v=GkB4vW16QHI

2元或者多元函数中,梯度向量为函数值f对每个变量的导数,该向量的方向就是梯度的方向,当然向量的大小也就是梯度的大小。
已知Z=F(X,Y),假设它的图像是这样:

分别固定住x跟y求偏导
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

扫描二维码关注公众号,回复: 13644555 查看本文章

这时候我们需要对某一个点对x,y求偏导然后相加得到一个关于z的向量这个向量就是梯度。
在这里插入图片描述

梯度相反方向总是能带着你找到山下也就是损失函数最小点
在这里插入图片描述

梯度下降

一个函数可微分。这个函数就代表着一座山。我们的目标就是找到这个函数的最小值,也就是山底。根据之前的场景假设,最快的下山的方式就是找到当前位置最陡峭的方向,然后沿着此方向向下走,对应到函数中,就是找到给定点的梯度 ,然后朝着梯度相反的方向,就能让函数值下降的最快!因为梯度的方向就是函数之变化最快的方向,所以,我们重复利用这个方法,反复求取梯度,最后就能到达局部的最小值,这就类似于我们下山的过程。
梯度下降就是沿着梯度所指出的反方向一步一步找到损失函数最小值的地方

图片来源于 https://zhuanlan.zhihu.com/p/36564434
在这里插入图片描述

那么问题就是如何找到下一个点 ,并保证 f(xt+1)<f(xt)呢?假设我们当前的函数f(x)形式是上图的形状,现在我们随机找了一个初始的点 x1,对于一元函数来说,函数值只会随着x 的变化而变化,那么我们就设计下一个 xt+1是从上一个 xt 沿着某一方向走一小步得到的。此处的关键问题就是:这一小步的方向是朝向哪里?
对于一元函数来说, x是会存在两个方向:要么是正方向,要么是负方向这时候就需要用到我们的泰勒展开式在这里插入图片描述
左边就是当前的x移动一小步 之后的下一个点位,它近似等于右边。前面我们说了关键问题是找到一个方向,使得 在这里插入图片描述
,那么根据上面的泰勒展式,显然我们需要保证:
在这里插入图片描述

可选择令:
在这里插入图片描述

其中步长a是一个较小的正数,从而:

在这里插入图片描述
由于任何不为0的数的平方均大于0因此保证了

在这里插入图片描述

从而,设定:

在这里插入图片描述

则可保证:
在这里插入图片描述
那么更新x 的计算方式就很简单了,可按如下公式更新
在这里插入图片描述
这就是所谓的沿负梯度方向走一小步,到此为止,这就是梯度下降的全部原理。

随机梯度下降

首先我们知道在我们平常使用的时候是不用标准的梯度下降算法的,因为标准梯度下降算法太难用了,他需要把所有的数据全都计算一遍非常浪费时间,计算量也是相当大的。我们现在计算机是做不到的,我们需要对这些算法进行优化。比如我们要统计全国男性平均身高我们可以进行抽取一部分数据来进行统计,其实就是找出部分数据可以摆脱开样本具体数据然后又可以代表整个样本的整个数值。
那么随机梯度下降法的精度如何呢,数学家已经证明在凸问题情况下不会快于

在这里插入图片描述
举个例子对于下面这个式子
在这里插入图片描述
梯度下降法:
在这里插入图片描述
当n很大时,每次迭代计算所有的在这里插入图片描述会非常耗时。随机梯度下降的想法就是每次在中random选取一个计算代替如上的,以这个随机选取的方向作为下降的方向。
由于 当选取step size =时算法在期望的意义下收敛。注意wt在靠近w*的时候这也就导致算法精准度比较低由于方差的存在,要使得算法收敛,就需要随着t逐渐减小因此导致函数即使在强凸且光滑的条件下,收敛速度也只有
一个经典的例子就是假设你现在在山上,为了以最快的速度下山,且视线良好,你可以看清自己的位置以及所处位置的坡度,那么沿着坡向下走,最终你会走到山底。但是如果你被蒙上双眼,那么你则只能凭借脚踩石头的感觉判断当前位置的坡度,精确性就大大下降,有时候你认为的坡,实际上可能并不是坡,走一段时间后发现没有下山,或者曲曲折折走了好多路才能下山。而随机梯度下降法就好比蒙着眼睛下山。
在这里插入图片描述
随机梯度下降法由于不能保证随机选择的方向是损失函数减小的方向,更不能保证一定是减小速度最快的方向,所以搜索路径就会呈现下图的态势。即随机梯度下降有着不可预知性。

随机梯度法缺点

每次迭代只是考虑让该样本点趋向最小,而不管其他的样本点,这样算法会很快,但是收敛的过程会比较曲折,整体效果上,大多数时候它只能接近局部最优解,而无法真正达到局部最优解。选择合适的learning rate比较困难,若设置过大,学习曲线将会剧烈震荡,代价函数值通常会明显增加;太小则学习过程会很缓慢,如果初始学习率太低,那么学习可能会卡在一个相当高的代价值。所以适合用于较大训练集的case。

动量法

参数迭代,于是会产生问题,学习参数过小,模型很难到达最优点,而参数过大,某个参数会发散
动量法的提出就是为了应对这个问题 ,把历史的数据也考虑进来,对参数的修改进行一些修正。
我们梯度下降法做一个修改如下:
***
相当于每次在进行参数更新的时候,都会将之前的速度考虑进来,每个参数在各方向上的移动幅度不仅取决于当前的梯度,还取决于过去各个梯度在各个方向上是否一致,如果一个梯度一直沿着当前方向进行更新,那么每次更新的幅度就越来越大,如果一个梯度在一个方向上不断变化,那么其更新幅度就会被衰减,这样我们就可以使用一个较大的学习率,使得收敛更快,同时梯度比较大的方向就会因为动量的关系每次更新的幅度减少,如下图在这里插入图片描述
比如我们的梯度每次都等于 g,而且方向都相同,那么动量法在该方向上使参数加速移动,有下面的公式:

如果我们把 γ \gammaγ 定为 0.9,那么更新幅度的峰值就是原本梯度乘学习率的 10 倍。

ADAM

融合一阶动量和二阶动量。因为当V_t和S_t一开始被初始化为 0 时,最初的几步通常会偏向0,表示参数更新太慢。

在这里插入图片描述

他们使用偏差纠正系数,来修正一阶矩和二阶矩的偏差
在这里插入图片描述

ADAM优点

.对方向一致的参数能够加速学习,对梯度改变方向的参数能够减少其更新,因此就是momentum能够在相关方向上加速学习,抑制振荡,从而加速收敛。这样在训练初期,分母较小,学习率较大,学习比较快,后期时,学习会逐渐减慢。而且它适合于处理稀疏梯度,具有损失最大偏导的参数相应地有一个快速下降的学习率,而具有小偏导的参数在学习率上有相对较小的下降。.改进了Adagrad在深度学习中过早结束的问题,适用于处理非平稳。

这里是引用
https://www.bilibili.com/video/BV1r64y1s7fU?from=search&seid=16187041594558647991&spm_id_from=333.337.0.0
https://blog.csdn.net/zhouhong0284/article/details/80232412?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_utm_term~default-1.no_search_link&spm=1001.2101.3001.4242.2&utm_relevant_index=3
https://www.youtube.com/watch?v=GkB4vW16QHI
https://zhuanlan.zhihu.com/p/36564434
https://blog.csdn.net/qq_44614524/article/details/114241259

总结

以上就是今天要讲的内容,本文仅仅简单介绍了梯度,梯度下降,随机梯度下降(SGD),动量法,ADAM的概念欢迎大家一起学习一块交流!

猜你喜欢

转载自blog.csdn.net/qq_48385934/article/details/122312299