不想写也要写!!!

概述

梯度下降法(Gradient Descent, GD)是一个最优化算法,常用于机器学习和人工智能当中用来迭代性地逼近最小偏差模型,其表达式为:
梯度下降法 - 图1

其中梯度下降法 - 图2代表的是时刻梯度下降法 - 图3模型的参数, 梯度下降法 - 图4表示学习因子,即下降的步长,梯度下降法 - 图5代表梯度下降法 - 图6处的梯度。
在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降是最常采用的方法之一,另一种常用的方法是最小二乘法。在求解损失函数的最小值时,可以通过梯度下降法来一步步的迭代求解,得到最小化的损失函数和模型参数值。

前置知识

梯度

梯度的本意是一个向量,表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向变化最快,变化率最大。以二元函数梯度下降法 - 图7为例,设其在平面区域D上具有一阶连续偏导数,则其在点梯度下降法 - 图8处的梯度为:
梯度下降法 - 图9

泰勒展开式

函数梯度下降法 - 图10梯度下降法 - 图11处的泰勒展开式为:

梯度下降法 - 图12

其中,梯度下降法 - 图13表示梯度下降法 - 图14的n阶导数,梯度下降法 - 图15是泰勒展开式的余项,是梯度下降法 - 图16的高阶无穷小。

数学推导

梯度下降法公式可由一阶泰勒展开式推导得到,取函数梯度下降法 - 图17梯度下降法 - 图18处的一阶泰勒展开式:

梯度下降法 - 图19

梯度下降法 - 图20很接近梯度下降法 - 图21,则梯度下降法 - 图22趋于0,可得到如下近似:

梯度下降法 - 图23

由上述公式可以得到梯度下降法 - 图24梯度下降法 - 图25之间的关系:

梯度下降法 - 图26

梯度下降法 - 图27梯度下降法 - 图28为一常量,梯度下降法希望函数梯度下降法 - 图29的值不断减小,故有:

梯度下降法 - 图30

梯度下降法 - 图31取最小值时,梯度下降法 - 图32梯度下降法 - 图33差最大,即下降速度最快,而:

梯度下降法 - 图34

梯度下降法 - 图35,即参数变化方向与梯度方向相反时上式取最小值,故可取梯度下降法 - 图36,得:
梯度下降法 - 图37

梯度下降法 - 图38
再令梯度下降法 - 图39,可得到梯度下降法的递推公式:

梯度下降法 - 图40

通过控制参数梯度下降法 - 图41可以控制梯度下降法 - 图42梯度下降法 - 图43的差距,梯度下降法省略了梯度下降法 - 图44,实际上如果梯度下降法 - 图45梯度下降法 - 图46的差距过大,梯度下降法 - 图47不可当作0省略,所以梯度下降法的步长不能太大,步长越大偏差也就越大。

算法流程

  1. 给定待优化连续可微函数梯度下降法 - 图48、学习率梯度下降法 - 图49以及一组初始值梯度下降法 - 图50
  2. 计算梯度:梯度下降法 - 图51
  3. 迭代更新:梯度下降法 - 图52
  4. 计算梯度向量的模来判断算法是否收敛:梯度下降法 - 图53
  5. 若收敛或超出最大迭代次数,则算法停止,否则重复234继续迭代更新;

实验示例

代码

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. def demo_2d():
  4. def f(x_):
  5. return x_ ** 2
  6. def grad(x_):
  7. return 2 * x_
  8. def delta_grad(x_, alpha=0.5):
  9. g = grad(x_)
  10. return alpha * g
  11. alphas = [0.1, 0.3, 0.5, 0.8]
  12. threshold = 1e-10
  13. res = []
  14. for alpha in alphas:
  15. x = 5
  16. p_x = [x]
  17. for _ in range(100):
  18. delta = delta_grad(x, alpha)
  19. if abs(delta) < threshold:
  20. break
  21. x = x - delta
  22. p_x.append(x)
  23. res.append(p_x)
  24. X = np.arange(-5, 5, 0.2)
  25. plt.figure()
  26. for i, _ in enumerate(res):
  27. plt.subplot(2, 2, i + 1)
  28. plt.plot(X, f(X))
  29. plt.plot(res[i], f(np.array(res[i])), 'r*-')
  30. plt.title(f'alpha={alphas[i]}')
  31. plt.tight_layout()
  32. plt.show()
  33. def demo_3d():
  34. def f(x_, y_):
  35. return 0.6 * (x_ + y_) ** 2 - x_ * y_
  36. def grad(x_, y_):
  37. return np.matrix([0.6 * 2 * (x_ + y_) - y_, 0.6 * 2 * (x_ + y_) - x_])
  38. def delta_grad(x_, y_, alpha=0.5):
  39. g = grad(x_, y_)
  40. return alpha * g
  41. x = np.matrix([[4], [4]])
  42. threshold = 1e-10
  43. p_x = [x[0, 0]]
  44. p_y = [x[1, 0]]
  45. for _ in range(100):
  46. delta = delta_grad(x[0, 0], x[1, 0])
  47. if abs(delta[0, 0]) < threshold and abs(delta[0, 1]) < threshold:
  48. break
  49. x = x - delta
  50. p_x.append(x[0, 0])
  51. p_y.append(x[1, 0])
  52. x = np.linspace(-5, 5, 50)
  53. y = np.linspace(-5, 5, 50)
  54. X, Y = np.meshgrid(x, y)
  55. fig = plt.figure()
  56. ax = fig.add_subplot(111, projection='3d')
  57. ax.plot_surface(X, Y, f(X, Y), rstride=1, cstride=1, cmap=plt.cm.Greys)
  58. ax.plot(p_x, p_y, (f(np.array(p_x), np.array(p_y)) + 1), 'r*-')
  59. plt.show()

