昨天晚上推CNN反向,池化层这块没推明白,不懂为什么meanpool偏导为1/(k*k),但是上采样却变成了另一种看起来比较简单的方法。
一、明确反向传播的是什么
cost函数对某一参数的偏导,即某一参数发生变化,会对cost产生什么影响。
在已l层变化对cost的影响,我们可以进一步根据链式法则得到l-1层参数对cost的影响。
二、在池化层中
目前,我们已知的是池化后的z(l)变化对cost的影响,想要知道的是池化前的z(l-1)对cost的影响。
z(l-1)通过激活函数,变为a(l-1),再经过池化变为z(l)。
那我们按照原来的思路,首先要做的就是将z(l)对a(l-1)求偏导,看看a(l-1)的改变会导致z(l)如何变化——
换句话说,就是求为了减小cost分到z(l)上应该改变的部分,再分到a(l-1)上应该减少多少。(这个思想比较重要,因为你会发现z(l)好像不是那么容易对a(l-1)求偏导,因为维度不太一样【我也不知道能不能,应该是不能叭,至少不像之前见过的那么简单】)**因此这个求偏导的过程,也就是向前一层分需要减少cost值的过程,要保证前一层能够负起责任,将减少cost的任务完整地从z(l)层接过来。在这里面我们就让z(l)层的一个元素的梯度传递k*k个元素就好了,保证总的梯度不变。具体,不同的池化方法,分配方式不同,但是都不难理解。
三、问题来了,那么之前求偏导的过程也是保证每层传递的梯度不变吗