梯度下降算法过程及为什么负梯度方向是下降最快方向(附代码)

article/2025/9/9 21:49:58

对于梯度下降算法我们熟知的一个例子就是下山问题,当我们位于山的某一点处,沿着当前位置寻找山坡最陡方向以一定步长进行移动,直到走到山脚。那么这个过程具体是怎么做到的?为什么说负梯度方向是下降最快方向呢?

首先我们设定一个初始值x_{k}【相当于我们在山上的一个初始位置】,优化的目标函数为f(x)【可以理解为将山体轮廓作为目标函数f(x)】,接下来我们可以在x_{k}处进行一阶泰勒展开【对函数局部的线性近似】:

f(x)=f(x_{k})+f'(x_{k})(x-x_{k})

我们期望的是在下一个位置x_{k+1}处有f(x_{k+1})<f(x_{k})【山体的下一个位置的值低于前面的值才说明我们正在下山,这个过程才是有效的】,我们令x=x_{k+1}则有:

f(x_{k+1})=f(x_{k})+f'(x_{k})(x_{k+1}-x_{k})

进一步得到:f(x_{k+1})-f(x_{k})=f'(x_{k})(x_{k+1}-x_{k})<0

为了保证f(x_{k+1})-f(x_{k})<0可以设x_{k+1}-x_{k}=-f'(x_{k}),又为了需要使x_{k+1}-x_{k}距离尽可能的小以减小误差,引入步长系数\gamma \epsilon (0,1),则有:

x_{k+1}-x_{k}=-\gamma f'(x_{k})

x_{k+1}=x_{k}-\gamma f'(x_{k})

这里只是举例的一元函数,如果是多元函数,上式为偏导数。根据上述过程不停的迭代寻找最优解。【上述公式也就是我们常看到的权重更新   w:w-\eta \triangledown J(w)

那么又为什么是负梯度方向才是下降的最快方向呢?

首先x_{k+1}-x_{k}也是一个向量,这个向量的大小(模值)也其实就是步长系数\gamma【注:步长是一个标量】,如果我们再引入一个单位向量\overrightarrow{e},那么向量x_{k+1}-x_{k}可表示为:

x_{k+1}-x_{k}=\gamma \overrightarrow{e}

那么泰勒展开则为:                     f(x_{k+1})=f(x_{k})+\gamma \overrightarrow{e}f'(x_{k})

我们又希望                                 f(x_{k+1})-f(x_{k})=\gamma \overrightarrow{e}f'(x_{k})<0

我们已知\gamma是一个为正值的标量,\overrightarrow{e}f'(x_{k})是矢量,两个向量相乘为\left | \overrightarrow{e} \right |\cdot \left | f'(x_{k}) \right |\cdot cos\alpha\alpha是两个向量之间的夹角。为了让相乘后的结果为“负最大值”那么向量之间的夹角应为180°,当夹角为0的时候有正的最大值(梯度方向上值增长最快的方向)。所以说当x_{k+1}-x_{k}和梯度方向相反(负梯度方向)的时候,能让值尽可能减小。

我们又已知\overrightarrow{e}是单位向量,模为1,则可以表示为:\overrightarrow{e}=-\frac{f'(x)}{\left | f'(x) \right |}。于是可得权重更新公式为:

x_{k+1}=x_{k}-\gamma\frac{f'(x)}{\left | f'(x) \right |}

又因为\left | f'(x) \right |是标量,所以和\gamma写在一起x_{k+1}=x_{k}-\eta f'(x),如果对于多元函数,则为:

x:x-\eta \triangledown f(x)

代码实现: 

# 假如目标函数为f(x) = 2(x - 5)² # 可以知道当函数值为0的时候,x=5
# 定义函数
def f(x):return 2 * (x - 5) ** 2# 函数求导
def df(x):return 4 * (x - 5)# 定义学习率(步长)
learning_rate = 0.1res_x = []  # 保存每次更新后x的值
res_y = []  # 保存每次更新x后y的值x0 = 1  # 初始位置
y = f(x0)  # 初始值
y_current = 0  # y当前值
# 循环20次
for epoch in range(20):x0 = x0 - learning_rate * df(x0)  # 权重更新  梯度下降tmp = f(x0)  # 将初始位置先放在一个临时变量中y_current = tmp  # 将临时变量中的值赋值为当前值res_x.append(x0)  # 记录x的变化res_y.append(y_current)  # 记录y的变化

