1)为什么pytorch会默认累计梯度?
pytorch自己设计的,pytorch对内存管理不是很好。在我们反向传播的时候中间结果要在内存中存起来。
假设有一个批量,比较大,有时一次性算不出那个梯度。
这时候我们会将这个批量分成n个小批量,总共计算n次梯度并累加起来,就可以得到梯度了。
2)为什么深度学习中一般对标量求导而不是对矩阵或向量?
因为很多精度、损失函数在机器学习中都是一个标量。
如果向量loss不是标量,会很麻烦。比如深度很大的时候,loss会成为一个很大的矩阵,这样也没办法看的很直观。
3)为什么获取.grad()前需要backward()?
因为计算梯度是一件很贵的事情,除非一定说需要梯度的话,那么就先backward一下,在获取计算图中叶结点的梯度(grad)。