机器学习_梯度下降法(BGD、SGD、MBGD)

除了最小二乘法求解损失函数之外,梯度下降法是另一种求解损失函数的方法。
梯度下降的直观理解,先用一个例子说明:
假设找凸函数y=x**2的最小值,通过迭代的方式,假设x=2时,y=4,x=0.8时,y=0.64,,,总之每一步迭代,都是Y都是一个下降的过程。直到f(x)<1e-10位置,如下图所示,整个求解过程是一个下降的过程。(蓝色点为迭代过程中的点)
机器学习_梯度下降法(BGD、SGD、MBGD)_第1张图片
那么问题来了,x如何取值让y不断变小呢,迭代公式又是什么呢?请看推倒过程:
机器学习_梯度下降法(BGD、SGD、MBGD)_第2张图片

梯度下降法的求解目标

求解损失函数/目标函数
机器学习_梯度下降法(BGD、SGD、MBGD)_第3张图片
对上式求导,对上面的式子对单个求解,再还原
机器学习_梯度下降法(BGD、SGD、MBGD)_第4张图片

批量梯度下降算法(BGD)—(batch一批)

由上面的式子我们得到,在这里插入图片描述在这里插入图片描述
得到的对θ进行一次计算,我们再次还原回去,一次对θ进行多次迭代,就是批量梯度下降算法(BGD),推倒过程如下:
机器学习_梯度下降法(BGD、SGD、MBGD)_第5张图片

随机梯度下降算法(SGD)—(stochastic随机的)

缺点是:有可能产生波动,一次更新一次。

机器学习_梯度下降法(BGD、SGD、MBGD)_第6张图片
注:随机是说可以把样本打乱,这样显示出了随机性。

SGD和BGD两个算法比较:

1 SGD速度比BGD快(迭代次数少)
2 SGD在某些情况下(全局存在多个相对最优解/J(θ)不是一个二次),SGD有可能跳
出某些小的局部最优解,所以不会比BGD坏

3 BGD一定能够得到一个局部最优解(在线性回归模型中一定是得到一个全局最优
解),SGD由于随机性的存在可能导致最终结果比BGD的差

沿着负梯度方向迭代,更新后的θ使J(θ)更小

迭代公式如下:
机器学习_梯度下降法(BGD、SGD、MBGD)_第7张图片
其中:在这里插入图片描述

小批量梯度下降法(MBGD)

如果既保证算法训练过程快,也保证最终参数训练的准确率,而这正是小批梯度下降法的初衷。MBGD中不是拿每一个样本就更新M次,而是而是拿b(一般为10)个样本的平均梯度作为更新方向。
机器学习_梯度下降法(BGD、SGD、MBGD)_第8张图片

BGD、SGD、MBGD的区别:

当样本量为m的时候,每次迭代BGD算法中对于参数值更新一次,SGD算法
中对于参数值更新m次,MBGD算法中对于参数值更新m/n次,相对来讲
SGD算法的更新速度最快;

SGD算法中对于每个样本都需要更新参数值,当样本值不太正常的时候,就
有可能会导致本次的参数更新会产生相反的影响,也就是说SGD算法的结果
并不是完全收敛的,而是在收敛结果处波动的;
SGD算法是每个样本都更新一次参数值,所以SGD算法特别适合样本数据量
大的情况以及在线机器学习(Online ML)。

梯度下降法总结:

由于梯度下降法中负梯度方向作为变量的变化方向,所以有可能导致最终求解的值是局部最优解,所以在使用梯度下降的时候,一般要进行一些调优策略
**学习率的选择:**学习率过大,表示每次迭代更新的变化比较大,有可能会调出最优解;学习率过小,表示每次迭代更新的时候变化比较小,就会导致迭代速度过慢,很长时间都不能结束。
算法初始参数值的选择:初始值不同,最终得到的最小值也有可能不同,因为梯度下降法求解的是局部最优解,所以一般情况下,选择多次不同初始值运行算法,并最终返回损失函数最小情况下的结果值
标准化:由于样本不同特征的取值范围不同,可能会导致在各个不同参数上
迭代速度不同
,为了减少特征取值的影响,可以将特征进行标准化操作。(都将数据在一个区间里(0,1))

实现f(x)=x2代码如下:**

def f(x):
    return x**2
def h(x):
    return 2*x
X=[]
Y=[]
x=2
step = 0.8
f_change=f(x)
f_current=f(x)
X.append(x)
Y.append(f_current)
while f_change>1e-10:
    x=x-step*h(x)
    tmp=f(x)
    f_change=np.abs(f_current-tmp)
    f_current=tmp
    X.append(x)
    Y.append(f_current)
print (u"最终结果为:",(x,f_current))
fig = plt.figure()
X2 = np.arange(-2.1,2.15,0.05)
Y2= X2**2

plt.plot(X2,Y2,'-',color="#666666",linewidth=2)
plt.plot(X,Y,'bo-')
plt.title(u'$y=x^2函数求解最小值,最终解为:x=%.2f,y=%.2f'%(x,f_current))
plt.show()

你可能感兴趣的:(机器学习,BGD批量梯度下降,随机梯度下降SGD,小批量梯度下降)