线性回归之梯度下降算法的分析和对学习率的优化

这篇文章主要写的是对梯度下降中学习率的优化过程,谈到牛顿法和拟牛顿法,梯度下降算法不是本文章的重点,如果对梯度下降算法还有不理解的地方,可以参考博文https://blog.csdn.net/weixin_43970346/article/details/104654613


我们从多变量线性回归中对我们建立的目标函数
J ( θ ) = 1 2 ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J(\theta) = \frac{1}{2}\sum_{i=1}^m (h_\theta(x^{(i)})-y^{(i)})^2 J(θ)=21i=1m(hθ(x(i))y(i))2
利用梯度下降算法
θ j : = θ j − α ∂ ∂ θ j J ( θ ) \theta_j :=\theta_j - \alpha\frac{\partial}{\partial\theta_j}J(\theta) θj:=θjαθjJ(θ)
可以求得 θ \theta θ的最优解。问题似乎解决了。但是还有一个参数 α \alpha α(学习率、步长)我们没有去过多地考虑。

那么学习率 α \alpha α如何确定呢?
是使用固定的学习率还是变化的学习率?
学习率的设置只能够凭借经验值吗?

我们先来看两个简单的例子(说明:对于x,我们可以看成是 θ \theta θ,对于y或F(x),我们可以看成是 J ( θ ) J(\theta) J(θ),对于f(x),则是F(x)的导数。这里只是将变量名称进行了一个改变,下面得都是如此)F

对于 y = x 2 y=x^2 y=x2,我们取x=1.5,学习率使用0.01
在这里插入图片描述
分析:经过200次迭代,x = 0.0258543;经过1000次迭代,x = 2.52445 * 1 0 − 9 10^{-9} 109 ,效果还不错。

对于 y = x 4 y = x^{4} y=x4,我们同样取初始值x = 1.5,学习率使用0.01
在这里插入图片描述
分析:经过200次迭代,x = 0.24436;经过1000次迭代,x = 0.111275。我们可以看到效果很不理想。随着迭代次数的增加,收敛得越来越慢。

对学习率的优化

学习率 α \alpha α在f(x)中是步长,与方向导数一起构成梯度下降的大小。 α \alpha α越大,步长越大,梯度也越大; α \alpha α越小,步长越小,梯度也越小。那我们可以有一个思路:
动态调整学习率,在斜率(方向导数)大的地方,使用小的学习率;在斜率(方向导数)小的地方,使用大的学习率。这样就可以保证下降的梯度始终保持在同一个水平线上,不至于时快时慢。

梯度下降的运行过程分析

x k + 1 = x k − α f ( x k ) x_{k+1} = x_k - \alpha f(x_k) xk+1=xkαf(xk)
x k = a x_k =a xk=a,沿着负梯度方向,移动到 x k + 1 = b x_{k+1} = b xk+1=b,有:
b = a − α f ( a )  则  f ( a ) ⩾ f ( b ) b = a - \alpha f(a) \\ \text{ 则 }f(a)\geqslant f(b) b=aαf(a)  f(a)f(b)
x 0 x_0 x0为出发点,每次沿着当前函数梯度的反方向移动一定距离 α k \alpha k αk,得到序列
x 0 , x 1 , . . . , x n x_0,x_1,...,x_n x0,x1,...,xn
对应的各点的函数值序列之间的关系为:
f ( x 0 ) ⩾ f ( x 1 ) ⩾ f ( x 2 ) . . . ⩾ f ( x n ) f(x_0) \geqslant f(x_1) \geqslant f(x_2) ... \geqslant f(x_n) f(x0)f(x1)f(x2)...f(xn)
当n达到一定值时,函数f(x)收敛到局部最小值。

视角转换

记当前点为 x k x_k xk,当前搜索方向为 d k d_k dk(负梯度方向),因为学习率 α \alpha α为待考察的对象,因此,我们可以将下列函数 f ( x k + α d k ) f(x_k + \alpha d_k) f(xk+αdk)看作时关于 α \alpha α的函数 h ( α ) h(\alpha) h(α)
h ( α ) = f ( x k + α d k ) , α > 0 h(\alpha) = f (x_k + \alpha d_k), \alpha > 0 h(α)=f(xk+αdk),α>0
α \alpha α = 0时, h ( 0 ) = f ( x k ) h(0) = f(x_k) h(0)=f(xk)
导数 ∇ h ( α ) = ∇ f ( x k + α d k ) T d k \nabla h(\alpha) = \nabla f(x_k + \alpha d_k)^T d_k h(α)=f(xk+αdk)Tdk

