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

Pytorch Tutorial【Chapter 2. Autograd】

Pytorch Tutorial

文章目录

  • Pytorch Tutorial
    • Chapter 2. Autograd
      • 1. Review Matrix Calculus
        • 1.1 Definition向量对向量求导
        • 1.2 Definition标量对向量求导
        • 1.3 Definition标量对矩阵求导
      • 2.关于autograd的说明
      • 3. grad的计算
        • 3.1 Manual手动计算
        • 3.2 backward()自动计算
    • Reference

Chapter 2. Autograd

1. Review Matrix Calculus

1.1 Definition向量对向量求导

​ Define the derivative of a function mapping f : R n → R m f:\mathbb{R}^n\to\mathbb{R}^m f:RnRm as the n × m n\times m n×m matrix of partial derivatives. That is, if x ∈ R n , f ( x ) ∈ R m x\in\mathbb{R}^n,f(x)\in\mathbb{R}^m xRn,f(x)Rm, the derivative of f f f with respect to x x x is defined as
[ ∂ f ∂ x ] i j = ∂ f i ∂ x i \begin{bmatrix} \frac{\partial f}{\partial x} \end{bmatrix}_{ij} = \frac{\partial f_i}{\partial x_i} [xf]ij=xifi
Let
x = [ x 1 x 2 ⋮ x n ] , f ( x ) = [ f 1 ( x ) f 2 ( x ) ⋮ f m ( x ) ] x = \begin{bmatrix} x_1 \\ x_2 \\ \vdots \\ x_n \end{bmatrix}, f(x) = \begin{bmatrix} f_1(x) \\ f_2(x) \\ \vdots \\ f_m(x) \end{bmatrix} x= x1x2xn ,f(x)= f1(x)f2(x)fm(x)

then we define the Jacobian Matrix

∂ f ∂ x = [ ∂ f 1 ∂ x 1 ∂ f 2 ∂ x 1 ⋯ ∂ f m ∂ x 1 ∂ f 1 ∂ x 2 ∂ f 2 ∂ x 2 ⋯ ∂ f m ∂ x 2 ⋮ ⋮ ⋱ ⋮ ∂ f 1 ∂ x n ∂ f 2 ∂ x n ⋯ ∂ f m ∂ x n ] \frac{\partial f}{\partial x} = \begin{bmatrix} \frac{\partial f_1}{\partial x_1} & \frac{\partial f_2}{\partial x_1} & \cdots & \frac{\partial f_m}{\partial x_1} \\ \frac{\partial f_1}{\partial x_2} & \frac{\partial f_2}{\partial x_2} & \cdots & \frac{\partial f_m}{\partial x_2} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial f_1}{\partial x_n} & \frac{\partial f_2}{\partial x_n} & \cdots & \frac{\partial f_m}{\partial x_n} \\ \end{bmatrix} xf= x1f1x2f1xnf1x1f2x2f2xnf2x1fmx2fmxnfm

1.2 Definition标量对向量求导

If f f f is scalar, one has

∂ f ∂ x = [ ∂ f ∂ x 1 ∂ f ∂ x 2 ⋮ ∂ f ∂ x n ] \frac{\partial f}{\partial x} = \begin{bmatrix} \frac{\partial f}{\partial x_1} \\ \frac{\partial f}{\partial x_2} \\ \vdots \\ \frac{\partial f}{\partial x_n} \\ \end{bmatrix} xf= x1fx2fxnf
这其实是一种分母布局

1.3 Definition标量对矩阵求导

​ Now we give some results on the derivative of scalar functions of a matrix. Let X = [ x i j ] X=[x_{ij}] X=[xij] be a matrix of order m × n m\times n m×n and let y = f ( X ) y=f(X) y=f(X) be a scalar function of X X X. The derivative of y y y with respect to X X X, denoted by ∂ y ∂ X \frac{\partial y}{\partial X} Xy, is defined as the following matrix of order m × n m\times n m×n,
G = ∂ y ∂ X = [ ∂ y ∂ x 11 ∂ y ∂ x 12 ⋯ ∂ y ∂ x 1 n ∂ y ∂ x 21 ∂ y ∂ x 22 ⋯ ∂ y ∂ x 2 n ⋮ ⋮ ⋱ ⋮ ∂ y ∂ x m 1 ∂ y ∂ x m 2 ⋯ ∂ y ∂ x m n ] = [ ∂ y ∂ x i j ] G = \frac{\partial y}{\partial X} = \begin{bmatrix} \frac{\partial y}{\partial x_{11}} & \frac{\partial y}{\partial x_{12}} & \cdots & \frac{\partial y}{\partial x_{1n}} \\ \frac{\partial y}{\partial x_{21}} & \frac{\partial y}{\partial x_{22}} & \cdots & \frac{\partial y}{\partial x_{2n}} \\ \vdots & \vdots & \ddots & \vdots& \\ \frac{\partial y}{\partial x_{m1}} & \frac{\partial y}{\partial x_{m2}} & \cdots & \frac{\partial y}{\partial x_{mn}} \end{bmatrix} = \Big[\frac{\partial y}{\partial x_{ij}} \Big] G=Xy= x11yx21yxm1yx12yx22yxm2yx1nyx2nyxmny =[xijy]

