方向导数和梯度

方向导数和梯度

  • 1 导数的回忆
  • 2 偏导数及其向量形式
    • 偏导数的几何意义
    • 偏导数的向量形式
  • 3 方向导数
    • 向量形式
    • 几何意义
    • 方向导数和偏导的关系
  • 4 梯度
  • 5 梯度下降算法

1 导数的回忆

导数的几何意义如图所示:

导数图像
P 0 P_{0} P0点不断接近 P P P时,导数如下定义:
f ′ ( x 0 ) = lim ⁡ △ x → 0 △ y △ x = lim ⁡ △ x → 0 f ( x 0 + △ x ) − f ( x 0 ) △ x {f}'(x_{0})=\lim\limits_{△x→0}\frac{△y}{△x} =\lim\limits_{△x→0}\frac{f(x_{0}+△x)-f(x_{0})}{△x} f(x0)=x0limxy=x0limxf(x0+x)f(x0)

2 偏导数及其向量形式

偏导数的几何意义

x x x的偏导数定义如下:
∂ f ∂ x ( x 0 , y 0 ) = lim ⁡ △ x → 0 f ( x 0 + △ x , y 0 ) − f ( x 0 , y 0 ) △ x \frac{\partial f}{\partial x}(x_{0},y_{0})=\lim\limits_{△x→0} \frac{f(x_{0}+△x,y_{0})-f(x_{0},y_{0})}{△x} xf(x0,y0)=x0limxf(x0+x,y0)f(x0,y0)
如图所示, M 0 ( x 0 , y 0 , f ( x 0 , y 0 ) ) M_{0}(x_{0},y{0},f(x_{0},y_{0})) M0(x0,y0,f(x0,y0))是曲线 z = f ( x , y ) z=f(x,y) z=f(x,y)的一点,过 M 0 M_{0} M0作平面 y = y 0 y=y_{0} y=y0,截此曲面得一曲线,此曲线的方程为: z = f ( x , y 0 ) z=f(x,y_{0}) z=f(x,y0),则上述对 x x x的偏导数就是在点 M 0 M_{0} M0处的切线 M 0 T x M_{0}T_{x} M0Tx对x轴的斜率。对 y y y的偏导数的几何意义同理。
偏导数

偏导数的向量形式

为了等一下方便理解方向导数,将上述的偏导数表示成向量形式。
a ⃗ = [ x 0 y 0 ] \vec{a}=\begin{bmatrix}x_{0}\\ y_{0}\end{bmatrix} a =[x0y0],则对 x x x的偏导数为:
∂ f ∂ x ( a ⃗ ) = lim ⁡ h → 0 f ( a ⃗ + h i ^ ) − f ( a ⃗ ) h \frac{\partial f}{\partial x}(\vec{a})=\lim\limits_{h→0} \frac{f(\vec{a}+h\hat{i})-f(\vec{a})}{h} xf(a )=h0limhf(a +hi^)f(a )

  • 其中 i ^ = [ 1 0 ] \hat{i}=\begin{bmatrix}1\\ 0\end{bmatrix} i^=[10]

3 方向导数

向量形式

从偏导数的向量形式可知:当 i ^ \hat{i} i^方向改变时,就产生了方向导数。
方向导数的定义如下:
∇ v ⃗ f ( a ⃗ ) = ∂ f ∂ v ⃗ ( a ⃗ ) = lim ⁡ h → 0 f ( a ⃗ + h v ⃗ ) − f ( a ⃗ ) h \nabla_{\vec{v}}f(\vec{a})=\frac{\partial f}{\partial \vec{v}}(\vec{a})=\lim\limits_{h→0} \frac{f(\vec{a}+h\vec{v})-f(\vec{a})}{h} v f(a )=v f(a )=h0limhf(a +hv )f(a )

  • 这种定义有一种问题,假设 v ⃗ \vec{v} v 变为原来的两倍,但分母不变,则实际上方向导数也会变成2倍。