打印一下x的输出结果:可以看出x的值越来越接近于5了

2.6
3.56
4.136
4.4816
4.68896
4.813376
4.8880256
4.93281536
4.959689216
4.9758135296
4.98548811776
4.991292870656
4.9947757223936
4.9968654334361595
4.998119260061696
4.998871556037018
4.999322933622211
4.999593760173327
4.999756256103996
4.999853753662398

print("{:.10f}".format(res_y[-1])) #无限接近0

输出为:0.0000000428

可视化:可以看到x的值越来越趋近于5,y的值越来越接近于0

代码参考:梯度下降算法(附代码实现) - 知乎


http://chatgpt.dhexx.cn/article/cpPb1Uso.shtml

相关文章

微积分:如何理解方向导数与梯度?

文章目录 前言方向导数梯度方向导数公式的证明 前言 前文介绍了多元函数微分的实质&#xff0c;接下来介绍多元函数中的方向导数与梯度&#xff0c;以二元函数为例 方向导数 方向导数的实质&#xff1a;自变量沿着xoy平面上的某个方向变化时&#xff0c;f的变化率&#xff0…

Opencv中计算梯度、梯度幅值以及梯度方向的相关函数

在进行图像处理中&#xff0c;经常会计算图像的梯度、梯度幅值以及梯度等&#xff0c;对于不太了解opencv的&#xff0c;可能会自己写计算梯度、梯度幅值和梯度方向的函数&#xff0c;其实这些工作OpenCV都已经为我们做了。下面来看看Opencv中的相关函数&#xff1a; 1&#xf…

梯度方向,梯度下降法,牛顿法

梯度、等高线切线、方向导数 一、直观理解梯度方向与等高线的切线方向垂直 二、方向导数梯度是函数上升的方向&#xff0c;且在该方向上的方向导数最大 三、从泰勒级数展开来看四、牛顿法五、梯度下降与牛顿法的区别 一、直观理解 梯度方向与等高线的切线方向垂直 假设一函数为…

函数的梯度方向和切线方向_导数、方向导数与梯度

导数,方向导数,切线、梯度是从高中就开始接触的概念,然而对这几个概念的认识不清,困惑了我很长时间,下面我将以图文并茂的形式,对这几个概念做详细的解释。 1, 导数 定义:设函数y=f(x)在点x0的某个邻域内有定义,当自变量x在x0处有增量Δx,(x0+Δx)也在该邻域内时,相…

梯度方向与等高线方向垂直的理解

项目github地址&#xff1a;bitcarmanlee easy-algorithm-interview-and-practice 欢迎大家star&#xff0c;留言&#xff0c;一起学习进步 1.前言 在讲解梯度下降算法时&#xff0c;经常可以看到下面这张图(图片来自Wiki百科): 这张图后面一般都会再接一句&#xff0c;梯度…

为什么梯度方向一定是函数增大的方向?

前言 今年是很幸运的一年&#xff0c;准备了大半年的研究生终于考上了&#xff01;但问题随着就来了&#xff0c;我选择的导师方向是深度学习有关的&#xff0c;我从前觉得这个东西十分的高大上&#xff0c;一直敬而远之&#xff0c;没想到今天自己也要参与进来成为它的从业者&…

为什么梯度是上升方向,梯度下降要取负?

讨论 这个问题是很容易忽略&#xff0c;也就一个负号的问题&#xff0c;大多是记下来&#xff0c;但是确实也一个搞不懂的问题。 方向导数 简单说明方向导数&#xff0c;毕竟梯度与方向导数是有关系的。   上图 l l l 对 x x x, y y y的偏导&#xff0c;分别在 x x x和 y y…

深入浅出理解HOG特征---梯度方向直方图

梯度方向直方图 原文路径&#xff1a;https://www.learnopencv.com/histogram-of-oriented-gradients/ 最近在搞车牌识别的时候&#xff0c;训练样本去识别车牌的时候用到HOG特征。国外一篇文章让我受益良多 什么是特征描述符&#xff1f; 特征描述符是指通过提取有用的信息并…

函数的梯度方向和切线方向_方向导数和梯度是什么?