2.关于autograd的说明

torch.Tensor 是包的核心类。如果将其属性 tensor.requires_grad 设置为 True,则会开始跟踪针对 tensor 的所有操作。完成计算后,您可以调用 tensor.backward() 来自动计算所有梯度。该张量的梯度将累积到 tensor.grad 属性中。

要停止 tensor 历史记录的跟踪,您可以调用 tensor.detach(),它将其与计算历史记录分离,并防止将来的计算被跟踪。

要停止跟踪历史记录(和使用内存),您还可以将代码块使用 with torch.no_grad(): 包装起来。在评估模型时,这是特别有用,因为模型在训练阶段具有 requires_grad = True 的可训练参数有利于调参,但在评估阶段我们不需要梯度。

还有一个类对于 autograd 实现非常重要那就是 FunctionTensorFunction 互相连接并构建一个非循环图,它保存整个完整的计算过程的历史信息。每个张量都有一个 tensor.grad_fn 属性保存着创建了张量的 Function 的引用,(如果用户自己创建张量,则 grad_fn=None)。

如果你想计算导数,你可以调用 tensor.backward()如果 Tensor 是标量(即它包含一个元素数据),则不需要指定任何参数backward(),但是如果它有更多元素,则需要指定一个gradient 参数来指定张量的形状。

最后的计算结果保存在tensor.grad属性里

  • 使用tensor.requires_grad在初始化时,设置跟踪梯度
import torch
import numpy as np
x = torch.ones(2,2, requires_grad=True)
print(x)

结果如下

tensor([[1., 1.],[1., 1.]], requires_grad=True)
  • 设置了跟踪梯度的tensor,将会出现tensor.grad_fn的属性,用于记录上次计算的Function
y = torch.add(x, 1)
print(y)
print(y.grad_fn)

结果如下

tensor([[2., 2.],[2., 2.]], grad_fn=<AddBackward0>)
<AddBackward0 object at 0x0000020D723EBE80>
  • tensor.requires_grad_(True / False) 会改变张量的 requires_grad 标记。 如果没有提供相应的参数输入的标记默认为 False。
a = torch.randn(2,2)
a = (a * 3) / (a-1)
print(a)
a.requires_grad_(True)
print(a)
a = a + 1
print(a)
tensor([[  0.0646, -46.3478],[  5.6683,  -0.8896]])
tensor([[  0.0646, -46.3478],[  5.6683,  -0.8896]], requires_grad=True)
tensor([[  1.0646, -45.3478],[  6.6683,   0.1104]], grad_fn=<AddBackward0>)

3. grad的计算

3.1 Manual手动计算

  • 可以使用函数torch.autograd.grad()来手动计算梯度,详细可参考此处
Image

例如计算 y = x 1 2 + x 2 2 + x 1 x 2 y = x_1^2 + x_2^2 + x_1x_2 y=x12+x22+x1x2的梯度

x1 = torch.tensor(3., requires_grad=True)
x2 = torch.tensor(1., requires_grad=True)
y = x1**2+x2**2+x1*x2# 求一阶导数
# torch.autograd.grad(y, x1,retain_graph=True, create_graph=True)
x1_1 = torch.autograd.grad(y, x1, retain_graph=True, create_graph=True)[0]
x2_1 = torch.autograd.grad(y, x2, retain_graph=True, create_graph=True)[0]
print(x1_1,x2_1)# 求二阶混合偏导数
x1_11 = torch.autograd.grad(x1_1, x1)[0]
x1_12 = torch.autograd.grad(x1_1, x2)[0]
x2_21 = torch.autograd.grad(x2_1, x1)[0]
x2_22 = torch.autograd.grad(x2_1, x2)[0]
print(x1_11,x1_12,x2_21,x2_22)

结果如下

tensor(7., grad_fn=<AddBackward0>) tensor(5., grad_fn=<AddBackward0>)
tensor(2.) tensor(1.) tensor(1.) tensor(2.)