如果要把方向导数表示成该方向的斜率,则应该用如下定义:
∇ v ⃗ f ( a ⃗ ) = ∂ f ∂ v ⃗ ( a ⃗ ) = lim ⁡ h → 0 f ( a ⃗ + h v ⃗ ) − f ( a ⃗ ) h ∣ v ⃗ ∣ \nabla_{\vec{v}}f(\vec{a})=\frac{\partial f}{\partial \vec{v}}(\vec{a})=\lim\limits_{h→0} \frac{f(\vec{a}+h\vec{v})-f(\vec{a})}{h|\vec{v}|} v f(a )=v f(a )=h0limhv f(a +hv )f(a )

  • 在该定义下,表示的是函数在某点沿着 a ⃗ \vec{a} a 方向上的导数,即斜率

几何意义

方向导数的非向量形式如下:
e l = ( c o s α , c o s β ) e_{l}=(cos\alpha,cosβ) el=(cosα,cosβ)是与 l l l同方向的单位向量,设射线 l l l P P P的坐标为 P = ( x 0 + t c o s α , y 0 + t c o s β ) P=(x_{0}+tcos\alpha,y_{0}+tcosβ) P=(x0+tcosα,y0+tcosβ),此时如下图所示:
图
此时函数增量与距离 ∣ P P 0 ∣ = t |PP_{0}|=t PP0=t的比值为:
f ( x 0 + t c o s α , y 0 + t c o s β ) − f ( x 0 , y 0 ) t \frac{f(x_{0}+tcos\alpha,y_{0}+tcosβ)-f(x_{0},y_{0})}{t} tf(x0+tcosα,y0+tcosβ)f(x0,y0)
P P P沿着 l l l趋于 P 0 P_{0} P0时,若极限存在,则称为函数 f ( x , y ) f(x,y) f(x,y)在点 P 0 P_{0} P0沿方向 l l l的的方向导数,即上面向量形式的第二种定义(只不过这里用了非向量形式),如下:
∂ f ∂ l ∣ ( x 0 , y 0 ) = lim ⁡ t → 0 + f ( x 0 + t c o s α , y 0 + t c o s β ) − f ( x 0 , y 0 ) t \frac{\partial f}{\partial l}\vert_{(x_{0},y_{0})}=\lim\limits_{t→0^{+}}\frac{f(x_{0}+tcos\alpha,y_{0}+tcosβ)-f(x_{0},y_{0})}{t} lf(x0,y0)=t0limtf(x0+tcosα,y0+tcosβ)f(x0,y0)
其几何意义如下图所示:如果要求A点在紫色向量方向上的斜率(红色线圈出来的),则可用方向导数
方向导数

方向导数和偏导的关系

定理: 如果函数 f ( x , y ) f(x,y) f(x,y)在点 P 0 ( x 0 , y 0 ) P_{0}(x_{0},y_{0}) P0(x0,y0)可微分,那么函数在该点沿任一方向 l l l的方向导数存在,且有
∂ f ∂ l ∣ ( x 0 , y 0 ) = f x ( x 0 , y 0 ) c o s α + f y c o s β \frac{\partial f}{\partial l}\vert_{(x_{0},y_{0})}=f_{x}(x_{0},y_{0})cos\alpha+f_{y}cosβ lf(x0,y0)=fx(x0,y0)cosα+fycosβ
其中 c o s α cos\alpha cosα c o s β cosβ cosβ是方向 l l l的方向余弦

