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

2025-04-20 李沐深度学习4 —— 自动求导

文章目录

  • 1 导数拓展
    • 1.1 标量导数
    • 1.2 梯度:向量的导数
    • 1.3 扩展到矩阵
    • 1.4 链式法则
  • 2 自动求导
    • 2.1 计算图
    • 2.2 正向模式
    • 2.3 反向模式
  • 3 实战:自动求导
    • 3.1 简单示例
    • 3.2 非标量的反向传播
    • 3.3 分离计算
    • 3.4 Python 控制流

硬件配置:

  • Windows 11
  • Intel®Core™i7-12700H
  • NVIDIA GeForce RTX 3070 Ti Laptop GPU

软件环境:

  • Pycharm 2025.1
  • Python 3.12.9
  • Pytorch 2.6.0+cu124

1 导数拓展

1.1 标量导数

基本公式

  • 常数: d ( a ) / d x = 0 d(a)/dx = 0 d(a)/dx=0
  • 幂函数: d ( x n ) / d x = n ⋅ x n − 1 d(x^n)/dx = n·x^{n-1} d(xn)/dx=nxn1
  • 指数/对数:
    • d ( e x ) / d x = e x d(e^x)/dx = e^x d(ex)/dx=ex
    • d ( ln ⁡ x ) / d x = 1 / x d(\ln x)/dx = 1/x d(lnx)/dx=1/x
  • 三角函数:
    • d ( sin ⁡ x ) / d x = cos ⁡ x d(\sin x)/dx = \cos x d(sinx)/dx=cosx
    • d ( cos ⁡ x ) / d x = − sin ⁡ x d(\cos x)/dx = -\sin x d(cosx)/dx=sinx
image-20250419111921569

求导法则
d ( u + v ) d x = d u d x + d v d x d ( u v ) d x = u d v d x + v d u d x d f ( g ( x ) ) d x = f ′ ( g ( x ) ) ⋅ g ′ ( x ) \begin{aligned}&\frac{d(u+v)}{dx}=\frac{du}{dx}+\frac{dv}{dx}\\&\frac{d(uv)}{dx}=u\frac{dv}{dx}+v\frac{du}{dx}\\&\frac{df(g(x))}{dx}=f^{\prime}(g(x))\cdotp g^{\prime}(x)\end{aligned} dxd(u+v)=dxdu+dxdvdxd(uv)=udxdv+vdxdudxdf(g(x))=f(g(x))g(x)
不可微函数的导数:亚导数

  • ∣ x ∣ |x| x x = 0 x=0 x=0 时的亚导数: [ − 1 , 1 ] [-1,1] [1,1] 区间任意值。
  • ReLU 函数:max(0,x) x = 0 x=0 x=0 时导数可取 [ 0 , 1 ] [0,1] [0,1]
image-20250419112225706

1.2 梯度:向量的导数

形状匹配规则

函数类型自变量类型导数形状示例
标量 y y y标量 x x x标量 d y / d x = 2 x dy/dx = 2x dy/dx=2x
标量 y y y向量 x \mathbf{x} x行向量 d y / d x = [ 2 x 1 , 4 x 2 ] dy/d\mathbf{x} = [2x_1,4x_2] dy/dx=[2x1,4x2]
向量 y \mathbf{y} y标量 x x x列向量 d y / d x = [ cos ⁡ x , − sin ⁡ x ] T d\mathbf{y}/dx = [\cos x, -\sin x]^T dy/dx=[cosx,sinx]T
向量 y \mathbf{y} y向量 x \mathbf{x} x雅可比矩阵 d y / d x = [ [ 1 , 0 ] , [ 0 , 1 ] ] d\mathbf{y}/d\mathbf{x} = [[1,0],[0,1]] dy/dx=[[1,0],[0,1]]
image-20250419112819630

案例 1

  • y y y x 1 2 + 2 x 2 2 x_1^2 + 2x_2^2 x12+2x22(第一个元素的平方与第二个元素平方的 2 倍之和)
  • x \mathbf{x} x:向量。

d y d x = [ 2 x 1 , 4 x 2 ] \frac{dy}{d\mathbf{x}}=\begin{bmatrix}2x_1,&4x_2\end{bmatrix} dxdy=[2x1,4x2]

  • 几何解释:梯度向量 [2, 4] 指向函数值增长最快方向。
image-20250419113359974
  • 其他情况

    image-20250419113541593

案例 2

  • y \mathbf{y} y:向量。
  • x x x:标量。
image-20250419113648965

