在《动手学深度学习》第二版教程中,当y为非标量的时候,调用backward()函数时,为什么先要求和呢(即y.sum().backward()),估计很多读者有点懵,今天小编给大家说说我的理解。
一、导数
先说明一下向量的导数,假设y=f(x):
1、如果x是标量,y为标量,那么y对x的导数为标量。
2、如果x是标量,y为一维列向量,那么y对x的导数为1维列向量。此时可以转为两个标量函数分别求导,然后拼接。
3、如果x是1维行向量,y为标量,那么y对x的导数是1维行向量。
4、如果x是1维行向量,y为1维列向量,那么y对x的导数是2维矩阵。
二、backward()函数调用
2.1、当y为标量时
y=f(x),当y为标量时,可以直接调用y.backward()
1、假设x是标量,y为标量
2、假设x是1维行向量,y为标量
2.2、当y为向量时
当y为向量时,调用backward需要传入一个gradient参数。
所以y.sum().backward()等价于y.backward(torch.ones(len(x)))
小结。其实在深度学习中,损失函数都是标量,所以一般情况下我们可以直接调用backward()就可以了。
参考资料
1、《动手学深度学习》第二版,https://zh.d2l.ai/index.html