证明:由函数 f ( x , y ) f(x,y) f(x,y)在点 P 0 ( x 0 , y 0 ) P_{0}(x_{0},y_{0}) P0(x0,y0)可微分可得:
f ( x 0 + △ x , y 0 + △ y ) − f ( x 0 , y 0 ) = f x ( x 0 , y 0 ) △ x + f y △ y + o ( △ x 2 + △ y 2 ) f(x_{0}+△x,y_{0}+△y)-f(x_{0},y_{0})=f_{x}(x_{0},y_{0})△x+f_{y}△y+o(\sqrt{△x^{2}+△y^{2} }) f(x0+x,y0+y)f(x0,y0)=fx(x0,y0)x+fyy+o(x2+y2 )
由上述可知: △ x = t c o s α , △ y = t c o s β △x=tcos\alpha,△y=tcosβ x=tcosα,y=tcosβ,则有: △ x 2 + △ y 2 = t \sqrt{△x^{2}+△y^{2} }=t x2+y2 =t
从而有:
lim ⁡ t → 0 + f ( x 0 + t c o s α , y 0 + t c o s β ) − f ( x 0 , y 0 ) t = lim ⁡ t → 0 + f x ( x 0 , y 0 ) t c o s α + f y t c o s β + o ( t ) t = f x ( x 0 , y 0 ) c o s α + f y c o s β \begin {aligned} {} \lim\limits_{t→0^{+}}\frac{f(x_{0}+tcos\alpha,y_{0}+tcosβ)-f(x_{0},y_{0})}{t}& =\lim\limits_{t→0^{+}}\frac{f_{x}(x_{0},y_{0})tcos\alpha+f_{y}tcosβ+o(t)}{t} \\&=f_{x}(x_{0},y_{0})cos\alpha+f_{y}cosβ \end {aligned} t0limtf(x0+tcosα,y0+tcosβ)f(x0,y0)=t0limtfx(x0,y0)tcosα+fytcosβ+o(t)=fx(x0,y0)cosα+fycosβ
相当于方向导数是偏导数的线性组合

4 梯度

在二元函数情况下,设函数 f ( x , y ) f(x,y) f(x,y)在平面区域 D D D内具有一阶连续偏导数,则对于每一点 P 0 ( x 0 , y 0 ) ∈ D P_{0}(x_{0},y_{0})∈D P0(x0,y0)D,都存在一个梯度,记作 grad f ( x 0 , y 0 ) \textbf{grad}f(x_{0},y_{0}) gradf(x0,y0) ▽ f ( x 0 , y 0 ) ▽f(x_{0},y_{0}) f(x0,y0)
grad f ( x 0 , y 0 ) = ▽ f ( x 0 , y 0 ) = [ ∂ f ∂ x ∂ f ∂ y ] \textbf{grad}f(x_{0},y_{0})=▽f(x_{0},y_{0})= \begin{bmatrix}\frac{\partial f}{\partial x} \\ \\ \frac{\partial f}{\partial y}\end{bmatrix} gradf(x0,y0)=f(x0,y0)= xfyf
因此,假设函数 f ( x , y ) f(x,y) f(x,y)在点 P 0 ( x 0 , y 0 ) P_{0}(x_{0},y_{0}) P0(x0,y0)可微分, e l = ( c o s α , c o s β ) e_{l}=(cos\alpha,cosβ) el=(cosα,cosβ)是与方向 l l l同向的方向向量,则方向导数和梯度的关系是:
∂ f ∂ l ∣ ( x 0 , y 0 ) = f x ( x 0 , y 0 ) c o s α + f y c o s β = ▽ f ( x 0 , y 0 ) ⋅ e l = ∣ ▽ f ( x 0 , y 0 ) ∣ ∣ e l ∣ c o s θ = ∣ ▽ f ( x 0 , y 0 ) ∣ c o s θ \begin {aligned} {} \frac{\partial f}{\partial l}\vert_{(x_{0},y_{0})}& = f_{x}(x_{0},y_{0})cos\alpha+f_{y}cosβ \\&=▽f(x_{0},y_{0}) \ \bm{\cdot} \ e_{l} \\&=|▽f(x_{0},y_{0})| \ |e_{l}| \ cos\theta \\&=|▽f(x_{0},y_{0})|\ cos\theta \end {aligned} lf(x0,y0)=fx(x0,y0)cosα+fycosβ=f(x0,y0)  el=∣▽f(x0,y0) el cosθ=∣▽f(x0,y0) cosθ
其中, θ \theta θ是向量 ▽ f ( x 0 , y 0 ) ▽f(x_{0},y_{0}) f(x0,y0)与向量 e l e_{l} el所成夹角,因此可以得出下述结论:

  • θ = 0 \theta=0 θ=0,向量 ▽ f ( x 0 , y 0 ) ▽f(x_{0},y_{0}) f(x0,y0)与向量 e l e_{l} el方向相同,此时方向导数最大,函数 f ( x , y ) f(x,y) f(x,y)增长最快
  • θ = π \theta=π θ=π,向量 ▽ f ( x 0 , y 0 ) ▽f(x_{0},y_{0}) f(x0,y0)与向量 e l e_{l} el方向相反,此时方向导数最小,函数 f ( x , y ) f(x,y) f(x,y)减少最快
  • θ = π 2 \theta=\frac{π}{2} θ=2π,向量 ▽ f ( x 0 , y 0 ) ▽f(x_{0},y_{0}) f(x0,y0)与向量 e l e_{l} el方向正交,函数 f ( x , y ) f(x,y) f(x,y)变化率为0
  • 综上,沿着梯度方向函数增长最快