原标题:方向导数和梯度是什么? 为什么梯度的方向是函数在该点的方向导数最大的方向,梯度的模是最大方向导数的值?大家在看复习全书时,有认真想过这个问题吗?小编在本文以二元函数为例详细讲解方向导数和梯度,并试图以尽可能通俗地语言回答上述问题。 1.梯度 首先看看二…

机器学习--什么是梯度?为什么梯度方向就是函数上升最快的方向?本文将给你解惑

本打算把梯度放在神经网络来讲&#xff0c;学习机器学习实战时发现用到梯度下降最优算法&#xff0c;所以就把这个知识点深入讲一下&#xff0c;等后面实战到神经网络时&#xff0c;直接复制这里的&#xff0c;这次讲解会深入讲解&#xff0c;简明易懂是目的&#xff0c;虽然网…

如何理解梯度方向是增长最快的方向

前言&#xff1a; 最近在看关于机器学习的书&#xff0c;里面提到了梯度下降算法&#xff0c;里面提到了梯度方向是增长最快的方向&#xff0c;虽然说很早之前就知道了这个概念&#xff0c;但是一直也没有仔细想过为什么&#xff0c;今天突然想弄懂这个问题&#xff0c;所以有…

什么是梯度?为什么梯度的方向总是指向函数值增大的方向?

闲谈 对于梯度这个概念&#xff0c;我是这样的&#xff0c; 学习时&#xff0c;正序&#xff1a;导数–>偏导数–>方向导数–>梯度&#xff0c;从导数开始一步一步学到梯度这个概念&#xff0c;脑子里想 着&#xff1a;“梯度这个玩意儿有什么用&#xff0c;得记下…

【梯度,方向导数,以及梯度方向为什么是函数增长最快的方向】

梯度&#xff0c;方向导数&#xff0c;以及梯度方向为什么是函数增长最快的方向 结论&#xff01;&#xff01;&#xff01;多元函数的偏导数梯度的直观展示梯度与方向导数参考链接 结论&#xff01;&#xff01;&#xff01; 对一元函数而言&#xff0c;梯度是标量&#xff0…

各种梯度下降法的简单理解

微分 如何看待微分的直观含义&#xff0c;有以下两种最普遍的理解&#xff1a; 1.函数图像中&#xff0c;某点的斜率 2.函数的变化率 单变量微分&#xff1a; 多变量微分&#xff08;分别对多个变量求偏导数&#xff09;&#xff1a; 梯度 梯度其实就是变量偏导数的一般化…

AcWing 16. 替换空格

文章目录 AcWing 16. 替换空格AC代码 AcWing 16. 替换空格 本题链接&#xff1a;AcWing 16. 替换空格 本博客给出本题截图&#xff1a; AC代码 代码&#xff1a; class Solution { public:string replaceSpaces(string &str) {string res;for (auto x : str)if (x …

c++替换空格

请实现—个函数&#xff0c;把字符串s中的每个空格替换成”%20""。 示例1: 输入:s "we are happy ."输出:""Me%20are%20happy ." #define _CRT_SECURE_NO_WARNINGS //vs2017下使用strcpy #include <iostream> #include <string…

替换空格符

任务描述 本关任务&#xff1a;替换文本流中的空格符。 相关知识 参照第一关&#xff0c;第三关相关知识。 编程要求 在右侧编辑器中的 Begin-End 之间补充代码 &#xff0c;读入一行文本&#xff0c;将输入复制到输出&#xff0c;要求将其中连续的多个空格用一个空格代替…

~替换空格~

问题描述&#xff1a;请实现一个函数&#xff0c;将一个字符串中的空格替换成“%20”。 例如&#xff0c;当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。 问题分析&#xff1a; 1.解决这道题应该关注的点&#xff1a; 1&#xff09;字符串的长度 2&…

替换空格

一、需求 请实现一个函数&#xff0c;把字符串 s 中的每个空格替换成"%20"。 二、遍历法 2,1 思路分析 新建字符串临时变量str和temp&#xff0c;str初始化为空串&#xff1b;截取给定字符串s的每单个字串&#xff0c;若字串为空格&#xff0c;temp赋值为"%…

[字符串]替换空格

一、题目描述 原文链接&#xff1a;Offer 05. 替换空格 具体描述&#xff1a; 请实现一个函数&#xff0c;把字符串 s 中的每个空格替换成"%20"。 示例 1&#xff1a; 输入&#xff1a;s “We are happy.” 输出&#xff1a;“We%20are%20happy.” 限制&#xff…