机器学习基础06_梯度下降

目录

一、为什么使用梯度下降

二、什么是梯度下降

三、为什么要用梯度下降

四、怎么进行梯度下降

1、微分

1.单变量的微分

2.多变量的微分

2、梯度

3、步骤

(1)学习率α

(2)梯度(导数)前的负号

4、实例实现

五、sklearn梯度下降


一、为什么使用梯度下降

前面利用正规方程求解的w是最优解的原因是均方误差(MSE)这个损失函数是凸函数。但是,机器学习的损失函数并非都是凸函数,设置导数为0会得到很多个极值,不能确定唯一解,MSE还有一个问题,当数据量和特征较多时,矩阵计算量太大。

二、什么是梯度下降

假设你在一个陌生星球的山地上,你想找到一个谷底,那么肯定是想沿着向下的坡行走,如果想尽快的走到谷底,那么肯定是要沿着最陡峭的坡下山。每走一步,都找到当前位置为基准的最陡峭的地方走下一步,同理上山也是如此,这时就变成了梯度上升算法了。

在这个比喻中,梯度就像是山上的坡度,告诉我们在当前位置上地势变化最快的方向。为了尽快走向谷底,我们需要沿着最陡峭的坡向下行走,而梯度下降算法正是这样的方法。

梯度下降法(Gradient Descent)是一个算法,但不是像多元线性回归那样是一个具体做回归任务的算法,而是一个非常通用的优化算法来帮助一些机器学习算法求解出最优解,所谓的通用就是很多机器学习算法都是用梯度下降,甚至深度学习也是用它来求解最优解。

三、为什么要用梯度下降

梯度在微积分中的意义:

  • 在单变量的函数中,梯度其实就是函数的微分,代表着函数在某个给定点的切线的斜率
  • 在多变量函数中,梯度是一个向量,向量有方向,梯度的方向就指出了函数在给定点的上升最快的方向

用前面的例子来说,我们需要到达山底,就需要在每一步观测到此时最陡峭的地方,梯度就恰巧告诉了我们这个方向。梯度的方向是函数在给定点上升最快的方向,那么梯度的反方向就是函数在给定点下降最快的方向,这正是我们所需要的。所以我们只要沿着梯度的方向一直走,就能走到局部的最低点。

四、怎么进行梯度下降

在机器学习中,梯度表示损失函数对于模型参数的偏导数,而梯度的方向就是函数变化最快的方向。

具体来说,对于每个可训练参数,梯度告诉我们在当前参数值下,沿着每个参数方向变化时,损失函数的变化率。通过反复计算损失函数对参数的梯度,最后就能到达局部最小值。

梯度下降算法能够根据梯度的信息来调整参数,朝着减少损失的方向更新模型,从而逐步优化模型,使得模型性能更好。

1、微分

微分常用的两种的意义:

  • 函数图像中,某点的切线的斜率
  • 函数的变化率
1.单变量的微分

\frac{d(\theta -5)^2}{d\theta} = 2(\theta -5)

2.多变量的微分

分别对每个变量进行求微分

\frac{\vartheta }{\vartheta \theta_1}(-5\theta_1+2\theta_2) = -5

\frac{\vartheta }{\vartheta \theta_2}(-5\theta_1+2\theta_2) = 2

2、梯度

梯度实际上是多变量微分的一般化

J(\theta ) =(-5\theta_1+2\theta_2-12\theta_3)

\triangledown J(\theta ) = <\frac{\vartheta }{\vartheta \theta_1},\frac{\vartheta }{\vartheta \theta_2},\frac{\vartheta }{\vartheta \theta_3}>=(-5,2,12)

3、步骤

\omega ^{n+1} = \omega^{n}-\alpha *\triangledown J(\theta )

此公式的意义是:J是关于\theta的一个函数,我们当前所处的位置为w^{n}点,要从这个点走到J的最小值点,也就是山底。首先我们先确定前进的方向,也就是梯度的反向,然后走一段距离的步长,也就是α,走完这个段步长,就到达了w^{n+1}这个点。

(1)学习率α

α在梯度下降算法中被称作为学习率或者步长,意味着可以通过α来控制每一步走的距离。设置大的学习率α;每次调整的幅度就大,设置小的学习率α;每次调整的幅度就小。

