机器学习基础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 plt

w = 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.1
    t0,t1 = 1,10
    # 梯度下降更新w
    epoch = 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.1
    t0,t1 = 1,10
    # 梯度下降更新w
    epoch = 100  # 循环次数 
    for i in range(epoch):
        # 设置临时变量
        w1_ = w1
        w2_ = w2
        # 更新w1
        w1 = w1 - lr*dloss_w1(w1_,w2_)
        # 更新w2
        w2 = 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):在随机梯度下降中,每次迭代仅使用随机单个样本(或有时称为“例子”)来计算梯度并更新权重。这种方法能够更快地收敛,但由于每次更新都基于单个样本,所以会导致权重更新路径不稳定。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《Vue零基础入门教程》第二课:搭建开发环境

往期内容&#xff1a; 《Vue零基础入门教程》第一课&#xff1a;Vue简介 1 搭建开发环境 Vue环境分为两种 不使用构建工具使用构建丁具 首先&#xff0c;我们会介绍 不使用构建工具 的环境,在组件化章节中介绍 使用构建工具 的方式 1) 初始化 使用如下指令初始化 npm i…

【IDEA】解决总是自动导入全部类(.*)问题

文章目录 问题描述解决方法 我是一名立志把细节说清楚的博主&#xff0c;欢迎【关注】&#x1f389; ~ 原创不易&#xff0c; 如果有帮助 &#xff0c;记得【点赞】【收藏】 哦~ ❥(^_-)~ 如有错误、疑惑&#xff0c;欢迎【评论】指正探讨&#xff0c;我会尽可能第一时间回复…

Acme PHP - Let‘s Encrypt

Lets Encrypt是一个于2015年三季度推出的数字证书认证机构&#xff0c;旨在以自动化流程消除手动创建和安装证书的复杂流程&#xff0c;并推广使万维网服务器的加密连接无所不在&#xff0c;为安全网站提供免费的SSL/TLS证书。 使用PHP来更新证书&#xff1a; Acme PHP | Rob…

【Linux清空显存占用】Linux 系统中清理 GPU 显存

操作指令 # 查看NVIDIA GPU状态和进程 nvidia-smi # 查找所有包含"python"的进程 ps -ef grep python # 强制结束进程号为3023的进程 kill -9 3023截图演示 在 Linux 系统中清理 GPU 显存可以采用以下方法&#xff1a; 1. 终止特定进程&#xff08;常用方法&#x…

【网络】网络抓包与协议分析

网络抓包与协议分析 一. 以太网帧格式分析 这是以太网数据帧的基本格式&#xff0c;包含目的地址(6 Byte)、源地址(6 Byte)、类型(2 Byte)、数据(46~1500 Byte)、FCS(4 Byte)。 Mac 地址类型 分为单播地址、组播地址、广播地址。 单播地址&#xff1a;是指第一个字节的最低位…

IC脚本之perl

Perl 是一种功能丰富的计算机程序语言&#xff0c;运行在超过100种计算机平台上。IC flow 的 流传的古老版本大多是也是使用这种语言&#xff0c;这里会对Perl的常用知识点进行总结。 Note: 所有的语句必须以 “ &#xff1b;”结尾&#xff1b;所有的数据必须先定义才可以使…

MEMS硅麦克风应用电子烟雾化产业稳步爬升,耐高温、 防油、防酸、防腐蚀等性能优势和可实现自动化贴片及极高的一致性等特性使其必将成为主流

全球范围内&#xff0c;电子烟行业正处于快速发展的阶段。随着消费者健康意识的提升和对传统烟草制品替代品需求的增加&#xff0c;电子烟市场获得了显著的增长。然而&#xff0c;伴随而来的监管挑战和消费者期待的变化&#xff0c;也促使行业不断进行技术创新和产品优化。特别…

双因子认证:统一运维平台安全管理策略

01双因子认证概述 双因子认证&#xff08;Two-Factor Authentication&#xff0c;简称2FA&#xff09;是一种身份验证机制&#xff0c;它要求用户提供两种不同类型的证据来证明自己的身份。这通常包括用户所知道的&#xff08;如密码&#xff09;、用户所拥有的&#xff08;如…

快慢指针应用---环型链表的应用

1.题目--判断链表是否成环 已经了解了快慢指针的应用原理&#xff0c;引申&#xff1a;用快慢指针去判断链表是否成环。 题解 简而言之&#xff0c;在fast和slow指针遍历的这种情况下&#xff0c;如果链表是成环的&#xff0c;那么在循环遍历了两次后&#xff0c;fast指针就会…

