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

Lecture3 梯度下降(Gradient Descent)

目录

1 问题背景

2 批量梯度下降 (Batch Gradient Descent)

3 鞍点(Saddle Point)

3 随机梯度下降 (Stochastic Gradient Descent)

4 小批量梯度下降 (Mini-batch Gradient Descent)


1 问题背景

图1 上节课讲述的穷举法求最优权重值

  在Lecture2中,介绍了使用穷举法来确定最优\omega值,然而当遇到\omega范围较大,或者数量过多等情况时,穷举法的时间复杂度过大。因此,我们需要优化该算法。

2 批量梯度下降 (Batch Gradient Descent)

  在这次课中,介绍了一种寻找\omega最优值的算法——批量梯度下降 (Batch Gradient Descent, BGD)

简单介绍下该算法。首先对于下图:

图2 训练过程中权重初始值与最优值的位置

  假设我们目前的起始\omega位于上图红色点,为了找到最优\omega点(位于绿点),那么我们需要向左边移动,这样才能到达最优\omega点。

图3 我们需要计算梯度以向左移动权值点

 

   如何让权值点向左还是向右移动呢?此时我们需要计算当前点的梯度(Gradient),也就是用成本函数对权重进行求导,如果梯度<0,则向函数值递减方向移动;梯度>0,则向函数值递增方向移动。

  因为要移动起来,所以我们每移动一步,就要更新一下\omega值。更新函数如下图Update处:

图4 更新权重值的函数公式

  在这个更新函数中, α代表学习率(Learning Rate),学习率是机器学习中常用的一个超参数,它定义了每次更新参数时步长的大小,即每次更新参数时参数值变化的幅度。如果学习率设置得过大,所求结果可能会在最优解的附近来回震荡,而无法找到全局最优解。如果学习率设置得过小,那么模型的训练将会非常缓慢,甚至找不到最优解。

  这个式子中,梯度前面用了减号,是为了朝函数值递减方向,也就是往最优\omega所在的点移动,所以在梯度前面加负号。 就这样持续一步步地更新\omega,直到找到最优\omega

下面我们来具体讲讲如何去计算更新函数中的\frac{\partial cost}{\partial \omega} :

图5 更新函数

计算过程中,需要用到上节课总结的两个公式:

图6 均方误差MSE

图7 预测值y_hat

  接着把上述两个公式代入原式:

图8 求导过程

   蓝色处,因为cost=MSE,所以直接代入上一节课的MSE公式,然后对\omega求导。

  绿色处,由有理运算法则,和的导数等于导数的和,所以这里可以把\frac{\partial}{\partial \omega}移入求和式子中,对里面先进行求导后,再求和相加。

  黄色处,根据复合导数的链式求导法进行求导。

代码实现

from matplotlib import pyplot as pltx_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]
w = 1.0  # 初始权重,由这个权重开始迭代'''线性模型,算出预测值y_hat'''
def forward(x):return x * w'''均方误差MSE'''
def cost(xs, ys):cost = 0for x, y in zip(xs, ys):y_pred = forward(x)  # 算出y_hatcost += (y_pred - y) ** 2  # (y_hat - y)²return cost / len(xs)  # 除以样本总数求均值'''梯度下降公式'''
def gradient(xs, ys):grad = 0for x, y in zip(xs, ys):grad += 2 * x * (x * w - y)return grad / len(xs)print('Predict (before training)', 4, forward(4))  # 训练前,模型对输入的4的最终预测结果cost_list = [] # 保存每轮迭代后的cost值
epoch_list = [] # 保存每轮的迭代后的epoch值
for epoch in range(100):  # 进行100轮训练cost_val = cost(x_data, y_data)grad_val = gradient(x_data, y_data)w -= 0.01 * grad_val # 使用梯度下降法更新权重,0.01表示学习率print('Epoch:', epoch, 'w=%.2f' % w, 'loss=%.2f' % cost_val)cost_list.append(cost_val)epoch_list.append(epoch)
print('Predict (after training)', 4, forward(4))  # 训练后,模型对输入的4的最终预测结果'''绘图'''
plt.plot(epoch_list, cost_list)
plt.ylabel('Cost')
plt.xlabel('Epoch')
plt.grid()
plt.show()
图9 输出结果图像

  将MSE公式和Linear Model公式代入整合,的最终更新函数:

