网站要备案吗,网站关键词的选择,域名访问过程会不会影响网站访问,怎么做推销产品的网站5.1 向量链式法则 ① 例子1是一个线性回归的例子#xff0c;如下图所示。 5.2 自动求导 5.3 计算图 5.4 两种模型 ① b是之前计算的结果#xff0c;是一个已知的值。 5.5 复杂度 5.6 自动求导 import torch
x torch.arange(4.0)
x
结果#xff1a; ② 在外面计算y关于x的…5.1 向量链式法则 ① 例子1是一个线性回归的例子如下图所示。 5.2 自动求导 5.3 计算图 5.4 两种模型 ① b是之前计算的结果是一个已知的值。 5.5 复杂度 5.6 自动求导 import torch
x torch.arange(4.0)
x
结果 ② 在外面计算y关于x的梯度之前需要一个地方来存储梯度。
import torch
x torch.arange(4.0)
x.requires_grad_(True) # 等价于 x torch.arange(4.0,requires_gradTrue)
print(x.grad) # 默认为None
结果两种写法 ③ 现在计算y。
import torch
x torch.arange(4.0,requires_gradTrue)
y 2 * torch.dot(x,x)
print(y) # grad_fn是隐式的构造了梯度函数
结果 ④ 通过调用反向传播函数来自动计算y关于x每个分量的梯度。
import torch
x torch.arange(4.0,requires_gradTrue)
y 2 * torch.dot(x,x)
y.backward() # 反向传播后会有梯度计算出来
print(x.grad) # 访问导数即访问梯度
print(x.grad 4 * x) # 4 * x 是 2 * x * x 的导数
结果 ⑤ 计算x的另一个函数。
import torch
x torch.arange(4.0,requires_gradTrue)
y 2 * torch.dot(x,x)
y.backward()
# 默认情况下PyTorch会累积梯度需要清除之前的值
x.grad.zero_() # y.backward() 后才能产生梯度才能梯度清零没有反向传播无法梯度清零
y x.sum() # 这里的y是一个标量sum函数其实就是x_1x_2...x_n求偏导自然是全1啊
y.backward()
print(x.grad)
结果 ⑥ 在深度学习中目的不是计算微分矩阵而是批量中每个样本单独计算的偏导数之和。
import torch
x torch.arange(4.0,requires_gradTrue)
y 2 * torch.dot(x,x)
y.backward()
# 默认情况下PyTorch会累积梯度需要清除之前的值
# 对非标量调用 backward 需要传入一个 gradient 参数该参数指定微分函数
x.grad.zero_()
y x * x # 这里的y不是一个标量这是一个向量
print(y)
# 等价于y.backward(torch.ones(len(x)))
y.sum().backward() # y.sum()后就讲向量转为标量了对标量求导
x.grad 结果 ⑦ 将某些计算移动到记录的计算图之外。
import torch
x torch.arange(4.0,requires_gradTrue)
y 2 * torch.dot(x,x)
y.backward()
x.grad.zero_()
y x * x
print(y)
u y.detach() # y.detach把y当作一个常数而不是关于x的一个函数
print(y.detach())
print(u)
z u * x
z.sum().backward()
x.grad u 结果 import torch
x torch.arange(4.0,requires_gradTrue)
y 2 * torch.dot(x,x)
y.backward()
x.grad.zero_()
y x * x # 这里的y是关于x的函数
x.grad.zero_()
y.sum().backward()
x.grad 2 * x 结果 ⑧ 即使构建函数的计算图需要通过Python控制流例如条件、循环或任意函数调用仍然可以计算得到的变量的梯度。
def f(a):b a * 2while b.norm() 1000: # norm是L2范数b b * 2if b.sum() 0:c belse:c 100 * breturn ca torch.randn(size(),requires_gradTrue)
print(a)
d f(a)
d.backward()
print(a.grad)
print(d/a)
a.grad d/a # d是a的线性函数所以导数就是斜率d/a
结果