学习问题总结(有关FP、BP、CG)
问题一
个人觉得github上讲得不错的BP算法 点这里
问题二
正向传播就是沿着从输入层到输出层的顺序,依次计算并存储神经网络的中间变量,so easy!反向传播就是沿着从输出层到输入层的顺序,依次计算并存储神经网络中间变量和参数的梯度。indigestibility ?
我理解的就是对复合函数求偏导呗,不管函数多么复杂,其实都是层层相套,堆叠在一起,就比如要函数Z对最里层的变量x求偏导,用的不也是链式求导吗,Z先对次外层变量u求偏导,其值再乘以u对次次外层变量y的偏导,以此类推,相乘即可。
问题三
在pytorch中真正用的时候直接通过autograd模块调用backward函数计算梯度。
问题四
给一个Tensor属性.requires_grad设置为True之后,就能track它的各种操作,一顿哈赛之后,直接.backward() ,链式求导,完成所有梯度计算,Tensor的梯度会累积到.grad属性中。
问题五
backword用的时候需要注意一点:在y.backward()时,如果y是标量,则不需要为backward()传入任何参数;否则,需要传入一个与y同形的Tensor。所以使用时直接捣鼓成标量得了,这也是为什么backword之前都会sum一下。简单解释看下边吧,详细解释可以参考知乎回答(PyTorch 的 backward 为什么有一个 grad_variables 参数?)
为了避免向量(甚至更高维张量)对张量求导,而转换成标量对张量求导。我们不允许张量对张量求导,只允许标量对张量求导,求导结果是和自变量同形的张量,所以必要时我们要把张量通过将所有张量的元素加权求和的方式转换为标量。
问题六
在模型参数初始化完成后,我们交替地进行正向传播和反向传播,并根据反向传播计算的梯度迭代模型参数。我们在BP中会使用FP中计算得到的intermediate variable 来避免重复计算。那么这个复用也导致结束后不能立即释放中间变量内存。这也是训练要比预测占用更多内存的一个重要原因。
另外需要指出的是,这些中间变量的个数大体上与网络层数线性相关,每个变量的大小跟批量大小和输入个数也是线性相关的,它们是导致较深的神经网络使用较大批量训练时更容易超内存的主要原因。