结果展示

image.png

image.png

几种梯度下降算法

上面的两个例子用最简单的方式直观的展示了梯度下降算法的流程,需要注意的是,这两个例子中的梯度下降法 - 图56梯度下降法 - 图57是待更新的参数,而不是样本点,如第二个例子中:梯度下降法 - 图58,可以将其看成一个优化目标函数:梯度下降法 - 图59,其训练样本只有梯度下降法 - 图60这一个样本。
注:切勿将训练样本与训练参数混淆。迭代更新过程中是待更新的函数在不断变化去拟合样本,而不是样本在动,上面两个例子中标注的点的变化并不是样本点在变化。

下面以机器学习中一个常见的均方误差损失函数为例,介绍几种梯度下降算法,均方误差损失定义如下:

梯度下降法 - 图61

其中,梯度下降法 - 图62为第梯度下降法 - 图63个样本的真实标注,梯度下降法 - 图64为第梯度下降法 - 图65个样本的预测结果,共梯度下降法 - 图66个训练样本,梯度下降法 - 图67是为了求导时与平方的梯度下降法 - 图68抵消系数,为方便起见,设预测函数为梯度下降法 - 图69梯度下降法 - 图70代表梯度下降法 - 图71维样本集中第梯度下降法 - 图72个样本的第梯度下降法 - 图73个分量,梯度下降法 - 图74为参数集合,得到优化的目标函数为:

梯度下降法 - 图75

可以用梯度下降法优化这个函数,上面的例子展示了只有一个样本的梯度下降法流程,现在有梯度下降法 - 图76个样本,根据不同的策略可以将梯度下降法大致分为下面三种:

  • 批量梯度下降(Batch Gradient Descent, BGD)
  • 随机梯度下降(Stochastic Gradient Descent, SGB)
  • 小批量梯度(Mini Batch Gradient Descent, MBGD)

    批量梯度下降

批量梯度下降法的思想最为直接,对所有样本计算梯度后求平均,来迭代更新参数。梯度计算公式为:

梯度下降法 - 图77

随机梯度下降

随机梯度下降在每次参数更新是从样本中只选取一个计算梯度,来迭代更新参数。梯度计算公式为:

梯度下降法 - 图78

梯度下降法 - 图79个样本中随机选取1个计算梯度,仅计算一个样本的梯度,且省略了求和及求平均的过程,降低了计算开销,因此提升了计算速度。

小批量梯度下降

小批量梯度下降则是上面两种方法的折中,从所有样本中选取一小部分计算梯度后求平均,来迭代更新参数。梯度计算公式为:

梯度下降法 - 图80

梯度下降法 - 图81个样本中随机选取个计算梯度。

优缺点对比

方法 优点 缺点
批量梯度下降 非凸函数可保证收敛至全局最优解 计算速度缓慢,不允许新样本中途进入
随机梯度下降 计算速度快 计算结果不易收敛,可能会陷入局部最优解中
小批量梯度下降 计算速度相对快,收敛相对稳定 小批量的规模的选取需探究

其实,已经有研究发现,当逐渐减小SGD方法使用的学习率时,可以保证SGD解的收敛性,但不一定保证收敛至全局最优解。此外,许多深度学习方法所使用的求解算法都是基于MBGD的,该方法一个算不上缺点的“缺点”就是需要找到合适的参与梯度计算的样本规模,对于超过2000个样本的较大数据集而言,参与计算的样本规模建议值为至梯度下降法 - 图82

参考