Lam1360 / YOLOv3-model-pruning

在 oxford hand 数据集上对 YOLOv3 做模型剪枝(network slimming)
MIT License
1.67k stars 431 forks source link

不理解添加L1规范怎样使得BN层的某些gama值变为0的? #80

Open ZhangAdjy opened 4 years ago

ZhangAdjy commented 4 years ago

bnmodule.weight.grad.data.add(s * torch.sign(bn_module.weight.data)) # L1 不理解将L1范式加到grad上后怎样来使得gama值变成0,以便于后续裁剪?麻烦知道的朋友告知一下,谢谢了

ZongshengXie commented 4 years ago

因为每次更新是要执行weight -= weight.grad的,这个操作相当于若weight为正,每次更新多减一点,若为负,每次更新时少减一点,于是weight就有向0的趋势

Curry-Christopher commented 4 years ago

我做了一些实验证明,加了加了L1范式后,如@ZongshenXie所说可以使γ更趋近于0(也就是数值较小的γ更多了),但是并不可以使γ值变为0。

ZongshengXie commented 4 years ago

我做了一些实验证明,加了加了L1范式后,如@ZongshenXie所说可以使γ更趋近于0(也就是数值较小的γ更多了),但是并不可以使γ值变为0。

代码里面实际上并不是L1,而是一个与γ正负相同的固定值,应该算是L0。另外,剪枝并不需要使γ严格等于0,而是让部分γ足够小,也就是让这部分channel对网络的影响变小,从而剪枝的时候把它们去掉后网络依然能够正常运行

Curry-Christopher commented 4 years ago

我做了一些实验证明,加了加了L1范式后,如@ZongshenXie所说可以使γ更趋近于0(也就是数值较小的γ更多了),但是并不可以使γ值变为0。

代码里面实际上并不是L1,而是一个与γ正负相同的固定值,应该算是L0。另外,剪枝并不需要使γ严格等于0,而是让部分γ足够小,也就是让这部分channel对网络的影响变小,从而剪枝的时候把它们去掉后网络依然能够正常运行

L0的说法还是不太严谨的,这里援引netslim原作者的回答https://github.com/Eric-mingjie/network-slimming/issues/31

EricliuEx commented 3 years ago

因此对于bn_module.weight.data(scale)为正数的,等于增大其梯度,按照梯度相反数更新,即bn_module.weight.data(scale)为正数的数值调小,

因此对于bn_module.weight.data(scale)为负数的,等于减小其梯度,按照梯度相反数更新,即bn_module.weight.data(scale)e为负数的数值调大,

即将bn_module.weight.data(scale)的绝对值调小,是其增加regular 用来产生绝对值调小的bn_module.weight.data(scale)方便其后的剪枝