关于导数\偏导数的理解以及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 的梯度值。

  1. 导数\偏导数的近似性。偏导数本质上是函数在某一点处沿特定自变量方向的瞬时变化率,利用偏导数来估算函数值的变化属于线性近似,在自变量变化量较小时,这种近似比较准确;当自变量变化量较大时,误差就会比较明显。

    下面为你详细分析:

    原函数与偏导数

    已知函数\(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\),此时线性近似的结果就会和精确计算结果很接近。 ↩︎

posted @ 2025-04-15 14:46  icuic  阅读(37)  评论(0)    收藏  举报