万字长文,揭开梯度下降的神秘面纱:从理论基础到批量、随机、小批量梯度下降实战演练

前言

   本文将深入探讨梯度下降算法,从基础的理论概念出发,结合线性回归预测房价的实例,详细阐述其工作原理与实现过程。
   同时,还将对三种梯度下降方法进行全面的比较分析,并通过代码实战,让读者更加直观地理解算法在实际应用中的表现与效果。
   希望通过本文的介绍,读者能够对梯度下降算法有更深入的认识,并在未来的机器学习实践中灵活运用这一强大的工具。(内容较多建议收藏慢慢看)

1、无约束最优化问题

1.1、无约束最优化

  无约束最优化问题(unconstrained optimization problem)指的是从一个问题的所有可能的备选方案中,选择出依某种指标来说是最优的解决方案。从数学上说,最优化是研究在一个给定的集合S上泛函 J ( θ ) J(\theta) J(θ)的极小化或极大化问题:广义上,最优化包括数学规划、图和网络、组合最优化、库存论、决策论、排队论、最优控制等。狭义上,最优化仅指数学规划。

1.2、梯度下降

  梯度下降法(Gradient Descent)是一个算法,但不是像多元线性回归那样是一个具体做回归任务的算法,而是一个非常通用的优化算法来帮助一些机器学习算法(都是无约束最优化问题)求解出最优解, 所谓的通用就是很多机器学习算法都是用梯度下降,甚至深度学习也是用它来求解最优解。

  所有优化算法的目的都是期望以最快的速度把模型参数θ求解出来,梯度下降法就是一种经典常用的优化算法。

  之前利用正规方程求解的 θ 是最优解的原因是 MSE 这个损失函数是凸函数。但是,机器学习的损失函数并非都是凸函数,设置导数为 0 会得到很多个极值,不能确定唯一解,就像下图这样。

image.png

  使用正规方程 θ = ( X T X ) − 1 X T y \theta = (X^TX)^{-1}X^Ty θ=(XTX)1XTy 求解的另一个限制是特征维度( X 1 、 X 2 … … 、 X n X_1、X_2……、X_n X1X2……Xn)不能太多,矩阵逆运算的时间复杂度通常为 O ( n 3 ) O(n^3) O(n3) 。换句话说,就是如果特征数量翻2倍,你的计算时间大致为原来的 2 3 2^3 23倍,也就是之前时间的8倍。

  举个例子,2 个特征 1 秒,4 个特征就是 8 秒,8 个特征就是 64 秒,16 个特征就是 512 秒,当特征更多的时候呢?运行时间会非常漫长~

  所以正规方程求出最优解并不是机器学习甚至深度学习常用的手段。

  之前我们令导数为 0,反过来求解最低点 θ 是多少,而梯度下降法是一点点去逼近最优解,就像下图这样。

image.png

  其实这就跟生活中的情形很像,比如你问同学的考试分数是多少,他说你猜?那就很难了,他说你猜完我告诉你是猜高了还是猜低了,这样你就可以奔着对的方向一直猜下去,最后总会猜对!

  梯度下降法就是这样的,多次尝试。并且,在试的过程中还得想办法知道是不是在猜对的路上,说白了就是得到正确的反馈再调整然后继续猜才有意义~

  这个就好比道士下山,我们把 Loss (或者称为Cost,即损失)曲线看成是山谷,如果走过了,就再往回返,所以是一个迭代的过程。

1.3、梯度下降公式

  这里梯度下降法的公式就是一个式子指导计算机迭代过程中如何去调整 θ \theta θ,可以通过泰勒公式一阶展开来进行推导和证明:

image.png

  这里的 w j w_j wj 就是 θ \theta θ 中的某一个 j = 0…m,这里的 η \eta η 就是梯度下降图里的 learning step,很多时候也叫学习率 learning rate,很多时候也用 α \alpha α 表示,这个学习率我们可以看作是下山迈的步子的大小,步子迈的大下山就快。

