无约束最优化问题的求解算法--梯度下降法(Gradient Descent)

news2025/4/19 5:41:45

文章目录

  • 梯度下降法
  • 梯度下降法原理(通俗版)
  • 梯度下降法公式
  • 学习率的设置
    • **如何选择学习率?**
  • 全局最优解
  • 梯度下降法流程
  • 损失函数的导函数
  • 三种梯度下降法
    • **梯度下降法核心步骤回顾**
    • **优缺点详解**
      • **1. 全量梯度下降 (Batch Gradient Descent, BGD)**
      • **2. 随机梯度下降 (Stochastic Gradient Descent, SGD)**
      • **3. 小批量梯度下降 (Mini-Batch Gradient Descent, MBGD)**
    • **三种梯度下降的区别与对比**
    • 如何选择?
  • 梯度下降法的问题与挑战

梯度下降法

  • 梯度下降法(Gradient Descent):是一个非常通用的优化算法帮助机器学习求解最优解。所有优化算法的目的都是期待以最快的速度求解模型参数θ,梯度下降就是一种经典常用的优化算法。
  • 使用梯度下降法的原因:
    • 如果机器学习的损失函数是非凸函数,使用解析解公式求解θ,设置梯度为0会得到很多极值,甚至可能是极大值。
    1. 解析解计算成本高 :当特征维度N较大时,解析解需要计算矩阵的逆(复杂度O(N³)),计算时间呈指数级增长。例如,特征数量从4增加到16,计算时间会从1秒暴增到64秒。
    2. 更适合高维和大规模数据:梯度下降法通过迭代逼近最优解,避免了直接求逆的计算瓶颈,尤其适合特征维度高或数据量大的场景(如深度学习)。
    3. 动态优化的优势:解析解需要一次性求解,而梯度下降可以逐步优化,灵活适应在线学习或超大规模数据的分批训练。

在这里插入图片描述

梯度下降法原理(通俗版)

  1. 初始化:随机猜一个起点:就像猜工资时先随便说个数,计算机一开始也会随机给参数θ(比如W₁, W₂…Wₙ)赋一组初始值。
  2. 计算误差(Loss):用当前的θ预测结果(ŷ),并计算预测值ŷ和真实值y的差距(比如用均方误差MSE)。 目标:让这个误差越小越好。
  3. 调整参数:根据反馈改进如果误差变小了:说明调整方向正确,继续按这个方向微调θ;如果误差变大了:说明调反了,换个方向调整(比如增大改减小,或反之)。
  4. 重复直到最优:像“道士下山”一样,一步步试探,最终找到误差最低的θ(山谷最低点)。
  • 核心思想**“猜-反馈-改进”循环**,通过不断试错逼近最优解,而不是直接计算复杂公式。

类比简化

  • 猜工资游戏: 朋友说“高了/低了”,你逐步逼近正确答案。
  • 梯度下降:计算机用“误差”反馈(如MSE)指导参数调整方向,直到最优。

梯度下降法公式

  • 参数更新公式:
    W j ( t + 1 ) = W j ( t ) − η ⋅ gradient j W_j^{(t+1)} = W_j^{(t)} - \eta \cdot \text{gradient}_j Wj(t+1)=Wj(t)ηgradientj
  • 符号说明:
    • W j ( t ) W_j^{(t)} Wj(t):第 t t t轮迭代时的参数 W j W_j Wj θ \theta θ 中的一个分量)。
    • η \eta η(或 α \alpha α):学习率(learning rate),控制每次调整的步长(类似“下山时的步幅”)。
    • gradient j \text{gradient}_j gradientj:损失函数对 W j W_j Wj梯度(即当前方向上的“最陡下降方向”)。

