一、增加额外参数的方法
这些方法通过向模型中添加额外的可训练参数,而不修改原有的预训练模型参数。
1. Prefix Tuning(前缀微调)
- 原理:在每一层的输入添加一组可训练的“前缀”向量,这些前缀向量会影响模型的输出。
- 特点:只训练前缀向量,预训练模型的参数保持不变。
- 优势:参数量小,适用于多任务场景。
2. Prompt Tuning(提示词微调)
- 原理:在输入文本前添加一系列可训练的“提示词”或“提示向量”。
- 特点:仅训练这些提示词的嵌入向量,模型其他参数不变。
- 优势:实现了对任务的定制化,而无需大规模更新模型参数。
3. Adapter Tuning(适配器微调)
- 原理:在模型的每一层插入小型的“适配器”模块,这些模块是可训练的。
- 特点:仅训练适配器模块,原始模型参数冻结。
- 优势:适配器模块体积小,便于在不同任务间共享主模型。
适配器的变体
- 并行适配器:将适配器并行添加到模型层中,而不是串联。
- Compacter:通过参数共享和低秩分解进一步压缩适配器的参数量。
二、选取一部分参数更新
1. BitFit(仅微调偏置项)
- 原理:只对模型中的偏置项(bias)进行训练,其他参数保持不变。
- 特点:偏置项的数量远小于权重参数,因此训练开销很小。
- 优势:显著降低了训练参数量,同时在某些任务上性能接近全参数微调。
三、引入重参数化的方法
这些方法通过改变模型参数的表示方式,减少需要更新的参数数量。
1. LoRA(低秩适配器)
- 原理:将权重矩阵的更新表示为低秩矩阵的乘积,只训练这些低秩矩阵。
- 特点:减少了训练参数量,同时保留了模型的表达能力。
- 优势:适用于大规模模型的微调,节省内存和计算资源。
2. AdaLoRA(自适应LoRA)
- 原理:在LoRA的基础上,自适应地调整低秩矩阵的秩,使之在训练过程中动态变化。
- 特点:能够根据参数的重要性分配不同的容量。
- 优势:提高了模型的灵活性和性能。
3. QLoRA
- 原理:将模型的权重量化为低精度(如4位),同时使用LoRA进行微调。
- 特点:结合了量化和参数高效微调的优势。
- 优势:大幅减少了内存占用和计算量,适合资源受限的环境。
四、混合高效微调方法
这些方法结合多种参数高效微调技术,进一步提升性能。
1. MAM Adapter
- 原理:结合了多头注意力机制的调制和适配器方法,对模型进行高效微调。
- 特点:在适配器中加入了对注意力机制的调节。
- 优势:增强了模型对任务特定信息的捕获能力。
2. UniPELT
- 原理:统一了多种参数高效微调方法(如Prefix Tuning、Adapter Tuning、LoRA等),提供一个灵活的框架。
- 特点:可以根据任务需求选择或组合不同的微调策略。
- 优势:提高了模型在不同任务和场景下的适应性。
不同方法之间的差异
- 参数更新部分:一些方法(如BitFit)只更新模型现有的部分参数,另一些方法(如Adapter Tuning)则增加新的参数模块。
- 模型结构影响:增加额外参数的方法会改变模型的结构,而仅更新部分参数的方法保持模型结构不变。
- 性能和效率:不同方法在性能和训练效率上有所差异,需要根据具体任务选择。
当前参数高效微调方法的问题
- 适用性限制:某些方法在特定任务或模型上效果不佳。
- 优化难度:仅训练少量参数可能导致优化困难,收敛速度变慢。
- 模型兼容性:不是所有方法都能直接应用于所有类型的预训练模型。
最佳实践
- 方法选择:根据任务的需求和资源限制,选择合适的微调方法。
- 参数调节:对于方法中的超参数(如LoRA的秩),需要进行调优以获得最佳性能。
- 方法组合:可以尝试将多种方法结合,发挥各自的优势。
引入重参数化的方法详解
您提到不太理解“引入重参数化的方法,这些方法通过改变模型参数的表示方式,减少需要更新的参数数量”。下面我将详细解释这一概念,帮助您理解这些方法是如何工作的。
什么是重参数化?
重参数化(Reparameterization)是指通过重新定义或重新表达模型的参数,使得模型在训练或推理时更高效。在参数高效微调的背景下,重参数化的方法通过改变参数的表示方式,使得我们只需要更新一小部分参数,而不必调整整个模型的所有参数。
为什么要引入重参数化?
大型预训练模型(如BERT、GPT-3)通常包含数以亿计的参数,直接微调所有参数有以下问题:
- 计算资源消耗大:需要大量的计算能力和存储空间。
- 训练时间长:全参数微调需要更多的训练时间。
- 参数冗余:并非所有参数都对特定任务有重大影响。
重参数化的方法旨在:
- 减少需要更新的参数数量:只更新少量关键参数。
- 降低计算和存储成本:减少计算量和显存占用。
- 保持或接近原始性能:在减少参数的同时,尽可能保持模型性能。
重参数化的方法示例
以下是一些常用的重参数化方法:
1. LoRA(Low-Rank Adaptation)
基本思想:
- 假设:在特定任务中,模型参数的变化可以近似为低秩矩阵。
- 方法:将权重矩阵的更新部分表示为两个小矩阵的乘积,即低秩分解。
公式:
ΔW=A×B
其中:
- W:原始权重矩阵。
- ΔW:权重的更新量。
- A∈Rd×r,B∈Rr×k:新引入的可训练小矩阵。
- r:远小于 d 和 k 的秩值。
优势:
- 参数量减少:A 和 B 的参数量远小于 W。
- 只需训练 A 和 B:原始权重 W 保持不变。
- 易于实现:不需要改变模型的整体结构。
2. AdaLoRA(Adaptive LoRA)
基本思想:
- 动态调整秩 r:根据参数在特定任务中的重要性,自适应地调整秩大小。
- 方法:在训练过程中,自动增大或减小 r,以优化性能和参数量的平衡。
优势:
- 更灵活:适应不同参数的重要性,资源分配更合理。
- 性能提升:在相同参数量下,可能获得更好的性能。
3. QLoRA
基本思想:
- 结合量化和LoRA:将模型参数量化为低精度(如4位),同时使用LoRA进行微调。
- 方法:在降低模型精度的同时,应用低秩更新。
优势:
- 显存占用更小:量化降低了模型的存储需求。
- 计算更快:低精度计算速度更快。
- 参数高效:结合了量化和低秩更新的优势。
如何理解重参数化减少了参数数量?
1. 参数量对比
- 全参数微调:需要更新整个权重矩阵 W,参数量为 d×k。
参数量=d×k
- LoRA微调:只需训练 A 和 B,参数量为 d×r+r×k。
参数量=d×r+r×k
由于 r≪d,k,因此:
d×r+r×k≪d×k
示例:
假设:
- d=k=1024
- r=8
则:
- 全参数微调参数量:1024×1024=1,048,576 个参数。
- LoRA微调参数量:1024×8+8×1024=16,384 个参数。
参数量减少了约 64倍。
2. 示例图解
图1:LoRA通过低秩分解减少了需要训练的参数数量。
重参数化的原理深入
1. 低秩近似
- 概念:低秩矩阵可以用更少的信息表示原始矩阵的主要特征。
- 应用:在很多情况下,模型的参数更新实际上具有低秩结构。
2. 矩阵分解
- 奇异值分解(SVD):将矩阵分解为多个秩一矩阵的加权和。
- 在LoRA中:通过低秩矩阵 A 和 B 的乘积近似权重更新。
3. 为什么有效
- 参数共享:低秩分解捕捉了参数更新的主要方向,减少了冗余。
- 泛化能力:减少参数量有助于防止过拟合,提高模型的泛化能力。
实际应用中的流程
- 加载预训练模型:模型参数 W 保持不变,不参与训练。
- 引入可训练参数:添加 A 和 B 等小矩阵,这些是需要训练的参数。
- 前向传播:
y=f(Wx+ΔWx)=f(Wx+(A×B)x)
-
- x:输入数据。
- y:模型输出。
- 反向传播:只计算并更新 A 和 B 的梯度。
- 推理阶段:
- 合并权重:可以将 ΔW 与 W 合并,或者在运行时计算。
- 效率提升:由于 A 和 B 较小,对推理速度影响不大。
重参数化方法的优势总结
- 高效性:显著减少需要更新的参数数量,降低训练成本。
- 灵活性:可以根据需要调整秩 r,在参数量和性能之间找到平衡。
- 适用性强:适用于各种预训练模型,且易于与其他方法结合。
可能的疑问
1. 重参数化会降低模型性能吗?
- 一般情况下不会:虽然更新的参数量减少了,但由于捕捉了关键的更新方向,模型性能通常能够保持。
- 需要调节:秩 r 的选择对性能有影响,可能需要根据任务调整。
2. 如何选择秩 r?
- 经验法则:从小的 r 开始(如8、16),根据验证集性能进行调整。
- 任务相关:不同的任务可能需要不同的 r。
与其他参数高效微调方法的对比
- 增加额外参数的方法(如Adapter Tuning):需要在每一层添加适配器模块。
- 仅更新部分参数的方法(如BitFit):只更新偏置项。
- 重参数化的方法:通过改变参数表示,只需更新少量新参数。
重参数化方法的独特之处在于:
- 参数效率更高:相比增加额外参数的方法,参数量更少。
- 性能保持良好:相比仅更新部分参数的方法,性能通常更接近全参数微调。
总结
引入重参数化的方法通过重新表示模型参数,实现了以下目标:
- 减少需要更新的参数数量:只训练新引入的小矩阵。
- 降低计算和存储成本:减少了计算量和显存占用。
- 保持模型性能:在大多数情况下,性能与全参数微调相近。
希望以上详细解释能帮助您理解引入重参数化的方法,以及它们如何通过改变模型参数的表示方式,减少需要更新的参数数量。如有进一步疑问,请随时提问!