什么是梯度下降算法
俗话说”人往高处走,水往低处流”,类似的,我们可以把曲线的形状也看成山谷山峰,就可以模拟”水往低处流”的过程,来解决寻找最小值的问题,梯度下降法就类似如此。
梯度下降算法
给定目标函数f(x)和初始点x0,学习率η(步长)
重复:Δx = -Δf(x)
x= x+ηΔx
停止,如果|Δx|<ε
算法描述不难理解,就是先求出所在位置的梯度,然后这个梯度的负值就是x向着极小值前进的方向。X在负梯度方向按照步长(学习率)每次更新,直到收敛到极值点。
梯度下降法是一种迭代算法,负梯度方向是是函数下降最快的方向,在迭代的每一步,以负梯度方向更新x的值,从而达到减少函数值的目的。
为了更好的理解,可以假设一下下山的场景。
一个人被困在山上,需要从山上下来找到山的最低点,也就是山谷。但此时山上的浓雾很大,导致可视度很低。因此,下山的路径就无法确定,他必须利用自己周围的信息去找到下山的路径。这个时候,他就可以利用梯度下降算法来帮助自己下山。具体来说就是,以他当前的所处的位置为基准,寻找这个位置最陡峭的地方,然后朝着山的高度下降的地方走,同理,如果我们的目标是上山,也就是爬到山顶,那么此时应该是朝着最陡峭的方向往上走。然后每走一段距离,都反复采用同一个方法,最后就能成功的抵达山谷
假设上图的曲线是f(x)
1.随机取一个自变量的值;
2.对应该自变量算出对应点的因变量值:f( x0);
3.计算f(x0)处目标函数f(x)的导数;
4.从f(x0)开始,沿着该处目标函数导数的方向,按一个指定的步长,向前“走一步”,走到的位置对应自变量取值为。
换言之,|x0–x1| /a = f(x)在(x0)处的斜率;
5.继续重复2-4,直至退出迭代(达到指定迭代次数,或f(x)近似收敛到最优解)。
以利用梯度下降法,求a的平方根为例来理解下
import math
'''
利用梯度下降法,求a的平方根
令 sqrt(a) = x 则 x^2 - a =0
令 F(x)的一阶导数 f(x) = x^2 - a,
则转化为求F(x)的极值点,可用梯度下降法求解如下
x初始值取 0 迭代1000次
'''
if __name__ == "__main__":
learning_rate = 0.01
for a in range(1,100):
cur = 0
for i in range(1000):
cur -= learning_rate*(cur**2 - a)
print(' %d的平方根(近似)为:%.8f,真实值是:%.8f' % (a, cur, math.sqrt(a)))
以线性回归算法来对三种梯度下降法进行比较。梯度下降法的三种形式BGD、SGD以及MBGD
一般线性回归函数的假设函数为:
对应的能量函数(损失函数)形式为:
1.批量梯度下降法BGD
批量梯度下降法(Batch Gradient Descent,简称BGD)是梯度下降法最原始的形式,它的具体思路是在更新每一参数时都使用所有的样本来进行更新
它得到的是一个全局最优解,但是每迭代一步,都要用到训练集所有的数据,如果样本数目m很大,那么可想而知这种方法的迭代速度!所以,这就引入了另外一种方法,随机梯度下降。
优点:全局最优解;易于并行实现;
缺点:当样本数目很多时,训练过程会很慢。
2.随机梯度下降法SGD
随机梯度下降法,其实和批量梯度下降法原理类似,区别在与求梯度时没有用所有的m个样本的数据,而是仅仅选取一个样本j来求梯度。对应的更新公式是:
随机梯度下降法,和4.1的批量梯度下降法是两个极端,一个采用所有数据来梯度下降,一个用一个样本来梯度下降。自然各自的优缺点都非常突出。对于训练速度来说,随机梯度下降法由于每次仅仅采用一个样本来迭代,训练速度很快,而批量梯度下降法在样本量很大的时候,训练速度不能让人满意。对于准确度来说,随机梯度下降法用于仅仅用一个样本决定梯度方向,导致解很有可能不是最优。对于收敛速度来说,由于随机梯度下降法一次迭代一个样本,导致迭代方向变化很大,不能很快的收敛到局部最优解
3.小批量梯度下降法MBGD
小批量梯度下降法是批量梯度下降法和随机梯度下降法的折衷,也就是对于m个样本,我们采用x个样子来迭代,1