核心作用:

  • 梯度(gradient) 告诉参数“往哪个方向调整能最快降低误差”。
  • 学习率(η) 决定调整的幅度:
    • η太大 → 可能“跨过”最优解(震荡甚至发散)。
    • η太小 → 收敛慢(下山速度太慢)。
      在这里插入图片描述
      关键点:
  1. 梯度决定方向(往哪走),学习率决定步幅(走多远)。
  2. 所有参数 W j W_j Wj同时按各自梯度调整,直到收敛。

  • 公式的直观意义“沿着梯度方向,迈一小步,反复走,直到最低点。”
    新参数 = 旧参数 − 步长 × 最陡方向 \text{新参数} = \text{旧参数} - \text{步长} \times \text{最陡方向} 新参数=旧参数步长×最陡方向

学习率的设置

  • 权重更新公式 W j t + 1 = W j t − η ⋅ gradient j W_{j}^{t+1} = W_{j}^{t} - \eta \cdot \text{gradient}_j Wjt+1=Wjtηgradientj
    • W j t W_{j}^{t} Wjt:当前权重
    • η \eta η(eta):学习率(控制每次调整的幅度)
    • gradient j \text{gradient}_j gradientj:损失函数对权重的梯度
      在这里插入图片描述
  • 学习率的影响
    1. 学习率太大(如 η=1.0):调整幅度过大,容易“跨过”最优解,导致震荡甚至无法收敛。类似“步子太大,容易走过头,来回摇摆”。
    2. 学习率太小(如 η=0.0001):每次调整幅度过小,收敛速度极慢,训练时间大幅增加。类似“小碎步前进,要走很久才能到达目标”。

如何选择学习率?

常用初始值:0.1、0.01、0.001、0.0001(根据问题调整)
动态调整策略

  • 学习率衰减:随着训练进行,逐步减小 η(越接近最优解,步伐越小)。
  • 自适应优化算法:如 Adam、RMSprop 等,自动调整学习率。
    在这里插入图片描述

全局最优解

在这里插入图片描述

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

梯度下降法流程

在这里插入图片描述

  • 梯度下降法就像一个人蒙着眼睛下山的过程,通过不断试探找到最低点。
  • 以下是具体步骤:
  1. 随机初始化:先随便猜一组参数值(θ或W),就像随机站在山上的某个点。
    • 实现方法np.random.rand()np.random.randn()
  2. 计算梯度:计算当前位置的"坡度"(梯度)。梯度是损失函数在该点的斜率,指向最陡上升方向。
    • 关键点:梯度指向上升方向,所以我们要往反方向走才能下降。
  3. 参数更新
    • 如果梯度(g)为负 → 需要增大θ
    • 如果梯度(g)为正 → 需要减小θ
    • 更新公式 θ n e w = θ o l d − η × g r a d i e n t θ_{new} = θ_{old} - η×gradient θnew=θoldη×gradient (η是学习率,控制步长)
  4. 判断收敛
    • 不能简单判断梯度=0(可能是局部最低或最高点)
    • 更好的方法是观察损失值的变化:当损失值基本不再下降时停止
    • 实际做法:设置阈值,当损失变化小于阈值时停止
  • 关键问题
    1. 如何随机初始化?:使用随机函数生成初始参数值
    2. 如何计算梯度?:需要求损失函数对各个参数的偏导数(这是后续要详细讲解的部分)
    3. 如何调整参数?:按照公式:新参数 = 旧参数 - 学习率×梯度
    4. 如何判断收敛?:监测损失值的变化幅度,而不是梯度本身

损失函数的导函数

  • 推导损失函数的导函数
    在这里插入图片描述
  • J ( θ ) J(θ) J(θ)是损失函数
  • θ j θ_j θj是某个特征维度 X j X_j Xj对应的权值系数
  • 损失函数是MSE,MSE中x、y是已知的,θ是未知的,而θ不是一个变量而是一堆变量。所以我们只能对含有一推变量的函数MSE中的一个变量求导,即偏导,下面就是对 θ j θ_j θj求偏
    导。
    在这里插入图片描述
    在这里插入图片描述

三种梯度下降法


