微调技术
微调技术
请解释全参数微调与参数高效微调的核心区别与应用场景。 掌握
核心区别在于对模型参数的更新范围与方式。全参数微调会更新预训练模型的所有参数,相当于在新的数据集上对整个模型进行一次“再训练”。它能最大程度地适应下游任务,但计算成本、存储成本和过拟合风险都很高。参数高效微调则通过引入少量可训练的新参数(如LoRA中的低秩矩阵、Adapter中的小型神经网络模块)或冻结绝大部分原始参数、仅选择性更新部分参数(如BitFit仅更新偏置项),来达到接近全参数微调的性能。
应用场景:全参数微调适用于数据充足、计算资源丰富且任务分布与预训练数据差异较大的场景,如领域专业化(医学、法律)。参数高效微调则是资源受限、需要快速迭代或部署多任务服务的首选,例如在消费级GPU上针对特定指令进行微调,或在单一云端服务中为不同客户维护多个轻量级微调模型。
LoRA的原理是什么?它为什么有效且受欢迎? 重要
原理:LoRA(低秩适应)假设模型在下游任务适应过程中的参数更新具有低秩特性。它不直接更新预训练权重矩阵 (W),而是冻结 (W),并注入一个旁路矩阵 ( \Delta W = BA ),其中 (B) 和 (A) 是可训练的低秩矩阵(秩 (r \ll \min(d, k)))。前向传播变为 (h = Wx + BAx)。
有效性及受欢迎的原因:
- 显著减少可训练参数:参数量从 (d \times k) 降至 ( (d + k) \times r ),通常减少数千至数万倍,极大降低了内存和存储开销。
- 保持推理零延迟:微调完成后,可将 (BA) 合并回 (W),得到一个与原始架构完全一致的模型,无需在推理时引入任何额外计算或延迟。
- 模块化与可组合性:不同的LoRA模块可以像插件一样方便地切换、组合或叠加,便于实现多任务学习或风格融合。
- 实践简便性:通常只需指定目标层(如Q、V投影矩阵)和秩 (r),调参简单,收敛稳定,效果常能媲美全微调。
除了LoRA,你还了解哪些参数高效微调技术?简述其特点。 掌握
- Adapter:在Transformer层的注意力或前馈网络后插入一个小型的、带瓶颈结构的前馈网络。特点是结构规整,但会改变模型架构,可能引入推理延迟,且通常效果略逊于LoRA。
- Prefix-tuning / Prompt-tuning:在输入层或模型深处添加可学习的虚拟Token(前缀)。完全冻结模型,仅优化这些前缀向量。非常节省参数,但对超参数(长度、初始化)敏感,且长序列会挤占有效上下文窗口。
- QLoRA:LoRA的量化升级版。在微调时将预训练模型量化为4-bit,并利用参数高效的LoRA适配器进行训练,同时使用一种新颖的高精度技术来减少量化误差。它使得在单张消费级GPU(如24GB)上微调超大模型(如65B)成为可能,是资源极度受限场景下的突破性技术。
指令微调与继续预训练有什么区别? 掌握
目标不同:指令微调的目标是教会模型理解和服从人类指令。它使用(指令, 期望输出)的配对数据进行有监督训练,旨在激发出模型在预训练阶段已具备但未显式展现的指令跟随和对话能力,对齐人类的交互偏好。继续预训练的目标则是让模型吸收某个特定领域或风格的新知识。它在无标注或弱标注的领域文本(如医学文献、代码)上,沿用预训练的语言建模目标进行训练,旨在扩展或深化模型的知识库。
数据与任务形式:指令微调数据是高质量的对话或任务完成样本;继续预训练数据是纯文本或代码片段。因此,指令微调是“对齐”过程,而继续预训练是“知识注入”过程。
在微调中,如何防止灾难性遗忘?有哪些策略? 重要
灾难性遗忘指模型在学习新任务/数据时,过度覆盖并丢失了原有通用知识与能力。
核心策略包括:
- 数据混合:在新任务数据中混入少量高质量的原始预训练数据或通用任务数据,在训练中同时兼顾新旧分布。
- 正则化技术:
- 弹性权重整合:对重要的旧任务参数施加更强的惩罚,限制其变化幅度。重要性可通过Fisher信息矩阵等估算。
- 梯度方向约束:确保新任务的梯度更新方向与旧任务的重要梯度方向不至于完全冲突。
- 参数高效微调:如使用LoRA、Adapter等,通过冻结绝大部分原始参数,从根本上限制了模型“遗忘”的能力。
- 多任务学习:如果有多个相关任务,从一开始就进行联合训练,使模型学习到更稳健的共享表示。
进行指令微调时,数据构造有哪些关键注意事项? 重要
- 多样性:指令应覆盖格式、复杂度、领域的广泛范围(如开放式生成、摘要、问答、推理等)。
- 质量与真实性:输出应由专家编写或严格验证,确保正确、有用、无害。避免引入错误或偏见。
- 格式一致性:明确统一输出的格式要求(如JSON、列表、正式/非正式语气),并在数据中严格体现。
- 负样本与拒绝能力:包含一些不合理、模糊或越界的指令,并配上模型礼貌拒绝或要求澄清的回应,以增强模型的安全边界。
- 避免泄露答案格式:指令本身不应隐含答案的结构或内容,迫使模型真正理解任务。