导数和微分
导数和微分
本文主要介绍了导数和微分的概念、区别以及在PyTorch中的应用。文章内容较为专业,主要面向数学和机器学习领域的读者。
导数和微分
导数是描述函数变化率的量,它表示函数在某点的瞬时变化速度和切线斜率。微分是导数的一个线性近似,表示函数在某点处随着自变量变化的增量。导数和微分在本质上都是研究函数变化的工具,但导数更侧重于变化率,而微分更侧重于线性近似和变化量。
导数和微分是微积分中的两个重要概念,它们虽然紧密相关,但有不同的含义和应用。以下是它们的区别:
导数(Derivative)
- 定义:
- 导数是描述函数变化率的一个量。具体来说,函数f(x)在某点x=a处的导数,表示当x在a附近变化时,函数f(x)的变化速度。
- 数学上,导数定义为:
f′(a)=limh→0f(a+h)−f(a)h
- 几何意义:
- 导数在几何上表示曲线y=f(x)在点(a,f(a))处的切线的斜率。
- 表示方法:
- 常见的表示法有f′(x)、dfdx、Df(x)等。
- 应用:
- 导数用于研究函数的单调性、极值、凹凸性等性质,广泛应用于物理学、工程学、经济学等领域。
微分(Differential)
- 定义:
- 微分是导数的一个线性近似。它描述了函数f(x)在某点x=a处的增量与自变量x的增量之间的线性关系。
- 如果f在a处可导,且导数为f′(a),那么函数在a处的微分df可以表示为:
df=f′(a)⋅dx - 其中dx是自变量x的一个增量。
- 几何意义:
- 微分表示的是切线的变化量,它是导数的一个线性近似,适用于小范围内的函数变化。
- 表示方法:
- 微分常表示为dy或df,其中dy=f′(x)⋅dx。
导数描述函数变化率
例子:位置函数和速度
假设有一辆车在直线上行驶,其位置s(单位:米)随时间t(单位:秒)的变化用函数s(t)=t2表示。这意味着在时间t秒时,车的位置是s(t)米。我们想要了解这辆车在某一时刻的速度。速度就是位置随时间变化的速率,也就是位置函数的导数。
- 计算导数:
- 首先,计算位置函数s(t)的导数s′(t):
s′(t)=dtd(t2)=2t - 这个导数s′(t)就是车在时间t秒时的瞬时速度。
- 解释变化率:
- 导数s′(t)描述了车的位置s(t)随时间t变化的速率。例如,在t=3秒时,导数s′(3)=2×3=6米/秒。这意味着在第3秒时,车的速度是每秒6米。
- 更具体地说,导数s′(t)告诉我们,当时间t变化一个非常小的量Δt时,位置s(t)将变化约s′(t)⋅Δt。
具体的变化率例子
假设我们想知道在t=3秒时,车的位置是如何随时间变化的。我们可以计算导数在这个点的值并解释它的含义。
在t=3秒时,车的位置是:
s(3)=32=9米在t=3秒时,车的瞬时速度是:
s′(3)=2×3=6米/秒
如果时间从3秒增加到3.1秒,即Δt=0.1秒,我们可以使用导数来近似计算这段时间内车位置的变化量:近似变化量Δs:
Δs≈s′(3)⋅Δt=6米/秒×0.1秒=0.6米实际位置的变化量:
计算实际位置在3.1秒时的位置:
s(3.1)=(3.1)2=9.61米
实际位置的变化量:
Δs=s(3.1)−s(3)=9.61−9=0.61米
通过这个例子,我们可以看到,导数s′(t)提供了车在某一时刻的位置变化率,近似地描述了车位置随时间变化的情况。这就是导数描述函数变化率的一个具体实例。
微分作为导数的线性近似
例子:函数f(x)=x2
假设我们有一个函数f(x)=x2,我们想要研究这个函数在某个点x=2处的导数和微分。
- 计算导数:
- 首先,计算f(x)的导数f′(x):
f′(x)=dxd(x2)=2x - 在x=2处的导数f′(2)为:
f′(2)=2×2=4
- 微分的线性近似:
- 在x=2处,函数f(x)的微分df表示为:
df=f′(2)⋅dx=4⋅dx - 这里,dx是自变量x的一个小增量。
- 具体例子:估算函数值的变化:
- 现在假设x从2增加到2.1,即dx=0.1。
- 通过微分来近似计算f(x)的变化量df:
df=4⋅0.1=0.4 - 这意味着,当x从2增加到2.1时,函数值f(x)的变化量大约为0.4。
- 现在我们来计算精确的变化量,即f(2.1)−f(2):
f(2.1)=(2.1)2=4.41
f(2)=22=4
f(2.1)−f(2)=4.41−4=0.41 - 由此可见,通过微分得到的近似值0.4与精确变化量0.41非常接近。
在这个例子中,导数f′(2)=4表示函数f(x)=x2在x=2处的瞬时变化率。而微分df=4⋅dx提供了一个线性近似,用于估算当x发生小变化时,函数值f(x)的变化量。这种线性近似在dx很小时非常有效,可以用于快速估算和简化计算。
PyTorch 中的求导(autograd)功能
基本用法
- 计算标量函数的导数
假设我们有一个标量函数f(x)=x2,我们希望计算它的导数。
import torch
# 创建一个张量并启用梯度计算
x = torch.tensor(2.0, requires_grad=True)
# 定义函数
y = x**2
# 计算导数
y.backward()
# 打印导数
print(x.grad) # 输出: tensor(4.0)
在这个例子中:
- 我们创建了一个标量张量 x 并启用了梯度计算(requires_grad=True)。
- 定义了一个函数y = x2。
- 使用 y.backward() 计算导数,这会计算dydx并将其结果存储在 x.grad 中。
- 计算向量函数的导数
对于向量函数,我们可以计算每个分量对输入的梯度。
import torch
# 创建一个张量并启用梯度计算
x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
# 定义函数
y = x**2
# 计算导数,y 是一个向量,因此需要提供梯度的初始值
y.backward(torch.tensor([1.0, 1.0, 1.0]))
# 打印导数
print(x.grad) # 输出: tensor([2.0, 4.0, 6.0])
在这个例子中:
- y 是一个向量函数y=[x12,x22,x32]。
- y.backward() 需要一个与 y 形状相同的张量作为参数,表示每个分量的梯度初始值。
- 结果是 x.grad,它包含了每个分量的导数。