当前位置: 首页 > article >正文

梯度计算(MATLAB和pytorch实例)

  • 梯度计算概述
  • 梯度计算的原理
  • 对于离散数据而言
    • 一维离散数据的梯度近似
      • 前向差分(Forward Difference)
      • 后向差分(Backward Difference)
      • 中心差分(Central Difference)
    • 二维离散数据的梯度近似
    • 多维扩展(以三维为例)
    • 误差分析与步长选择

梯度计算概述

梯度计算是数学和工程中的基础工具,梯度计算通常用于图像处理、数值分析和优化等领域。梯度可以帮助我们了解函数值的变化率。

梯度在科学与工程中广泛应用,例如:

  • 优化算法:梯度下降法(Gradient Descent)利用负梯度方向寻找函数最小值。
  • 物理场分析:电场、重力场的梯度表示场强的变化方向。
  • 图像处理:边缘检测通过梯度识别像素值的突变方向。

下面是个二维函数:

f ( x , y ) = x 2 + y 2 f(x,y)={{x}^{2}}+{{y}^{2}} f(x,y)=x2+y2

使用MATLAB输出结果矩阵和三维图形:

z_func_mesh

为了计算二维函数 f ( x , y ) = x 2 + y 2 f(x,y)={{x}^{2}}+{{y}^{2}} f(x,y)=x2+y2 在某一点的梯度,我们需要求出该函数在 x 和 y 方向上的偏导数,并将它们组合成一个向量。

将 y 视为常数,对 x 求导:

∂ f ∂ x = ∂ ∂ x ( x 2 + y 2 ) = 2 x \frac{\partial f}{\partial x}=\frac{\partial }{\partial x}({{x}^{2}}+{{y}^{2}})=2x xf=x(x2+y2)=2x

将 x 视为常数,对 y 求导:

∂ f ∂ y = ∂ ∂ y ( x 2 + y 2 ) = 2 y \frac{\partial f}{\partial y}=\frac{\partial }{\partial y}({{x}^{2}}+{{y}^{2}})=2y yf=y(x2+y2)=2y

组合偏导数形成梯度向量

梯度向量由上述两个偏导数组成

▽ f = ( ∂ f ∂ x , ∂ f ∂ x ) = ( 2 x , 2 y ) ▽f=(\frac{\partial f}{\partial x},\frac{\partial f}{\partial x})=(2x,2y) f=(xf,xf)=(2x,2y)

由此可得,二维函数 f ( x , y ) = x 2 + y 2 f(x,y)={{x}^{2}}+{{y}^{2}} f(x,y)=x2+y2 在任意一点 ( x , y ) (x,y) (x,y) d 梯度 ▽ f = ( 2 x , 2 y ) ▽f=(2x,2y) f=(2x,2y)

**总结:**对于函数 f ( x , y ) = x 2 + y 2 f(x,y)={{x}^{2}}+{{y}^{2}} f(x,y)=x2+y2 来说,它的梯度标量上的含义即是各自在x轴和y轴方向上的偏导数;两者组合成一个在二维平面上的向量;从而在三维空间上表示此函数所描绘的曲平面的斜率和斜率的方向。

梯度计算的原理

数学定义

梯度是多元函数的导数推广,表示函数在某一点处所有方向上的最大变化率。对于函数 f ( x 1 , x 1 , . . . , x 1 ) f({x}_{1},{x}_{1},...,{x}_{1}) f(x1,x1,...,x1) ,其梯度是一个向量:

∇ f = ( ∂ f ∂ x 1 , ∂ f ∂ x 2 , . . . ∂ f ∂ x n , ) ∇f=\left ({\frac{\partial f}{\partial {{x}_{1}}},\frac{\partial f}{\partial {{x}_{2}}},...\frac{\partial f}{\partial {{x}_{n}}},}\right ) f=(x1f,x2f,...xnf,)

方向指向函数值增长最快的方向,模长为该方向的变化率。

对于离散数据而言

一维离散数据的梯度近似

假设有一维离散数据点 f ( x i ) f({x}_{i}) f(xi),步长为 h = x i + 1 − x i h={x}_{i+1}-{x}_{i} h=xi+1xi ,梯度(导数)的近似方法有三种:

