您现在的位置是:首页 > 正文

【转载】梯度下降算法的参数更新公式 热门推荐

2024-04-01 03:35:52阅读 1

NN这块的公式,前馈网络是矩阵乘法。损失函数的定义也是一定的。

但是如何更新参数看了不少描述,下面的叙述比较易懂的:

 

1、在吴恩达的CS229的讲义的第四页直接给出参数迭代公式

 

在UFLDL中反向传导算法一节也是直接给出的公式

 

2、例子:

第一步:随机对比重(a,b)赋值并计算误差平方和(SSE)

第二步:通过对误差比重(a,b)求导计算出误差梯度(注:YP即Ypred)

∂SSE/∂a = – (Y-YP)

∂SSE/∂b = – (Y-YP)X

误差公式:SSE=½ (Y-YP)^2 = ½(Y-(a+bX))^2

这里涉及到一些微积分,不过仅此而已。∂SSE/∂a 和 ∂SSE/∂b 就被称之为梯度,他们代表a,b相对SSE移动的方向。

第三步:通过梯度调整a,b,使得a,b最佳即所得SSE最小

(右上角是我们随机的a,b所取得的SSE值,我们需要找到图中黑虚线所指的SSE最小值)

我们通过改变a,b来确保我们的SSE会向最小值方向移动,即沿黄线所指方向。至于改变a,b的规则:

  • a – ∂SSE/∂a

  • b – ∂SSE/∂b


所以,具体的公式就是:

  • New a = a – r * ∂SSE/∂a = 0.45 - 0.01 * 3.300 = 0.42

  • New b = b – r * ∂SSE/∂b = 0.75 - 0.01 * 1.545 = 0.73

在这里,r代表学习率 = 0.01,可以自设,是用来决定调整a,b快慢的。越大调整的越快,但越容易漏掉收敛的最佳点。

第四步:用新的a,b来求出新的SSE

大家可以从图上看出,总的SSE值(Total SSE)从原来的0.677变为0.553。代表着我们的预测准度正在增加。

第五步:重复三四步直到调整a,b不会明显的影响SSE。到那时我们的预测准度就会达到最高

3、这就是梯度下降法,梯度更新公式不是推导而是创造然后定义出来的。

 

设想下有个函数,你的目标是:找到一个参数 \theta 使得它的值 Y 最小。但它很复杂,你无法找到这个参数的解析解,所以你希望通过梯度下降法去猜这个参数。 问题是怎么猜?

对于多数有连续性的函数来说,显然不可能把每个 \theta 都试一遍。所以只能先随机取一个 \theta ,然后看看怎么调整它最有可能使得 Y 变小。把这个过程重复n遍,自然最后得到的 \theta 的估值会越来越小。

现在问题是怎么调整?既然要调整,肯定是基于当前我们拥有的那个参数 \theta_t ,所以有了:

\theta_{t+1}=\theta_t+\Delta

那现在问题是每次更新的时候这个 \Delta 应该取什么值?

我们知道关于某变量的(偏)导数的概念是指当(仅仅)该变量往正向的变化量趋向于0时的其函数值变化量的极限。 所以现在若求 Y 关于\theta_t的导数,得到一个值比如:5,那就说明若现在我们把 \theta_t 往正向(即增大)一点点, Y 的值会变大,但不一定是正好+5。同理若现在导数是-5,那么把 \theta_t 增大一点点 Y 值会变小。 这里我们发现不管导数值 \Delta 是正的还是负的(正负即导数的方向),对于 \theta_t 来说,-\Delta 的最终方向(即最终的正负号,决定是增(+)还是减(-))一定是能将Y值变小的方向(除非导数为0)。所以有了:

\theta_{t+1}=\theta_t+(-\Delta)

但是说到底, \Delta 的绝对值只是个关于Y的变化率,本质上和 \theta_t 没关系。所以为了抹去 \Delta 在幅度上对 \theta_t 的影响,需要一个学习率来控制: \alpha \in (0,1] 。所以有了:

\theta_{t+1}=\theta_t+(-\alpha\Delta)=\theta_t-\alpha\Delta

而这里的 \Delta 就是你1式中的那个偏导,而对于2式,就是有多少个参数,就有多少个不同的 \Delta

现在分析在梯度下降法中最常听到的一句话:“梯度下降法就是朝着梯度的反方向迭代地调整参数直到收敛。” 这里的梯度就是 \Delta ,而梯度的反方向就是 -\Delta 的符号方向---梯度实际上是个向量。所以这个角度来说,即使我们只有一个参数需要调整,也可以认为它是个一维的向量。 整个过程你可以想象自己站在一个山坡上,准备走到山脚下(最小值的地方),于是很自然地你会考虑朝着哪个方向走,方向由 -\Delta方向给出,而至于一次走多远,由 |\alpha\Delta| 来控制。 这种方式相信你应该能理解其只能找到局部最小值,而不是全局的。