图10 最终的更新函数

补充

训练后的结果一般来说,cost会趋于收敛情况

图11 通常训练后cost图像会趋于收敛

 如果发生如下情况,说明训练失败,原因有很多,其中之一可能是学习率取得太大:

图12 训练失败

 

  这就是批量梯度下降算法,本质上是一个贪心算法(Greedy Algorithm)。不过该算法有局限性,比如当前的预测值\omega正好位于下图绿线处,因为再往右移动会梯度会发生变化,使得程序直接终止,于是误将红的点作为最优\omega值,而忽略了处于蓝色点的最优\omega值:

图13 局部最优和全局最优示意图

   我们把上图中的红点称为局部最优点(Local Optimum),蓝色点称为全局最优点(Global Optimum)。因此对于该梯度下降算法,很可能会找到局部最优点,而忽略了全局最优点。不过这种现象不必担心,因为在实际训练中,往往很难陷入局部最优点。

3 鞍点(Saddle Point)

  在实际训练中,往往很难陷入局部最优点,而最需要解决的问题是鞍点(Saddle Point),鞍点是机器学习和数学中的一个概念,它指的是一个特殊的局部极小值,在某些方向上是极小值,但在其他方向上是极大值。在一元函数中,梯度=0的点就是鞍点。比如下图中,红色小球所处的位置就在鞍点,此时梯度为零,会导致更新函数无法更新(因为梯度=0,\omega=\omega-α*0相当于没有发生更新):

图14 鞍点示意图

 

 从多维角度来分析,比如下图红球处于马鞍面(Saddle Surface),从一个切面看可以处于最小值,从另一个切面看又处于最大值:

图15 位于马鞍面的鞍点

 

  在优化问题中,鞍点是一种特殊的局部最优解,是一个难以优化的点,因为优化算法可能很难从鞍点附近找到全局最优解。这是因为,如果优化算法在鞍点附近搜索,它可能会被误导到其他附近的局部最优解,而不是真正的全局最优解。所以在深度学习中,需要克服的最大问题就是鞍点而非局部最优问题。

3 随机梯度下降 (Stochastic Gradient Descent)

  随机梯度下降 (Stochastic Gradient Descent, SGD)在深度学习中很常用,和BGD算法的区别是,BGD使用所有的样本的均值的平均损失来作为\omega的更新依据,而SGD是从所有样本中随机选择单个样本的损失值来对\omega进行更新。

  随机梯度下降的优点是,每次仅使用一个数据点的梯度,因此在每次迭代时都有可能沿着非0梯度的方向更新参数,这样就避免陷入到鞍点导致无法更新参数。

图16 BGD到SGD公式上的改变

代码实现

import randomx_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]
w = 1.0def forward(x):return x * wdef loss(x, y):y_pred = forward(x)return (y_pred - y) ** 2def gradient(x, y):return 2 * x * (x * w - y)print('Predict (before training)', 4, forward(4))
for epoch in range(100):t = random.randrange(0, 3) # 随机得到一个样本x = x_data[t]y = y_data[t]grad = gradient(x, y)w = w - 0.01 * gradprint("\tgrad: ", x, y, '%.2f' % grad)l = loss(x, y)print("progress:", epoch, "w=%.2f" % w, "loss=%.2f" % l)
print('Predict (after training)', 4, forward(4))

部分输出结果

Predict (before training) 4 4.0
    grad:  3.0 6.0 -18.00
progress: 0 w=1.18 loss=6.05
    grad:  2.0 4.0 -6.56
progress: 1 w=1.25 loss=2.28
    grad:  3.0 6.0 -13.58
progress: 2 w=1.38 loss=3.44
    grad:  1.0 2.0 -1.24