5 梯度下降算法

梯度下降法(Gradient Descent)是一种用于寻找函数极小值的一阶迭代优化算法,又称为最速下降(Steepest Descent)。以下是梯度下降的基本公式:
θ ← θ − η ∂ L ( θ ) ∂ θ \theta \leftarrow \theta -η\frac{\partial L(\theta)}{\partial \theta } θθηθL(θ)
可以看出:

  • L ( θ ) L(\theta) L(θ)是关于 θ \theta θ的损失函数
  • η η η是学习率,称为梯度下降的步长,
  • 梯度下降法是让方向导数最小时做迭代

举一个例子:设 L ( θ ) = θ 2 L(\theta)=\theta^{2} L(θ)=θ2,则梯度 ▽ L ( θ ) = ∂ L ( θ ) ∂ θ = 2 θ ▽L(\theta)=\frac{\partial L(\theta)}{\partial \theta }=2\theta L(θ)=θL(θ)=2θ;设学习率为 η = 0.2 η=0.2 η=0.2;设初始值为 ( θ 0 , L ( θ 0 ) ) = ( 10 , 100 ) (\theta_{0},L(\theta_{0}))=(10,100) (θ0,L(θ0))=(10,100),此时梯度为: ▽ L ( θ 0 ) = 2 θ 0 = 20 ▽L(\theta_{0})=2\theta_{0}=20 L(θ0)=2θ0=20

  • 更新 θ \theta θ θ 1 ← θ 0 − η ∂ L ( θ 0 ) ∂ θ 0 = 10 − 0.2 × 20 = 6 \theta_{1} \leftarrow \theta_{0} -η\frac{\partial L(\theta_{0})}{\partial \theta_{0} } = 10-0.2×20=6 θ1θ0ηθ0L(θ0)=100.2×20=6
  • 重复上述步骤,直至 θ \theta θ收敛

代码如下:

import numpy as np
import matplotlib.pyplot as plt# 定义损失函数 y = x^2
def f(x):return x**2# 梯度下降函数
def gradient_descent(x, eta):# 计算斜率slope = 2 * x# 更新 x 的值x_out = x - eta * slopereturn x_out, slope# 主程序
def main():# 初始化参数x_data = np.linspace(-10, 10, 1000)  # x 范围LRate = 0.2  # 学习率slope_thresh = 0.0001  # 斜率阈值# 绘制损失函数图像plt.plot(x_data, f(x_data), 'c', linewidth=2)plt.title('y = x^2 (learning rate = 0.2)')plt.xlabel('x')plt.ylabel('y = x^2')plt.grid(True)# 初始点设置为 (10, f(10))x = 10y = f(10)plt.plot(x, y, 'r*')# 开始梯度下降迭代slope = float('inf')  # 初始斜率设置为无穷大while abs(slope) > slope_thresh:x_new, slope = gradient_descent(x, LRate)y_new = f(x_new)# 绘制当前点到更新后点的连线plt.plot([x, x_new], [y, y_new], 'k--', linewidth=1)# 绘制点plt.plot(x_new, y_new, 'r*')plt.legend(['y = x^2', 'Gradient descent path'])plt.draw()plt.pause(0.2)  # 暂停一小段时间,使得动态图像可见x = x_newy = y_newplt.show()# 当这个 .py 文件被直接运行时(作为主程序),执行 main() 函数;
# 当这个 .py 文件被导入到其他模块中时,不执行 main() 函数,因为 __name__ 的值不是 '__main__'。
if __name__ == '__main__':main()

