Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

剪枝时bn层的bias不用mask置零吗? #29

Open
zihaozhang9 opened this issue Dec 22, 2019 · 10 comments
Open

剪枝时bn层的bias不用mask置零吗? #29

zihaozhang9 opened this issue Dec 22, 2019 · 10 comments

Comments

@zihaozhang9
Copy link

为什么这里被注释了

为什么不使用bn_module.bias.data.mul_(mask)

剪枝时bn层的bias不用mask置零吗?

@tanluren
Copy link
Owner

这一步只是把bn weight置零了,结构还是原来的,bias的激活值也还没转移,只是先测试下初步效果;bias处理在后面的prune_model_keep_size2里,会先将bias的激活偏移值传给后来层,再把它置零。

@zihaozhang9
Copy link
Author

这一步只是把bn weight置零了,结构还是原来的,bias的激活值也还没转移,只是先测试下初步效果;bias处理在后面的prune_model_keep_size2里,会先将bias的激活偏移值传给后来层,再把它置零。

恩是的。我看到了,here。非常感谢

@mozpp
Copy link

mozpp commented Dec 23, 2019

这一步只是把bn weight置零了,结构还是原来的,bias的激活值也还没转移,只是先测试下初步效果;bias处理在后面的prune_model_keep_size2里,会先将bias的激活偏移值传给后来层,再把它置零。

for next_idx in next_idx_list:
next_conv = pruned_model.module_list[next_idx][0]
conv_sum = next_conv.weight.data.sum(dim=(2, 3))
offset = conv_sum.matmul(activation.reshape(-1, 1)).reshape(-1)
if next_idx in CBL_idx:
next_bn = pruned_model.module_list[next_idx][1]
next_bn.running_mean.data.sub_(offset)
else:
next_conv.bias.data.add_(offset)

请问你指的是这里吗?

@zihaozhang9
Copy link
Author

bias处理在后面的prune_model_keep_size2里,会先将bias的激活偏移值传给后来层,再把它置零。

for next_idx in next_idx_list:
next_conv = pruned_model.module_list[next_idx][0]
conv_sum = next_conv.weight.data.sum(dim=(2, 3))
offset = conv_sum.matmul(activation.reshape(-1, 1)).reshape(-1)
if next_idx in CBL_idx:
next_bn = pruned_model.module_list[next_idx][1]
next_bn.running_mean.data.sub_(offset)
else:
next_conv.bias.data.add_(offset)

请问你指的是这里吗?

对的,是这里

@zhaoxin111
Copy link

zhaoxin111 commented Apr 23, 2021

对prune_model_keep_size2和update_activation的理解

block: conv1-bn1-leaky1-conv2-bn2-leaky2

在prune_model_keep_size2中,依据bn层γ来选择哪些层被剪,小于阈值的层要被剪掉。
但被减去层的bias(β)还是会影响到结果,因此我们对BN1.weight筛选后还需要将被剪通道的bias转移至后续层计算,这样减少bias的影响
为什么说是减少呢?
回顾BN层计算:w*x+b,这儿w即γ,bias即b
w小于阈值的直接被置0,但在训练过程中w可能非常小,但也很微妙影响到输出。w趋向0,则对应层输出受bias控制。

prune_model_keep_size2处理逻辑:

  1. 将BN1中γ小于阈值的层权重置0
  2. 将BN1中γ小于阈值的层的bias转移至后一层计算
    怎么转移?
    先求取出被剪层cut_layers(即1-mask对应的层)的激活输出,这些激活输出就可以看做是对应层实际计算结果的近似(即bias),因为w趋向0了嘛
    好了,下面计算cut_layers在后续层的值,后续层是conv2,那么conv后的输出即offset

offset其实就是求的每一个卷积核针对上一层的一个激活输出,卷积的计算流程是将kernel_size范围内的神经元加权求和,而cut_layers对应的层的输出即bias
因此,每一层卷积计算可简化一下: (b1w11+b1w12+b1w13+...)->b1sum(kernel),也就是下面offset求取的方式
由于cut_layers每一层输出的值是一样的,那么均值也就是每一个卷积核一次求取的结果