一般情况下学习率在整体迭代过程中是不变,但是也可以设置成随着迭代次数增多学习率逐渐变小,因为越靠近山谷我们就可以步子迈小点,可以更精准的走入最低点,同时防止走过。还有一些深度学习的优化算法会自己控制调整学习率这个值。

(2)梯度(导数)前的负号

梯度前加一个负号,就意味着朝着梯度相反的方向前进。梯度的方向实际就是函数在此点上升最快的方向,而我们需要朝着下降最快的方向走,即负的梯度的方向,所以此处需要加上负号;那么如果时上坡,也就是梯度上升算法,就不需要添加负号了。

4、实例实现

单变量的梯度下降

import numpy as np 
import matplotlib.pyplot as pltw = np.linspace(-10,20,100)# 损失函数
def loss(w):return (w-3.5)**2 - w*4.5 + 10# 导函数
def dloss(w):return 2*(w-3.5) - 4.5 plt.plot(w,loss(w))
# 梯度下降
np.random.seed(1)
# 随机设置w值
w = np.random.randint(-10,20) 
e = loss(w)  # 误差
x = [w]
y = [e]
alpha = 0.1  # 学习率
# 循环
for i in range(5):w = w - alpha*dloss(w)e = loss(w)x.append(w)y.append(e)plt.scatter(x,y)plt.show()

 

import numpy as np# 损失函数
def loss(w):return (w-3.5)**2 - 4.5*w + 10
# 导函数
def dloss(w):return 2*(w-3.5) - 4.5
# 梯度下降算法
def train():# 随机初始化一个w值w = -10 # np.random.randint(-10,20)# 初始化学习率lr = 0.1t0,t1 = 1,10# 梯度下降更新wepoch = 100  # 循环次数 for i in range(epoch):lr = t0/(t1+i)  # 学习率递减w = w - lr*dloss(w)print(f'w更新后的值为:{w},更新后的损失函数的值:{loss(w)}')train()

多变量的梯度下降

 

import numpy as np# 损失函数
def loss(w1,w2):return (w1-3.5)**2 + (w2-3.5)**2 + 3*w1*w2 - 4.5*w1 - 2*w2 + 20
# w1偏导数
def dloss_w1(w1,w2):return 2*(w1-3.5) + 3*w2 - 4.5
# w2偏导数
def dloss_w2(w1,w2):return 2*(w2-3.5) + 3*w1 - 2
# 梯度下降算法
def train():# 随机初始化一个w值w1 = -10 # np.random.randint(-10,20)w2 = -10# 初始化学习率lr = 0.1t0,t1 = 1,10# 梯度下降更新wepoch = 100  # 循环次数 for i in range(epoch):# 设置临时变量w1_ = w1w2_ = w2# 更新w1w1 = w1 - lr*dloss_w1(w1_,w2_)# 更新w2w2 = w2 - lr*dloss_w2(w1_,w2_)lr = t0/(t1+i)  # 学习率递减print(f'w1更新后:{w1},w2更新后:{w2} \n 更新后的损失函数的值:{loss(w1,w2)}')train()

五、sklearn梯度下降

官方的梯度下降API常用有三种:

批量梯度下降BGD(Batch Gradient Descent):在这种情况下,每一次迭代都会使用全部的训练样本计算梯度来更新权重。这意味着每一步梯度更新都是基于整个数据集的平均梯度。这种方法的优点是每次更新的方向是最准确的,但缺点是计算量大且速度慢,尤其是在大数据集上

小批量梯度下降MBGD(Mini-BatchGradient Descent):这种方法介于批量梯度下降和随机梯度下降之间。它不是用全部样本也不是只用一个样本,而是每次迭代从数据集中随机抽取一小部分样本(例如,从500个样本中选取32个),然后基于这一小批样本的平均梯度来更新权重。这种方法在准确性和计算效率之间取得了一个平衡。

随机梯度下降SGD(Stochastic Gradient Descent):在随机梯度下降中,每次迭代仅使用随机单个样本(或有时称为“例子”)来计算梯度并更新权重。这种方法能够更快地收敛,但由于每次更新都基于单个样本,所以会导致权重更新路径不稳定。

