表示微调(ReFT)
1 介绍
为什么使用 ReFT?
- 参数更少:与像 LoRA 这样的 PEFT 方法相比,ReFT 只干预表示的一小部分,并使用远少于可训练参数。内存使用和计算资源大幅减少,从而降低了时间消耗。例如,使用 ReFT 进行指令微调只需 1,000 个示例,262K 个参数,且在不到 18 分钟内完成。
- 灵活性:ReFT 与 Hugging Face 上的每个语言模型一起工作。它附带一个库 PyReFT,其接口类似于 PEFT 库,因此您可以轻松地在 PEFT 和 ReFT 之间切换。
- 性能:ReFT 可以启用与传统或基于 PEFT 的微调方法相似或更好的性能。
ReFT 与 PeFT 有何不同?
PEFT 方法如 LoRA 专注于减少可训练参数的数量,并更新模型权重的一小部分以适应模型。在 PEFT 中,变化是在序列中单个标记的表示上进行的。
ReFT 受到对可解释性研究的影响,该研究在时间上重复使用表示,并直接编辑其中的一小部分。它使用编码在这样表示中的强大语义信息来调整模型。
PEFT方法,例如,LoRA、DoRA和prefix-tuning,侧重于修改模型的权重或引入额外的权重矩阵。而ReFT方法不直接修改模型的权重;它们会干预模型在向前传递期间计算的隐藏表示、
- 干预目标
PEFT方法,例如,LoRA、DoRA和prefix-tuning,侧重于修改模型的权重或引入额外的权重矩阵。而ReFT方法不直接修改模型的权重;它们会干预模型在向前传递期间计算的隐藏表示。- 适应机制
像LoRA和DoRA这样的PEFT方法学习权重更新或模型权重矩阵的低秩近似值。然后在推理期间将这些权重更新合并到基本模型的权重中,从而不会产生额外的计算开销。ReFT方法学习干预,在推理过程中在特定层和位置操纵模型的表示。此干预过程会产生一些计算开销,但可以实现更有效的适应。- 动机
PEFT方法的主要动机是对参数有效适应的需求,减少了调优大型语言模型的计算成本和内存需求。另一方面,ReFT方法受到最近语言模型可解释性研究的启发,该研究表明,在这些模型学习的表示中编码了丰富的语义信息。ReFT的目标是利用和利用这些编码的知识来更有效地适应模型。
ReFT 是如何工作的?
ReFT 改变模型在正向传播过程中内部表示或隐藏状态(数字向量)。这些是针对特定任务的改变,是对表示的干预。
设置 ReFT 配置
现在我们可以通过详细说明我们想要学习的干预措施来设置 ReFT 配置。您会看到设置 ReFT 配置与 PEFT 配置非常相似。在这个演示中,我们将仅编辑第 15 层,并将低秩维度设置为 4。
# get reft model
reft_config = pyreft.ReftConfig(representations={"layer": 15,"component": "block_output","low_rank_dimension": 4,"intervention": pyreft.LoreftIntervention(embed_dim=model.config.hidden_size,low_rank_dimension=4)} )
reft_model = pyreft.get_reft_model(model, reft_config)
reft_model.set_device("cuda")
reft_model.print_trainable_parameters()
您会注意到可训练的参数非常少,仅占模型总参数数量的 0.0004%。
由于 ReFT 训练器期望数据以特定格式,我们将使用 PyReft 库中的 make_last_position_supervised_data_module() 函数来准备数据。
在实施 ReFT 时需要考虑的事项
就像在 PEFT 或其他微调方法中一样,在 ReFT 中找到正确的超参数设置对于获得良好的性能至关重要:
- 层:在演示中,我简单地选择了第 15 层进行干预。
论文建议从所有层开始,然后有系统地减少干预层的数量。- 位置:该论文还发现,在多个标记处进行干预比关注单个标记位置(例如,第一个或最后一个位置)可以获得更高的性能。
- 排名:论文建议从低于 32 的排名开始,例如排名 4。
- 共享权重:跨层共享权重可以允许层间改进。
- 经典神经网络训练超参数:再次提醒一下,学习率、预热比例、权重衰减等因素确实起着作用,但与 ReFT 中其他基本因素相比,其影响程度要小一个数量级。