2024工作周期安排
2024项目整体规划
沐曦测试(已完成)
沐曦性能测试研究
沐曦Benchmark相关测试
沐曦模型适配表
2024-02-26沐曦沟通报告
智能打标
数据打标服务Json样例
智能打标寒武纪大模型思路
业务层优先级排序
智能打标流程图
打标API接口文档
图像内容识别
其他
申报项目文本段落
研发链相关资料文档
国产GPU虚拟化培训介绍
大模型比赛
相关资料
智能填单_填单 启动命令
2024私人规划
ChatGPT API账号记录
公众号相关资料
基于 Docker 的深度学习环境:入门篇
ollama
Ollama
ReFT
ReFT AI论文笔记
ReFT概要
分布式对齐搜索 DAS
不是每个人都开始使用 ReFT 吗?
ReFT 微调Llama3
ReFT 算法详解
-
+
首页
ReFT AI论文笔记
# ReFT 本文介绍了表示微调(ReFT),这是一系列通过学习任务特定的隐藏表示干预而不是修改模型权重来适应大型语言模型的方法。作者关注于一种称为低秩线性子空间ReFT(LoReFT)的ReFT特例,它在由低秩投影矩阵张成的线性子空间中干预隐藏表示。LoReFT受到最近在模型可解释性研究中使用干预表示来理解和引导模型行为的启发。作者评估了LoReFT和一种高效的消融实验DiReFT在常识推理、算术推理、指令跟随和自然语言理解等一系列任务上的性能。他们发现,LoReFT比现有的参数高效微调方法使用15倍到65倍更少的参数就能达到最先进的性能,这表明ReFT方法是一种有前景的替代基于权重的微调方法。 ### 主要观点 - ReFT方法通过在隐藏表示上学习特定于任务的干预来适应大型语言模型,而不是修改模型权重 - 作者专注于低秩线性子空间ReFT(LoReFT),它在表示中进行干预,采用低秩线性子空间 - LoReFT受到模型可解释性工作的启发,该工作使用表示干预来理解和引导模型行为 - LoReFT和一种高效的消融实验称为DiReFT在一系列任务上进行了评估,包括常识推理、算术、指令遵循和自然语言理解 - LoReFT使用的参数比现有的参数高效微调方法少15倍到65倍,同时实现了最先进的性能,这表明ReFT是一种有前景的替代基于权重的微调方法 具体是怎么实现的,可以给我点伪代码来进行参考么 根据提供的上下文信息,可以通过以下几种方式来实现这个方法: 1. **激活加法(Activation Addition, ActAdd)** [36](https://app.txyz.ai/chat/a419b797-7bb9-4b5f-b606-bc5d356107ed): ``` def ActivationAddition(h, x_plus, x_minus, l, c): a = PCA([h(x_plus)(l) - h(x_minus)(l)], n_components=1)[0] return h + c * a ``` 主要步骤包括: - 计算正负样本在第l层的激活差异向量a。 - 将缩放后的a加到原始激活h上。 1. **表示工程(Representation Engineering, RepE)** [36](https://app.txyz.ai/chat/a419b797-7bb9-4b5f-b606-bc5d356107ed): ``` def RepresentationEngineering(h, prompts, l, c): # 计算读取向量 a_reading = PCA([h(x_i)(l)[-1] - h(x_i+1)(l)[-1] for i in range(0, len(prompts), 2)], n_components=1)[0] # 计算对比向量 a_contrast = PCA([h(x_plus_i)(l)[-1] - h(x_minus_i)(l)[-1] for i in range(1, len(prompts)+1)], n_components=1)[0] # 应用不同的RepE操作 h_linear = h + c * a_reading h_piecewise = h + c * torch.sign(a_reading * h) * a_reading h_projection = h - c * (a_reading * h) / torch.norm(a_reading) * a_reading return h_linear, h_piecewise, h_projection ``` 主要步骤包括: - 从给定的提示中计算读取向量a_reading和对比向量a_contrast。 - 使用计算得到的向量应用不同的RepE操作(线性、分段和投影)。 具体的实现细节,如提示的选择、关注的层以及超参数c,都取决于具体的使用场景和期望的行为。 那也就是说这个其实不会动权重,也不会训练,而完全只是在代码层来实现的么 根据提供的上下文信息,可以得出以下结论: [2](https://app.txyz.ai/chat/a419b797-7bb9-4b5f-b606-bc5d356107ed)ReFT方法不是通过修改模型权重来实现参数高效的微调,而是通过训练对隐藏表示的干预来实现。也就是说,ReFT方法是在代码层面上对模型的隐藏表示进行操作,而不会直接修改模型的权重参数。 [3](https://app.txyz.ai/chat/a419b797-7bb9-4b5f-b606-bc5d356107ed)具体来说,ReFT方法中提出的一种高效实现叫做Low-rank Linear Subspace ReFT (LoReFT),它通过干预隐藏表示的线性子空间来实现任务特定的调整,而不需要修改模型的权重参数。这种方法相比于现有的基于权重修改的参数高效微调方法,在参数效率和性能上都有显著优势。 因此,可以说ReFT方法是一种完全在代码层面上实现的参数高效微调方法,不会涉及到对模型权重的直接修改。 如果和提示词关联性相关感觉不能用在通用场景只能用在特定场景来使用这个 根据提供的背景,可以得出以下结论: ReFT(Representation-Focused Tuning)框架是一种通用方法,可以应用于广泛的场景,而不仅仅是特定的任务或提示。ReFT的关键在于它在前向传递过程中干预模型的隐藏表示,而不是直接修改模型权重。这使得ReFT更加灵活和适用于各种用例,与基于提示或基于权重的微调方法相比。 ReFT框架包括各种现有的推理时干预方法,包括像RED(Representation Editing)这样的技术。这些方法可以应用于模型的隐藏表示,而不受特定提示或任务的限制。 虽然不同ReFT变体的性能可能会因任务和模型大小而有所不同,但核心的ReFT方法并不局限于专门的或依赖于提示的场景。作者认为ReFT可以更广泛地应用,并希望在未来的工作中探索其在更广泛的模型和任务上的有效性。 总之,ReFT框架被设计为一种通用和灵活的语言模型微调方法,不受特定提示或任务的限制。作者相信它可以应用于广泛的常见场景,而不仅仅是依赖于提示的应用程序。 详细介绍一下什么是RED 根据提供的上下文信息,可以得出以下关于RED (Representation Editing)的介绍: RED是一种简单的表示编辑方法,它在每一层应用一个元素级的缩放变换s和偏置b来修改隐藏表示。这种修改会应用到序列中的每个位置,包括生成的令牌,从而增加了推理的开销。 在ReFT框架中,RED定义如下: ΦRED(h) = s × h + b IRED = {⟨ΦRED,{1,...,n},l⟩∣l ∈{1,...,m}} 其中,参数ϕRED = {s,b}是通过梯度下降来学习优化的,目标函数可以是语言建模损失或分类损失,如我们在LoReFT实验中所做的那样。 作者认为,与适配器相比,RED更应该被归类为一种适配器,因为它会应用到所有位置上 给我RED相关的伪代码 根据提供的上下文信息,我可以总结以下关于RED (Representation Editing)的介绍和伪代码: RED是一种简单的表示编辑方法,它在每一层应用一个元素级的缩放变换s和偏置b来修改隐藏表示。这种修改会应用到序列中的每个位置,包括生成的令牌,从而增加了推理的开销。[35](https://app.txyz.ai/chat/a419b797-7bb9-4b5f-b606-bc5d356107ed) RED的伪代码如下: ``` def RED(h): s = learnable_parameter(h.shape) # 学习的缩放因子 b = learnable_parameter(h.shape) # 学习的偏置 return s * h + b IRED = [{'phi_RED': RED, 'positions': list(range(h.shape[0])), 'layer': l} for l in range(num_layers)] # 在每一层的所有位置应用RED ``` 作者认为,与适配器相比,RED更应该被归类为一种适配器,因为它会应用到所有位置上。 编辑函数(editing function)是表示学习的一个参数化的变换Φ,它可以应用于预训练语言模型产生的隐藏表征h,从而得到修改后的表征hΦ,使其更适合于目标任务。这种编辑表征的方法,而不是直接更新模型权重,是表示微调(Representation Finetuning, ReFT)的核心思想。 编辑函数Φ可以采取多种形式,如低秩线性变换(LoReFT方法)或简单的元素级缩放和偏移(RED方法)。通过学习编辑函数的参数,ReFT方法可以高效有效地将模型适配到新任务,而无需进行完整的模型微调。 这种编辑表征的方法,相比于直接修改模型权重,能够更好地利用表征所编码的丰富语义信息,从而实现更强大的任务适配能力。 根据提供的上下文信息,我可以对秩线性变换(Low-rank Linear Subspace ReFT, LoReFT)做如下介绍: LoReFT是一种表示微调(Representation Finetuning, ReFT)方法,它通过对隐藏表征进行线性子空间编辑来实现模型适配[3](https://app.txyz.ai/chat/a419b797-7bb9-4b5f-b606-bc5d356107ed)[4](https://app.txyz.ai/chat/a419b797-7bb9-4b5f-b606-bc5d356107ed)[6](https://app.txyz.ai/chat/a419b797-7bb9-4b5f-b606-bc5d356107ed)。具体来说,LoReFT定义了一个编辑函数Φ,它将隐藏表征h映射到新的表征Φ(h)。这个编辑函数Φ由一个低秩矩阵R、一个线性变换矩阵W和一个偏置向量b参数化,如下式所示: Φ(h) = h + R⊺(Wh + b - Rh) 其中,R是一个正交的低秩矩阵,它定义了要编辑的线性子空间。W和b则学习如何在这个子空间上进行编辑,以更好地适应目标任务[3](https://app.txyz.ai/chat/a419b797-7bb9-4b5f-b606-bc5d356107ed)[6](https://app.txyz.ai/chat/a419b797-7bb9-4b5f-b606-bc5d356107ed)。 与其他参数高效微调(PEFT)方法相比,LoReFT具有以下优势: 1. 参数量大幅减少(15-65倍),但仍能在常识推理、指令跟随和自然语言理解等任务上达到最先进的性能。 2. 编辑函数Φ可以直接应用于隐藏表征,无需修改模型权重,因此在推理时没有额外开销[3](https://app.txyz.ai/chat/a419b797-7bb9-4b5f-b606-bc5d356107ed)。 3. 通过对线性子空间进行编辑,LoReFT可以有效地控制和调整模型的内部表征,从而实现对应任务的最佳性能[4](https://app.txyz.ai/chat/a419b797-7bb9-4b5f-b606-bc5d356107ed)[6](https://app.txyz.ai/chat/a419b797-7bb9-4b5f-b606-bc5d356107ed)。 总之,LoReFT是一种高效灵活的表示微调方法,值得进一步探索和应用。 根据上述上下文信息,我可以回答您的问题如下: 在 LoReFT 方法中,训练时修改的是一个低秩矩阵 R、一个线性变换矩阵 W 和一个偏置向量 b 这三个参数。[3](https://app.txyz.ai/chat/a419b797-7bb9-4b5f-b606-bc5d356107ed)[6](https://app.txyz.ai/chat/a419b797-7bb9-4b5f-b606-bc5d356107ed) 具体来说,LoReFT 定义了一个编辑函数 Φ,它将隐藏表征 h 映射到新的表征 Φ(h)。这个编辑函数 Φ 由 R、W 和 b 参数化,如下式所示: Φ(h) = h + R⊺(Wh + b - Rh) 其中,R 是一个正交的低秩矩阵,定义了要编辑的线性子空间。W 和 b 则学习如何在这个子空间上进行编辑,以更好地适应目标任务。[3](https://app.txyz.ai/chat/a419b797-7bb9-4b5f-b606-bc5d356107ed) 因此,在训练 LoReFT 时,我们主要修改这三个参数的值,而不需要更新原始预训练模型的全部参数。这使得 LoReFT 相比于传统的微调方法更加参数高效。 下面的表格将对比 ReFT 与 LoRA 的参数高效微调(PEFT)方法,以说明为什么 ReFT 所需的新增参数量通常比 LoRA 更少。请注意,具体参数量取决于实现细节和模型架构,这里是概念层面的对比。 | 对比维度 | LoRA | ReFT | 导致参数更小的原因 | | ---------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | | 参数引入方式 | 在模型权重矩阵中加入低秩分解的额外参数(A、B矩阵) | 将参数精调限制在较小范围的残差或特定层的微小偏移参数 | ReFT只需在少量位置添加极少参数,而LoRA往往需要对多个层的权重进行低秩分解 | | 参数新增规模 | 因为需要为若干层的权重矩阵添加低秩子空间的参数,对大模型而言即使低秩也会累积较多参数 | 通常只调整部分层(如输出层或特定中间层)的极少参数,以最小化新增量 | ReFT主要在局部添加少量参数,不进行全局低秩矩阵分解,整体参数增量更低 | | 模型尺寸变化 | 在较多层插入LoRA参数,参数量的增加相对显著 | 仅在部分位置增加非常有限的参数,整体增量可忽略不计 | ReFT的参数增量通常小于LoRA,因为改变范围与数量更为有限 | | 实际存储占用 | LoRA需要存储相对较多的新增矩阵参数(尽管低秩,但层数多时累积仍不少) | ReFT只需存储极少量的残差参数或特殊偏移参数,存储需求更小 | 减少额外矩阵存储,选取更低参数维度,使得ReFT额外存储显著缩减 | | 适用场景与灵活性 | 适用于多种场景,但参数增量相对较大,需要在各层添加LoRA模块 | 适用于快速、低参数增量的精调场景,在不显著扩大参数量的情况下微调模型 | ReFT通过在有限维度上进行微调,参数开销更小,更灵活地降低训练与部署成本 | 总结而言,ReFT的精调策略通常聚焦于对模型参数进行局部而非全局的调整,从而减少了需要新增的参数数量;相比之下,LoRA虽然也降低了参数量,但通常会在更多层面引入额外参数,因此整体参数增量仍较大。 下面是一个概念性伪代码对比示例,仅用于展示 LoRA 与 ReFT 在参数注入与前向计算中的差异。实际实现将因框架、模型结构而异。 ### LoRA 的伪代码示例 ``` python复制代码# 假设原始全连接层为:y = W * x + b # LoRA在层内增加两个低秩矩阵 A、B,用于微调参数 # A 和 B 的尺寸通常远小于 W,从而达到参数高效的效果 class LoRALayer: def __init__(self, W, rank): self.W = W # 原始权重,尺寸[D_out, D_in] self.A = init_matrix(D_out, rank) # 新增参数 A,尺寸[D_out, r] self.B = init_matrix(rank, D_in) # 新增参数 B,尺寸[r, D_in] self.b = init_bias(D_out) # 原始偏置 def forward(self, x): # 原有路径 base_output = self.W @ x + self.b # LoRA 增强路径 lora_output = (self.A @ (self.B @ x)) # 合并输出 return base_output + lora_output ``` ### ReFT 的伪代码示例 ``` python复制代码# 假设我们只在特定层的输出增加一个残差式的可训练偏移向量,或在残差块中增加极少参数 # 这里以增加残差向量为例来表示ReFT的额外参数 class ReFTLayer: def __init__(self, W): self.W = W # 原始权重,尺寸[D_out, D_in] self.b = init_bias(D_out) # 原始偏置 # 新增的极少参数,例如一个小维度的残差偏移向量 res_vec, 尺寸[D_out] self.res_vec = init_small_vector(D_out) def forward(self, x): # 原有路径 base_output = self.W @ x + self.b # 新增的极小参数影响:对输出增加一小段可学习的偏移 # (或者可以是对部分通道添加轻微调整,不必像LoRA一样对整个矩阵进行低秩分解) refined_output = base_output + self.res_vec return refined_output ``` ### 对比分析 | | LoRA | ReFT | | -------- | ------------------------------------------- | ------------------------------------------------------ | | 新增参数 | 引入两个低秩矩阵 A、B,对应多个层均可能需要 | 通常只在极少位置(如单个偏置向量)增加很少参数量的偏移 | | 前向计算 | 原始输出 + (A @ (B @ x)) | 原始输出 + (res_vec) | | 参数控制 | 通过选择低秩 r 来控制新增参数量 | 通过减少额外参数层的使用范围和维度来极小化新增参数量 | 从上面的伪代码可以看出,LoRA 的实现往往需要多个新增的参数矩阵参与计算,而 ReFT 只在极少量位置追加很少的参数(如仅一个小向量),这使得 ReFT 的额外参数量通常更低。 使用更少的参数(如ReFT)在理论上可能会减少模型在微调时的参数自由度,这有可能对模型的表达能力和最终精度产生一定影响。然而,实际效果取决于以下几个因素: 1. **参数选择的策略**: ReFT聚焦于对模型中最关键、最敏感的部分进行精调,而非对整套权重进行大范围的修改。这种有针对性的调优如果选择得当,能够在最小参数增量的情况下对模型进行有效的性能提升。由于这些参数往往集中在最能影响模型输出质量的“瓶颈”环节中,ReFT可能在较低参数增量的情况下,仍保持性能接近甚至媲美参数增量更大的方法。 2. **任务复杂度和数据分布**: 若下游任务相对简单且数据分布与原始预训练任务较为相似,使用ReFT这种参数增量小但有针对性的方法,往往就足够达到较高的精度。即便是更复杂的任务,在适当地选取修改点以及恰当的训练策略下,ReFT也能取得较为出色的表现。 3. **超参调优与训练细节**: 尽管ReFT引入的参数量少,但如果在训练中对学习率、正则化方式、训练步数进行良好的超参数搜索与调优,仍能在较低参数代价下取得合理的精度表现。精度是否会受到影响,很大程度上取决于具体训练实践与调优过程。 总的来说,较少的参数增量(如ReFT)不必然导致精度显著下降。通过精心选择修改点、充分利用预训练模型的已有表示能力,并结合合理的训练策略,即使使用非常有限的额外参数,也有可能在目标任务上达到接近或达到使用更大参数增量方法的效果。
yg9538
2024年12月9日 16:17
212
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档
PDF文档(打印)
分享
链接
类型
密码
更新密码