梯度下降法核心步骤回顾

  1. 初始化参数:随机生成初始参数(θ/W)。
  2. 计算梯度:求损失函数对参数的偏导(梯度),确定下降方向。
  3. 更新参数:沿梯度反方向调整参数(学习率η控制步长)。
  4. 判断收敛:通过损失变化或梯度接近零终止迭代。

优缺点详解

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

在这里插入图片描述

  • 公式
    θ j t + 1 = θ j t − η ⋅ 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) \theta_{j}^{t+1} = \theta_{j}^{t} - \eta \cdot \frac{1}{m} \sum_{i=1}^{m} \left( h_{\theta}(x^{(i)}) - y^{(i)} \right) x_{j}^{(i)} θjt+1=θjtηm1i=1m(hθ(x(i))y(i))xj(i)
    说明:
  • θ j t \theta_{j}^{t} θjt: 第 t t t 次迭代的参数 θ j \theta_j θj(第 j j j 维)。
  • η \eta η: 学习率(步长)。
  • m m m: 训练集总样本数。
  • h θ ( x ( i ) ) h_{\theta}(x^{(i)}) hθ(x(i)): 模型对样本 x ( i ) x^{(i)} x(i)的预测值。
  • 特点:每次迭代使用全部样本计算梯度,更新稳定但计算成本高。
  • 优点
    • 梯度方向准确,收敛稳定(数学上保证凸函数的全局最优)。
    • 易于并行化(因梯度计算依赖全数据集)。
  • 缺点
    • 计算成本高(每次迭代需遍历全部数据)。
    • 内存占用大,无法处理超出内存的数据集。
    • 对非凸函数可能陷入局部最优。

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

在这里插入图片描述
公式:
θ j t + 1 = θ j t − η ⋅ ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) \theta_{j}^{t+1} = \theta_{j}^{t} - \eta \cdot \left( h_{\theta}(x^{(i)}) - y^{(i)} \right) x_{j}^{(i)} θjt+1=θjtη(hθ(x(i))y(i))xj(i)
说明:

  • i i i: 随机选取的单个样本索引( i ∼ Uniform ( 1 , m ) i \sim \text{Uniform}(1, m) iUniform(1,m))。
  • 特点:每次迭代仅用一个样本更新参数,计算快但噪声大。
  • 优点
    • 计算速度快,适合大规模或流式数据。
    • 随机性可能逃离局部最优(非凸优化中表现更好)。
  • 缺点
    • 梯度估计噪声大,收敛不稳定(需精细调节学习率)。
    • 难以并行化(因更新依赖单个样本)。

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

在这里插入图片描述
公式:
θ j t + 1 = θ j t − η ⋅ 1 b ∑ i = k k + b − 1 ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) \theta_{j}^{t+1} = \theta_{j}^{t} - \eta \cdot \frac{1}{b} \sum_{i=k}^{k+b-1} \left( h_{\theta}(x^{(i)}) - y^{(i)} \right) x_{j}^{(i)} θjt+1=θjtηb1i=kk+b1(hθ(x(i))y(i))xj(i)
说明:

  • b b b: 小批量大小(通常 b ∈ [ 32 , 256 ] b \in [32, 256] b[32,256])。
  • k k k: 当前批次的起始样本索引。
  • 特点:折中方案,平衡计算效率和稳定性。
  • 优点
    • 平衡BGD的稳定性和SGD的速度(主流深度学习选择)。
    • 可利用GPU并行计算小批量数据。
  • 缺点
    • 需手动调节批量大小(k)和学习率。
    • 仍存在一定噪声(但比SGD小)。

收敛路径:
BGD  → 平滑但慢  
SGD  → 快速但震荡  
MBGD → 折中方案

三种梯度下降的区别与对比

类型全量(批量)梯度下降 (BGD)随机梯度下降 (SGD)小批量梯度下降 (MBGD)
每次迭代的样本量全部样本(N)单个样本(1)小批量样本(k,通常32-256)
梯度计算方式真实梯度(全局平均)噪声梯度(单个样本的估计)近似梯度(局部平均)
参数更新频率每轮迭代1次更新每样本1次更新每k个样本1次更新
收敛性稳定,但可能陷入局部最优不稳定,震荡大平衡稳定性和随机性
计算效率慢(尤其大数据集)快(适合在线学习)适中(GPU并行优化友好)
内存需求高(需加载全部数据)
适用场景凸函数、小数据集非凸优化、大规模数据深度学习等大多数场景