3.2 backward()自动计算

当输出是标量scalar函数时
考虑如下的计算问题

x = torch.ones(2,2, requires_grad=True)
y = x + 2
print(y)
z = y * y * 3
out = z.mean()
print(z, out)  #输出out是一个标量
out.backward()
print(x.grad)

输出是

tensor([[3., 3.],[3., 3.]], grad_fn=<AddBackward0>)
tensor([[27., 27.],[27., 27.]], grad_fn=<MulBackward0>) tensor(27., grad_fn=<MeanBackward0>)
tensor([[4.5000, 4.5000],[4.5000, 4.5000]])

X = [ x 1 x 2 x 3 x 4 ] = [ 1 1 1 1 ] X =\begin{bmatrix} x_1 & x_2 \\ x_3 & x_4 \end{bmatrix} = \begin{bmatrix} 1 & 1 \\ 1 & 1 \end{bmatrix} X=[x1x3x2x4]=[1111]

中间变量是

Z = [ z 1 z 2 z 3 z 4 ] = [ 3 ( x 1 + 2 ) 2 3 ( x 1 + 2 ) 2 3 ( x 1 + 2 ) 2 3 ( x 1 + 2 ) 2 ] Z =\begin{bmatrix} z_1 & z_2 \\ z_3 & z_4 \end{bmatrix} = \begin{bmatrix} 3(x_1+2)^2 & 3(x_1+2)^2 \\ 3(x_1+2)^2 & 3(x_1+2)^2 \end{bmatrix} Z=[z1z3z2z4]=[3(x1+2)23(x1+2)23(x1+2)23(x1+2)2]

最后获得是输出是

out = 1 4 ∑ i = 1 z i = 1 4 ( z 1 + z 2 + z 3 + z 4 ) = 1 4 ( 3 ( x 1 + 2 ) 2 + 3 ( x 2 + 2 ) 2 + 3 ( x 3 + 2 ) 2 + 3 ( x 4 + 2 ) 2 ) = f ( x ) \begin{aligned} \text{out} & = \frac{1}{4}\sum_{i=1} z_i = \frac{1}{4}(z_1+z_2+z_3+z_4) \\ & = \frac{1}{4}(3(x_1+2)^2+3(x_2+2)^2+3(x_3+2)^2+3(x_4+2)^2) \\ & = f(\mathrm{x}) \end{aligned} out=41i=1zi=41(z1+z2+z3+z4)=41(3(x1+2)2+3(x2+2)2+3(x3+2)2+3(x4+2)2)=f(x)

其中将矩阵 X X X和矩阵 Z Z Z中的所有元素拼接为向量

x = [ x 1 , x 2 , x 3 , x 4 ] T z = [ z 1 , z 2 , z 3 , z 4 ] T \mathrm{x} = [x_1,x_2,x_3,x_4]^T \\ \mathrm{z} = [z_1,z_2,z_3,z_4]^T x=[x1,x2,x3,x4]Tz=[z1,z2,z3,z4]T

我们利用矩阵求导的链式法则

∂ f ∂ x = f ( x ) ∂ x = ∂ z ∂ x ∂ f ( x ) ∂ z \frac{\partial f}{\partial \mathrm{x}} = \frac{f(\mathrm{x})}{\partial \mathrm{x}} = \frac{\partial \mathrm{z}}{\partial \mathrm{x}} \frac{\partial f(\mathrm{x})}{\partial \mathrm{z}} xf=xf(x)=xzzf(x)

再利用标量函数对矩阵导数的定义,则有

