梯度下降法基本原理

梯度下降法基本原理求解线性回归模型 函数求极值解析解根据严格的推导和计算得到 是方程的精确解能够在任意精度下满足方程但是在很多情况下 无法直接通过严格的公式推导 得到方程或者方程组的解析解 这时候只能够采用数值分析的方法得到近似解 这样的解也成为数值解数值解通过某种近似计算得到的解能够在给定的精度条件下满足方程我们就都介绍一种常用的求数值解的方法 梯度下降法 为了便于理解 我们先从最简单的一元凸函数开始介绍梯度下降法的求解过程 一元凸函数求极值这是一元函数 fx x 平方 2 的函数曲线

求解线性回归模型–函数求极值

  • 解析解
    • 根据严格的推导和计算得到,是方程的精确解
    • 能够在任意精度下满足方程

但是在很多情况下,无法直接通过严格的公式推导,得到方程或者方程组的解析解,这时候只能够采用数值分析的方法得到近似解,这样的解也成为数值解

  • 数值解
    • 通过某种近似计算得到的解
    • 能够在给定的精度条件下满足方程

我们就都介绍一种常用的求数值解的方法,梯度下降法。为了便于理解,我们先从最简单的一元凸函数开始介绍梯度下降法的求解过程。

一元凸函数求极值

在这里插入图片描述

这是一元函数fx=x平方+2的函数曲线,这种形状的函数称为凸函数,他一定存在唯一的一个极小值点,这个点在一个斜率正好为0的位置。在求解一个问题的时候,如果我们能够把它转换为在凸函数上求极小值的问题,那么这个问题就算已经激活成功教程了。在上节课中我们介绍了求这个函数的解析解的方法,下面我们来看一下,如何采用数值计算的方法来得到它的数值解。这类问题可以采用迭代的方法来求解。

在这里插入图片描述
这类问题可以采用迭代的方法来求解,首先我们在函数曲线上取任意1点 x 0 x_0 x0作为初值,当然这个初值不会恰好在极值点上。下面,我们按照某个步长移动x找到 x 1 x_1 x1,使得函数在 x 1 x_1 x1上的值,小于在 x 0 x_0 x0上的值。不断重复这个步骤,直到无法找到更小的函数值,最后找到的这个x,就是使函数达到极小值时的位置。
在这里插入图片描述

例如取初始值 x 0 = 3 x_0=3 x0=3,那么这一点的函数值等于11。假设取步长是0.2,那么x可能分别向两个方向移动,到达3.2或者2.8的位置,究竟应该向哪个方向移动呢?对比它们的函数值分别是显然9.84小于12.24。因此,取 x 1 = 2.8 x_1=2.8 x1=2.8
在这里插入图片描述

下面再以2.8为起点,步长仍然是0.2,对比函数,在 x = 2.6 x=2.6 x=2.6 x = 3 x=3 x=3处的取值,显然,在 x = 2.6 x=2.6 x=2.6时的函数值更小。因此,取 x 2 = 2.6 x_2=2.6 x2=2.6。下面再以2.6为起点,继续这个步骤不断移动x,直到函数达到最小值,这个图只是个示意图,这个步长的比例是夸张了,其实每一步0.2是要比这个小很多。

产生震荡的原因是因为更新x的时候,步长太大,一下子跨过了最小值。在英文资料中把这种情况称为overshoot the minimum

震荡现象也分为两种情况,一种是虽然来回震荡,但是震幅越来越小,最后还是可以收敛。另一种就是来回震荡无法收敛。

通过这个例子我们发现,

  • 步长如果太小会增加迭代次数,收敛速度很慢。
  • 不长如果太大又会引起震荡,甚至导致无法收敛

曲线在这一点的斜率就是函数在这个点的导数,让步长和斜率之间保持正比例关系。

步 长 = η d f ( x ) d x 步长=\eta\frac{df(x)}{dx} =ηdxdf(x) η \eta η是一个常数,称为学习率。