在这里插入图片描述


如何选择?

  • 数据量小 → BGD(确保精度)。
  • 数据量大/在线学习 → SGD(牺牲稳定性换速度)。
  • 深度学习/默认推荐 → MBGD(批量大小常选32/64/128)。

梯度下降法的问题与挑战

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2337737.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python全功能PDF工具箱GUI:支持转换、加密、旋转、图片提取、日志记录等多功能操作

使用Python打造一款集成 PDF转换、编辑、加密、解密、图片提取、日志追踪 等多个功能于一体的桌面工具应用(Tkinter ttkbootstrap PyPDF2 等库)。 ✨项目背景与开发动机 在日常办公或学习中,我们经常会遇到各种关于PDF文件的操作需求&#…

计算机视觉---相机标定

相机标定在机器人系统中的作用 1.确定相机的内部参数 相机的内部参数包括焦距、主点坐标、像素尺寸等。这些参数决定了相机成像的几何关系。通过标定,可以精确获取这些参数,从而将图像中的像素坐标与实际的物理坐标建立联系。例如,已知相机…

【AI插件开发】Notepad++ AI插件开发实践:支持配置界面

一、引用 此前的系列文章已基本完成了Notepad的AI插件的功能开发,但是此前使用的配置为JSON配置文件,不支持界面配置。 本章在此基础上集成支持配置界面,这样不需要手工修改配置文件,直接在界面上操作,方便快捷。 注…

数据库原理及应用mysql版陈业斌实验四