∂ f ∂ x = [ ∂ z 1 ∂ x 1 ∂ z 2 ∂ x 1 ∂ z 3 ∂ x 1 ∂ z 4 ∂ x 1 ∂ z 1 ∂ x 2 ∂ z 2 ∂ x 2 ∂ z 3 ∂ x 2 ∂ z 4 ∂ x 2 ∂ z 1 ∂ x 3 ∂ z 2 ∂ x 3 ∂ z 3 ∂ x 3 ∂ z 4 ∂ x 3 ∂ z 1 ∂ x 4 ∂ z 2 ∂ x 4 ∂ z 3 ∂ x 4 ∂ z 4 ∂ x 4 ] [ ∂ f ∂ z 1 ∂ f ∂ z 2 ∂ f ∂ z 3 ∂ f ∂ z 4 ] = [ 6 ( x 1 + 2 ) 0 0 0 0 6 ( x 2 + 2 ) 0 0 0 0 6 ( x 3 + 2 ) 0 0 0 0 6 ( x 4 + 2 ) ] [ 1 4 1 4 1 4 1 4 ] = [ 4.5 4.5 4.5 4.5 ] \frac{\partial f}{\partial \mathrm{x}} = \begin{bmatrix} \frac{\partial z_1}{\partial x_1} & \frac{\partial z_2}{\partial x_1} & \frac{\partial z_3}{\partial x_1} & \frac{\partial z_4}{\partial x_1} \\ \frac{\partial z_1}{\partial x_2} & \frac{\partial z_2}{\partial x_2} & \frac{\partial z_3}{\partial x_2} & \frac{\partial z_4}{\partial x_2} \\ \frac{\partial z_1}{\partial x_3} & \frac{\partial z_2}{\partial x_3} & \frac{\partial z_3}{\partial x_3} & \frac{\partial z_4}{\partial x_3} \\ \frac{\partial z_1}{\partial x_4} & \frac{\partial z_2}{\partial x_4} & \frac{\partial z_3}{\partial x_4} & \frac{\partial z_4}{\partial x_4} \end{bmatrix} \begin{bmatrix} \frac{\partial f}{\partial z_1} \\ \frac{\partial f}{\partial z_2} \\ \frac{\partial f}{\partial z_3} \\ \frac{\partial f}{\partial z_4} \end{bmatrix}= \begin{bmatrix} 6(x_1+2) & 0 & 0 & 0 \\ 0 & 6(x_2+2) & 0 & 0 \\ 0 & 0 & 6(x_3+2) & 0 \\ 0 & 0 & 0 & 6(x_4+2) \end{bmatrix} \begin{bmatrix} \frac{1}{4} \\ \frac{1}{4} \\ \frac{1}{4} \\ \frac{1}{4} \end{bmatrix} = \begin{bmatrix} 4.5 \\ 4.5 \\ 4.5 \\ 4.5 \\ \end{bmatrix} xf= x1z1x2z1x3z1x4z1x1z2x2z2x3z2x4z2x1z3x2z3x3z3x4z3x1z4x2z4x3z4x4z4 z1fz2fz3fz4f = 6(x1+2)00006(x2+2)00006(x3+2)00006(x4+2) 41414141 = 4.54.54.54.5

所以最后获得关于的矩阵 X X X的导数为

∂ f ∂ X = [ ∂ f ∂ x 1 ∂ f ∂ x 2 ∂ f ∂ x 3 ∂ f ∂ x 4 ] = [ 4.5 4.5 4.5 4.5 ] \frac{\partial f}{\partial X} = \begin{bmatrix} \frac{\partial f}{\partial x_1} & \frac{\partial f}{\partial x_2} \\ \frac{\partial f}{\partial x_3} & \frac{\partial f}{\partial x_4} \end{bmatrix} = \begin{bmatrix} 4.5 & 4.5 \\ 4.5 & 4.5 \\ \end{bmatrix} Xf=[x1fx3fx2fx4f]=[4.54.54.54.5]

当输出是张量tensor函数时

x = torch.tensor([[1.0, 2, 3],[4, 5, 6],[7, 8, 9]], requires_grad=True)
w = torch.tensor([[1.0, 2, 3],[4, 5, 6]], requires_grad=True)y = torch.matmul(x,w.T)
print(y)
print(torch.ones_like(y))
y.backward(gradient = torch.ones_like(y))
print(x.grad)

输出是

tensor([[ 14.,  32.],[ 32.,  77.],[ 50., 122.]], grad_fn=<MmBackward0>)
tensor([[1., 1.],[1., 1.],[1., 1.]])
tensor([[5., 7., 9.],[5., 7., 9.],[5., 7., 9.]])