就可以得到更新x的迭代公式 x ( k + 1 ) = x ( k ) − η d f ( x ) d x x^{(k+1)}=x^{(k)}-\eta\frac{df(x)}{dx} x(k+1)=x(k)ηdxdf(x)

这里我们采用加括号的上标来表示迭代的次数,这是为了和之前采用下标表示样本序号,采用上标表示属性区分开来。在第k+1次迭代中,x的取值是由第k次x的值减去步长得到。

采用这种方法进行迭代,可以根据函数曲线的斜率实现,对步长的自适应调整,在这种迭代算法中,当x大于0时导数为正数。这时候, x ( k + 1 ) = x ( k ) − a x^{(k+1)}=x^{(k)}-a x(k+1)=x(k)a,a为正数,变得更小,向原点的方向移动。
在这里插入图片描述
当x小于0时,导数为负数, x ( k + 1 ) = x ( k ) − a x^{(k+1)}=x^{(k)}-a x(k+1)=x(k)a,a为负数,变得更大,x也是向原点的方向移动,
在这里插入图片描述
可见无论x是大于0还是小于0,最后都能够收敛于原点。采用这种方法导数的符号就直接决定了迭代更新的方向,而不需要像前面的例子那样,每次都去比较两个方向的函数值来确定x移动的方向。



总结一下,采用这种迭代算法能够自动调节步长,自动确定下一次更新的方向,并且能够保证收敛性。

这种一元凸函数求极值的方法可以推广到二元凸函数中,二元函数中有两个自变量 z = f ( x , y ) z=f(x,y) z=f(x,y),x和y需要分别进行迭代计算。
这是二元函数的迭代算法,
x ( k + 1 ) = x ( k ) − η ∂ f ( x , y ) ∂ x x^{(k+1)}=x^{(k)}-\eta\frac{\partial{f(x, y)}}{\partial{x}} x(k+1)=x(k)ηxf(x,y)

y ( k + 1 ) = y ( k ) − η ∂ f ( x , y ) ∂ y y^{(k+1)}=y^{(k)}-\eta\frac{\partial{f(x, y)}}{\partial{y}} y(k+1)=y(k)ηyf(x,y)

  • 导数:函数在某一点p的导数,其实就是函数在p点的变化率。
  • 偏导数: ∂ f ( x , y ) ∂ x \frac{\partial{f(x, y)}}{\partial{x}} xf(x,y)二元函数对x的偏导数,就是函数在x方向上的变化率。
    ∂ f ( x , y ) ∂ y \frac{\partial{f(x, y)}}{\partial{y}} yf(x,y)对y的偏导数就是函数在y方向的变化率
  • 方向导数:函数沿着某一个方向l的变化率,这个l可以是任何一个方向

x偏导数和y偏导数都是方向导数的特例,那么函数在p点时沿着哪一个方向的变化最快呢?也就是说哪一个方向导数最大,这个最大的值又是多少呢?这个问题的答案就是梯度。

  • 梯度: g r a d ⃗ f ( x , y ) = ∂ f ∂ x i ⃗ + ∂ f ∂ y j ⃗ \vec{grad}f(x, y)=\frac{\partial{f}}{\partial{x}}\vec{i}+\frac{\partial{f}}{\partial{y}}\vec{j} grad
    f(x,y)=
    xfi
    +
    yfj

    梯度是一个矢量,既有大小又有方向,也可以采用这样的向量形式来表示.
    ∇ = ( ∂ f ( x , y ) ∂ x ∂ f ( x , y ) ∂ y ) \nabla=(\begin{array}{c} \frac{\partial{f(x, y)}}{\partial{x}} \\ \frac{\partial{f(x, y)}}{\partial{y}} \end{array}) =(xf(x,y)yf(x,y))

    • 它的大小就是所有方向导数中那个最大的值。
    • 它的方向就是取得最大方向导数的方向,或者说函数在某个点的梯度,就是指在这个点沿着这个方向的变化率最大。