3.conv2后面是BN层,那么这儿将上一层bias的计算结果直接写到BN的均值中。上一层原本是加cut_layers的均值,到了BN层就是减去他们了
(这一步的前提是conv2的bias为False)
如果conv2后面没BN层,那么直接将上一层的bias叠加到conv2的bias里去

@linklist2
Copy link

对prune_model_keep_size2和update_activation的理解

block: conv1-bn1-leaky1-conv2-bn2-leaky2

在prune_model_keep_size2中,依据bn层γ来选择哪些层被剪,小于阈值的层要被剪掉。 但被减去层的bias(β)还是会影响到结果,因此我们对BN1.weight筛选后还需要将被剪通道的bias转移至后续层计算,这样减少bias的影响 为什么说是减少呢? 回顾BN层计算:w*x+b,这儿w即γ,bias即b w小于阈值的直接被置0,但在训练过程中w可能非常小,但也很微妙影响到输出。w趋向0,则对应层输出受bias控制。

prune_model_keep_size2处理逻辑:

  1. 将BN1中γ小于阈值的层权重置0
  2. 将BN1中γ小于阈值的层的bias转移至后一层计算
    怎么转移?
    先求取出被剪层cut_layers(即1-mask对应的层)的激活输出,这些激活输出就可以看做是对应层实际计算结果的近似(即bias),因为w趋向0了嘛
    好了,下面计算cut_layers在后续层的值,后续层是conv2,那么conv后的输出即offset

offset其实就是求的每一个卷积核针对上一层的一个激活输出,卷积的计算流程是将kernel_size范围内的神经元加权求和,而cut_layers对应的层的输出即bias 因此,每一层卷积计算可简化一下: (b1_w11+b1_w12+b1_w13+...)->b1_sum(kernel),也就是下面offset求取的方式 由于cut_layers每一层输出的值是一样的,那么均值也就是每一个卷积核一次求取的结果

3.conv2后面是BN层,那么这儿将上一层bias的计算结果直接写到BN的均值中。上一层原本是加cut_layers的均值,到了BN层就是减去他们了 (这一步的前提是conv2的bias为False) 如果conv2后面没BN层,那么直接将上一层的bias叠加到conv2的bias里去

请问第3条该如何理解呢?第一个convolutional的leaky(bias)传递给第二个convolutional后,为什么需要BN的均值减去offset呢?而传递到没有BN的卷积中,需要bias加上offset呢?

@YeLL0W
Copy link

YeLL0W commented Apr 22, 2022

对prune_model_keep_size2和update_activation的理解
block: conv1-bn1-leaky1-conv2-bn2-leaky2
在prune_model_keep_size2中,依据bn层γ来选择哪些层被剪,小于阈值的层要被剪掉。 但被减去层的bias(β)还是会影响到结果,因此我们对BN1.weight筛选后还需要将被剪通道的bias转移至后续层计算,这样减少bias的影响 为什么说是减少呢? 回顾BN层计算:w*x+b,这儿w即γ,bias即b w小于阈值的直接被置0,但在训练过程中w可能非常小,但也很微妙影响到输出。w趋向0,则对应层输出受bias控制。
prune_model_keep_size2处理逻辑:

  1. 将BN1中γ小于阈值的层权重置0
  2. 将BN1中γ小于阈值的层的bias转移至后一层计算
    怎么转移?
    先求取出被剪层cut_layers(即1-mask对应的层)的激活输出,这些激活输出就可以看做是对应层实际计算结果的近似(即bias),因为w趋向0了嘛
    好了,下面计算cut_layers在后续层的值,后续层是conv2,那么conv后的输出即offset