文章有参考:梯度下降算法原理讲解——机器学习

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

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

相关文章

ELK8.15.4搭建开启安全认证

安装 Elastic &#xff1a;Elasticsearch&#xff0c;Kibana&#xff0c;Logstash 另外安装一个收集器filebeat 通过二进制安装包进行安装 创建一个专门放elk目录 mkdir /elk/ mkdir /elk/soft下载 es 、kibana、Logstash、filebeat二进制包 cd /elk/softwget https://art…

贴代码框架PasteForm特性介绍之image

简介 PasteForm是贴代码推出的 “新一代CRUD” &#xff0c;基于ABPvNext&#xff0c;目的是通过对Dto的特性的标注&#xff0c;从而实现管理端的统一UI&#xff0c;借助于配套的PasteBuilder代码生成器&#xff0c;你可以快速的为自己的项目构建后台管理端&#xff01;目前管…

【划分型 DP-约束划分个数】【hard】【阿里笔试】力扣1278. 分割回文串 III

给你一个由小写字母组成的字符串 s&#xff0c;和一个整数 k。 请你按下面的要求分割字符串&#xff1a; 首先&#xff0c;你可以将 s 中的部分字符修改为其他的小写英文字母。 接着&#xff0c;你需要把 s 分割成 k 个非空且不相交的子串&#xff0c;并且每个子串都是回文串…

YOLO入门教程(三)——训练自己YOLO11实例分割模型并预测【含教程源码+一键分类数据集 + 故障排查】

目录 引言前期准备Step0 环境部署1.安装OpenCV2.安装Pytorch3.安装Ultralytics Step1 打标训练Step2 格式转换Step3 整理训练集Step4 训练数据集4.1创建yaml文件4.2训练4.3预测4.4故障排查4.4.1OpenCV版本故障&#xff0c;把OpenCV版本升级到4.0以上4.4.2NumPy版本故障&#xf…

鸿蒙系统下使用AVPlay播放视频,封装播放器

鸿蒙系统下使用AVPlay开发一款视频播放器流程 一. 申请权限 申请相关权限&#xff0c;主要是读取存储卡权限&#xff0c;方便后面扫描视频用&#xff1a; getPermission(): void {let array: Array<Permissions> [ohos.permission.WRITE_DOCUMENT,ohos.permission.REA…

编程语言05:面向对象

一、定义 使用步骤&#xff1a; 1.定义类 2.创建对象 3.调用类的属性和方法 (一)定义类 1.java 一个java文件中可以定义多个class类&#xff0c;且只能一个类是public修饰&#xff0c;而且public修饰的类名必须成为代码文件名。 实际开发中建议还是一个文件定义一个…

低速接口项目之串口Uart开发(二)——FIFO实现串口数据的收发回环测试

本节目录 一、设计思路 二、loop环回模块 三、仿真模块 四、仿真验证 五、上板验证 六、往期文章链接本节内容 一、设计思路 串口数据的收发回环测试&#xff0c;最简单的硬件测试是把Tx和Rx连接在一起&#xff0c;然后上位机进行发送和接收测试&#xff0c;但是需要考虑到串…

机器学习系列----关联分析

目录 1. 关联分析的基本概念 1.1定义 1.2常用算法 2.Apriori 算法的实现 2.1 工作原理 2.2 算法步骤 2.3 优缺点 2.4 时间复杂度 2.5实际运用----市场购物篮分析 3. FP-Growth 算法 3.1 工作原理 3.2 算法步骤 3.3 优缺点 3.4 时间复杂度 3.5实际运用——网页点…

二叉树路径相关算法题|带权路径长度WPL|最长路径长度|直径长度|到叶节点路径|深度|到某节点的路径非递归(C)

带权路径长度WPL 二叉树的带权路径长度(WPL)是二叉树所有叶节点的带权路径长度之和&#xff0c;给定一棵二叉树T&#xff0c;采用二叉链表存储&#xff0c;节点结构为 其中叶节点的weight域保存该节点的非负权值&#xff0c;设root为指向T的根节点的指针&#xff0c;设计求W…

Ubuntu ESP32开发环境搭建