这就好像下山,我们在山腰上的某个位置环顾一圈之后,沿着当前最陡的方向,向下走一步。然后再环顾一圈,再沿着目前最陡的方向向下走一步。不断重复这个过程,保证每一步都是沿着当时最陡的方向向下走,那么一定可以以最少的步数到达山脚下,当然这要假设这个山的每个方向上都有路,都可以向下走。

对于机器学习算法,只要能够把损失函数描述成凸函数,那么就一定可以采用梯度下降法,以最快的速度更新模型参数,找到使损失函数达到最小值的点的位置。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/217425.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 上午9:35
下一篇 2026年3月18日 上午9:36


相关推荐

  • ps磨皮插件portraiture「建议收藏」

    ps磨皮插件portraiture「建议收藏」相信大家在使用photoshop的时候经常会配合插件来进行修图,而ps磨皮插件portraiture也是大多数人的必备插件,因为当你需要处理人像照片的话,那么磨皮将是必不可少的一个步骤,而该插件正是一个功能强大的磨皮滤镜插件,不仅为用户们提供了强大的磨皮效果,还使用起来十分的简单,无需繁琐的使用步骤,只需要简简单单的设置下磨皮参数再随意的调整下即可快速的帮助用户进行磨皮处理啦,非常方便,所以如果你要用ps的话怎么可以缺少这款ps磨皮插件呢?另外,使用这款插件的时候,你会发现它直接为用户们提供了一个单独的面板

    2022年7月22日
    25
  • 服务器中”系统平均负载 Load average“含义学习

    服务器中”系统平均负载 Load average“含义学习文章目录一、什么是系统平均负载二、衡量系统性能三、行车过桥(引用)四、自我总结一、什么是系统平均负载  uptime、w、top等命令都会有系统负载loadaverage的输出,系统平均负载被定义为在特定时间间隔内运行队列中的平均进程数,包括可运行状态和不可中断状态的平均进程数,也就是活跃进程数。它和cpu使用率没有直接的关系二、衡量系统性能  如果系统平均负载的数值除以CPU的数目高于…

    2025年11月7日
    6
  • ViewState的用法

    ViewState的用法学习标签:ViewState本文导读:在web窗体控件设置为runat="server",这个控件会被附加一个隐藏的属性_ViewState,_ViewState存放了所有控件

    2022年7月1日
    28
  • 智谱 AI 秘密发布 ZCode,轻松可视化使用 Claude Code、Codex、Gemini~

    智谱 AI 秘密发布 ZCode,轻松可视化使用 Claude Code、Codex、Gemini~

    2026年3月12日
    3
  • 计算机二级考试python考试大纲

    计算机二级考试python考试大纲全国计算机等级考试二级Python语言程序设计考试大纲(2018年版)基本要求1.掌握Python语言的基本语法规则。2.掌握不少于2个基本的Python标准库。3.掌握不少于2个Python第三方库,掌握获取并安装第三方库的方法。4.能够阅读和分析Python程序。5.熟练使用IDLE开发环境,能够将脚本程序转变为可执行程序。6.了解Python计算生态在以下方面(不限于)的主要第三方库名称:网络爬虫、数据分析、数据可视化、机器学习、Web开发等。考试内容一、Python语言基本语法元

    2022年10月19日
    3
  • pycharm中如何导入包和模块

    pycharm中如何导入包和模块本人所使用的编译器是 pycharm 所以给大家讲述的是 pycharm 的一些基本用法 相信大家如果在百度上搜索如何安装库和包 大部分都是叫你打开 windows 管理器 首先 windows 键 r 然后输入 cmd 利用 pip 命令语句来下载模块 只不过这种是把这个模块下载到了你的 python 中 你自己的电脑中 如果你使用的是 pycharm 编辑器 那么里面还是没有这个模块 所以 首先你应该先打开 file 然后点开 settings 然后再点开 Project pythonProjec 在点开 pythoninte

    2026年3月27日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号