前向差分(Forward Difference)

f ′ ( x i ) ≈ f ( x i + 1 ) − f ( x i ) h {{f}^{'}}({{x}_{i}})≈\frac{f({{x}_{i+1}})-f({{x}_{i}})}{h} f(xi)hf(xi+1)f(xi)

特点:仅用右侧相邻点,计算简单,但精度较低(一阶误差 O ( h ) O(h) O(h))。

后向差分(Backward Difference)

f ′ ( x i ) ≈ f ( x i ) − f ( x i − 1 ) h {{f}^{'}}({{x}_{i}})≈\frac{f({{x}_{i}})-f({{x}_{i-1}})}{h} f(xi)hf(xi)f(xi1)

特点:仅用左侧相邻点,计算简单,但精度较低(一阶误差 O ( h ) O(h) O(h))。

中心差分(Central Difference)

f ′ ( x i ) ≈ f ( x i + 1 ) − f ( x i − 1 ) 2 h {{f}^{'}}({{x}_{i}})≈\frac{f({{x}_{i+1}})-f({{x}_{i-1}})}{2h} f(xi)2hf(xi+1)f(xi1)

特点:利用左右两侧点,精度更高(二阶误差 O ( h 2 ) O({h}^{2}) O(h2)),但需要更多数据。

二维离散数据的梯度近似

对二维网格数据 f ( x i ) f({x}_{i}) f(xi),需分别计算 x 和 y 方向的偏导数,再组合成梯度向量

∇ f = ( ∂ f ∂ x , ∂ f ∂ y ) ∇f=\left ({\frac{\partial f}{\partial {{x}}},\frac{\partial f}{\partial {{y}}}}\right ) f=(xf,yf)

计算 x 方向的偏导数

中心差分公式(假设网格均匀,步长 h x {h}_{x} hx

∂ f ∂ x ( x i , y i ) ≈ f ( x i + 1 , y i ) − f ( x i − 1 , y i ) 2 h x \frac{\partial f}{\partial x}({{x}_{i}},{{y}_{i}})≈\frac{f({{x}_{i+1}},{{y}_{i}})-f({{x}_{i-1}},{{y}_{i}})}{2{{h}_{x}}} xf(xi,yi)2hxf(xi+1,yi)f(xi1,yi)

计算 y 方向的偏导数

中心差分公式(假设网格均匀,步长 h y {h}_{y} hy

∂ f ∂ y ( x i , y i ) ≈ f ( x i , y i + 1 ) − f ( x i , y i − 1 ) 2 h x \frac{\partial f}{\partial y}({{x}_{i}},{{y}_{i}})≈\frac{f({{x}_{i}},{{y}_{i+1}})-f({{{x}_{i}},{y}_{i-1}})}{2{{h}_{x}}} yf(xi,yi)2hxf(xi,yi+1)f(xi,yi1)

边界点的处理

边缘点(如 x 0 {x}_{0} x0 y 0 {y}_{0} y0 )无法使用中心差分,需改用前向或后向差分:

∂ f ∂ y ( x 0 , y i ) ≈ f ( x 1 , y i ) − f ( x 0 , y i ) h x \frac{\partial f}{\partial y}({{x}_{0}},{{y}_{i}})≈\frac{f({{x}_{1}},{{y}_{i}})-f({{{x}_{0}},{y}_{i}})}{{{h}_{x}}} yf(x0,yi)hxf(x1,yi)f(x0,yi)

假设均匀网格数据 f ( x , y ) = x 2 + y 2 f(x,y)={{x}^{2}}+{{y}^{2}} f(x,y)=x2+y2 网格步长 h x = h y = 1 {h}_{x}={h}_{y}=1 hx=hy=1 ,计算点(2,3)的梯度:

计算
∂ f ∂ x \frac{\partial f}{\partial x} xf

f ( 1 , 3 ) = 10 f(1,3)=10 f(1,3)=10 f ( 3 , 3 ) = 18 f(3,3)=18 f(3,3)=18 ( 18 − 10 ) / 2 = 4 (18-10)/2=4 (1810)/2=4;

计算
∂ f ∂ y \frac{\partial f}{\partial y} yf

f ( 2 , 2 ) = 8 f(2,2)=8 f(2,2)=8 f ( 2 , 4 ) = 20 f(2,4)=20 f(2,4)=20 ( 20 − 8 ) / 2 = 6 (20-8)/2=6 (208)/2=6;

所以点(2,3)的梯度: ▽ f = ( 4 , 6 ) ▽f=(4,6) f=(4,6) ,与理论值一致。

使用pytorch进行验证

import torch

# 定义变量并启用梯度跟踪
x = torch.tensor(2.0, requires_grad=True)
y = torch.tensor(3.0, requires_grad=True)

# 计算函数值
f = x**2 + y**2

# 反向传播,计算梯度
f.backward()

# 输出梯度
print("▽f=(", x.grad.item(), y.grad.item(),")")

多维扩展(以三维为例)

对三维数据 f ( x i , y i , z k ) f({x}_{i},{y}_{i},{z}_{k}) f(xi,yi,zk) ,梯度为:

∇ f = ( ∂ f ∂ x , ∂ f ∂ y , ∂ f ∂ z , ) ∇f=\left ({\frac{\partial f}{\partial {{x}}},\frac{\partial f}{\partial {{y}}},\frac{\partial f}{\partial {{z}}},}\right ) f=(xf,yf,zf,)

每个方向的偏导数均用中心差分近似,例如:

∂ f ∂ z ( x i , y i , z k ) ≈ f ( x i , y i , z k + 1 ) − f ( x i , y i , z k − 1 ) 2 h x \frac{\partial f}{\partial z}({{x}_{i}},{y}_{i},{{z}_{k}})≈\frac{f({{x}_{i}},{y}_{i},{{z}_{k+1}})-f({{{x}_{i}},{y}_{i},{z}_{k-1}})}{2{{h}_{x}}} zf(xi,yi,zk)2hxf(xi,yi,zk+1)f(xi,yi,zk1)

误差分析与步长选择

  • 截断误差:由泰勒展开的高阶项忽略导致,中心差分误差更小。
  • 舍入误差:步长 h 过小时,计算机浮点运算可能放大噪声。
  • 平衡策略:选择适中的 h,通常取数据采样间隔或通过试验确定。

数值差分法通过局部线性近似将连续的导数转化为离散差值运算,是处理实验数据、图像或仿真结果的实用工具。其核心在于:

  1. 选择差分公式(前向、后向、中心)平衡精度与数据可用性。
  2. 合理处理边界条件。
  3. 优化步长以平衡截断误差与舍入误差。

这一方法在工程、物理、计算机视觉和机器学习中广泛应用,例如图像边缘检测、流体动力学模拟和优化算法中的梯度估计。


http://www.kler.cn/a/558958.html

相关文章:

  • Github 2025-02-21 Java开源项目日报Top7
  • Unity制作游戏——前期准备:Unity2023和VS2022下载和安装配置——附安装包
  • netty十八罗汉之——挖耳罗汉(Decoder)
  • 一文弄懂RSA算法中的TLS握手流程
  • 大白话“讲”哈希表
  • 数据结构与算法-搜索-双向搜索 和 A*算法(字串变换,八数码,第k短路)
  • 【Vue3+Tres 三维开发】03 - 基本操作
  • 习题解答 | 一维差分与等差数列差分
  • 如何通过 Docker 在没有域名的情况下快速上线客服系统
  • Unity for Python —— 强大的 Python 脚本支持提升 Unity 编辑器效率
  • C语言递归——青蛙跳台阶问题和汉诺塔问题
  • 辗转相除法(欧几里得算法)
  • transformer架构嵌入层位置编码之RoPE旋转位置编码及简单实现示例
  • go-zero学习笔记(五)
  • Windows系统第一次运行C语言程序,环境配置,软件安装等遇到的坑及解决方法
  • 嵌入式之内存管理
  • 【2025.2最新版】从零开始的HTML网页开发学习笔记(包含网页基础概念 HTML语法 前端工具VsCode介绍)
  • mysql之B+ 树索引 (InnoDB 存储引擎)机制
  • 反射和注解
  • 自制操作系统前置知识汇编学习