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

你好 我在渐进式剪枝这一环节有些疑问 希望您解答 #30

Open
Hao-tianWang opened this issue Mar 18, 2024 · 2 comments
Open

Comments

@Hao-tianWang
Copy link

你好,很出色的工作!
我在渐进式剪枝这一部分有一些疑问,在论文中,您提出用累计梯度的大小作为alpha参数重要性的衡量因子,不过在论文中好像并未说明更新alpha时变动的元素是alpha的grad值大还是值小的元素?
在代码中,我看到:

sorted_alpha_grad, indices = torch.sort(alpha_grad, descending=True)
    compression_weight = torch.ones_like(indices)
    compression_weight[indices < alpha_grad_attn.numel()] = 36 # 36 = 12 (number of heads) * [1 (weights of query) + 1 (weights of key) + 1 (weights of value)]
    threshold = sorted_alpha_grad[torch.argmin(torch.abs(torch.cumsum(compression_weight, 0) - torch.sum(compression_weight)*pi))]
    
    def update(module, grad):
        mask = ((grad <= threshold) | (grad <= torch.min(grad)))
        module.data.copy_(mask + (~mask)*(1 - pi/p))

这一部分似乎说明,在update过程中是grad比threshold大的部分参数得到了更新,将其趋于0,这里我有些疑问,为何grad比threshold大的部分参数重要性就小以至于能趋于0呢?希望您解答

@sdc17
Copy link
Owner

sdc17 commented Mar 20, 2024

你好,

  1. 更新alpha时变动的元素是alpha的grad值大还是值小的元素

    论文算法1的10-12行有具体流程,第10行的TopKMask代表取累计梯度最大的K个位置生成 0-1 Mask $M^t$$M_t$ 为0代表需要保留的位置, $M_t$为1代表需要剪枝的位置,也即累计梯度大的位置需要被剪枝。

  2. 为何grad比threshold大的部分参数重要性就小以至于能趋于0呢

    首先需要区分在Progressive Pruning中会涉及到的两种不同mask。我们不想让需要被剪枝的值从原值直接变为0(这对应我们直接将二值化的 $M^t$ 乘到模型里),而是想让其逐渐变为0,因此这里我们需要把二值化的 $M^t$ 平滑成一个连续实值的mask $\zeta^t$,也即让 $\zeta^t$ 作为真正乘到模型里的mask。

    所有的mask $\zeta^t$的初值都为1,为促进稀疏化,其范数会被作为额外的损失项,即公式3。如果按正常随机梯度下降更新mask $\zeta^t$ 的参数,那么在不重要的位置上mask $\zeta^t$ 的值学出来会比较小,这也意味着从iteration 0开始他们的累计梯度比较大。由于在Progressive Pruning中我们需要控制在每个iteration时mask $\zeta^t$ 的更新,正常随机梯度下降只能促使mask $\zeta^t$ 值变小,但控制不了每个iteration时mask $\zeta^t$ 的具体取值,所以Progressive Pruning借用了累计梯度作为指标,先根据累计梯度生成0-1 Mask $M^t$,再根据 $M^t$ 和当前时间步 $t$ 平滑成连续实值的mask $\zeta^t$,以达到控制每个iteration时mask $\zeta^t$ 具体取值的效果。

@Jayce0625
Copy link

Jayce0625 commented May 15, 2024

你好,

  1. 更新alpha时变动的元素是alpha的grad值大还是值小的元素
    论文算法1的10-12行有具体流程,第10行的TopKMask代表取累计梯度最大的K个位置生成 0-1 Mask Mt 。 Mt 为0代表需要保留的位置, Mt为1代表需要剪枝的位置,也即累计梯度大的位置需要被剪枝。
  2. 为何grad比threshold大的部分参数重要性就小以至于能趋于0呢
    首先需要区分在Progressive Pruning中会涉及到的两种不同mask。我们不想让需要被剪枝的值从原值直接变为0(这对应我们直接将二值化的 Mt 乘到模型里),而是想让其逐渐变为0,因此这里我们需要把二值化的 Mt 平滑成一个连续实值的mask ζt,也即让 ζt 作为真正乘到模型里的mask。
    所有的mask ζt的初值都为1,为促进稀疏化,其范数会被作为额外的损失项,即公式3。如果按正常随机梯度下降更新mask ζt 的参数,那么在不重要的位置上mask ζt 的值学出来会比较小,这也意味着从iteration 0开始他们的累计梯度比较大。由于在Progressive Pruning中我们需要控制在每个iteration时mask ζt 的更新,正常随机梯度下降只能促使mask ζt 值变小,但控制不了每个iteration时mask ζt 的具体取值,所以Progressive Pruning借用了累计梯度作为指标,先根据累计梯度生成0-1 Mask Mt,再根据 Mt 和当前时间步 t 平滑成连续实值的mask ζt,以达到控制每个iteration时mask ζt 具体取值的效果。

所以我可以理解为应该是M=0代表越重要所以需要保留吗?也就是楼主实际上说错了,楼主以为重要性小才会趋于0.传统掩码剪枝一般是为1保留为0修剪。但是您的工作中是把Mask矩阵看作修剪矩阵,所以1代表修剪0代表不剪,也就是1代表权重不重要0代表重要

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

3 participants