progress: 3 w=1.39 loss=0.37
    grad:  2.0 4.0 -4.85
progress: 4 w=1.44 loss=1.24

···

    grad:  1.0 2.0 -0.00
progress: 97 w=2.00 loss=0.00
    grad:  1.0 2.0 -0.00
progress: 98 w=2.00 loss=0.00
    grad:  2.0 4.0 -0.00
progress: 99 w=2.00 loss=0.00
Predict (after training) 4 7.999910864525451

4 小批量梯度下降 (Mini-batch Gradient Descent)

  SGD算法虽然可以在一定程度上避免陷入局部最优以及鞍点问题,但是运算所需时间复杂度过高,每次仅使用一个数据点的梯度,因此它的收敛速度通常比较慢。

  因此有一个折中的办法,就是使用小批量梯度下降 (Mini-batch Gradient Descent) 算法。简单来说,小批量梯度下降是一种介于批量梯度下降和随机梯度下降之间的优化算法。结合了这两种方法,通过使用小的随机选择的训练数据子集(称为mini-batch)计算损失函数关于参数的梯度的平均值来更新模型参数。

  总之,小批量梯度下降算法实现了BGD的高计算效率和SGD的良好收敛性之间的平衡。

相关文章:

Lecture3 梯度下降(Gradient Descent)

目录 1 问题背景 2 批量梯度下降 (Batch Gradient Descent) 3 鞍点(Saddle Point) 3 随机梯度下降 (Stochastic Gradient Descent) 4 小批量梯度下降 (Mini-batch Gradient Descent) 1 问题背景 图1 上节课讲述的穷举法求最优权重值在Lecture2中&#xff0c;介绍了使用穷举…...

深入了解DSP

一、时钟和电源 问&#xff1a;DSP的电源设计和时钟设计应该特别注意哪些方面&#xff1f;外接晶振选用有源的好还是无源的好&#xff1f; 答&#xff1a;时钟一般使用晶体&#xff0c;电源可用TI的配套电源。外接晶振用无源的好。 问&#xff1a;TMS320LF2407的A/D转换精度保证…...

Flink反压如何排查

Flink反压利用了网络传输和动态限流。Flink的任务的组成由流和算子组成&#xff0c;那么流中的数据在算子之间转换的时候&#xff0c;会放入分布式的阻塞队列中。当消费者的阻塞队列满的时候&#xff0c;则会降低生产者的处理速度。 如上图所示&#xff0c;当Task C 的数据处…...

windows无法访问指定设备路径或文件怎么办?2个解决方案

有时候Win10电脑打不开程序或文件&#xff0c;windows无法访问指定设备路径或文件该怎么办&#xff1f;原因是什么呢&#xff1f;一般导致这种情况的出现&#xff0c;大多是因为我们的电脑缺乏相应的查看权限&#xff0c;我们只需要通过赋予权限就可以解决这个难题了。 操作环境…...

冷知识|鹤顶红还能用来修长城?

大家好&#xff0c;我是建模助手。 在上篇浅浅地蹭了波热点之后&#xff0c;我灵机一动&#xff0c;倒不如也搞一搞建筑方面的冷知识&#xff1f;冷热搭配&#xff0c;事半功倍... 问问大家&#xff0c;如果谈起古建筑&#xff0c;关键词都有什么&#xff1f;是庄严、震撼、壮…...

【GD32F427开发板试用】在IAR环境中移植RTX5

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;吴金刚 0.前言 首先感谢极术社区和兆易创新给了这次试用GD32F427开发板的机会。 板子做的虽然简约&#xff0c;但是自带了GD-link所以一根USB…...

MySQl学习(从入门到精通15)

MySQl学习&#xff08;从入门到精通15&#xff09;第 18 章_MySQL 8 其它新特性1. MySQL 8 新特性概述1. 1 MySQL 8. 0 新增特性1. 2 MySQL 8. 0 移除的旧特性2. 新特性 1 &#xff1a;窗口函数2. 1 使用窗口函数前后对比2. 2 窗口函数分类2. 3 语法结构2. 4 分类讲解1. 序号函…...