image.png

  学习率一般都是正数,如果在山左侧(曲线左半边)梯度是负的,那么这个负号就会把 w j w_j wj 往大了调, 如果在山右侧(曲线右半边)梯度就是正的,那么负号就会把 w j w_j wj 往小了调。每次 w j w_j wj 调整的幅度就是 η ∗ g r a d i e n t \eta * gradient ηgradient,就是横轴上移动的距离。

  因此,无论在左边,还是在右边,梯度下降都可以快速找到最优解,实现快速下山~

  如果特征或维度越多,那么这个公式用的次数就越多,也就是每次迭代要应用的这个式子多次(多少特征,就应用多少次),所以其实上面的图不是特别准,因为 θ \theta θ 对应的是很多维度,应该每一个维度都可以画一个这样的图,或者是一个多维空间的图。

image.png

image.png

  所以观察上图我们可以发现不是某一个 θ 0 \theta_0 θ0 θ 1 \theta_1 θ1 找到最小值就是最优解,而是它们一起找到 J ( θ ) J(\theta) J(θ) 最小值才是最优解。

1.4、学习率

  根据我们上面讲的梯度下降公式,我们知道 η \eta η 是学习率,设置大的学习率 w j w_j wj 每次调整的幅度就大,设置小的学习率 w j w_j wj 每次调整的幅度就小,然而如果步子迈的太大也会有问题。

  学习率大,可能一下子迈过了,到另一边去了(从曲线左半边跳到右半边),继续梯度下降又迈回来, 使得来来回回震荡。步子太小呢,就像蜗牛一步步往前挪,也会使得整体迭代次数增加。

image.png

  学习率的设置是门一门学问,一般我们会把它设置成一个比较小的正整数,0.1、0.01、0.001、0.0001,都是常见的设定数值(然后根据情况调整)。

  一般情况下学习率在整体迭代过程中是不变,但是也可以设置成随着迭代次数增多学习率逐渐变小,因为越靠近山谷我们就可以步子迈小点,可以更精准的走入最低点,同时防止走过。

  还有一些深度学习的优化算法会自己控制调整学习率这个值,后续文章会一一讲到。

image.png

1.5、全局最优化

image.png

上图显示了梯度下降的两个主要挑战:

  • 若随机初始化,算法从左侧起步,那么会收敛到一个局部最小值,而不是全局最小值;
  • 若随机初始化,算法从右侧起步,那么需要经过很长时间才能越过Plateau(函数停滞带,梯度很小),如果停下得太早,则永远达不到全局最小值;

  而线性回归的模型MSE损失函数恰好是个凸函数,凸函数保证了只有一个全局最小值,其次是个连续函数,斜率不会发生陡峭的变化,因此即便是乱走,梯度下降都可以趋近全局最小值。

  上图损失函数是非凸函数,梯度下降法是有可能落到局部最小值的,所以其实步长不能设置的太小太稳健,那样就很容易落入局部最优解,虽说局部最小值也没大问题, 因为模型只要是堪用的就好嘛,但是我们肯定还是尽量要奔着全局最优解去!

1.6、梯度下降步骤

梯度下降流程就是“猜”正确答案的过程:

  • 1、“瞎蒙”,Random 随机数生成 θ \theta θ,随机生成一组数值 w 0 、 w 1 … … w n w_0、w_1……w_n w0w1……wn ,期望 μ \mu μ 为 0 方差 σ \sigma σ 为 1 的正太分布数据。

  • 2、求梯度 g ,梯度代表曲线某点上的切线的斜率,沿着切线往下就相当于沿着坡度最陡峭的方向下降

  • 3、if g < 0, θ \theta θ 变大,if g > 0, θ \theta θ 变小

  • 4、判断是否收敛,如果收敛跳出迭代,如果没有达到收敛,回第 2 步再次执行2~4步

    收敛的判断标准是:随着迭代进行损失函数Loss,变化非常微小甚至不再改变,即认为达到收敛

image.png

1.7、代码模拟梯度下降

  • 梯度下降优化算法,比正规方程,应用更加广泛

  • 什么是梯度?

    • 梯度就是导数对应的值!
  • 下降?

    • 涉及到优化问题,最小二乘法
  • 梯度下降呢?

    • 梯度方向下降,速度最快的~

  接下来,我们使用代码来描述上面梯度下降的过程:

方程如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值