youzhonghui/gate-decorator-pruning

关于Conv2dObserver里out_mask的疑问

Aaron4Fun opened this issue · 3 comments

感谢youzhonghui提供如此好的剪枝方法,请问Conv2dObserver里,out_mask是通过_backward_hook累加梯度得到的,后面的通道选择上需要选取self.out_mask != 0的通道,由于梯度是float类型,这样子的话累加和怎么等于0呢?谢谢

这算是个技巧。因为GBN的实现中,卷积的输入是被其之前的BN层剪枝(置0),输出是被其之后的BN层剪枝。我们可以通过反向传播的梯度来获知卷积层的哪些通道被剪枝,而不用让后边的BN层来反馈信息。

我们将filter的卷积操作考虑为 w*x+b。通过后边的门系数g,通道的输出是为 g(wx+b) 。当该通道被剪枝,g被置0,根据梯度计算的链式法则,到达filter的梯度也就为0。

但是因为ReLU的影响,仅仅观察一个样本是不足够判断filter被剪的,所以我们观察一个样本集合上的梯度情况,如果该filter的梯度始终为0,就可以判断该filter在后续的BN层被剪枝。

原来如此,十分巧妙的设计,获益良多谢谢谢谢

但是代码中已经使用leakyReLU来代替ReLU层,那么“仅仅观察一个样本是不足够判断filter被剪的”是不是有问题的