前端构建工具 Vite

文章目录参考环境构建工具构建工具的主要功能目前主流的前端构建工具Vite为什么使用 Vite冷启动WebpackVite热更新优化热更新优化预构建依赖Webpack VS ViteVite 的缺点首屏性能懒加载与 Vite 相关的基本操作获取create-vite创建项目Project nameSelect a frameworkSelect a va…...

若依框架---PageHelper分页(十)

在前几天的文章中&#xff0c;我们介绍了PageHelper的分页方法&#xff0c;研读代码定位到了ExecutorUtil.pageQuery(...)方法&#xff0c;并阅读到了其中的部分代码。 今天我们将看到重要的SQL修改代码。 getPageSql 我们接着看代码&#xff1a; if (!dialect.beforePage(…...

苹果手机专用蓝牙耳机有哪些?与iphone兼容性好的蓝牙耳机

蓝牙耳机摆脱了线缆的束缚&#xff0c;在地以各种方式轻松通话。自从蓝牙耳机问世以来&#xff0c;一直是行动商务族提升效率的好工具&#xff0c;苹果产品一直都是受欢迎的数码产品&#xff0c;下面推荐几款与iphone兼容性好的蓝牙耳机。 第一款&#xff1a;南卡小音舱蓝牙耳…...

CS-TPGS;壳聚糖修饰维生素E;Chitosan-g-TPGS

Chitosan-g-TPGS,CS-TPGS壳聚糖修饰维生素E聚乙二醇1000琥珀酸酯外观呈现白色固体或者粘稠液体。长期保存需要在-20℃,避光,干燥条件下存放&#xff0c;注意取用一定要干燥,避免频繁溶冻。 维生素E聚乙二醇琥珀酸酯(简称TPGS)是维生素E的水溶性衍生物,由维生素E琥珀酸酯的羧基与…...

easyx的基本使用(万字解析)

easyx的基本使用一.基本框架1.创建文件2.创建窗体-initgraph,closegraph,getchar二.简单的绘制1.圆形-circle2.坐标系统-setorigin,setaspectratio三.简单图形1.绘制点-putpixel2.简单的直线-line3.矩形-rectangle4.椭圆-ellipse5.圆角矩形-roundrect6.扇形-pie7.圆弧-arc四.多…...

基于OpenCV 的车牌识别

基于OpenCV 的车牌识别 车牌识别是一种图像处理技术&#xff0c;用于识别不同车辆。这项技术被广泛用于各种安全检测中。现在让我一起基于 OpenCV 编写 Python 代码来完成这一任务。 车牌识别的相关步骤 1. 车牌检测&#xff1a;第一步是从汽车上检测车牌所在位置。我们将使用…...

C#【必备技能篇】Winform跨线程更新进度条的实例

文章目录实例一&#xff1a;【方便理解&#xff0c;常用&#xff01;】源码&#xff1a;运行效果&#xff1a;实例二&#xff1a;【重在理解代码本身】源码&#xff1a;运行效果&#xff1a;参考&#xff1a;实例一&#xff1a;【方便理解&#xff0c;常用&#xff01;】 跨线…...

(1分钟速通面试) 矩阵分解相关内容

矩阵分解算法--总结QR分解 LU分解本篇博客总结一下QR分解和LU分解&#xff0c;这些都是矩阵加速的操作&#xff0c;在slam里面还算是比较常用的内容&#xff0c;这个地方在isam的部分出现过。(当然isam也是一个坑&#xff0c;想要出点创新成果的话 可能是不太现实的 短期来讲 哈…...

this指向

&#xff08;1&#xff09;在全局环境中的this——window 无论是否在严格模式下&#xff0c;在全局执行环境中&#xff08;在任何函数体外部&#xff09;this 都指向全局对象。 "use strict"console.log(this); //windowconsole.log(thiswindow);//true &#xff08…...

安卓小游戏:小板弹球