文章目录 ESP32开发环境搭建安装ESP-IDF搭建一个最小工程现象 ESP32开发环境搭建 最近有个小项目需要用到能够联网的mcu驱动&#xff0c;准备玩玩esp的芯片&#xff0c;记录下ESP32开发环境搭建的过程。 ESP-IDF 是乐鑫科技为其 ESP32 系列芯片提供的官方开发框架。这个框架主…

2024.5 AAAiGLaM:通过邻域分区和生成子图编码对领域知识图谱对齐的大型语言模型进行微调

GLaM: Fine-Tuning Large Language Models for Domain Knowledge Graph Alignment via Neighborhood Partitioning and Generative Subgraph Encoding 问题 如何将特定领域知识图谱直接整合进大语言模型&#xff08;LLM&#xff09;的表示中&#xff0c;以提高其在图数据上自…

《SpringBoot、Vue 组装exe与套壳保姆级教学》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

django宠物服务管理系统

摘 要 宠物服务管理系统是一种专门为宠物主人和宠物服务提供商设计的软件。它可以帮助用户快速找到附近的宠物医院、宠物美容店、宠物寄养中心等服务提供商&#xff0c;并预订相关服务。该系统还提供了一系列实用的功能。通过使用宠物服务管理系统&#xff0c;用户可以更加方便…

docker 容器运行Ruoyi-cloud

1&#xff0c;linux系统安装openjdk1.8,mvn,dokcer,node,git 2&#xff0c;拉取代码 1&#xff09;查看gitee仓库地址 2&#xff09;创建/app文件夹&#xff0c;进入app目录 mkdir /app cd /app 3&#xff09;clone代码 4&#xff09;修改配置文件中nacos地址 # 修改注…

Linux运维篇-iscsi存储搭建

目录 概念实验介绍环境准备存储端软件安装使用targetcli来管理iSCSI共享存储 客户端软件安装连接存储 概念 iSCSI是一种在Internet协议上&#xff0c;特别是以太网上进行数据块传输的标准&#xff0c;它是一种基于IP Storage理论的存储技术&#xff0c;该技术是将存储行业广泛…

《Spring 数据访问:高效整合数据库与 ORM》

一、Spring 数据访问概述 Spring 在数据访问方面具有至关重要的地位&#xff0c;它为开发者提供了强大而高效的数据访问解决方案。 &#xff08;一&#xff09;强大的数据访问支持 Spring 提供了多种数据访问方式&#xff0c;以满足不同项目的需求。JDBC 是一种传统的数据访问…

AMD(Xilinx) FPGA配置Flash大小选择

目录 1 FPGA配置Flash大小的决定因素2 为什么选择的Flash容量大小为最小保证能够完成整个FPGA的配置呢&#xff1f; 1 FPGA配置Flash大小的决定因素 在进行FPGA硬件设计时&#xff0c;选择合适的配置Flash是我们进行硬件设计必须考虑的&#xff0c;那么配置Flash大小的选择由什…

解读缓存问题的技术旅程

目录 前言1. 问题的突发与初步猜测2. 缓存的“隐身术”3. 缓存策略的深层优化4. 反思与感悟结语 前言 那是一个普通的工作日&#xff0c;团队例行的早会刚刚结束&#xff0c;我正准备继续优化手头的模块时&#xff0c;突然收到了用户反馈。反馈的内容是部分数据显示异常&#…

Block Successive Upper Bound Minimization Method(BSUM)算法

BSUM优化方法学习 先验知识参考资料1 A Unified Convergence Analysis of Block Successive Minimization Methods for Nonsmooth OptimizationSUCCESSIVE UPPER-BOUND MINIMIZATION (SUM) 连续上限最小化算法THE BLOCK SUCCESSIVE UPPER-BOUND MINIMIZATION ALGORITHM 块连续上…

开源 AI 智能名片 2+1 链动模式商城小程序:场景驱动的商业创新与用户价值挖掘

摘要&#xff1a;本文围绕开源 AI 智能名片 21 链动模式商城小程序源码&#xff0c;深入分析了场景中的时间、空间、设备、社交和状态五大核心元素。阐述了各元素的表现形式、应用策略及价值&#xff0c;包括时间元素对业务周期和用户行为的影响及相应营销策略&#xff1b;空间…