【梯度下降法】,我悟了!

3,486 阅读7分钟

「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战

首先跟我设想一个场景🎞

有一个人👨‍🦱被困在山上,想要下山(需要找到山的最低点,也就是山谷)。然而此时山上的浓雾很大,导致可视度很低。因此,下山的路径就无法确定,他必须利用自己周围的信息去找到下山的路径,走一步看一步🔎。

🎇此时,他就可以利用梯度下降算法来帮助自己下山。具体来说就是,他每到一处,就去寻找这个位置最陡峭的地方,然后迈一小步,接着在新的位置,继续找最陡的方向,再往下迈一步,就这样一小步一小步的,就可以顺利地走到山脚下了🎉。

☝这就是梯度下降法的一个直观理解。

可以看出,顺利下山的核心在于找到当前位置最陡峭的方向确定迈多大的步子。在梯度下降法里,这两个变量有更高逼格的名字:梯度步长

接下来,让我来把你研究~🧐

概念和算法

梯度下降的基本过程就和下山的场景很类似。

首先,我们有一个可微分的函数,这个函数就代表着一座山。我们的目标就是找到这个函数的最小值,也就是山底。根据之前的场景假设,最快的下山的方式就是找到当前位置最陡峭的方向,然后沿着此方向向下走,对应到函数中,就是找到给定点的梯度 ,然后朝着梯度相反的方向(想知道为什么相反方向?那就往后看~),就能让函数值下降的最快!到达下一个点后,我们重复找最陡峭的位置走(求取梯度),最后就能到达局部的最小值。

这就类似于我们下山的过程。而求取梯度就确定了最陡峭的方向,也就是场景中测量方向的手段。

1. 梯度

梯度,沿着该方向可取得最大的变化率,说人话就是当前位置最陡峭的方向。

​ 如何计算梯度呢?

single-variable

单变量的话,直接对变量求导就可以啦,得到的梯度就是一个关于位置的函数,也就是每一个位置对应一个梯度。

muti-variable

多变量的话,那么就分别对每个变量求偏导数,然后合并在一起,得到一个多元向量。

我们需要到达山底,就需要在每一步观测到此时最陡峭的地方,梯度就恰巧告诉了我们这个方向。梯度的方向是函数在给定点上升最快的方向,那么梯度的反方向就是函数在给定点下降最快的方向,这正是我们所需要的,也解释了为什么公式里梯度前要加一个负号。

这是一个迭代公式。此公式的意义是:f(θ(k))f(\theta^{(k)})是关于θ\theta的一个函数,我们当前所处的位置为θk\theta^{k}点,要从这个点走到f(θ(k))f(\theta^{(k)})的最小值点,也就是走到山底。

那么首先我们需要先确定前进的方向,也就是梯度的反向,然后走一段距离的步长,也就是η\eta,走完这段步长,就到达了θ(k+1)\theta^{(k+1)}这个点!

2.步长

​ 步长,即用来控制每一步走的距离的变量。步长的选择在梯度下降法中往往是很重要的!步长不能太大也不能太小,太小的话可能导致走得太慢迟迟走不到最低点,太大的话会导致错过最低点!

看我的栗子,假设函数f(x)=x2f(x)=x^2,那么迭代公式为

以下是同样的初始位置,同样的下山目标,不一样的步长的情况👇

3.详细算法

输入:目标函数 f(θ)f(\theta),步长 η\eta,计算精度 ϵ\epsilon

输出:f(θ)f(\theta)的极小值点 θ\theta^*

  • (1) 选取初始值 θ(0)\theta^{(0)},置 k=0k=0;
  • (2) 计算 f(θ(k))f(\theta^{(k)});
  • (3) 计算梯度 f(θ(k))\nabla f(\theta^{(k)});
  • (4) 利用迭代公式 θ(k+1)=θ(k)ηf(θ(k))\theta^{(k+1)}=\theta^{(k)}-\eta \nabla f(\theta^{(k)}) 进行参数更新;

如果 f(θ(k+1))f(θ(k))<ϵ||f(\theta^{(k+1)})-f(\theta^{(k)})||<\epsilon,停止迭代,令 θ=θ(k+1)\theta^*=\theta^{(k+1)},输出结果。

  • (5) 否则,令k=k+1k=k+1,转(3).