Y = X W T [ y 11 y 21 y 12 y 22 y 13 y 23 ] = [ x 11 x 12 x 13 x 21 x 22 x 23 x 31 x 32 x 33 ] [ w 11 w 21 w 12 w 22 w 13 w 23 ] [ y 11 y 21 y 12 y 22 y 13 y 23 ] = [ ( x 11 w 11 + x 12 w 12 + x 13 w 13 ) ( x 11 w 21 + x 12 w 22 + x 13 w 23 ) ( x 21 w 11 + x 22 w 12 + x 23 w 13 ) ( x 21 w 21 + x 22 w 22 + x 23 w 23 ) ( x 31 w 11 + x 32 w 12 + x 33 w 13 ) ( x 31 w 21 + x 32 w 22 + x 33 w 23 ) ] Y = XW^T \\ \begin{bmatrix} y_{11} & y_{21} \\ y_{12} & y_{22} \\ y_{13} & y_{23} \\ \end{bmatrix} = \begin{bmatrix} x_{11} & x_{12} & x_{13} \\ x_{21} & x_{22} & x_{23} \\ x_{31} & x_{32} & x_{33} \\ \end{bmatrix} \begin{bmatrix} w_{11} & w_{21} \\ w_{12} & w_{22} \\ w_{13} & w_{23} \\ \end{bmatrix} \\ \begin{bmatrix} y_{11} & y_{21} \\ y_{12} & y_{22} \\ y_{13} & y_{23} \\ \end{bmatrix} = \begin{bmatrix} (x_{11}w_{11} + x_{12}w_{12} + x_{13}w_{13}) & (x_{11}w_{21} + x_{12}w_{22} + x_{13}w_{23}) \\ (x_{21}w_{11} + x_{22}w_{12} + x_{23}w_{13}) & (x_{21}w_{21} + x_{22}w_{22} + x_{23}w_{23}) \\ (x_{31}w_{11} + x_{32}w_{12} + x_{33}w_{13}) & (x_{31}w_{21} + x_{32}w_{22} + x_{33}w_{23}) \\ \end{bmatrix} Y=XWT y11y12y13y21y22y23 = x11x21x31x12x22x32x13x23x33 w11w12w13w21w22w23 y11y12y13y21y22y23 = (x11w11+x12w12+x13w13)(x21w11+x22w12+x23w13)(x31w11+x32w12+x33w13)(x11w21+x12w22+x13w23)(x21w21+x22w22+x23w23)(x31w21+x32w22+x33w23)

gradient=torch.ones_like(y)用于指定矩阵 Y Y Y中每一项的权重都为1,由矩阵 Y Y Y中元素加权得到的scalar函数为

f ( x , w ) = 1 × y 11 + 1 × y 12 + 1 × y 13 + 1 × y 21 + 1 × y 22 + 1 × y 23 , x = [ x 11 , x 12 , x 13 , x 21 , x 22 , x 23 , x 31 , x 32 , x 33 ] T w = [ w 11 , w 12 , w 13 , w 21 , w 22 , w 23 , w 31 , w 32 , w 33 ] T \begin{aligned} f(\mathrm{x},\mathrm{w}) & = 1\times y_{11}+1\times y_{12}+1\times y_{13}+1\times y_{21}+1\times y_{22}+1\times y_{23}, \\ & \mathrm{x} = [x_{11}, x_{12}, x_{13}, x_{21}, x_{22}, x_{23}, x_{31}, x_{32}, x_{33}]^T \\ & \mathrm{w} = [w_{11}, w_{12}, w_{13}, w_{21}, w_{22}, w_{23}, w_{31}, w_{32}, w_{33}]^T \end{aligned} f(x,w)=1×y11+1×y12+1×y13+1×y21+1×y22+1×y23,x=[x11,x12,x13,x21,x22,x23,x31,x32,x33]Tw=[w11,w12,w13,w21,w22,w23,w31,w32,w33]T

这里不包括复合求导,可以直接计算

∂ f ∂ x = [ ∂ f ∂ x 11 , ∂ f ∂ x 12 , ∂ f ∂ x 13 , ∂ f ∂ x 21 , ∂ f ∂ x 22 , ∂ f ∂ x 23 , ∂ f ∂ x 31 , ∂ f ∂ x 32 , ∂ f ∂ x 33 ] T ∂ f ∂ x = [ w 11 + w 21 , w 12 + w 22 , w 13 + w 23 , w 11 + w 21 , w 12 + w 22 , w 13 + w 23 , w 11 + w 21 , w 12 + w 22 , w 13 + w 23 ] T = [ 5 , 7 , 9 , 5 , 7 , 9 , 5 , 7 , 9 ] T \begin{aligned} \frac{\partial f}{\partial \mathrm{x}} & = \Big[\frac{\partial f}{\partial x_{11}}, \frac{\partial f}{\partial x_{12}}, \frac{\partial f}{\partial x_{13}}, \frac{\partial f}{\partial x_{21}}, \frac{\partial f}{\partial x_{22}}, \frac{\partial f}{\partial x_{23}}, \frac{\partial f}{\partial x_{31}}, \frac{\partial f}{\partial x_{32}}, \frac{\partial f}{\partial x_{33}} \Big]^T \\ \frac{\partial f}{\partial \mathrm{x}} & = \Big[ w_{11} + w_{21}, w_{12} + w_{22}, w_{13} + w_{23}, w_{11} + w_{21}, w_{12} + w_{22}, w_{13} + w_{23}, w_{11} + w_{21}, w_{12} + w_{22}, w_{13} + w_{23} \Big]^T \\ & = [5, 7, 9, 5, 7, 9, 5, 7, 9]^T \end{aligned} xfxf=[x11f,x12f,x13f,x21f,x22f,x23f,x31f,x32f,x33f]T=[w11+w21,w12+w22,w13+w23,w11+w21,w12+w22,w13+w23,w11+w21,w12+w22,w13+w23]T=[5,7,9,5,7,9,5,7,9]T
再写成矩阵的形式则有

