赞
踩
梯度下降我们前面的介绍,简单的略过了,这里详细解释一下。
梯度下降法的基本思想可以类比为一个下山的过程。假设这样一个场景:一个人被困在山上,需要从山上下来(i.e. 找到山的最低点,也就是山谷)。但此时山上的浓雾很大,导致可视度很低。因此,下山的路径就无法确定,他必须利用自己周围的信息去找到下山的路径。这个时候,他就可以利用梯度下降算法来帮助自己下山。具体来说就是,以他当前的所处的位置为基准,寻找这个位置最陡峭的地方,然后朝着山的高度下降的地方走,同理,如果我们的目标是上山,也就是爬到山顶,那么此时应该是朝着最陡峭的方向往上走。然后每走一段距离,都反复采用同一个方法,最后就能成功的抵达山谷。
用微积分解释:
首先,我们有一个可微分的函数。这个函数就代表着一座山。我们的目标就是找到这个函数的最小值,也就是山底。根据之前的场景假设,最快的下山的方式就是找到当前位置最陡峭的方向,然后沿着此方向向下走,对应到函数中,就是找到给定点的梯度 ,然后朝着梯度相反的方向,就能让函数值下降的最快!因为梯度的方向就是函数之变化最快的方向。
看待微分的意义,可以有不同的角度,最常用的两种是:
上面的例子都是单变量的微分,当一个函数有多个变量的时候,就有了多变量的微分,即分别对每个变量进行求微分。
梯度实际上就是多变量微分的一般化。
下面这个例子:
我们可以看到,梯度就是分别对每个变量进行微分,然后用逗号分割开,梯度是用<>包括起来,说明梯度其实一个向量。
梯度是微积分中一个很重要的概念,之前提到过梯度的意义
题外话:这里的 J ( θ ) J(\theta) J(θ)其实就是代价函数,所以要找到一个合适的代价函数。https://blog.csdn.net/No_Game_No_Life_/article/details/89512402#theta_Tgai_42
上面我们花了大量的篇幅介绍梯度下降算法的基本思想和场景假设,以及梯度的概念和思想。下面我们就开始从应用上解释梯度下降算法的计算过程和思想!
公式:
此公式的意义是:J是关于
Θ
Θ
Θ的一个函数,我们当前所处的位置为
Θ
0
Θ^0
Θ0点,要从这个点走到J的最小值点,也就是山底。首先我们先确定前进的方向,也就是梯度的反向,然后走一段距离的步长,也就是
α
α
α,走完这个段步长,就到达了
Θ
1
Θ^1
Θ1这个点!
α在梯度下降算法中被称作为学习率或者步长,意味着我们可以通过α来控制每一步走的距离,以保证不要步子跨的太大扯着蛋,哈哈,其实就是不要走太快,错过了最低点。同时也要保证不要走的太慢,导致太阳下山了,还没有走到山下。所以α的选择在梯度下降法中往往是很重要的!α不能太大也不能太小,太小的话,可能导致迟迟走不到最低点,太大的话,会导致错过最低点!
为什么要梯度要乘以一个负号?
梯度前加一个负号,就意味着朝着梯度相反的方向前进!我们在前文提到,梯度的方向实际就是函数在此点上升最快的方向!而我们需要朝着下降最快的方向走,自然就是负的梯度的方向,所以此处需要加上负号
以下图为栗子:
基于梯度的搜索足使用最为广泛的参数寻优方法。在此类方法中,我们从某些初始解出发,迭代寻找最优参数值。每次迭代中,我们先计算代价函数在当前点的梯度,然后根据梯度确定搜索方向。例如,由于负梯度方向是函数值下降最快的方向,如果代价函数在当前梯度为0,则已达到局部极小,更新量将为零,这意味着参数的迭代更新将在此停止。
显然,如果代价函数仅有一个局部极小,那么此时找到的局部极小就是全局最小;然而,如果代价函数具有多个局部极小,则不能保证找到的解是全局最小。对后一种情形,我们称参数寻优陷入了局部极小, 这显然不是我们所希望的。
在现实任务中,人们常采用以下策略来试图找出局部极小,从而进一步接近全局最小。
物理的退火降温的过程——一个处于很高温度的物体,现在要给它降温,使物体内能降到最低。我们常规的思维是,越快越好,让它的温度迅速地降低。然而,实际上,过快地降温使得物体来不及有序地收缩,难以形成结晶。而结晶态,才是物体真正内能降到最低的形态。
正确的做法,是徐徐降温,也就是退火,才能使得物体的每一个粒子都有足够的时间找到自己的最佳位置并紧密有序地排列。开始温度高的时候,粒子活跃地运动并逐渐找到一个合适的状态。在这过程中温度也会越降越低,温度低下来了,那么粒子也渐渐稳定下来,相较于以前不那么活跃了。这时候就可以慢慢形成最终稳定的结晶态了。
我们需要设定这几个参数,模拟退火过程:
再定义一些量:
我们给一个初始解x,并让它不断变动。要模拟变动的大小随温度的降低而降低,我们每次的Δx应该在一个大小与T成正比的值域内随机取值。这时候我们就要考虑是否将当前解变为目标解。因为我们还是需要贪心,所以如果f(x1)<f(x),那么接受目标解,x=x1。
那如果f(x1)>f(x)呢?我们当然要以一定概率接受它啦,这样才能跳出局部的限制,去搜寻更优的解,弥补贪心的局限性。那么这个概率应该是多少呢?同样要模拟变动的大小随温度的降低而降低。
科学家经过理论分析,得出这个概率应该是
e
Δ
f
T
e^{\frac{\Delta f}{T}}
eTΔf
首先经过大幅波动,当前解由A->B->C,找到了一个比较满意的解。但还不能满足。由于温度还比较大,此时接受了一些不比当前解优的目标解,C->D->E,成功地爬了上去。而温度还在慢慢减小。终于,发现了一个更优解F,成功跳出了那个非常宽的局部凹函数。
这时候,温度越来越小了,很难再次接受不比当前解优的目标解,再次翻出去。解终于渐渐趋于稳定,并最终到达了G,找到了最优解。
随机梯度下降(SGD)是一种简单但非常有效的方法,多用用于支持向量机、逻辑回归等凸损失函数下的线性分类器的学习。并且SGD已成功应用于文本分类和自然语言处理中经常遇到的大规模和稀疏机器学习问题。
SGD既可以用于分类计算,也可以用于回归计算。
这里比较对象是批量梯度和mini-batch梯度下降,先看下他们三者:
随机梯度下降:在每次更新时用1个样本,可以看到多了随机两个字,随机也就是说我们用样本中的一个例子来近似我所有的样本,来调整θ,因而随机梯度下降是会带来一定的问题,因为计算得到的并不是准确的一个梯度,对于最优化问题,凸问题,虽然不是每次迭代得到的损失函数都向着全局最优方向, 但是大的整体的方向是向全局最优解的,最终的结果往往是在全局最优解附近。但是相比于批量梯度,这样的方法更快,更快收敛,虽然不是全局最优,但很多时候是我们可以接受的,所以这个方法用的也比上面的多。
批量梯度下降:在每次更新时用所有样本,要留意,在梯度下降中,对于θ的更新,所有的样本都有贡献,也就是参与调整θ其计算得到的是一个标准梯度,对于最优化问题,凸问题也肯定可以达到一个全局最优。因而理论上来说一次更新的幅度是比较大的。如果样本不多的情况下,当然是这样收敛的速度会更快啦。但是很多时候,样本很多,更新一次要很久,这样的方法就不合适啦。
mini-batch梯度下降:在每次更新时用b个样本,其实批量的梯度下降就是一种折中的方法,他用了一些小样本来近似全部的,其本质就是我1个指不定不太准,那我用个30个50个样本那比随机的要准不少了吧,而且批量的话还是非常可以反映样本的一个分布情况的。在深度学习中,这种方法用的是最多的,因为这个方法收敛也不会很慢,收敛的局部最优也是更多的可以接受!
暂时不做介绍,其理论可以看 https://www.jianshu.com/p/ae5157c26af9 和 https://blog.csdn.net/qq_31805821/article/details/79763326
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。