也就是继续迭代,更新参数,直到满足终止条件。

单变量函数的梯度下降

单变量函数的梯度下降

多变量函数的梯度下降

多变量函数的梯度下降

我们发现,已经基本靠近函数的最小值点

关于梯度下降到底是为了干嘛的?

在机器学习、神经网络以及各种数学建模问题中,不是总会见到有个损失函数/代价函数/误差函数嘛🤔

梯度下降作用是找到函数的最小值所对应的自变量的值(曲线最低点对应x的值),再说一遍,是想找自变量而不是函数值❕一个算法不同参数会产生不同拟合曲线,也意味着有不同的误差。梯度下降就是最常用的对损失函数进行优化的方法,去找出让误差值最小时算法取的参数。

梯度下降法大家庭

洗脑概念:

  • 假设函数:在监督学习中,为了拟合输入样本而使用的函数。
  • 目标函数/损失函数/代价函数/误差函数:为了评估模型拟合的好坏,用来度量拟合程度的函数。损失函数极小化,意味着拟合程度最好,对应的模型参数即为最优参数。

为了便于理解,以只包含一个特征的线性回归为例,假设线性回归的假设函数为(i=1,2,⋯m表示样本数):

在线性回归中,损失函数通常为样本输出和假设函数的差取平方。因此,这里对应的均方差损失函数为:

1.批量梯度下降法(Batch Gradient Descent,BGD)

批量梯度下降法,是梯度下降法最常用的形式,具体做法也就是在更新参数时使用所有的样本来进行更新

(1)对损失函数J(θ0,θ1)J(θ_0,θ_1)求偏导(置x0(i)=1x_0^{(i)}=1):

(2)每次迭代对参数进行更新:

❗从式子可以看到,这里更新时有一个求和项,即要每迭代一步,都要用到训练集所有的数据,对所有样本进行计算处理。

优点

(1)一次迭代是对所有样本进行计算,此时可利用矩阵进行操作,实现了并行
(2)由全部数据集确定的方向能够更好代表样本总体,从而能更准确地朝极值所在的方向,当目标函数为凸函数时,一定能够得到全局最优

缺点

当样本数目较大时,每次迭代都需要计算所有样本的梯度,训练速度较慢

2.随机梯度下降法(Stochastic Gradient Descent,SGD)

不同于批量梯度下降法,随机梯度下降法每次迭代使用一个样本对参数进行更新,使得训练速度加快。

随机梯度下降法的前面步骤与梯度下降法相同,同样的对损失函数J(θ0,θ1)J(θ_0,θ_1)求偏导(置x0(i)=1x_0^{(i)}=1):

区别就在💥每次迭代对参数进行更新时:

❗从式子可以看到,这里更新时不再有求和项,即要每迭代一步,仅仅选取一个样本。

优点

由于不是在全部训练数据上的损失函数,而是在每轮迭代中,随机优化某一条训练数据上的损失函数,这样每一轮参数的更新速度大大加快

缺点

(1)准确度下降。由于即使在目标函数为强凸函数的情况下,随机梯度下降法仍旧无法做到线性收敛。
(2)可能会收敛到局部最优,由于单个样本并不能代表全体样本的趋势。
(3)不易于并行实现

3.小批量梯度下降法(Mini-Batch Gradient Descent, MBGD)

小批量梯度下降法是对随机梯度下降法和批量梯度下降法的一个折中方案,其思想是:每次迭代用“batch_size”个样本对参数进行更新。一般设batch_size=10,样本数m=1000。当然根据样本的数据,可以调整这个batch_size的值。

对应的更新公式是:

优点

  (1)通过矩阵运算,每次在一个batch上优化神经网络参数并不会比单个数据慢太多。
  (2)每次使用一个batch可以大大减小收敛所需要的迭代次数,同时可以使收敛到的结果更加接近梯度下降的效果。
  (3)可实现并行化。

缺点

  (1)batch_size的不当选择可能会带来一些问题。

参考资料

深入浅出--梯度下降法及其实现-六尺帐篷

梯度下降小结-刘建平Pinard