因为梯度下降是寻找 f ( x ) f(x) f(x)的最小值 ,那么在 x k x_k xk d k d_k dk给定的前提下,即寻找函数 f ( x k + α d k ) f(x_k+\alpha d_k) f(xk+αdk)的最小值。即:
α = a r g min ⁡ α > 0 h ( α ) \alpha = arg \min_{\alpha > 0} h(\alpha) α=argα>0minh(α)
如果 h ( α ) h(\alpha) h(α) 可导,局部最小值的处的 α \alpha α满足:
h ′ ( α ) = ∇ f ( x k + α d k ) T d k = 0 h'(\alpha) = \nabla f(x_k + \alpha d_k)^T d_k = 0 h(α)=f(xk+αdk)Tdk=0
接下来我们分析 h ′ ( α ) = ∇ f ( x k + α d k ) T d k = 0 h'(\alpha) = \nabla f(x_k + \alpha d_k)^T d_k = 0 h(α)=f(xk+αdk)Tdk=0
α = 0 \alpha = 0 α=0带入:
h ′ ( 0 ) = ∇ f ( x k + 0 ∗ d k ) T d k = ∇ f ( x k ) T d k h'(0) = \nabla f(x_k + 0* d_k) ^T d_k = \nabla f(x_k)^T d_k h(0)=f(xk+0dk)Tdk=f(xk)Tdk
下降的方向 d k d_k dk可选负梯度方向 d k = − ∇ f ( x k ) d_k = -\nabla f(x_k) dk=f(xk),则 h ′ ( 0 ) < 0 h'(0) < 0 h(0)<0。如果能够找到足够大的 α \alpha α,使得 h ( α ^ ) > 0 h(\hat\alpha) > 0 h(α^)>0。则必存在某 α \alpha α,使得 h ( α ) = 0 h(\alpha) = 0 h(α)=0。至此,我们可以寻找到我们所需要的学习率了。

为了寻找我们所需要的学习率,我们可通过采用二分线性搜索、回溯线性搜索、插值法、二次插值法。

二分线性搜索(Bisection Line Search)

不断将区间分成两半,选择端点异号的一侧,直到区间足够小或者找到当前最优学习率。(二分查找)

回溯线性搜索(Backing Line Search)

基于Armijo准则计算搜索方向上的最大步长,其基本思想是沿着搜索方向移动一个较大的步长估计值,然后以迭代的形式不断缩减步长,直到改步长使得函数值 f ( x k + α d k ) f(x_k+\alpha d_k) f(xk+αdk)相对与当前函数值 f ( x k ) f(x_k) f(xk)的减小成都大于预设的期望值(即满足Armijo准则)为止。
f ( x k + α d k ≤ f ( x k ) + c 1 α ∇ f ( x k ) T d k ; c 1 ∈ ( 0 , 1 ) f(x_k +\alpha d_k \le f(x_k) + c_1\alpha \nabla f(x_k)^T d_k ;\quad c_1 \in(0,1) f(xk+αdkf(xk)+c1αf(xk)Tdk;c1(0,1)

二分线性搜索的目标是求得满足 h ′ ( α ) ≈ 0 h'(\alpha) \approx 0 h(α)0的最优步长近似值。而回溯线性搜索放松了对步长的约束,只要步长能使函数值有足够大的变化即可。二分线性搜索可以减少下降次数,但在计算最优步长上花费了不少代价;而回溯线性搜索则是找到一个差不多的步长即可。

插值法

  • 采用多项式插值法拟合简单函数,然后根据该简单函数估计函数的极值点,这样选择合适步长的效率会高很多。
  • 对于以上分析,现在拥有数据为: x k x_k xk处的函数值 f ( x k ) f(x_k) f(xk)及其导数 f ′ ( x k ) f'(x_k) f(xk),再加上第一次尝试的步长 α 0 \alpha_0 α0。如果 α 0 \alpha_0 α0满足条件,显然算法退出;若 α 0 \alpha_0 α0不满足条件,则根据上述信息可以构造一个二次近似函数:
    h q ( α ) = h ( α 0 ) − h ′ ( 0 ) α 0 − h ( 0 ) α 0 2 α 2 + h ′ ( 0 ) α + h ( 0 ) h_q(\alpha) = \frac{h(\alpha_0)-h'(0)\alpha_0 - h(0)}{\alpha_0^2}\alpha^2 + h'(0)\alpha + h(0) hq(α)=α02h(α0)h(0)α0h(0)α2+h(0)α+h(0)

二次插值法求极值

显然,导数为0的最优解为:
α 1 = h ′ ( 0 ) α 0 2 2 [ h ′ ( 0 ) α + h ( 0 ) − h ( α 0 ) ] \alpha_1 = \frac{h'(0)\alpha_0^2}{2[h'(0)\alpha + h(0) - h(\alpha_0)]} α1=2[h(0)α+h(0)h(α0)]h(0)α02
α \alpha α 满足Armijo准则,则输出该学习率,否则继续迭代。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值