李沐动手学深度学习-07自动求导

07自动求导

对于矩阵的求导可以使用函数自动实现,但是还是需要学习一下具体的过程。链式法则等导数计算方法,截图主要用于帮助理解反向传递
李沐动手学深度学习-07自动求导_第1张图片

正向和反向的计算方法相比,在时间复杂度上两者并没有太大的查遍,但是内存复杂度不同,正向传递需要把所有结果都存下来,需要消耗大量的GPU内存资源。

x = torch.arange(4.0)
print(x)
x.requires_grad_(True)  # 等价于x=torch.arange(4.0, requires_grad=True)
x.grad  # 默认值为None
y = 2 * torch.dot(x, x) # 通过x构造一个y的标量
print(y)

y.backward()    # 对y关于x的每一个分量进行求导
print(x.grad)

x.grad.zero_()  # 对x.grad继续清零操作 如果不进行清零的操作,那么后续求出来的导数就会和前面的结果累加
y = x.sum()
y.backward()
print(x.grad)

x.grad.zero_()
y = x * x
# 很少对向量或者矩阵进行求导,一般来说都是对标量进行求导,所以如果需要计算的话就通过下面这种方式进行
y.sum().backward()
print(x.grad)

x.grad.zero_()
y = x * x
u = y.detach()  # 这里的作用是把y当成是一个正常的变量,而不是x的一个函数,u就是一个单独的u,和x没有关系
z = u * x
z.sum().backward()
print(x.grad == u)  # 所以这里求导以后的结果就是u

python的控制流实现
李沐动手学深度学习-07自动求导_第2张图片

你可能感兴趣的:(李沐深度学习,python,pytorch,深度学习)