案例 3

  • y \mathbf{y} y:向量。
  • x \mathbf{x} x:向量。
image-20250419113904878
  • 其他情况
image-20250419113933471

1.3 扩展到矩阵

image-20250419114117161

1.4 链式法则

标量链式法则的向量化

​ 当 y = f ( u ) , u = g ( x ) y = f(u), u = g(x) y=f(u),u=g(x) 时:
d y d x = d y d u ⋅ d u d x \frac{dy}{d\mathbf{x}}=\frac{dy}{du}\cdot\frac{du}{d\mathbf{x}} dxdy=dudydxdu

  • d y / d u dy/du dy/du:标量 → 形状不变
  • d u / d x du/dx du/dx:若 u u u 是向量, x x x 是向量 → 雅可比矩阵(形状 [ d i m ( u ) , d i m ( x ) ] [dim(u), dim(x)] [dim(u),dim(x)]
image-20250419114750475

多变量链式法则
d z d w = d z d b ⋅ d b d a ⋅ d a d w = 2 b ⋅ 1 ⋅ x T \frac{dz}{d\mathbf{w}}=\frac{dz}{db}\cdot\frac{db}{da}\cdot\frac{da}{d\mathbf{w}}=2b\cdot1\cdot\mathbf{x}^T dwdz=dbdzdadbdwda=2b1xT

  • 示例:线性回归 z = ( x T w − y ) 2 z = (x^Tw - y)^2 z=(xTwy)2 的梯度计算
image-20250419114839290

2 自动求导

​ 自动求导计算一个函数在指定值上的导数,它有别于

  • 符号求导
  • 数值求导
image-20250420134058142

2.1 计算图

构建原理

  • 将代码分解成操作子

  • 将计算表示成一个无换图

    • 节点:输入变量(如 x , w , y x,w,y x,w,y)或基本操作(如 + , − , × +,-,× +,,×

    • 边:数据流向

image-20250420134206599

显式 vs 隐式构造

类型代表框架特点
显式TensorFlow,Mxnet,Theano先定义计算图,后喂入数据
隐式PyTorch,Mxnet动态构建图,操作即记录
image-20250420134557212

2.2 正向模式

​ 从输入到输出逐层计算梯度,每次计算一个输入变量对输出的梯度,通过链式法则逐层传递梯度。

​ 以 z = ( x ⋅ w − y ) 2 z = (x \cdot w - y)^2 z=(xwy)2 为例(线性回归损失函数):

# 正向计算过程
a = x * w    # a对x的梯度:∂a/∂x = w
b = a - y    # b对a的梯度:∂b/∂a = 1
z = b ** 2   # z对b的梯度:∂z/∂b = 2b
  • 特点:每次只能计算一个输入变量(如 xw)的梯度,需多次计算。

  • 计算复杂度:O(n)n 为输入维度)

  • 内存复杂度:O(1)(不需要存储中间结果)

  • 适用场景:输入维度低(如参数少)、输出维度高的函数。

2.3 反向模式

​ 从输出到输入反向传播梯度,一次性计算所有输入变量对输出的梯度。

数学原理

  • 前向计算

    计算所有中间值(a,b,z)并存储。

  • 反向传播(Back Propagation,也称反向传递)

    从输出z开始,按链式法则逐层回传梯度。

    先计算 ∂z/∂b = 2b,再计算 ∂b/∂a = 1,最后计算 ∂a/∂x = w

image-20250420134829609

​ 同样以 z = ( x ⋅ w − y ) 2 z = (x \cdot w - y)^2 z=(xwy)2 为例:

  1. 前向计算

    a = x * w    # 存储 a
    b = a - y    # 存储 b
    z = b ** 2
    
  2. 反向传播

    dz_db = 2 * b          # ∂z/∂b
    db_da = 1              # ∂b/∂a
    da_dx = w              # ∂a/∂x
    dz_dx = dz_db * db_da * da_dx  # 最终梯度
    
image-20250420135917081
  • 计算复杂度:O(n)(与正向模式相同)
  • 内存复杂度:O(n)(需存储所有中间变量)
  • 适用场景:深度学习(输入维度高,输出为标量损失函数)。

3 实战:自动求导

3.1 简单示例

​ 以函数 y = 2 x ⊤ x y=2\mathbf{x}^{\top}\mathbf{x} y=2xx 为例,关于列向量 x \mathbf{x} x 求导。

  1. 首先,创建变量x并为其分配一个初始值。

    import torchx = torch.arange(4.0)
    x
    
    image-20250420214507130
  2. 在计算 y y y 关于 x \mathbf{x} x 的梯度之前,需要一个地方来存储梯度。

    我们不会在每次对一个参数求导时都分配新的内存。

    因为我们经常会成千上万次地更新相同的参数,每次都分配新的内存可能很快就会将内存耗尽。

    注意,一个标量函数关于向量 x \mathbf{x} x 的梯度是向量,并且与 x \mathbf{x} x 具有相同的形状。

    x.requires_grad_(True)  # 等价于x=torch.arange(4.0,requires_grad=True)
    x.grad  # 默认值是None
    
  3. 现在计算 y y y

    y = 2 * torch.dot(x, x)
    y
    
    image-20250420214911500
  4. x是一个长度为 4 的向量,计算xx的点积,得到了我们赋值给y的标量输出。
    接下来,通过调用反向传播函数来自动计算y关于x每个分量的梯度,并打印这些梯度。

    y.backward()
    x.grad
    
    image-20250420215014257
  5. 函数 y = 2 x ⊤ x y=2\mathbf{x}^{\top}\mathbf{x} y=2xx 关于 x \mathbf{x} x 的梯度应为 4 x 4\mathbf{x} 4x。让我们快速验证这个梯度是否计算正确。

    x.grad == 4 * x
    
    image-20250420215153504
  6. 探究x的另一个函数。

    # 在默认情况下,PyTorch会累积梯度,我们需要清除之前的值
    x.grad.zero_()
    y = x.sum()
    y.backward()
    x.grad
    
    image-20250420215427676

3.2 非标量的反向传播

​ 当y不是标量时,向量y关于向量x的导数的最自然解释是一个矩阵。

​ 对于高阶和高维的yx,求导的结果可以是一个高阶张量。

​ 虽然这些更奇特的对象确实出现在高级机器学习中(包括[深度学习中]),但当调用向量的反向计算时,我们通常会试图计算一批训练样本中每个组成部分的损失函数的导数。
​ 这里,我们的目的不是计算微分矩阵,而是单独计算批量中每个样本的偏导数之和。

# 对非标量调用backward需要传入一个gradient参数,该参数指定微分函数关于self的梯度。
# 本例只想求偏导数的和,所以传递一个1的梯度是合适的
x.grad.zero_()
y = x * x
# 等价于y.backward(torch.ones(len(x)))
y.sum().backward()
x.grad
image-20250420220408467

理解

  1. x.grad.zero_()

    • 作用:清空 x 的梯度(grad)缓存。

    • 为什么需要清零?

      • PyTorch 会累积梯度(grad),如果之前已经计算过 x 的梯度(比如在循环中多次 backward()),新的梯度会加到旧的梯度上。
      • 调用 zero_() 可以避免梯度累积,确保每次计算都是新的梯度。

  1. y = x \* x

    • 计算 y = x²(逐元素相乘)。

    • 例如:

      • 如果 x = [1, 2, 3],那么 y = [1, 4, 9]

  1. y.backward(torch.ones(len(x)))

    • backward() 的作用:计算 yx 的梯度(即 dy/dx)。
    • 为什么需要 gradient 参数?
      • 如果 y 是 标量(单个值),可以直接调用 y.backward(),PyTorch 会自动计算 dy/dx
      • 但如果 y 是 非标量(向量/矩阵),PyTorch 不知道如何计算梯度,必须传入一个 gradient 参数(形状和 y 相同),表示 y 的梯度权重。
    • gradient=torch.ones(len(x)) 的含义:
      • 这里 gradient 是一个全 1 的张量,表示我们希望计算 y 的所有分量对 x 的 梯度之和(相当于 sum(y)x 的梯度)。
      • 数学上:
        • y = [y₁, y₂, y₃] = [x₁², x₂², x₃²]
        • sum(y) = x₁² + x₂² + x₃²
        • d(sum(y))/dx = [2x₁, 2x₂, 2x₃](这就是 x.grad 的结果)

  1. 结果 x.grad

    • 由于 y = x²dy/dx = 2x

    • 由于 gradient=torch.ones(len(x)),PyTorch 计算的是 sum(y) 的梯度:

      • x.grad = [2x₁, 2x₂, 2x₃](即 2 * x)。
    • 例如:

      • 如果 x = [1, 2, 3],那么 x.grad = [2, 4, 6]

3.3 分离计算

​ 有时,我们希望将某些计算移动到记录的计算图之外。例如,假设y是作为x的函数计算的,而z则是作为yx的函数计算的。

​ 想象一下,我们想计算z关于x的梯度,但由于某种原因,希望将y视为一个常数,并且只考虑到xy被计算后发挥的作用。这里可以分离y来返回一个新变量u,该变量与y具有相同的值,但丢弃计算图中如何计算y的任何信息?

​ 换句话说,梯度不会向后流经ux。因此,下面的反向传播函数计算z = u * x关于x的偏导数,同时将u作为常数处理,而不是z = x * x * x关于x的偏导数。

x.grad.zero_()
y = x * x
u = y.detach()
z = u * xz.sum().backward()
x.grad == u
image-20250420222006669

​ 由于记录了y的计算结果,我们可以随后在y上调用反向传播,得到y = x * x关于的x的导数,即2 * x

x.grad.zero_()
y.sum().backward()
x.grad == 2 * x
image-20250420225127299

3.4 Python 控制流

​ 使用自动微分的一个好处是:即使构建函数的计算图需要通过 Python 控制流(例如,条件、循环或任意函数调用),我们仍然可以计算得到的变量的梯度。
​ 在下面的代码中,while循环的迭代次数和if语句的结果都取决于输入a的值。

def f(a):# type: (torch.Tensor)->torch.Tensorb = a * 2while b.norm() < 1000:b = b * 2if b.sum() > 0:c = belse:c = 100 * breturn c

​ 让我们计算梯度。

a = torch.randn(size=(), requires_grad=True)
d = f(a)
d.backward()

​ 我们现在可以分析上面定义的f函数。请注意,它在其输入a中是分段线性的。换言之,对于任何a,存在某个常量标量k,使得f(a)=k*a,其中k的值取决于输入a,因此可以用d/a验证梯度是否正确。

a.grad, d / a, a.grad == d / a
image-20250420225434814

相关文章:

2025-04-20 李沐深度学习4 —— 自动求导

文章目录 1 导数拓展1.1 标量导数1.2 梯度&#xff1a;向量的导数1.3 扩展到矩阵1.4 链式法则 2 自动求导2.1 计算图2.2 正向模式2.3 反向模式 3 实战&#xff1a;自动求导3.1 简单示例3.2 非标量的反向传播3.3 分离计算3.4 Python 控制流 硬件配置&#xff1a; Windows 11Inte…...

Nginx在微服务架构项目(Spring Cloud)中的强大作用

文章目录 一、Nginx是什么&#xff1f;二、Nginx在微服务架构&#xff08;Spring Cloud&#xff09;项目中的作用1.前端静态资源托管2.反向代理后端 API3.负载均衡4.SSL 证书与 HTTPS 支持5.缓存与压缩优化6.安全防护7.灰度发布与流量控制8.跨域处理&#xff08;CORS&#xff0…...

Mysql相关知识2:Mysql隔离级别、MVCC、锁

文章目录 MySQL的隔离级别可重复读的实现原理Mysql锁按锁的粒度分类按锁的使用方式分类按锁的状态分类 MySQL的隔离级别 在 MySQL 中&#xff0c;隔离级别定义了事务之间相互隔离的程度&#xff0c;用于控制一个事务对数据的修改在何时以及如何被其他事务可见。MySQL 支持四种…...

解决IDEA创建SpringBoot项目没有Java版本8

问题&#xff1a;idea2023版本创建springboot的过程中&#xff0c;选择java版本时发现没有java8版本&#xff0c;只有java17和java20 原因&#xff1a;spring2.X版本在2023年11月24日停止维护了&#xff0c;因此创建spring项目时不再有2.X版本的选项&#xff0c;只能从3.1.X版本…...

第十章:Agent 的评估、调试与可观测性:确保可靠与高效

引言 随着我们一步步构建出越来越复杂的 AI Agent&#xff0c;赋予它们高级工具和更智能的策略&#xff0c;一个至关重要的问题浮出水面&#xff1a;我们如何知道这些 Agent 是否真的有效、可靠&#xff1f;当它们行为不符合预期时&#xff0c;我们又该如何诊断和修复问题&…...

8节串联锂离子电池组可重构buck-boost均衡拓扑结构 simulink模型仿真

8节串联锂离子电池组 极具创新性 动态分组均衡策略&#xff0c;支持3种均衡模式 1.最高SOC电池给最低SOC电池均衡 2.高能电池组电池给最低SOC电池均衡 3.高能电池组电池给低能电池组电池均衡 支持手动设置均衡开启阈值和终止阈值 均衡效果非常好...

Oracle EBS COGS Recognition重复生成(一借一贷)

背景 月结用户反馈“发出商品”(实际为递延销货成本)不平,本月都是正常操作月结程序,如正常操作步骤如下: 记录订单管理事务处理 (Record Order Management Transactions)收集收入确认信息 (Collect Revenue Recognition Information)生成销货成本确认事件 (Generate COGS …...

Linux命令--将控制台的输入写入文件

原文网址&#xff1a;Linux命令--将控制台的输入写入文件-CSDN博客 简介 本文介绍Linux将控制台的输入写入文件的方法。 方案1&#xff1a;cat > file1&#xff08;推荐&#xff09; 普通用法 cat > file1 输入结束后&#xff0c;用CtrlD退出。 示例 使用root权限…...

使用BQ76PL455和STM32的SAE电动方程式电动汽车智能BMS

BMS对任何电动汽车来说都是必不可少的&#xff0c;它可以监控电池的行为&#xff0c;确保安全行驶。 该项目旨在降低成本&#xff0c;同时为每个电池模块提供可扩展的BMS。BQ76PL455具有监测6-16个单元的能力&#xff0c;8通道辅助输入(用于温度监测)和多达15个其他ic用于Daisy…...

OpenCV 模板与多个对象匹配方法详解(继OpenCV 模板匹配方法详解)

文章目录 前言1.导入库2.图片预处理3.输出模板图片的宽和高4.模板匹配5.获取匹配结果中所有符合阈值的点的坐标5.1 threshold 0.9&#xff1a;5.2 loc np.where(res > threshold)&#xff1a; 6.遍历所有匹配点6.1 loc 的结构回顾6.2 loc[::-1] 的作用6.2.1 为什么需要反转…...

7.0/Q1,Charls最新文章解读

文章题目&#xff1a;Anti-hypertensive medication adherence, socioeconomic status, and cognitive aging in the Chinese community-dwelling middle-aged and older adults ≥ 45 years: a population-based longitudinal study DOI&#xff1a;10.1186/s12916-025-03949-…...

【第三十二周】CLIP 论文阅读笔记

CLIP 摘要Abstract文章信息引言方法预训练推理Q&A 关键代码实验结果总结 摘要 本篇博客介绍了CLIP&#xff08;Contrastive Language-Image Pre-training&#xff09;&#xff0c;这是OpenAI于2021年提出的多模态预训练模型&#xff0c;其核心思想是通过对比学习将图像与文…...

在 Ubuntu 系统上安装 PostgreSQL

在 Ubuntu 系统上安装 PostgreSQL 的完整指南&#xff1a; 一、安装 PostgreSQL&#xff08;最新版本&#xff09; 1. 更新软件包列表&#xff1a; bash sudo apt update 2. 安装 PostgreSQL 和客户端工具&#xff1a; bash sudo apt install postgresql po…...

【MySQL】数据类型

&#x1f3e0;个人主页&#xff1a;Yui_ &#x1f351;操作环境&#xff1a;Centos7 &#x1f680;所属专栏&#xff1a;MySQL 文章目录 前言1. bit类型2.tinyint类型3. float类型4. decimal5. char类型6. varchar5&6 char和varchar的比较7.日期和时间类型8.enum和set总结 …...

Mac上Cursor无法安装插件解决方法

可能是微软的vscode被cursor这些新晋的AI-IDE白嫖够了&#xff0c;所以现在被制裁了&#xff0c;cursor下载不了vscode插件了。​需要自己修改扩展商店源。 近期微软调整了 API 鉴权策略或限制了非官方客户端的访问权限。 解决方案 一、找到 product.json 文件 打开终端&…...

PI0 Openpi 部署(仅测试虚拟环境)

https://github.com/Physical-Intelligence/openpi/tree/main 我使用4070tisuper, 14900k,完全使用官方默认设置&#xff0c;没有出现其他问题。 目前只对examples/aloha_sim进行测试&#xff0c;使用docker进行部署, 默认使用pi0_aloha_sim模型(但是文档上没找到对应的&…...

NumPy数组和二维列表的区别

在 Python 中&#xff0c;NumPy 数组和二维列表在性能方面存在诸多不同&#xff0c;下面从存储方式、内存占用、操作速度、缓存局部性这几个角度详细分析。 存储方式 二维列表&#xff1a;它是 Python 内置的数据结构&#xff0c;列表中的每个元素实际上是一个引用&#xff0…...

学习设计模式《四》——单例模式

一、基础概念 单例模式的本质【控制实例数目】&#xff1b; 单例模式的定义&#xff1a;是用来保证这个类在运行期间只会被创建一个类实例&#xff1b;单例模式还提供了一个全局唯一访问这个类实例的访问点&#xff08;即GetInstance方法&#xff09;单例模式只关心类实例的创建…...

构建具备推理与反思能力的高级 Prompt:LLM 智能代理设计指南

在构建强大的 AI 系统&#xff0c;尤其是基于大语言模型&#xff08;LLM&#xff09;的智能代理&#xff08;Agent&#xff09;时&#xff0c;Prompt 设计的质量决定了系统的智能程度。传统 Prompt 通常是简单的问答或填空式指令&#xff0c;而高级任务需要更具结构性、策略性和…...

NLP 梳理03 — 停用词删除和规范化

一、说明 前文我们介绍了标点符号删除、文本的大小写统一&#xff0c;本文介绍英文文章的另一些删除内容&#xff0c;停用词删除。还有规范化处理。 二、什么是停用词&#xff0c;为什么删除它们&#xff1f; 2.1 停用词的定义 停用词是语言中的常用词&#xff0c;通常语义…...

算法—插入排序—js(小数据或基本有序数据)

插入排序原理&#xff1a;&#xff08;适合小规模数据&#xff09; 将数组分为“已排序”和“未排序”两部分&#xff0c;逐个将未排序元素插入到已排序部分的正确位置。 特点&#xff1a; 时间复杂度&#xff1a;平均 O(n)&#xff0c;最优&#xff08;已有序&#xff09;O(n…...

家庭电脑隐身后台自动截屏软件,可远程查看

7-4 本文介绍一个小软件&#xff0c;可以在电脑后台运行&#xff0c;并且记录电脑的屏幕画面保存下来&#xff0c;并且可以远程提取查看。 可以用于记录长时间运行的软件的执行画面过程&#xff0c;或者用于记录家庭中小孩使用电脑的过程&#xff0c;如果没有好好上网课&…...

【Agent】AI智能体评测基座AgentCLUE-General

note AgentCLUE-General将题目划分为“联网检索”、“数据分析”、“多模态理解”和“多场景组合”任务AgentCLUE-General为每个题目都提供一个标准答案&#xff0c;将Agent智能体的答案与标准答案进行规则匹配判断对错 文章目录 note一、任务划分和场景划分二、答案提取的pro…...

最新iOS性能测试方法与教程

一、工具instrument介绍 使用Xcode的instrument进行测试&#xff0c;instrument自带了很多性能方面的测试工具&#xff0c;如图所示&#xff1a; 二、常见性能测试内容 不管是安卓还是iOS的性能测试&#xff0c;常见的性能测试都要包含这五个方面&#xff1a; 1、内存&#xff…...

多模态大语言模型arxiv论文略读(三十)

Mastering Text-to-Image Diffusion: Recaptioning, Planning, and Generating with Multimodal LLMs ➡️ 论文标题&#xff1a;Mastering Text-to-Image Diffusion: Recaptioning, Planning, and Generating with Multimodal LLMs ➡️ 论文作者&#xff1a;Ling Yang, Zhao…...

【AI论文】CLIMB:基于聚类的迭代数据混合自举语言模型预训练

摘要&#xff1a;预训练数据集通常是从网络内容中收集的&#xff0c;缺乏固有的领域划分。 例如&#xff0c;像 Common Crawl 这样广泛使用的数据集并不包含明确的领域标签&#xff0c;而手动整理标记数据集&#xff08;如 The Pile&#xff09;则是一项劳动密集型工作。 因此&…...

AI大模型发展现状与MCP协议诞生的技术演进

1. 大模型能力边界与用户痛点&#xff08;2023年&#xff09; 代表模型&#xff1a;GPT-4&#xff08;OpenAI&#xff09;、Claude 3&#xff08;Anthropic&#xff09;、通义千问&#xff08;阿里云&#xff09;等展现出强大的生成能力&#xff0c;但存在明显局限&#xff1a…...

从malloc到free:动态内存管理全解析

1.为什么要有动态内存管理 我们已经掌握的内存开辟方法有&#xff1a; int main() {int val 20;//在栈空间上开辟四个字节char arr[20] { 0 };//在栈空间上开辟10个字节的连续空间return 0; }上述开辟的内存空间有两个特点&#xff1a; 1.空间开辟的时候大小已经固定 2.数组…...

CSS值和单位

CSS值和单位 CSS 中的值和单位是构建样式的基础&#xff0c;它们定义了属性的具体表现方式。值用于定义样式属性的具体取值&#xff0c;而单位用于指定这些值的度量方式。CSS中常用的值和单位如下&#xff1a; 1.长度单位 px : 像素&#xff0c;绝对单位 em : 相对于元素的字…...

Redis高级篇之I/O多路复用的引入解析

文章目录 一、问题背景1. 高并发连接的管理2. 避免阻塞和延迟3. 减少上下文切换开销4. 高效的事件通知机制5. 简化编程模型6. 低延迟响应本章小节 二、I/O多路复用高性能的本质1. 避免无意义的轮询&#xff1a;O(1) 事件检测2. 非阻塞 I/O 零拷贝&#xff1a;最大化 CPU 利用率…...

FTP协议命令和响应码

文章目录 &#x1f4e6; 一、什么是 FTP 协议&#xff1f;&#x1f9fe; 二、FTP 常见命令&#xff08;客户端发送&#xff09;&#x1f4e1; 三、FTP 响应码&#xff08;服务端返回&#xff09;&#x1f4cc; 响应码分类&#xff08;第一位&#xff09;✅ 常见成功响应码&…...

在win上安装Ubuntu安装Anaconda(linx环境)

一&#xff0c;安装Ubuntu 1. 在 Microsoft 商城去下载Ubuntu(LTS:是长期维护的版本) 2.安装完之后启动程序&#xff0c;再重新打开一个黑窗口&#xff1a; wsl --list --verbose 3.关闭Ubuntu wsl --shutdown Ubuntu-22.04 WSL2 Ubuntu-20.04文件太占c盘空间&#xff0c;…...

【Elasticsearch入门到落地】11、RestClient初始化索引库

接上篇《10、初始化RestClient》 上一篇我们已经完成了RestHighLevelClient的初始化工作&#xff0c;本篇将正式进入索引库的创建阶段。我们将使用Java代码来创建酒店数据的索引库。 一、准备工作 1. 创建常量类 首先&#xff0c;我们需要定义一个常量类来存放索引库的mappi…...

远程服务调用的一些注意事项

引言 最近工作中&#xff0c;遇到了一些关于远程服务调用的问题&#xff0c;背景是调用三方接口获取某些特征数据&#xff0c;但由于调用出现了超时&#xff0c;导致业务本身的接口的可用行降低。因此整理一些远程服务调用时的注意事项&#xff0c;通过不同维度的考虑来提高系…...

QML 样式库

在 QML 中&#xff0c;样式库&#xff08;或 UI 框架&#xff09;用于快速构建一致且美观的界面。Qt/QML 本身不提供内置的完整样式库&#xff0c;但可以通过以下方式实现样式管理或使用第三方库。 1. Qt Quick Controls 2 样式系统 Qt Quick Controls 2 是官方提供的 UI 组件…...

[RHEL8] 指定rpm软件包的更高版本模块流

背景&#xff1a;挂载RHEL ISO使用kickstart安装操作系统&#xff0c;安装包未指定安装perl&#xff0c;但是安装完可以查到其版本&#xff0c;且安装的是ISO中多个版本中的最低版本。 原因&#xff1a;&#xff08;1&#xff09;为什么没有装perl&#xff0c;perl -v可以看到版…...

使用Python可视化洛伦兹变换

引言 大家好!今天我们将探讨一个非常有趣且重要的物理概念—洛伦兹变换。它是相对论的核心内容之一,描述了在高速运动下,时间、长度以及其他物理量是如何发生变化的。通过使用 Python 进行可视化,我们不仅可以更好地理解这个概念,还能感受到物理世界中的奇妙之处。 什么…...

【二叉树专题】一道深入浅出的 DFS 题:求二叉树的直径(含通俗易懂讲解)

题目&#xff1a; 给你一棵二叉树的根节点&#xff0c;返回这棵树的 直径。 直径 是任意两个节点路径中&#xff0c;最长的一条路径所经过的边数。 比如下面这棵树&#xff1a; 1/ \2 3/ \ 4 5它的最长路径是&#xff1a;4 → 2 → 5 或者 4 → 2 → 1 → 3&#xff0c…...

考研系列-计算机网络-第三章、数据链路层

一、数据链路层的功能 1.知识点总结 2.习题总结...

医药采购系统平台第10天02:按药品分类的统计按供货商统计按医院统计统计数据的导出DWR的配置和应用

如果想要获取相关的源码&#xff0c;笔记&#xff0c;和相关工具&#xff0c;对项目需求的二次开发&#xff0c;可以关注我并私信&#xff01;&#xff01;&#xff01; 一 按药品分类的统计实现 1 按药品分类统计的需求 按药品统计&#xff1a;在指定时间段中采购量、采购金…...

Navicat、DataGrip、DBeaver在渲染 BOOLEAN 类型字段时的一种特殊“视觉风格”

文章目录 前言✅ 为什么 Boolean 字段显示为 [ ]&#xff1f;✅ 如何验证实际数据类型&#xff1f;✅ 小结 前言 看到的 deleted: [ ] 并不是 Prisma 的问题&#xff0c;而是数据库客户端&#xff08;如 Navicat、DataGrip、DBeaver&#xff09;在渲染 BOOLEAN 类型字段时的一种…...

(undone) 吴恩达版提示词工程 2. 指南

url: https://www.bilibili.com/video/BV1Z14y1Z7LJ?spm_id_from333.788.videopod.episodes&vd_source7a1a0bc74158c6993c7355c5490fc600&p2 别人的笔记 url: https://zhuanlan.zhihu.com/p/626966526 指导原则&#xff08;Guidelines&#xff09; 编写提示词有两个…...

VLC搭建本机的rtsp直播推流和拉流

媒体---流---捕获设备&#xff0c;选择摄像头&#xff0c;点击串流 x下一步 选择rtsp&#xff0c;点击添加 看到了端口&#xff0c;并设置路径&#xff1a; 选择Video -H 264 mp3(TS) 点击下一个&#xff0c; 点击流&#xff0c;就开始推流了 拉流&#xff0c;观看端&#x…...

Rocky Linux 9.1 修改网卡和DNS

在 Rocky Linux 9.1 中修改网卡和 DNS 配置可以通过 NetworkManager 工具实现(推荐)或直接编辑配置文件。以下是两种方法的详细步骤: 方法一:使用 nmcli 命令行工具(动态生效) 查看当前网络连接nmcli connection show # 输出示例: # NAME UUID …...

Web前端:常用的布局属性

常见的布局方式有哪些&#xff1f; float&#xff1a;浮动布局 ​position 定位布局 ​flex 弹性布局&#xff08;display&#xff09; ​table 表格布局&#xff08;弃用&#xff09; 一、HTML5 语义化布局标签 这些标签本身不提供布局能力&#xff0c;但能增强页面结构…...

XSS学习2

一、客户端的Cookie 1. 无状态的影响 无状态问题: HTTP协议的无状态特性导致每次请求都是独立的&#xff0c;无法保持会话。例如&#xff0c;在银行办理业务时&#xff0c;柜员不需要重复询问客户信息&#xff0c;但在计算机网络中&#xff0c;每次HTTP请求都需要重新认证用户…...

软件设计师/系统架构师---计算机网络

概要 什么是计算机网络&#xff1f; 计算机网络是指将多台计算机和其他设备通过通信线路互联&#xff0c;以便共享资源和信息的系统。计算机网络可以有不同的规模&#xff0c;从家庭网络到全球互联网。它们可以通过有线&#xff08;如以太网&#xff09;或无线&#xff08;如W…...

Kubernetes(k8s)学习笔记(二)--k8s 集群安装

1、kubeadm kubeadm 是官方社区推出的一个用于快速部署 kubernetes 集群的工具。这个工具能通过两条指令完成一个 kubernetes 集群的部署&#xff1a; 1.1 创建一个 Master 节点$ kubeadm init 1.2 将一个 Node 节点加入到当前集群中$ kubeadm join <Master 节点的 IP 和…...

线性DP:最长上升子序列(子序列可不连续,子数组必须连续)

目录 Q1&#xff1a;简单遍历 Q2&#xff1a;变式&#xff08;加大数据量&#xff09; Q1&#xff1a;简单遍历 Dp问题 状态表示 f(i,j) 集合所有以第i个数结尾的上升子序列集合-f(i,j)的值存的是什么序列长度最大值max- 状态计算 &#xff08;其实质是集合的划分&#xff09;…...

SpringBoot 基本原理

SpringBoot 为我们做的自动配置&#xff0c;确实方便快捷&#xff0c;但一直搞不明白它的内部启动原理&#xff0c;这次就来一步步解开 SpringBoot 的神秘面纱&#xff0c;让它不再神秘。 目录 SpringBootApplication 背后的秘密 Configuration ComponentScan EnableAutoC…...