自动求导Autograd
1,标量与标量之间的求导
函数y = x^2,当x=3.0时,y的导数,,
**注意:在机器学习中一般x的导数是多少,如x.grad(), 指的是函数在变量x处的导数。pytorch求导是函数对自变量的求导,并不计算函数对中间变量的导数,****如y是x的函数,z是y的函数,f是z的函数,那么在求导的时候,会使用 f.backwrad()只会默认求f对于叶子变量x的导数值,而对于中间变量y、z的导数值是不知道的,直接通过x.grad是知道的、y.grad、z.grad的值为none。pytorch实质上求解雅可比(Jacobian)式. 因为雅可比式可以根据已知条件(即明确的函数关系)求出,再乘以上一级梯度值。根据BP算法的推导(链式法则),dloss / dx = (dloss / doutput) * (doutput / dx),如下,dloss/doutput就是1.0, doutput / dx为6.0,再相乘。
x = torch.tensor(3.0, requires_grad=True)
y = torch.pow(x, 2)
# 判断x,y是否是可以求导的
print(x.requires_grad)
print(y.requires_grad)
# 求导,通过backward函数来实现
y.backward()
# 查看导数,也即所谓的梯度
print(x.grad)
"""
结果:
True
True
tensor(6.) # 使用数学求导法则同样计算是6
"""
2,标量对向量/矩阵求导
函数f=(X), 标量y对列向量x求导,即求函数在向量各处分量xi的导数.
# 创建一个多元函数,即Y=XW+b=Y=x1*w1+x2*w2*x3*w3+b,x不可求导,W,b设置可求导
X = torch.tensor([1.5, 2.5, 3.5], requires_grad=False) # 常量
W = torch.tensor([0.2, 0.4, 0.6], requires_grad