∂ f ∂ X = [ 5 7 9 5 7 9 5 7 9 ] \frac{\partial f}{\partial X} = \begin{bmatrix} 5 & 7 & 9 \\ 5 & 7 & 9 \\ 5 & 7 & 9 \\ \end{bmatrix} Xf= 555777999

再考虑一个更一般求二阶导的情况

x = torch.ones(3, requires_grad=True)
print(x)
y = x * 2
print(y)
z = y * 2
print(z)
v = torch.tensor([0.1, 1.0, 0.0001], dtype=torch.float)
z.backward(gradient=v)
print(x.grad)

结果如下

tensor([1., 1., 1.], requires_grad=True)
tensor([2., 2., 2.], grad_fn=<MulBackward0>)
tensor([4., 4., 4.], grad_fn=<MulBackward0>)
tensor([4.0000e-01, 4.0000e+00, 4.0000e-04])

其中
x = [ x 1 , x 2 , x 3 ] T = [ 1 , 1 , 1 ] T y = 2 x = [ y 1 , y 2 , y 3 ] T = [ 2 , 2 , 2 ] T z = 2 y = [ z 1 , z 2 , z 3 ] T = [ 4 , 4 , 4 ] T \begin{aligned} \mathrm{x} & = [x_1,x_2,x_3]^T = [1,1,1]^T \\ \mathrm{y} = 2\mathrm{x} & = [y_1,y_2,y_3]^T = [2,2,2]^T \\ \mathrm{z} = 2\mathrm{y} & = [z_1,z_2,z_3]^T = [4,4,4]^T \end{aligned} xy=2xz=2y=[x1,x2,x3]T=[1,1,1]T=[y1,y2,y3]T=[2,2,2]T=[z1,z2,z3]T=[4,4,4]T
若考虑gradient=torch.tensor([a1,a2,a3], dtype=torch.folat),那么最终加权得到的scalar函数为
f = a 1 z 1 + a 2 z 2 + a 3 z 3 f = a_1 z_1 + a_2 z_2 + a_3 z_3 f=a1z1+a2z2+a3z3
那么对 x \mathrm{x} x求偏导则有
∂ f ∂ x = ∂ y ∂ x ∂ f ∂ y = [ ∂ y 1 ∂ x 1 ∂ y 2 ∂ x 1 ∂ y 3 ∂ x 1 ∂ y 1 ∂ x 2 ∂ y 2 ∂ x 2 ∂ y 3 ∂ x 2 ∂ y 1 ∂ x 3 ∂ y 2 ∂ x 3 ∂ y 3 ∂ x 3 ] [ ∂ f ∂ y 1 ∂ f ∂ y 2 ∂ f ∂ y 3 ] = [ 2 2 2 ] [ 2 a 1 2 a 2 2 a 3 ] = [ 4 a 1 , 4 a 2 , 4 a 3 ] T \begin{aligned} \frac{\partial f}{\partial \mathrm{x}} & = \frac{\partial \mathrm{y}}{\partial \mathrm{x}} \frac{\partial f}{\partial \mathrm{y}} \\ & = \begin{bmatrix} \frac{\partial y_1}{\partial x_1} & \frac{\partial y_2}{\partial x_1} & \frac{\partial y_3}{\partial x_1} \\ \frac{\partial y_1}{\partial x_2} & \frac{\partial y_2}{\partial x_2} & \frac{\partial y_3}{\partial x_2} \\ \frac{\partial y_1}{\partial x_3} & \frac{\partial y_2}{\partial x_3} & \frac{\partial y_3}{\partial x_3} \\ \end{bmatrix} \begin{bmatrix} \frac{\partial f}{\partial y_1} \\ \frac{\partial f}{\partial y_2} \\ \frac{\partial f}{\partial y_3} \\ \end{bmatrix} \\ & = \begin{bmatrix} 2 & & \\ & 2 & \\ & & 2 \end{bmatrix} \begin{bmatrix} 2 a_1 \\ 2 a_2 \\ 2 a_3 \\ \end{bmatrix} \\ & = [4a_1, 4a_2, 4a_3]^T \end{aligned} xf=xyyf= x1y1x2y1x3y1x1y2x2y2x3y2x1y3x2y3x3y3 y1fy2fy3f = 222 2a12a22a3 =[4a1,4a2,4a3]T