安卓小游戏&#xff1a;小板弹球 前言 这个是通过自定义View实现小游戏的第三篇&#xff0c;是小时候玩的那种五块钱的游戏机上的&#xff0c;和俄罗斯方块很像&#xff0c;小时候觉得很有意思&#xff0c;就模仿了一下。 需求 这里的逻辑就是板能把球弹起来&#xff0c;球…...

7、单行函数

文章目录1 函数的理解1.1 什么是函数1.2 不同DBMS函数的差异1.3 MySQL的内置函数及分类2 数值函数2.1 基本函数2.2 角度与弧度互换函数2.3 三角函数2.4 指数与对数2.5 进制间的转换3 字符串函数4 日期和时间函数4.1 获取日期、时间4.2 日期与时间戳的转换4.3 获取月份、星期、星…...

华为机试题:HJ56 完全数计算(python)

文章目录博主精品专栏导航知识点详解1、input()&#xff1a;获取控制台&#xff08;任意形式&#xff09;的输入。输出均为字符串类型。1.1、input() 与 list(input()) 的区别、及其相互转换方法2、print() &#xff1a;打印输出。3、整型int() &#xff1a;将指定进制&#xf…...

opencv——傅里叶变换、低通与高通滤波及直方图等操作

1、傅里叶变换a、傅里叶变换原理时域分析&#xff1a;以时间为参照进行分析。频域分析&#xff1a;相当于上帝视角一样&#xff0c;看事物层次更高&#xff0c;时域的运动在频域来看就是静止的。eg&#xff1a;投球——时域分析&#xff1a;第1分钟投了3分&#xff0c;第2分钟投…...

【NGINX入门指北】 进阶篇

nginx 进阶篇 文章目录nginx 进阶篇一、Nginx Proxy 服务器1、代理原理2、proxy代理3、proxy缓存一、Nginx Proxy 服务器 1、代理原理 正向代理 内网客户机通过代理访问互联网&#xff0c;通常要设置代理服务器地址和端口。 反向代理 外网用户通过代理访问内网服务器&…...

Python中关于@修饰符、yeild关键词、next()函数的基本功能简述

关于修饰符&#xff1a;其实就是将修饰符下面的函数当成参数传给它上面的函数。 def a(x):print(a)adef b():print(b) 其效果等价为&#xff1a; def a(x):print(a)def b():print(b)a(b())有个记忆诀窍&#xff0c;的下面哪个函数最近&#xff0c;谁就是儿子&#xff0c;谁就…...

结合Coverity扫描Spring Boot项目进行Path Manipulation漏洞修复

本篇介绍使用Coverity 扫描基于Spring Boot 项目中的Path Manipulation 漏洞, 进而解决风险,并且可以通过扫描。 什么样的代码会被扫描有路径操纵风险? 在Spring Boot 项目中, 实验了如下的场景: 1. Control 中 file path 作为参数传递的会被扫描,单纯服务方法不会 场…...

【FFMPEG源码分析】从ffplay源码摸清ffmpeg框架(一)