三、计算机视觉_06YOLO基础知识

1、YOLO概述 1.1 定义 YOLO&#xff08;You Only Look Once&#xff09;是一种流行的对象检测和图像分割模型&#xff0c;由华盛顿大学的 Joseph Redmon 和 Ali Farhadi 于 2015 年推出&#xff0c;因其高速和准确性而迅速受到欢迎 在目标检测领域&#xff0c;传统方法&…

Python Matplotlib 数据可视化全面解析:选择它的七大理由与入门简介

Python Matplotlib数据可视化全面解析&#xff1a;选择它的七大理由与入门简介 本文介绍了Matplotlib这一强大而灵活的数据可视化工具&#xff0c;涵盖其基本概念、独特优势以及为何在众多Python绘图库中脱颖而出。Matplotlib具有广泛的社区支持、高度自定义能力、多样的绘图类…

【Spring Boot】用 MyBatis 实现数据的 CRUD

用 MyBatis 实现数据的 CRUD 1.创建项目 & 引入依赖2.实现数据表的自动初始化3.实现实体对象建模4.实现实体和数据表的映射关系5.实现增加、删除、修改和查询功能6.配置分页功能6.1 增加分页支持6.2 创建分页配置类 7.实现分页控制器8.创建分页视图 本篇博客将通过 MyBatis…

数据结构-二叉树_堆

目录 1.二叉树的概念 ​编辑1.1树的概念与结构 1.2树的相关语 1.3 树的表示 2. ⼆叉树 2.1 概念与结构 2.2 特殊的⼆叉树 2.2.2 完全⼆叉树 2.3 ⼆叉树存储结构 2.3.1 顺序结构 2.3.2 链式结构 3. 实现顺序结构⼆叉树 3.2 堆的实现 3.2.2 向下调整算法 1.二叉树的概…

独家原创 | SCI 1区 高创新预测模型!

往期精彩内容&#xff1a; 时序预测&#xff1a;LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较 全是干货 | 数据集、学习资料、建模资源分享&#xff01; EMD变体分解效果最好算法——CEEMDAN&#xff08;五&#xff09;-CSDN博客 拒绝信息泄露&#xff01;VMD滚动分…

IDEA+Docker一键部署项目SpringBoot项目

文章目录 1. 部署项目的传统方式2. 前置工作3. SSH配置4. 连接Docker守护进程5. 创建简单的SpringBoot应用程序6. 编写Dockerfile文件7. 配置远程部署7.1 创建配置7.2 绑定端口7.3 添加执行前要运行的任务 8. 部署项目9. 开放防火墙的 11020 端口10. 访问项目11. 可能遇到的问题…

Arcgis 地图制作

地图如下,不同历史时期&#xff1a;

【K8S系列】Kubernetes 中如何调试imagePullSecrets配置详细步骤介绍

调试 imagePullSecrets 配置是确保 Kubernetes 能够成功拉取私有镜像所需的关键步骤。以下是详细的调试步骤和建议。 1. 确认 imagePullSecrets 配置 首先&#xff0c;确保在 Pod 的 YAML 配置中正确引用了 imagePullSecrets。其基本结构如下&#xff1a; apiVersion: v1 kin…

山东春季高考-C语言-综合应用题

&#xff08;2018年&#xff09;3.按要求编写以下C语言程序&#xff1a; &#xff08;1&#xff09;从键盘上输入三个整数a、b、c&#xff0c;判断能否以这三个数为边构成三角形&#xff0c;若可以则计算机三角形的面积且保留两位小数&#xff1b;若不可以则输出“不能构成三角…

UE5 第一人称射击项目学习(二)

在上一章节中。 得到了一个根据视角的位置创建actor的项目。 现在要更近一步&#xff0c;对发射的子弹进行旋转。 不过&#xff0c;现在的子弹是圆球形态的&#xff0c;所以无法分清到底怎么旋转&#xff0c;所以需要把子弹变成不规则图形。 现在点开蓝图。 这里修改一下&…

如何实现点击目录跳转到指定位置?【vue】

需求&#xff1a;实现目录点击跳转到指定位置&#xff0c;点击后直接定位到指定模块 效果&#xff1a; 实现方法&#xff1a; &#xff08;1&#xff09;a标签跳转 普通使用&#xff1a; <!DOCTYPE html> <html><head><title>a-Demo</title>&l…