🏝️专栏:Mysql_猫咪-9527的博客-CSDN博客 🌅主页:猫咪-9527-CSDN博客 “欲穷千里目,更上一层楼。会当凌绝顶,一览众山小。” 目录 实验四索引与视图 1.实验数据如下 student 表(学生表&…

华为OD机试真题——最长的顺子(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 A卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C、C语言、GO六种语言的最佳实现方式! 本文收录于专栏:《2025华为OD真题目录全流程解析/备考攻略/经验…

足球AI模型:一款用数据分析赛事的模型

2023 年欧冠决赛前,某体育数据平台的 AI 模型以 78% 的概率预测曼城夺冠 —— 最终瓜迪奥拉的球队首次捧起大耳朵杯。当足球遇上 AI,那些看似玄学的 "足球是圆的",正在被数据与算法拆解成可计算的概率命题。今天我们就来聊聊&#…

【ESP32|音频】一文读懂WAV音频文件格式【详解】

简介 最近在学习I2S音频相关内容,无可避免会涉及到关于音频格式的内容,所以刚开始接触的时候有点一头雾水,后面了解了下WAV相关内容,大致能够看懂wav音频格式是怎么样的了。本文主要为后面ESP32 I2S音频系列文章做铺垫&#xff0…

42.[前端开发-JavaScript高级]Day07-手写apply-call-bind-块级作用域

手写apply-call-bind <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevi…

Vscode 插件开发

文章目录 1、使用vscode官方插件生成框架&#xff0c;下载脚手架2、使用脚手架初始化项目&#xff0c;这里我选择的是js3、生成的文件结构如下&#xff0c;重要的就是以下两个文件4、代码5、打包使用6、发布官网地址7、publisher ID undefined provided in the extension manif…

RTT添加一个RTC时钟驱动,以DS1307为例

添加一个外部时钟芯片 这里多了一个选项 复制drv_rtc.c,重命名为drv_rtc_ds1307.c 添加到工程中 /*** @file drv_rtc_ds1307.c* @brief * @author jiache (wanghuan3037@fiberhome.com)* @version 1.0* @date 2025-01-08* * @copyright Copyright (c) 2025 58* */ #

常见的低代码策略整理

低代码策略通过简化开发流程、降低技术门槛、提升效率&#xff0c;帮助用户快速构建灵活可靠的应用。这些策略的核心优势体现在以下方面&#xff1a; 快速交付与降本增效 减少编码需求&#xff1a;通过可视化配置&#xff08;如变量替换、表达式函数&#xff09;替代传统编码…

从彩色打印单行标准九九表学习〖代码情书〗的书写范式(Python/DeepSeek)

写给python终端的情书&#xff0c;学习代码设计/书写秘笈。 笔记模板由python脚本于2025-04-17 12:49:08创建&#xff0c;本篇笔记适合有python编程基础的coder翻阅。 【学习的细节是欢悦的历程】 博客的核心价值&#xff1a;在于输出思考与经验&#xff0c;而不仅仅是知识的简…

QML与C++:基于ListView调用外部模型进行增删改查(附自定义组件)

目录 引言相关阅读项目结构文件组织 核心技术实现1. 数据模型设计联系人项目类 (datamodel.h)数据模型类 (datamodel.h)数据模型实现 (datamodel.cpp) 2. 主程序入口点 (main.cpp)3. 主界面设计 (Main.qml)4. 联系人对话框 (ContactDialog.qml)5. 自定义组件CustomTextField.qm…

postman莫名奇妙报错,可能是注释引起的。postman 过滤请求体中的注释。

postman莫名奇妙报错&#xff0c;可能是注释引起的。postman 过滤请求体中的注释。 1、问题描述2、问题分析3、解决方法 1、问题描述 postman http请求测试时&#xff0c;如果在请求体中添加了注释&#xff0c;那么这个注释会被带到服务端执行&#xff0c;导致服务端接口返回报…

扩增子分析|基于R语言microeco包进行微生物群落网络分析(network网络、Zi-Pi关键物种和subnet子网络图)

一、引言 microeco包是福建农林大学姚敏杰教授团队开发的扩增子测序集成分析。该包综合了扩增子测序下游分析的多种功能包括群落组成、多样性、网络分析、零模型等等。通过简单的几行代码可实现复杂的分析。因此&#xff0c;microeco包发表以来被学界广泛关注&#xff0c;截止2…

中间件--ClickHouse-4--向量化执行(什么是向量?为什么向量化执行的更快?)

1、向量&#xff08;Vector&#xff09;的概念 &#xff08;1&#xff09;、向量的定义 向量&#xff1a;在计算机科学中&#xff0c;向量是一组同类型数据的有序集合&#xff0c;例如一个包含多个数值的数组。在数据库中&#xff0c;向量通常指批量数据&#xff08;如一列数…

【SpringBoot+Vue自学笔记】001

跟着这位老师学习的&#xff1a;https://www.bilibili.com/video/BV1nV4y1s7ZN?vd_sourceaf46ae3e8740f44ad87ced5536fc1a45 前后端开发技术的全栈课程&#xff1a; Java EE企业级框架&#xff1a;SpringBootMyBatisPlus Web前端核心框架&#xff1a;VueElement UI 公共云…

第十节:性能优化-如何排查组件不必要的重复渲染?

工具&#xff1a;React DevTools Profiler 方法&#xff1a;memo、shouldComponentUpdate深度对比 React 组件性能优化&#xff1a;排查与解决重复渲染问题指南 一、定位性能问题&#xff1a;React DevTools 高级用法 使用 React Developer Tools Profiler 精准定位问题组件&…

MATLAB项目实战(一)

题目&#xff1a; 某公司有6个建筑工地要开工&#xff0c;每个工地的位置&#xff08;用平面坐标系a&#xff0c;b表示&#xff0c;距离单位&#xff1a;km&#xff09;及水泥日用量d(t)由下表给出&#xff0e;目前有两个临时料场位于A(5,1)&#xff0c;B(2,7)&#xff0c;日储…

spring boot 文件下载

1.添加文件下载工具依赖 Commons IO is a library of utilities to assist with developing IO functionality. <dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version> </depe…