一些启示

Image

Reference

参考教程1
参考教程2

相关文章:

Pytorch Tutorial【Chapter 2. Autograd】

Pytorch Tutorial 文章目录 Pytorch TutorialChapter 2. Autograd1. Review Matrix Calculus1.1 Definition向量对向量求导1.2 Definition标量对向量求导1.3 Definition标量对矩阵求导 2.关于autograd的说明3. grad的计算3.1 Manual手动计算3.2 backward()自动计算 Reference C…...

Python第三方库国内镜像下载地址

Python第三方库国内镜像下载地址 一、清华大学二、中国科技大学三、安装方法 一、清华大学 https://pypi.tuna.tsinghua.edu.cn/simple 二、中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple 三、安装方法 例如 pyhook3 插件的安装方法&#xff0c;执行下面命令安装…...

从浏览器输入url到页面加载(七)服务端机器一般部署在哪里

前言 上一节&#xff0c;我们说到了CDN和路由器的关系&#xff0c;说到了公有地址&#xff0c;说到了通信线路服务&#xff0c;这一节跳过那些看不懂的深层知识&#xff0c;直接开始说web服务器。 1. 服务端机器为什么不部署在公司内部 记得在之前的一段时间里&#xff0c;公…...

Pytorch深度学习-----神经网络之Sequential的详细使用及实战详解

系列文章目录 PyTorch深度学习——Anaconda和PyTorch安装 Pytorch深度学习-----数据模块Dataset类 Pytorch深度学习------TensorBoard的使用 Pytorch深度学习------Torchvision中Transforms的使用&#xff08;ToTensor&#xff0c;Normalize&#xff0c;Resize &#xff0c;Co…...

安全基础 --- https详解 + 数组(js)

CIA三属性&#xff1a;完整性&#xff08;Confidentiality&#xff09;、保密性&#xff08;Integrity&#xff09;、可用性&#xff08;Availability&#xff09;&#xff0c;也称信息安全三要素。 https 核心技术&#xff1a;用非对称加密传输对称加密的密钥&#xff0c;然后…...

vue加载大量数据优化

在Vue中加载大量数据并形成列表时&#xff0c;可以通过以下方法来优化性能&#xff1a; 分页加载&#xff1a;不要一次性加载所有的数据&#xff0c;而是分批加载数据&#xff0c;每次只加载当前页需要显示的数据量。可以使用第三方库如vue-infinite-loading来实现无限滚动加载…...

WebRTC 之音视频同步

在网络视频会议中&#xff0c; 我们常会遇到音视频不同步的问题&#xff0c; 我们有一个专有名词 lip-sync 唇同步来描述这类问题&#xff0c;当我们看到人的嘴唇动作与听到的声音对不上的时候&#xff0c;不同步的问题就出现了 而在线会议中&#xff0c; 听见清晰的声音是优先…...

kubernetes基于helm部署gitlab-runner

kubernetes基于helm部署gitlab-runner 这篇博文介绍如何在 Kubernetes 中使用helm部署 GitLab-runner。 先决条件&#xff1a; 已运行的 Kubernetes 集群已运行的 gitlab 实例 项目地址&#xff1a;https://gitlab.com/gitlab-org/charts/gitlab-runner 官方文档&#xff…...

深度学习和OpenCV的对象检测(MobileNet SSD图像识别)