应尽可能选择适中的学习率,过大会震荡,过小迭代次数会过多,如下所示,学习率为0.2更好。
当学习率 η = 0.2 η=0.2 η=0.2时,图像如下:学习率0.2
当学习率 η = 0.9 η=0.9 η=0.9时,图像如下:
学习率0.9
当学习率 η = 0.01 η=0.01 η=0.01时,图像如下:
学习率0.01

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

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

相关文章

springboot私人诊所管理系统-计算机毕业设计源码93887

摘要 随着科技的不断发展和医疗服务的日益普及,私人诊所管理系统成为现代医疗管理的重要组成部分。该系统通过引入计算机技术和互联网平台,为患者提供方便快捷的就诊方式,同时也为诊所、医院提供高效的资源管理和服务优化的途径。本文将介绍私…

RocketMQ 顺序消息

顺序消息 顺序消息为云消息队列 RocketMQ 版中的高级特性消息,本文为您介绍顺序消息的应用场景、功能原理、使用限制、使用方法和使用建议。 应用场景 在有序事件处理、撮合交易、数据实时增量同步等场景下,异构系统间需要维持强一致的状态同步&#…

万字详解AI开发中的数据预处理(清洗)

数据清洗(Data Cleaning)是通过修改、添加或删除数据的方式为数据分析做准备的过程,这个过程通常也被称为数据预处理(Data Preprocessing)。对于数据科学家和机器学习工程师来说,熟练掌握数据清洗全流程至关…

21_硬件电路基础

目录 组合逻辑电路 组合逻辑电路原理 真值表 布尔代数 门电路 译码器 发光二极管LED 液晶字符显示器LCD 数据选择器 数据分配器 多路开关 时序逻辑电路 时序逻辑电路原理 时钟信号 触发器 电位触发方式触发器 边沿触发方式触发器 寄存器 移位器 计数器 总线…

经营人心:Mrs. B的百年传奇

这个故事的主角是Rose Blumkin,也被称为Mrs. B,她是Nebraska Furniture Mart的创始人。 她的故事确实是一个关于用户思维、客户关系和创业精神的经典案例。 Rose Blumkin于1893年出生在俄罗斯的一个小村庄,她在1921年移民到美国。 1937年&…

ImportError cannot import name ‘uic‘ from ‘PyQt5‘

ImportError cannot import name ‘uic’ from ‘PyQt5’ 1、描述 使用nuitka把PyQt5打包exe文件时报错: ImportError cannot import name ‘uic’ from ‘PyQt5’ 2、原因 这个是由于无法找到uic的目录导致的,在PyQt5的目录下是有uic文件的。 3、解决方案 找到导入uic…

SQL Server 2022的组成

《SQL Server 2022从入门到精通(视频教学超值版)》图书介绍-CSDN博客 SQL Server 2022主要由4部分组成,分别是数据库引擎、分析服务、集成服务和报表服务。本节将详细介绍这些内容。 1.2.1 SQL Server 2022的数据库引擎 SQL Server 2022的…

NGINX+KEEPALIVED | 一文搞懂NG+KL负载均衡高可用架构的实操教程(详细)

文章目录 NGINXKEEPALIVED负载均衡高可用架构为什么需要多节点应用为什么需要Nginx服务为什么需要Keepalived服务NGKL简述前期准备Linux服务器公共环境配置Server1 NGKL服务器配置Server2 NGKL服务器配置Server3 HTTP服务器配置Server4 HTTP服务器配置运行测试用例 NGINXKEEPAL…

使用Keil将STM32部分程序放在RAM中运行

