机器学习

机器学习——随机梯度下降

本文主要是介绍机器学习——随机梯度下降,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

  在经典的随机梯度下降算法中,我们的迭代下降公式是
    $x_{t+1}=x_{t}-\alpha \nabla f\left(x_{t}\right)$
  以一元线性回归的目标函数
    $\sum \limits _{i=1}^{n}\left(a x_{i}+b-y_{i}\right)^{2}$
  为例,其梯度可以表达为
    $\left(\frac{\partial g}{\partial a}, \frac{\partial g}{\partial b}\right)=\left(2 \sum \limits_{i=1}^{n} x_{i}\left(a x_{i}+b-y_{i}\right), 2 \sum \limits_{i=1}^{n}\left(a x_{i}+b-y_{i}\right)\right)$
  显然我们可以看到,这里的梯度计算,使用了所有的样本数据。倘若我们的数据集有1000组数据,那就需要计算1000次才可以得到梯度,倘若数据集有1亿组数据,就需要计算一亿次,其时间复杂度是O(n)。当我们面对的样本数据较多时,毫无疑问,模型的求解,学习一次的过程是很浪费时间的。因此,我们可以在所有的样本数据中选择随机的一个实例,用这个实例所包含的数据计算我们的“梯度”。此时的梯度为
    $\left(\frac{\partial g}{\partial a}, \frac{\partial g}{\partial b}\right)=\left(2 x_{i}\left(a x_{i}+b-y_{i}\right), 2\left(a x_{i}+b-y_{i}\right)\right)$
  其中 $\left(x_{i}, y_{i}\right)$ 是一个随机选中的样本。
  到了这里,可能会存在一定的疑问,因为对于
    $\sum \limits _{i=1}^{n}\left(a x_{i}+b-y_{i}\right)^{2}$
  这个目标函数,其梯度并不是
    $\left(\frac{\partial g}{\partial a}, \frac{\partial g}{\partial b}\right)=\left(2 x_{i}\left(a x_{i}+b-y_{i}\right), 2\left(a x_{i}+b-y_{i}\right)\right)$
  既然如此,这个方向还是不是可以使函数值下降的方向?只能说,对于一次迭代而言,不一定,但是站在宏观的角度去考虑,最后还是很有机会收敛到近似最优解的。
  事实上,我们的目标函数可以写成
    $\sum \limits_{i=1}^{n} S(i), \text{ 其中 } S(i)=\left(a x_{i}+b-y_{i}\right)^{2}$
  所以我们的梯度则是
    $\sum \limits _{i=1}^{n} \nabla S(i)$
  这个时候,我们的优化目标是所有样本的损失函数之和,所以在梯度下降时,自然而然是朝着使总的偏差缩小的方向去移动的。而对于随机梯度下降,我们每一步迭代的优化目标函数不是始终不变的,其变化的范围就是
    $S(i), i=1,2,3 \ldots$
  在第 $i$ 步,我们随机地选中了 $S(i)$ 作为我们的优化目标,其梯度便是
    $\left(\frac{\partial g}{\partial a}, \frac{\partial g}{\partial b}\right)=\left(2 x_{i}\left(a x_{i}+b-y_{i}\right), 2\left(a x_{i}+b-y_{i}\right)\right)$
  而在第 $i+1$ 步,我们的优化目标可能就变成了
    $\min S(j)$
  此时,梯度也自然变成了
    $\left(\frac{\partial g}{\partial a}, \frac{\partial g}{\partial b}\right)=\left(2 x_{j}\left(a x_{j}+b-y_{j}\right), 2\left(a x_{j}+b-y_{j}\right)\right)$
  显然,随机梯度下降迭代过程中,我们考虑的下降方向并不是全局下降方向,而是使得某个随机选中的样本的损失函数下降的方向。在一步迭代中,这种局部样本的下降未必会导致全局损失的下降,但是当迭代次数足够的时候,绝大部分样本都会被考虑到,最终一步一步走向全局最优解。
  所以,随机梯度下降相对于梯度下降而言,其根本区别在于每一步迭代时需要优化的目标函数不同。对于经典的梯度下降,其每一步的目标函数(损失函数)是一样的,即所有样本的(平均)损失函数之和。而对于随机梯度下降而言,其每一步的目标函数是被随机选中的某个样本的损失函数,并不是一直不变的。
  可以通过下面这个视频直观地感受一下随机梯度下降。

  <iframe height="350" src="https://vdn1.vzuu.com/HD/35313c0a-20d2-11eb-9244-befcc1b59df5.mp4?disable_local_cache=1&auth_key=1627236440-0-0-ac86df2a1758207241fa317480fc8853&f=mp4&bu=http-com&expiration=1627236440&v=hw" width="467"></iframe>

  上面的每个小球,我们可以将其理解为随机梯度下降过程中由于随机性而带来的迭代情况的分支。正是由于这种随机性的存在,每个球可以较为自由地选择其运动方向,有些就停在某个位置,有些则一路向下。当迭代的次数足够多时,总会有某个球的路径十分顺畅,最终到达全局最优解的附近。我们甚至可以猜测,随机梯度下降相对于经典梯度下降,其逃离局部最优的能力更强。因为一旦到达了某个样本的局部最优,随着目标函数的更换,很可能不再是另一个样本的局部最优,迭代就可以继续进行。
当然,随机梯度下降的缺点也是存在的,即它很可能无法收敛到全局最优解。什么是全局最优,是$\sum \limits _{i=1}^{n}\left(a x_{i}+b-y_{i}\right)^{2}$达到最小嘛?还是每一个 $S(i)$ 都无法继续下降?一般而言,前者可能更容易衡量一些,我们也更偏向于使用总体的最优作为全局最优,而非每一个样本的最优。而对于随机梯度下降,即使我们已经达到了总体全局最优,对于某些样本而言,其可能依然可以继续下降,所以一旦选中了这些样本,我们就要偏离全局最优点了。所以随机梯度下降最终的收敛性确实值得考虑。
  但总的来说,随机梯度下降还是很不错的,特别是对于大样本的处理情况,每一次迭代中O(1)的计算开销无疑会轻松很多,至于最终的收敛问题,则要根据迭代次数,终止准则等进行一个衡量取舍啦。

这篇关于机器学习——随机梯度下降的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!