
文章目录一元标量函数多元函数一元数组函数可微分计算Differentiable Computing或可微分编程Differentiable Programming是近年来计算机科学和科学计算领域最重要的范式转变之一。它的核心思想是将计算机程序变成可微分的从而可以通过梯度下降等优化方法从输出结果反推并优化输入参数或程序内部的逻辑。不用想就知道这种观念的直接来源是深度学习但其应用领域却足以泛化到整个科学计算和工程领域。一元标量函数PyTorch支持可微分计算只需在创建张量时开启【requires_grad】即可自动计算梯度。例如对于y x 2 yx^2yx2而言d y d x 2 x \frac{\mathbf dy}{\mathbf dx}2xdxdy2x。现令x 3 x3x3则其PyTorch可以依次计算出importtorch xtorch.tensor(3.0,requires_gradTrue)yx**2print(fy 的值:{y.item()})# y 的值: 9.0y.backward()print(fx 的梯度 (dy/dx):{x.grad.item()})# x 的梯度 (dy/dx): 6.0多元函数下面考虑多元函数f ( x , y ) x 2 sin y e x y f(x,y) x^2\sin ye^{xy}f(x,y)x2sinyexy其偏导数为∂ f ∂ x 2 x sin y y e x y ∂ f ∂ y x 2 cos y x e x y \begin{aligned} \frac{\partial f}{\partial x}2x\sin yye^{xy}\\ \frac{\partial f}{\partial y}x^2\cos yxe^{xy}\\ \end{aligned}∂x∂f∂y∂f2xsinyyexyx2cosyxexy当x 1 , y π 2 x1, y\frac{\pi}{2}x1,y2π时f 1 e π 2 ≈ 5.81 f x 2 π 2 e π 2 ≈ 9.56 f y e π 2 ≈ 4.81 \begin{aligned} f1e^\frac{\pi}{2}\approx5.81\\ f_x2\frac{\pi}{2}e^\frac{\pi}{2}\approx9.56\\ f_ye^\frac{\pi}{2}\approx4.81 \end{aligned}ffxfy1e2π≈5.8122πe2π≈9.56e2π≈4.81PyTorch的自动微分仍旧可以完美运行xtorch.tensor(1.0,requires_gradTrue)ytorch.tensor(torch.pi/2,requires_gradTrue)f(x**2)*torch.sin(y)torch.exp(x*y)f.backward()print(fdf/dx:{x.grad.item():.4f})# df/dx: 9.5563print(fdf/dy:{y.grad.item():.4f})# df/dy: 4.8105一元数组函数回到y x 2 yx^2yx2如果x xx是个数组那么在Python的计算规则中y yy也是同样维度的数组。此时把求导操作视作∂ y ∂ x \frac{\partial y}{\partial x}∂x∂y那么形式上的展开差不多是∂ ( y 1 , y 2 , ⋯ ) ∂ ( x 1 , x 2 , ⋯ ) \frac{\partial (y_1, y_2, \cdots)}{\partial(x_1, x_2,\cdots)}∂(x1,x2,⋯)∂(y1,y2,⋯)有些意义不明感觉最后求出来的是个矩阵。但是如果y i y_iyi求和那么就会得到s ∑ i y i ( x i ) s\sum_i y_i(x_i)s∑iyi(xi)此时∂ s ∂ ( x 1 , x 2 , ⋯ ) \frac{\partial s}{\partial(x_1, x_2,\cdots)}∂(x1,x2,⋯)∂s的意义却相对明确即s x i ∂ s ∂ x i ∂ y i ∂ x i s_{x_i} \frac{\partial s}{\partial x_i}\frac{\partial y_i}{\partial x_i}sxi∂xi∂s∂xi∂yi。按照这个逻辑可以用PyTorch继续做反向传播示例如下xtorch.tensor([1.0,2.0,3.0],requires_gradTrue)yx**2# y 是一个向量 [1, 4, 9]# 注意直接 y.backward() 会报错lossy.sum()loss.backward()print(fx 的梯度:{x.grad})# x 的梯度: tensor([2., 4., 6.])