梯度下降法的原理及例题计算
参数选取的不同会影响到假设函数,在计算机中可以不断的猜测这个参数θ,我们通常会将参数的初始值设为0参数迭代的范围可以称为步长,在机器学习领域中有一个更专业的称呼叫学习率。显而易见,学习率的设置会直接影响到函数收敛的速度。在计算机中就是通过设置不同的学习率进行参数θ的迭代更新。
1相关问题
梯度下降法的表达式:θ_j:=θ_j-α ∂J(θ_j )/(∂θ_j )
形式化 GD(θ_j,α, ∂J(θ_j )/(∂θ_j ) )
θ_j:参数,给定初始值;
α:学习率;
∂J(θ_j )/(∂θ_j ):梯度;
伪代码:
repeat
{
θ_j:=θ_j-α ∂J(θ_j )/(∂θ_j )
}
问题1:学习率是什么?
学习率在上面的表达式中即是参数α,它是一个很小的正数。
问题2:梯度是什么?
多元函数的梯度定义为:∇f(x)=(∂f/(∂x_1 ),…,∂f/(∂x_n ))^T,所谓梯度也就是对多元函数求偏导。沿着梯度的负方向也就是函数下降速度最快的一个方向。
例如:
问题3:为什么用梯度下降法更新参数?θ_j:=θ_j-α ∂J(θ_j )/(∂θ_j )
梯度是函数变化最快的方向,因为前面有个减号。使得参数θ在向J(θ)越来越小的方向更新,而损失函数J(θ)在最小的时候也就是模拟的预测函数h最好的时候。需要求的参数θ正是在J(θ)最小时候的取值。
2学习率的设置与调整策略
学习率的设置至关重要,它决定了损失函数能否收敛以及收敛的快慢。下面通过选取不同大小学习率来观察损失函数的变化情况如图1,并做具体的说明。
图1:学习率设置对损失函数的影响
曲线初始时上扬【红线】 :初始学习率过大导致振荡发散,应减小学习率并从头开始训练 。
曲线初始时强势下降没多久归于水平 【蓝线】 :后期学习率过大导致无法收敛,应减小学习率,并重新训练后几轮 。
曲线全程缓慢 【黄线】:初始学习率过小导致收敛慢,应增大学习率,并从头开始训练 。
曲线下降速度较快,很好地收敛【绿线】:选取了较为合适的学习率,曲线能够以较快的速度收敛到损失函数很小的值。
那么应该如何来调整学习率,从而让损失函数尽快地收敛呢?接下来给出三种调整策
略。
一:从一般的经验来看,学习率可以设置为0.001,0.003,0.01,0.03,0.1,0.3…具体需结合实际情况对比判断;二:根据数据集的大小来选择合适的学习率,当使用平方和误差作为代价函数时,随着数据量的增多,学习率应该被设置为相应更小的值(从梯度下降算法的原理可以分析得出);三:训练全过程并不是使用一个固定值的学习速度,而是随着时间的推移让学习率动态变化,比如刚开始训练,离最优值还很远,可以使用较大的学习率下的快一点,当快接近最优值时为避免跨过最优值,收敛速度要放缓(轮数减缓、指数减缓、分数减缓),使用较小学习率训练。
但是训练时的最优值并不能提前知道,所以具体的解决办法是:在每次迭代后,使用估计的模型的参数来查看误差函数的值,如果相对于上一次迭代,错误率减少了,就可以以5%的幅度增大学习率如果相对于上一次迭代,错误率增大了,说明跳过最优值,那么应该重新设置上一轮迭代的值,并且减少学习率到之前的50%。因此,这是一种学习率自适应调节的方法。
3梯度下降法的限制
虽然梯度下降法在使损失函数收敛到最小值上有优异表现,但是我们的损失函数并不总是凸函数,意味着初始值选取的不同,很可能导致收敛到局部最优解。那么如何保证收敛到的值是全局最优解呢?
图2:初始点选取对损失函数收敛的影响
如图2,选取了两个不同的初始值,并利用梯度下降法进行迭代,最后收敛到两个不同的局部最优解。为了保证损失函数最小,可以将这两个值进行比较,选取最小的那个值。同理,可以多选取几个不同的初始值进行尝试,选取最小的值做为全局最优解。
B.4梯度下降法实例与代码实现
假设损失函数为J(θ)=θ2,学习率为0.4,初始化参数起点为1,现在利用梯度下降法进行迭代:θ0=1,θ1=θ0-αJ^’ (θ^0 )=1-0.42=0.2,θ2=θ1-αJ^’ (θ^1 )=0.04,θ3=0.008,θ4=0.0016,将θ与J(θ)的关系图画出来,如图3,可以看出在进行到第四次迭代损失函数收敛到了最小值附近,这时候对应的参数θ就是假设函数h的参数。
图3:θ取值与J(θ)的关系图
但是损失函数通常是比较复杂的多项式,下面给出表达式f(x)=x4-3x3+2,利用计算机进行梯度下降法的迭代,如算法B.1所示。
算法B.1 梯度下降法的代码实现
import numpy as np
import matplotlib.pyplot as plt
x=np.arange(-5,5,0.001)/从-5到5每隔0.001个单位取值/
y=x**4-3x3+2/给出损失函数表达式/
plt.plot(x,y)
plt.show()
old=0
new=5
step=0.01/设置学习率/
precision=0.00001
def derivative(x):
return 4*x3-9x**2/求梯度/
while abs(new-old)>precision: /梯度下降法的终止条件/
old=new
new=new-stepderivative(new) /**/
print(new)
上述算法将学习率设置为0.01,对给定的损失函数进行迭代,当满足终止条件时,算法终止。