https://zh.d2l.ai/chapter_preliminaries/index.html
    一些基本的:
    x = torch.arange(12)创建行向量;x.shape求形状;x.numel()元素的总数;torch.zeros(),torch.ones()创建全零全一;torch.randn(3,4)创建随机的34矩阵;torch.tensor([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])也可以手动写;
    A.sum()求和;A.sum(axis=i)根据第i个轴求和;A.mean()求平均;A.sum(axis=i, keepdims=*True
    )非降维求和;A.cumsum(axis=i)沿某个轴计算A元素的累积总和,不会改变维度;torch.dot(x, y)向量点积;torch.mv(A, x)矩阵 向量积;torch.mm(A, B)矩阵矩阵积;torch.norm(u)范数,

    常用导数:
    image.png

    《微分自动微分》
    import torch
    x=torch.arange(4.0)
    x.requiresgrad(True)#首先要创建空间
    y=2*torch.dot(x,x)
    y.backward()#要进行反向传递操作
    print(x.grad)

    #非标量变量的反向传播,当我们对向量值变量y(关于x的函数)调用backward时,将通过对y中的元素求和来创建 一个新的标量变量。然后计算这个标量变量相对于x的梯度
    x.grad.zero()#每次使用要清零更新
    y=2x
    y.sum().backward()*#当y不是一个标量时,这样求导,但一般不用。

    print(x.grad)
    #为什么深度学习一般都是对标量求导而不是对向量或者矩阵,因为要用的loss一般是个标量,是向量或者矩阵会很麻烦。
    # 分离计算_
    y = x x
    u = y.detach()#把u当作一个常数
    z = u
    x
    z.sum().backward()
    print(x.grad)#=u=x**2

    使用自动微分的还一个好处是: 即使构建函数的计算图需要通过Python控制流(例如,条件、循环或任意函数调用),我们仍然可以计算得到的变量的梯度。 在下面的代码中,while循环的迭代次数和if语句的结果都取决于输入a的值
    def f(a):
    b = a 2
    while b.norm() < 1000:
    b = b
    2
    if b.sum() > 0:
    c = b
    else:
    c = 100 b
    return c
    a = torch.randn(size=(), requires_grad=*True
    )
    d = f(a)
    d.backward()
    结果a.grad == d / a