练习
- 为什么计算二阶导数比一阶导数的开销要更大?
- 在运行反向传播函数之后,立即再次运行它,看看会发生什么。
- 在控制流的例子中,我们计算
d
关于a
的导数,如果我们将变量a
更改为随机向量或矩阵,会发生什么?此时,计算结果f(a)
不再是标量。结果会发生什么?我们如何分析这个结果? - 重新设计一个求控制流梯度的例子。运行并分析结果。
- 使f(x)=sin(x),绘制f(x)和df(x)dx的图像,其中后者不使用f′(x)=cos(x)。
import torch #2 x = torch.arange(4.0) x.grad # 默认值是None x.requires_grad_(True) # 等价于 `x = torch.arange(4.0, requires_grad=True)` y = 2 * torch.dot(x,x) y.backward(retain_graph=True) y.backward() #如果你需要第二次反向传播,请在第一次时候使用retain_graph=True x.grad x.grad == 8 * x print(x.grad) #3 def f(a): b = a * a i = 0 while i < 5: b = b + i if b.norm > 0: d = b + 10 return c # b=a*a # for i in range(5): # b=b+i # if b.norm()>=0: # d=b+10 # return d a=torch.randn(10,requires_grad=True) d = f(a) d.backward(torch.ones_like(a)) print(a.grad)