基于深度学习的对象检测时,我们主要分享以下三种主要的对象检测方法: Faster R-CNN(后期会来学习分享)你只看一次(YOLO,最新版本YOLO3,后期我们会分享)单发探测器(SSD,本节介绍,若你的电脑配置比较低,此方法比较适合R-CNN是使用深度学习进行物体检测的训练模型; 然而,…...

Gitlab CI/CD笔记-第一天-GitOps和以前的和jenkins的集成的区别

一、GitOps-CI/CD的流程图与Jenkins的流程图 从上图可以看到&#xff1a; GitOps与基于Jennkins技术栈的CI/CD流程&#xff0c;无法从Jenkins集成其他第三方开源的项目来实现换成了Gitlab来进行集成。 好处在于&#xff1a;CI 一个工具Gitlab就行了&#xff0c;但CD部分依旧是…...

有关OpenBSD, NetBSD, FreeBSD -- 与GPT对话

1 介绍一下 - OpenBSD, NetBSD, FreeBSD 当谈论操作系统时,OpenBSD、NetBSD和FreeBSD都是基于BSD(Berkeley Software Distribution)的操作系统,它们各自是独立开发的,并在BSD许可下发布。这些操作系统有很多共同点,但也有一些差异。以下是对它们的简要介绍: OpenBSD: O…...

RabbitMQ 备份交换机和死信交换机

为处理生产者生产者将消息推送到交换机中&#xff0c;交换机按照消息中的路由键即自身策略无法将消息投递到指定队列中造成消息丢失的问题&#xff0c;可以使用备份交换机。 为处理在消息队列中到达TTL的过期消息&#xff0c;可采用死信交换机进行消息转存。 通过上述描述可知&…...

Linux 中利用设备树学习Ⅳ

系列文章目录 第一章 Linux 中内核与驱动程序 第二章 Linux 设备驱动编写 &#xff08;misc&#xff09; 第三章 Linux 设备驱动编写及设备节点自动生成 &#xff08;cdev&#xff09; 第四章 Linux 平台总线platform与设备树 第五章 Linux 设备树中pinctrl与gpio&#xff08;…...

使用Spring Initializr方式构建Spring Boot项目

除了可以使用Maven方式构建Spring Boot项目外&#xff0c;还可以通过Spring Initializr方式快速构建Spring Boot项目。从本质上说&#xff0c;Spring lnitializr是一个Web应用&#xff0c;它提供了一个基本的项目结构&#xff0c;能够帮助我们快速构建一个基础的Spring Boot项目…...

Sentinel 2.0 微服务零信任的探索与实践

作者&#xff1a;涯客、十眠 从古典朴素的安全哲学谈起 网络安全现状 现在最常见的企业网络安全架构便是在企业网络边界处做安全防护&#xff0c;而在企业网络内部不做安全防范。这确实为企业的安全建设省了成本也为企业提供了一定的防护能力。但是这类比于现实情况的一个小…...

Oracle以逗号分隔的字符串拆分为多行数据实例详解

前言 近期在工作中遇到某表某字段是可扩展数据内容&#xff0c;信息以逗号分隔生成的&#xff0c;现需求要根据此字段数据在其它表查询相关的内容展现出来&#xff0c;第一想法是切割数据&#xff0c;以逗号作为切割符&#xff0c;以下为总结的实现方法&#xff0c;以供大家参…...

harbor仓库安装部署(1.6.1)

目录 1、关闭防火墙 2、安装docker-ce&#xff08;所有主机&#xff09; 3、配置阿里云镜像加速器 4、部署Docker Compose 服务 5、部署 Harbor 服务 6、下载 Harbor 安装程序&#xff08;两台harbor主机&#xff09; 7、配置 Harbor 参数文件 8、启动并安装 Harbor …...

FastAPI 构建 API 高性能的 web 框架(一)

如果要部署一些大模型一般langchainfastapi&#xff0c;或者fastchat&#xff0c; 先大概了解一下fastapi,本篇主要就是贴几个实际例子。 官方文档地址&#xff1a; https://fastapi.tiangolo.com/zh/ 1 案例1:复旦MOSS大模型fastapi接口服务 来源&#xff1a;大语言模型工程…...

Spring框架中的Bean的生命周期

Spring Bean 的生命周期总体分为四个阶段&#xff1a;实例化 》属性注入》初始化》销毁 实例化&#xff1a; &#xff08;1&#xff09;实例化bean&#xff1a;根据配置文件中Bean的定义&#xff0c;利用java Reflection 反射技术创建Bean的实例&#xff01; 属性注入&#…...

vue3-ts-vite:vue 项目 配置 多页面应用

一、Vue项目&#xff0c;什么是多页面应用 Vue是一种单页面应用程序&#xff08;SPA&#xff09;框架&#xff0c;这意味着Vue应用程序通常只有一个HTML页面&#xff0c;而在该页面上进行动态的内容更改&#xff0c;而不是每次都加载新的HTML页面。 但是&#xff0c;有时候我…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing

Muffin 论文 现有方法 CRADLE 和 LEMON&#xff0c;依赖模型推理阶段输出进行差分测试&#xff0c;但在训练阶段是不可行的&#xff0c;因为训练阶段直到最后才有固定输出&#xff0c;中间过程是不断变化的。API 库覆盖低&#xff0c;因为各个 API 都是在各种具体场景下使用。…...