手动分配RAM区域,新建.sct文件,定义RAM_CODE区域,并指定其正确的起始地址和大小。 ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; ************************************************…

C语言 -- 函数

C语言 -- 函数 1. 函数的概念2. 库函数2.1 标准库和头文件2.2 库函数的使用方法2.2.1 功能2.2.2 头文件包含2.2.3 实践2.2.4 库函数文档的一般格式 3. 自定义函数3.1 函数的语法形式3.2 函数的举例 4. 形参和实参4.1 实参4.2 形参4.3 实参和形参的关系 5. return 语句6. 数组做…

Element中的消息提示组件Message和弹框组件MessageBox

简述:在 Element UI 中,Message和MessageBox都是比较常用的组件,Message用来提示消息,而MessageBox是一个用于创建模态对话框的组件。它可以用于在页面上快速展示信息、警告或错误提示,而不会阻止用户的其他操作。简单…

116-基于5VLX110T FPGA FMC接口功能验证6U CPCI平台

一、板卡概述 本板卡是Xilinx公司芯片V5系列芯片设计信号处理板卡。由一片Xilinx公司的XC5VLX110T-1FF1136 / XC5VSX95T-1FF1136 / XC5VFX70T-1FF1136芯片组成。FPGA接1片DDR2内存条 2GB,32MB Nor flash存储器,用于存储程序。外扩 SATA、PCI、PCI expres…

【期末复习】数据库系统概论(附带考点汇总)

第1章.绪论 目录 第1章.绪论1.1. 数据库系统概述1.1.1.基本概念1.1.2.产生和发展 1.2.概念模型1.2.1.三种模型1.2.2.概念模型1.2.3.关系模型 1.3.数据库系统结构1.3.1三级模式结构1.3.2.两级映像与数据独立性 第2章.关系型数据库2.1.关系2.2.关系操作2.2.1.基本关系操作2.2.2.关…

SALOME源码分析:View Model

作为一款开源的CAx(CAD/CAE/CAM)软件集成平台,为了实现各个Module支持不同的数据显示与交互方案,出于扩展性的考虑,SALOME引入了View Model,用以支持OpenGL、OCC、VTK、ParaView、Qwt等数据显示与交互实现。 本文将以OCCViewer、…

昇思25天学习打卡营第16天|Diffusion扩散模型

导入必要的库函数 import math from functools import partial %matplotlib inline import matplotlib.pyplot as plt from tqdm.auto import tqdm import numpy as np from multiprocessing import cpu_count from download import downloadimport mindspore as ms import mi…

Python基于卷积神经网络分类模型(CNN分类算法)实现时装类别识别项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 在深度学习领域,卷积神经网络(Convolutional Neural Networks, CNNs&#xff0…

【架构-20】死锁

什么是死锁? 死锁(Deadlock)是指两个或多个线程/进程在执行过程中,由于资源的互相占用和等待,而陷入一种互相等待的僵局,无法继续往下执行的情况。 产生死锁的四个必要条件: (1)互斥条件(Mutual Exclusion):至少有一个资源是非共享…

Elasticsearch:结合稀疏、密集和地理字段

作者:来自 Elastic Madhusudhan Konda 如何以自定义方式组合多个稀疏、密集和地理字段 Elasticsearch 是一款强大的工具,可用于近乎实时地搜索和分析数据。作为开发人员,我们经常会遇到包含各种不同字段的数据集。有些字段是必填字段&#x…

relation-graph——数据组装+鼠标移入后的详情(自定义插槽的用法)——js技能提升

最近在写后台管理系统的时候,遇到一个需求,就是给我一些节点,让我渲染到页面上,效果图如下: 之前写过一篇文章关于relation-graph关系图组件http://t.csdnimg.cn/7BGYm的用法 还有一篇关于relation-graph——实现右击…

回溯算法-以单位人事管理系统为例

1.回溯算法介绍 1.来源 回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。 用回溯算法解决问题的一般步骤: 1、 针对所给问题,定义问题的解空间,它至少包含问题的一个(最优)解。 2 、确定易于搜…