ffplay入口 ffmpeg\fftools\ffplay.c int main(int argc, char **argv) {/*******************start 动态库加载/网络初始化等**************/int flags;VideoState *is;init_dynload();av_log_set_flags(AV_LOG_SKIP_REPEATED);parse_loglevel(argc, argv, options);/* regis…...

C++蓝桥杯 基础练习,高精度加法,输入两个整数a和b,输出这两个整数的和。a和b都不超过100位。

C蓝桥杯 基础练习&#xff0c;高精度加法 问题描述 输入两个整数a和b&#xff0c;输出这两个整数的和。a和b都不超过100位。 算法描述 由于a和b都比较大&#xff0c;所以不能直接使用语言中的标准数据类型来存储。对于这种问题&#xff0c;一般使用数组来处理。   定义一…...

MySQL面试题:SQL语句的基本语法

MySQL目录一、数据库入门1. 数据管理技术的三个阶段2. 关系型数据库与非关系型数据库3. 四大非关系型数据库a. 基于列的数据库&#xff08;column-oriented&#xff09;b. 键值对存储&#xff08;Key-Value Stores&#xff09;c. 文档存储&#xff08;Document Stores&#xff…...

Fluid-数据编排能力原理解析

前言本文对Fluid基础功能-数据编排能力进行原理解析。其中涉及到Fluid架构和k8s csi driver相关知识。建议先了解相关概念&#xff0c;为了便于理解&#xff0c;本文使用JuiceFS作为后端runtime引擎。原理概述Fuild数据编排能力&#xff0c;主要是在云原生环境中&#xff0c;能…...

并发线程、锁、ThreadLocal

并发编程并发编程Java内存模型&#xff08;JMM&#xff09;并发编程核心问题—可见性、原子性、有序性volatile关键字原子性原子类CAS(Compare-And-Swap 比较并交换)ABA问题Java中的锁乐观锁和悲观锁可重入锁读写锁分段锁自旋锁共享锁/独占锁公平锁/非公平锁偏向锁/轻量级锁/重…...

CMMI-结项管理

结项管理&#xff08;ProjectClosing Management, PCM&#xff09;是指在项目开发工作结束后&#xff0c;对项目的有形资产和无形资产进行清算&#xff1b;对项目进行综合评估&#xff1b;总结经验教训等。结项管理过程域是SPP模型的重要组成部分。本规范阐述了结项管理的规程&…...

网络通信协议是什么?

网络通信基本模式 常见的通信模式有如下2种形式&#xff1a;Client-Server(CS) 、 Browser/Server(BS) 实现网络编程关键的三要素 IP地址&#xff1a;设备在网络中的地址&#xff0c;是唯一的标识。 端口&#xff1a;应用程序在设备中唯一的标识。 协议: 数据在网络中传输的…...

怎么做坑人的网站/自学seo能找到工作吗

创建一个控制台程序和一个类库, 在控制台创建一个匿名对象。然后再在类库中訪问它。代码例如以下&#xff1a; namespace ConsoleApplication1 {class Program{static void Main(string[] args){var obj new { Id 1 };var c new ClassLibrary1.TestClass();c.Test(obj);Cons…...

做h5最好的网站/企业seo顾问服务阿亮

我正在使用PHP的“simplexml_load_file”从Flickr获取一些数据.我的目标是获取照片网址.我能够得到以下值(分配给PHP变量)&#xff1a;codewrecker posted a photo:我怎样才能提取它的这一部分&#xff1f;http://farm3.static.flickr.com/2298/2302759205_4fb109f367_m.jpg万一…...

网站无icp备案/个人在线网站推广

号称第一的免费精美图片分享站&#xff0c;可商用&#xff0c;完全免费   StockSnap:免费图片素材高清资源库是一个提供可自由下载使用的高清晰摄影图片作品的素材库&#xff0c;所提供的资源相当实用&#xff0c;该网站由多位摄影师组成&#xff0c;提供丰富的免费照片&…...

帮助中心网站源码/直通车推广计划方案

Python内置了整数、复数、浮点数三种数字类型。整数 整数是没有小数部分的数值&#xff0c;与数学上的一样&#xff1a; >>> 1 1 >>> -1 -1 整数没有大小限制&#xff0c;只要你的内存足够大&#xff0c;就可以创建任意大小的整数&#xff1a; >>> …...

网站的css文件夹/谷歌seo服务

10055 WA了两次之后好好or vice versa&#xff1a;反之亦然。另外&#xff0c;int型的最大为2^31-1&#xff08;符号位&#xff09;c#include <iostream> #include <stdio.h>using namespace std;#define lln long longint main() {lln a, b;lln t;while(~scanf(&q…...

盗版视频网站怎么做的/seo刷网站

HTTP 三次握手与四次挥手 HTTP 概述 HTTP是hypertext transfer protocol&#xff08;超文本传输协议&#xff09;的简写&#xff0c;它是TCP/IP协议的一个应用层协议&#xff0c;用于定义WEB浏览器与WEB服务器之间交换数据的过程。客户端连上web服务器后&#xff0c;若想获得w…...