offset其实就是求的每一个卷积核针对上一层的一个激活输出,卷积的计算流程是将kernel_size范围内的神经元加权求和,而cut_layers对应的层的输出即bias 因此,每一层卷积计算可简化一下: (b1_w11+b1_w12+b1_w13+...)->b1_sum(kernel),也就是下面offset求取的方式 由于cut_layers每一层输出的值是一样的,那么均值也就是每一个卷积核一次求取的结果
3.conv2后面是BN层,那么这儿将上一层bias的计算结果直接写到BN的均值中。上一层原本是加cut_layers的均值,到了BN层就是减去他们了 (这一步的前提是conv2的bias为False) 如果conv2后面没BN层,那么直接将上一层的bias叠加到conv2的bias里去

请问第3条该如何理解呢?第一个convolutional的leaky(bias)传递给第二个convolutional后,为什么需要BN的均值减去offset呢?而传递到没有BN的卷积中,需要bias加上offset呢?

bn均值减去offset(用k表示)是因为bn输入的x此时也减少了offset, ((x-k)-(mean-k))= x-k 。卷积加上是因为 令k = wk',w(x-k') + b + k = wx + b,保证输出近似不变

@linklist2
Copy link

@YeLL0W 非常感谢,我想我明白了

@linklist2
Copy link

对prune_model_keep_size2和update_activation的理解
block: conv1-bn1-leaky1-conv2-bn2-leaky2
在prune_model_keep_size2中,依据bn层γ来选择哪些层被剪,小于阈值的层要被剪掉。 但被减去层的bias(β)还是会影响到结果,因此我们对BN1.weight筛选后还需要将被剪通道的bias转移至后续层计算,这样减少bias的影响 为什么说是减少呢? 回顾BN层计算:w*x+b,这儿w即γ,bias即b w小于阈值的直接被置0,但在训练过程中w可能非常小,但也很微妙影响到输出。w趋向0,则对应层输出受bias控制。
prune_model_keep_size2处理逻辑:

  1. 将BN1中γ小于阈值的层权重置0
  2. 将BN1中γ小于阈值的层的bias转移至后一层计算
    怎么转移?
    先求取出被剪层cut_layers(即1-mask对应的层)的激活输出,这些激活输出就可以看做是对应层实际计算结果的近似(即bias),因为w趋向0了嘛
    好了,下面计算cut_layers在后续层的值,后续层是conv2,那么conv后的输出即offset

offset其实就是求的每一个卷积核针对上一层的一个激活输出,卷积的计算流程是将kernel_size范围内的神经元加权求和,而cut_layers对应的层的输出即bias 因此,每一层卷积计算可简化一下: (b1_w11+b1_w12+b1_w13+...)->b1_sum(kernel),也就是下面offset求取的方式 由于cut_layers每一层输出的值是一样的,那么均值也就是每一个卷积核一次求取的结果
3.conv2后面是BN层,那么这儿将上一层bias的计算结果直接写到BN的均值中。上一层原本是加cut_layers的均值,到了BN层就是减去他们了 (这一步的前提是conv2的bias为False) 如果conv2后面没BN层,那么直接将上一层的bias叠加到conv2的bias里去

请问第3条该如何理解呢?第一个convolutional的leaky(bias)传递给第二个convolutional后,为什么需要BN的均值减去offset呢?而传递到没有BN的卷积中,需要bias加上offset呢?

bn均值减去offset(用k表示)是因为bn输入的x此时也减少了offset, ((x-k)-(mean-k))= x-k 。卷积加上是因为 令k = wk',w(x-k') + b + k = wx + b,保证输出近似不变

@YeLL0W 请问若BN层的weight不趋向于0,是否仍旧有办法将该BN的bias移动到下一个BN的running_mean中呢?
因为relu(A+B)不等于relu(A) + relu(B),若BN层的weight不趋向于0,上述推理就不成立了....

@zihaozhang9
Copy link
Author

zihaozhang9 commented Oct 11, 2022 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

6 participants