关于导数\偏导数的理解以及Pytorch实现
偏导数用于衡量多元函数中,某个自变量在其他自变量保持不变时,函数值随该自变量的变化率。
下面结合函数 \(y = \frac{1}{2}(x_1^2 + x_2^2)\) 在点\(x_1 = 2\),\(x_2 = 4\) 时来具体解释。
偏导数$\frac{\partial y}{\partial x_1}$
$\frac{\partial y}{\partial x_1}$ 表示在 $x_2$ 保持不变的情况下,$y$ 随 $x_1$ 的变化率。当 $x_1 = 2$,$x_2 = 4$ 时,不难得出 $\frac{\partial y}{\partial x_1}=2$。这意味着,在 $x_2 = 4$ 这个固定值的前提下,$x_1$ 有一个单位的微小变化时,$y$ 大约会有 $2$ 个单位的变化[1]。若 $x_1$ 增加 $1$ 个单位(变为 $3$),在不考虑高阶无穷小的情况下,$y$ 大约会增加 $2$ 个单位;若 $x_1$ 减少 $1$ 个单位(变为 $1$),$y$ 大约会减少 $2$ 个单位。
偏导数$\frac{\partial y}{\partial x_2}$
$\frac{\partial y}{\partial x_2}$ 表示在 $x_1$ 保持不变的情况下,$y$ 随 $x_2$ 的变化率。当 $x_1 = 2$,$x_2 = 4$ 时,$\frac{\partial y}{\partial x_2}=4$。也就是说,在 $x_1 = 2$ 这个固定值的前提下,$x_2$ 有一个单位的微小变化时,$y$ 大约会有 $4$ 个单位的变化。若 $x_2$ 增加 $1$ 个单位(变为 $5$),在不考虑高阶无穷小的情况下,$y$ 大约会增加 $4$ 个单位;若 $x_2$ 减少 $1$ 个单位(变为 $3$),$y$ 大约会减少 $4$ 个单位。
总的来说,偏导数给出了函数在某一点处,沿着某个自变量方向的变化率信息,有助于分析多元函数的局部变化特性。
PyTorch 实现
import torch
array = [2, 4]
x = torch.tensor(array, dtype=torch.float32, requires_grad=True) # 创建一个 Tensor,并设置 requires_grad=True
y = x**2
print(f"y: {y}")
o = (1/2)*torch.sum(y) # 使用 torch.sum 进行求和
print(f"o: {o}")
o.backward()
print(f"Gradient: {x.grad}")
# 输出内容
# y: tensor([ 4., 16.], grad_fn=<PowBackward0>)
# o: 10.0
# Gradient: tensor([2., 4.])
代码分析
1. 导入必要的库
import torch
这行代码导入了 PyTorch 库,后续就可以使用 PyTorch 提供的各种功能,如创建张量、进行张量运算以及自动求导等。
2. 创建可求导的张量
array = [2, 4]
x = torch.tensor(array, dtype=torch.float32, requires_grad=True)
torch.tensor()函数用于将 Python 列表array转换为 PyTorch 张量。dtype=torch.float32指定了张量的数据类型为 32 位浮点数。requires_grad=True表示需要对该张量进行梯度计算,即后续在反向传播时会计算关于x的梯度。
3. 计算 y
y = x**2
print(f"y: {y}")
对 x 中的每个元素进行平方操作,得到一个新的张量 y。这里使用 print 函数输出 y 的值。
4. 计算 o
o = (1/2)*torch.sum(y)
print(f"o: {o}")
torch.sum(y)对y中的所有元素进行求和操作。(1/2)*torch.sum(y)将求和结果乘以1/2得到o。- 最后使用
print函数输出o的值。
5. 反向传播计算梯度
o.backward()
print(f"Gradient: {x.grad}")
o.backward()执行反向传播操作,根据链式法则自动计算o关于所有requires_grad=True的张量的梯度。在这个例子中,就是计算o关于x的梯度。- 计算完成后,梯度会存储在
x.grad中,使用print函数输出x的梯度值。
导数\偏导数的近似性。偏导数本质上是函数在某一点处沿特定自变量方向的瞬时变化率,利用偏导数来估算函数值的变化属于线性近似,在自变量变化量较小时,这种近似比较准确;当自变量变化量较大时,误差就会比较明显。
下面为你详细分析:
原函数与偏导数
已知函数\(y = \frac{1}{2}(x_1^2 + x_2^2)\),当\(x_1 = 2\),\(x_2 = 4\)时,\(y = \frac{1}{2}(2^2 + 4^2)=\frac{1}{2}(4 + 16)=10\)。
对\(x_1\)求偏导数\(\frac{\partial y}{\partial x_1}=x_1\),在\(x_1 = 2\),\(x_2 = 4\)处,\(\frac{\partial y}{\partial x_1}=2\)。线性近似估算
偏导数反映的是函数在某点处的瞬时变化率,根据线性近似公式\(\Delta y\approx\frac{\partial y}{\partial x_1}\Delta x_1\)(这里\(\Delta x_1\)表示\(x_1\)的变化量)。
当\(x_1\)从\(2\)增加到\(3\),即\(\Delta x_1 = 3 - 2=1\),按照线性近似,\(\Delta y\approx\frac{\partial y}{\partial x_1}\Delta x_1 = 2\times1 = 2\),所以估算此时\(y\)的值约为\(10 + 2 = 12\)。精确计算
精确计算时,把\(x_1 = 3\),\(x_2 = 4\)代入原函数\(y=\frac{1}{2}(x_1^2 + x_2^2)\),可得\(y=\frac{1}{2}(3^2 + 4^2)=\frac{1}{2}(9 + 16)=12.5\)。
误差产生原因
线性近似公式\(\Delta y\approx\frac{\partial y}{\partial x_1}\Delta x_1\)是基于函数在某点附近的局部线性特性。实际上函数\(y = \frac{1}{2}(x_1^2 + x_2^2)\)是一个二次函数,并非线性函数。当\(\Delta x_1\)的取值相对较大时,函数的非线性特性就会体现出来,使得线性近似的结果与精确值之间出现偏差。如果\(\Delta x_1\)取值非常小,比如\(x_1\)从\(2\)变为\(2.01\),此时线性近似的结果就会和精确计算结果很接近。 ↩︎

浙公网安备 33010602011771号