Boosting Parameter Efficiency in LLM-Based Recommendation through Sophisticated Pruning
本文尝试通过参数pruning来减小模型规模。
核心认识就是通用模型用在推荐任务下,其关于数学或者代码的能力并不是必须的,这部分能力对应的参数就是冗余的,是应当去除的。而原本针对通用llm的pruning方式,目的是保留其各方面的通用能力,因此在推荐任务下并不会有很好的效果。
比如WANDA[1]与随机pruning相比,在推荐任务下的性能几乎差不多,甚至有所不足。这意味着需要在推荐场景下单独设计pruning策略。
## Step1 减小模型宽度 包括减小embeding size,减小attention头的个数
对每一个attention head求一个重要性,定义为抑制其前后模型输出的KLD,记为\(Imp(O_{i}^l)\),代表第l层第i个attention head的重要性。为了考虑去除前面的attention head之后,对后面层的影响,将其更新为 \[ Imp(O_{i}^l) = \alpha Imp(O_{i}^l) + (1-\alpha) Imp(O_{i}^{l+1}) \] 显然这是递归定义的,就考虑到了对之后每一层的影响 之后根据Imp对attention head进行修剪。
对于embeding,定义每一个维度\(d\)的重要性为\(|E_{d}\bigodot \nabla_{E_{d}}|\),即其对应嵌入权重与梯度的乘积的abs,然后按照重要性修剪。
Step2 修剪MLP
实验发现MLP层的activation分布明显长尾,这意味着少部分维度提供了大部分信息,从而存在冗余维度。考虑每一个序列最后一个token对应的activation(这应该是只希望考虑任务强相关的信息,毕竟最后一个token之后就是预测结果了) 定义每一个维度的重要性为其整个batch中其对应activation大于给定阈值\(\tau\)的概率,之后保留topK维度
Step3 层级修剪
对于每一层,重要性定义为去除其前后的PPL变化,变化越大,代表其越重要。然后依据此修剪冗余层
性能恢复
以修剪前的模型作为teacher,与修建后的模型做KD,加上student与ground truth的对齐
总结
对于每一个组件,主要还是依据其对具体任务的影响来评估其重要性,然后依据重要性修剪。 当然最终的效果还是很好的,在修剪了95%的参数(非embedding)之后还能还原88%的性能。
Reference
[1] Sun, M., Liu, Z., Bair, A., & Kolter, J.Z. A Simple and Effective Pruning Approach for Large Language Models. In ICLR, 24