参考

1:作者:老董 链接:https://www.zhihu.com/question/57747902/answer/240695458 来源:知乎

2:https://zhuanlan.zhihu.com/p/27297638

网站文章

  • java的轻量锁,jvm第7节-锁(偏向锁,轻量锁,自旋锁)

    java的轻量锁,jvm第7节-锁(偏向锁,轻量锁,自旋锁)

    在介绍锁之前我们先介绍一个线程不安全的例子,一个全局的list,开2个线程往里面插入数据,代码如下:package com.jvm.day6.lock.demo;import java.util.Ar...

    2024-04-01 03:35:45
  • 前端之JS

    参考博客:http://www.cnblogs.com/liwenzhou/p/8004649.html JS基础语法: 0. JS引入方式   1. 直接在script标签里面写代码  2. 在单独的JS文件中写代码,然后通过script标签的src属性引入写好的JS文件1. 变量  1. var 变量名; var 变量名 = 值  2. 变量的命名 字母 数字 下划...

    2024-04-01 03:35:38
  • Ajax中的错误处理 - 优化你的编程体验

    Ajax中的错误处理 - 优化你的编程体验

    此外,我们还了解了一些高级技巧,如显示错误信息、错误分类处理和重试机制,以进一步优化错误处理的效果。在实际的开发中,根据具体的需求和场景,我们可以根据本文提供的示例代码进行适当的修改和定制,以满足实际...

    2024-04-01 03:34:58
  • 【若泽大数据实战第十八天】Hive - 创建测试表dual的使用

    -- 创建 dual 表(只有在测试的时候用insert)hive> create table dual(x string);OKTime taken: 0.282 secondshive> insert into table dual values('');Query ID = hadoop_20180611233030_645e070e-77f9-4ea4-8b32-ee3...

    2024-04-01 03:34:50
  • leetcode刷题:查找重复的电子邮箱

    编写一个 SQL 查询,查找 Person 表中所有重复的电子邮箱。示例:+—-+———+ | Id | Email | +—-+———+ | 1 | a@b.com | | 2 | c@d.com | | 3 | a@b.com | +—-+———+ 根据以上输入,你的查询应返回以下结果:+———+ | Email | +———+ | a@b.com...

    2024-04-01 03:34:42
  • 494. Target Sum题解(DP法)

    494. Target Sum题解(DP法)

    题目链接:https://leetcode.com/problems/target-sum/ 题解: 首先转化问题:令取正的数为A,取负的数为B,则要求sum(A)-sum(B)=S,两边加上sum(A)+sum(B),得到sum(A)-sum(B)+sum(A)+sum(B)=S+sum(A)+sum(B),即2*sum(A)=S+sum(nums),原问题转化为子数组和问题,使子数组和...

    2024-04-01 03:34:34
  • 最短路算法(3种算法)

    1.最短路 最短路,顾名思义,最短的路径。我们把边带有权值的图称为带权图。边的权值可以理解为两点之间的距离。一张图中任意两点之间会有不同的路径相连。最短路径就是指连接两点的这些路径中最短的一条。我们有...

    2024-04-01 03:33:53
  • 定时器工作方式

    定时器工作方式

    1、工作方式控制寄存器(TCON) TMOD(89H) 地址90H8FH 8EH8DH8CH 8BH8AH89H 符号GATEC/T M1M0GATE C/TM1M0 1)GATE:门控制位。  GATE=1,外部启动方式(也曾硬件启动方式),定时/计数器的启动受外部输入引脚INT0‾\overline{INT0}INT0或I

    2024-04-01 03:33:45
  • golang写入csv

    package mainimport ( "encoding/csv" "fmt" "os")func main() { file, err := os.OpenFile("111.csv", os.O_CREATE|os.O_RDWR, 0644) if err != nil { fmt.Println("open fi...

    2024-04-01 03:33:39
  • 树莓派4B ubuntu20.04 python控制pwm 蜂鸣器播放歌曲 教程

    树莓派4B ubuntu20.04 python控制pwm 蜂鸣器播放歌曲 教程

    本文参考自:https://shumeipai.nxez.com/2020/11/18/raspberry-pi-controls-the-buzzer-to-play-music.html驱动蜂鸣器...

    2024-04-01 03:32:59