机器学习中的数学——优化技术:优化算法-[共轭梯度法(Conjugate Gradient)]

共轭梯度是一种通过迭代下降的共轭方向(Conjugate Directions)以有效避免Hessian矩阵求逆计算的方法。这种方法的灵感来自对最速下降方法弱点的仔细研究,其中线搜索迭代地用于与梯度相关的方向上。下图说明了该方法在二次碗型目标中如何表现的,是一个相当低效的来回往复,锯齿形模式。这是因为每一个由梯度给定的线搜索方向,都保证正交于上一个线搜索方向。
锯齿形模式
假设上一个搜索方向是 d t − 1 d_{t-1} dt1。在极小值处,线搜索终止,方向 d t − 1 d_{t-1} dt1处的方向导数为零: ∇ θ J ( θ ) d t − 1 = 0 \nabla_\theta J(\theta)d_{t-1}=0 θJ(θ)dt1=0。因为该点的梯度定义了当前的搜索方向, d t = ∇ θ d_t=\nabla_\theta dt=θ将不会贡献于方向 d t − 1 d_{t-1} dt1。因此方向 d t d_{t} dt正交于 d t − 1 d_{t-1} dt1。最速下降多次迭代中,方向 d t − 1 d_{t-1} dt1 d t d_{t} dt之间的关系如上图所示。如上图展示的那样,下降正交方向的选择不会保持前一搜索方向上的最小值。这产生了锯齿形的过程。在当前梯度方向下降到极小值,我们必须重新最小化之前梯度方向上的目标。因此,通过遵循每次线搜索结束时的梯度,我们在某种程度上撤销了在之前线搜索的方向上取得的进展。共轭梯度试图解决这个问题。

在共轭梯度法中,我们寻求一个和先前线搜索方向共轭的搜索方向,即它不会撤销该方向上的进展。在训练迭代 t t t时,下一步的搜索方向 d t d_t dt的形式如下:
d t = ∇ θ J ( θ ) + β t d t − 1 d_t=\nabla_\theta J(\theta)+\beta_td_{t-1} dt=θJ(θ)+βtdt1

其中,系数 β t \beta_t βt的大小控制我们应沿方向 d t − 1 d_{t-1} dt1加回多少到当前搜索方向上。

如果 d t T H d t − 1 = 0 d_t^THd_{t-1}=0 dtTHdt1=0,其中 H H H是Hessian矩阵,则两个方向 d t d_t dt d t − 1 d_{t-1} dt1被称为共轭的。适应共轭的直接方法会涉及 H H H特征向量的计算以选择 β t \beta_t βt。这将无法满足我们的开发目标。我们有不进行这些计算而得到共轭方向的的方法,两种用于计算 β t \beta_t βt 的流行方法是:

  • Fletcher-Reeves: β t = ∇ θ J ( θ t ) T ∇ θ J ( θ t ) ∇ θ J ( θ t − 1 ) T ∇ θ J ( θ t − 1 ) \beta_t=\frac{\nabla_\theta J(\theta_t)^T\nabla_\theta J(\theta_t)}{\nabla_\theta J(\theta_{t-1})^T\nabla_\theta J(\theta_{t-1})} βt=θJ(θt1)TθJ(θt1)θJ(θt)TθJ(θt)
  • Polak-Ribi`ere: β t = ( ∇ θ J ( θ t ) − ∇ θ J ( θ t − 1 ) ) T ∇ θ J ( θ t ) ∇ θ J ( θ t − 1 ) T ∇ θ J ( θ t − 1 ) \beta_t=\frac{(\nabla_\theta J(\theta_t)-\nabla_\theta J(\theta_{t-1}))^T\nabla_\theta J(\theta_t)}{\nabla_\theta J(\theta_{t-1})^T\nabla_\theta J(\theta_{t-1})} βt=θJ(θt1)TθJ(θt1)(θJ(θt)θJ(θt1))TθJ(θt)

对于二次曲面而言,共轭方向确保梯度沿着前一方向大小不变。因此,我们在前一方向上仍然是极小值。其结果是,在 k k k维参数空间中,共轭梯度只需要至多 k k k次线搜索就能达到极小值。

共轭梯度法(Conjugate Gradient)
输入:初始参数 θ 0 \theta_0 θ0
输出:神经网络参数 θ k \theta_k θk
(1) 初始化 ρ 0 = 0 , g 0 = 0 , t = 1 \rho_0=0, g_0=0, t=1 ρ0=0,g0=0,t=1
(2) while 停止准则未满足 \quad\text{停止准则未满足} 停止准则未满足
(3) \quad 从训练集中采包含 m m m个样本 { x ( 1 ) , x ( 2 ) , ⋯   , x ( m ) } \{x^{(1)}, x^{(2)}, \cdots, x^{(m)}\} { x(1),x(2),,x(m)}的小批量,其中 x ( i ) x^{(i)} x(i)对应目标为 y ( i ) y^{(i)} y(i)
(4) \quad 计算梯度: g t = 1 m ∇ θ ∑ i L ( f ( x ( i ) ; θ ) , y ( i ) ) g_t = \frac{1}{m}\nabla_\theta\sum_iL(f(x^{(i)}; \theta), y^{(i)}) gt=m1θiL(f(x(i);θ),y(i))
(5) \quad 计算 β t \beta_t βt β t = ( g t − g t − 1 ) T g t g t − 1 T g t − 1 \beta_t=\frac{(g_t-g_{t-1})^Tg_t}{g_{t-1}^Tg_{t-1}} βt=gt1Tgt1(gtgt1)Tgt(Polak-Ribière)
(6) \quad 计算搜索方向: ρ t = − g t + β t ρ t − 1 \rho_t=-g_t+\beta_t\rho_{t-1} ρt=gt+βtρt1
(7) \quad 执行线搜索寻找: ϵ ∗ = arg ⁡ min ⁡ ϵ 1 m ∑ i = 1 m L ( f ( x ( i ) ; θ t + ϵ ρ t ) ) \epsilon^*=\arg\min_\epsilon\frac{1}{m}\sum_{i=1}^mL(f(x^{(i)};\theta_t+\epsilon\rho_t)) ϵ=argminϵm1i=1mL(f(x(i);θt+ϵρt))(对于真正二次的代价函数,存在 ϵ ∗ \epsilon^* ϵ的解析解,而无需显式地搜索)
(8) return θ \theta θ

本文我们主要关注于探索训练神经网络和其他相关深度学习模型的优化方法,其对应的目标函数比二次函数复杂得多。或许令人惊讶,共轭梯度法在这种情况下仍然是适用的,尽管需要做一些修改。没有目标是二次的保证,共轭方向也不再保证在以前方向上的目标仍是极小值。其结果是,非线性共轭梯度算法会包括一些偶尔的重设,共轭梯度法沿未修改的梯度重启线搜索。

在实践中使用非线性共轭梯度算法训练神经网络是合理的,尽管在开始非线性共轭梯度前使用随机梯度下降迭代若干步来初始化效果更好。另外,尽管非线性共轭梯度算法传统上作为批方法,小批量版本已经成功用于训练神经网络。针对神经网路的共轭梯度应用早已被提出,例如缩放的共轭梯度算法。

猜你喜欢

转载自blog.csdn.net/hy592070616/article/details/123458453