从零开始学习大模型-第六章-大模型微调的概念
在深度学习的世界里,预训练大模型就像是接受过通识教育的“通才”,而微调,则是让这位通才快速成为某个领域的“专才”。简单来说,大模型微调(Fine-tuning)就是在已经训练好的、拥有广泛语言能力的基座模型(比如GPT-3、GPT-4、BERT)上,针对某个具体的任务或领域再进行一次针对性训练。预训练模型已经在海量无标签文本中学到了语言的通用规律,而微调就是利用相对小规模、有标签的数据集,去调整模型的参数,让它能更精准地完成类似文本分类、问答、机器翻译这样的特定任务。
当然,微调这件事也不是“一刀切”的。根据对原始模型调整的程度和方式,可以分成好几类。搞清楚了这些区别,才能在实际应用中选择更合适的那条路。
全微调:大动干戈,全面刷新
什么是全微调?
全微调,顾名思义,就是对整个预训练模型的所有参数进行无差别的更新和优化。在这个过程里,从最底层的词嵌入层,到中间的隐藏层,再到最顶端的输出层,没有一个参数能“逃过”被调整的命运。
全微调有什么特点?
这种方式能最大程度地利用预训练模型已经学到的知识,并在此基础上进行大刀阔斧的调整,以适配全新的任务需求。通常,在新任务与预训练任务相差甚远,或者要求模型具备极高灵活性和自适应能力时,全微调往往是首选。
全微调的优势在哪里?
- 它允许模型在预训练阶段积累的庞大通用知识之上继续学习,通常能显著提升模型在新任务上的表现,尤其是当预训练任务和目标任务关联紧密时。
性能上限高:
- 对所有参数进行调整,使模型能灵活应对各种复杂的任务和数据分布变化。对于与预训练任务差异大的场景,全微调更能捕捉到任务的独特之处。
适应性强:
- 相比于部分微调或引入特殊模块(如Adapter、LoRA)的方法,全微调无需在模型内部添加额外结构,模型结构纯粹,学习和实现的难度更低。同时,模型从前到后一体化训练,可以学到从输入到输出的完整映射,这对某些需要全局信息的任务(比如文本生成)可能更有效。
简单直接:
- 很多深度学习框架(比如Hugging Face Transformers)都为全微调提供了原生支持,开发者可以很方便地拿来就用,快速完成微调和部署。
生态友好:
全微调的“软肋”
不过硬币都有两面,全微调的缺点同样明显:
- 需要更新所有模型参数,这意味着更多的GPU时间、更大的内存占用,以及更长的训练周期。对于GPT-3、ChatGLM3这样的大模型来说,全微调的成本相当可观。
资源消耗巨大:
- 在目标任务的训练数据不够多的情况下,全微调很容易让模型“死记硬背”,在训练数据上表现很好,但在测试数据上却“原形毕露”。这时候就需要用正则化、早停等策略来“防一手”。
过拟合风险高:
- 对所有参数进行重新训练,可能会导致模型“忘掉”部分在预训练阶段学到的通用知识。如果微调数据集和预训练数据分布差异较大,模型的泛化能力就可能打折扣。
灾难性遗忘:
- 如果需要对同一个基座模型,微调出多个不同任务的模型,每次全微调都会完全覆盖上一次的结果。为了保留多个任务的能力,就得分别保存每个任务的模型副本,这大大增加了存储成本和模型管理的复杂度。
管理成本高:
- 如果微调过程中间出现不良现象(如梯度爆炸、优化困难),可能会对预训练模型的内部结构造成破坏,进而影响它在其他任务上的表现。虽然这种事不常发生,但对珍贵的预训练模型来说,确实是一种潜在风险。
破坏性风险:
部分微调:小修小补,高效节能
什么是部分微调?
部分微调(也叫Partial Fine-tuning / Repurposing)则克制得多。它只更新模型的顶层或者一小部分中间层的参数,而“锁住”大部分甚至是全部底层的预训练参数。这可以通过冻结某些层的训练,或者采用像Adapter、LoRA这样的特殊结构来实现。
部分微调有什么特点?
它的核心思想是“用好已有的,只补需要的”。在保留预训练模型通用语言能力优势的同时,以较低的“装修成本”对模型进行轻度调整来适应新任务。特别适合新任务与预训练任务比较相关,或者希望尽量保留模型泛化能力的情况。
部分微调的优势在哪里?
- 只训练部分参数,意味着需要更新的参数少了,训练收敛通常更快,时间成本也更低。
训练速度快,成本低:
- 预训练模型的底层通常学到了最通用的语言结构和模式。部分微调能避免这些宝贵特征被过度修改,从而保持对基础语言的良好捕获能力。
保留通用知识:
- 只调整少量参数,不容易对特定任务的数据“钻牛角尖”,尤其在下游任务数据量有限的时候,有助于保持模型的泛化性能。
更抗过拟合:
- 需要更新的参数少,对GPU内存和算力的要求也随之降低,对资源有限的环境更友好。
计算资源友好:
- 在面对多个相关任务时,可以使用同一个底层预训练模型,只针对每个任务微调不同的顶层参数,实现知识的有效共享和跨任务迁移。
便于多任务复用:
部分微调的“短板”
当然,省力的代价就是可能不够“彻底”:
- 如果只微调顶层,可能无法充分适应某些复杂或高度专业化的下游任务。底层的通用特征可能不足以捕捉到这些任务特有的细微之处。顶层参数的调整空间有限,性能往往难以达到全微调的水平。
表达天花板较低:
- 部分微调需要更精细的超参数调整和学习率策略设计,以确保仅更新的这部分参数能有效学习,同时避免底层参数的退化。
调参更讲究:
- 某些任务要求模型的不同层次甚至整个网络结构都做出适应性改变,而部分微调的固定更新范围就限制了这种灵活性。
灵活性受限:
- 最后的效果很大程度上取决于预训练模型本身的质量,以及它的底层特征对目标任务的匹配程度。如果基座模型就没选好,部分微调很难力挽狂澜。
依赖基座模型:
几种主流的特定微调技术
除了上述两种大类,业界还摸索出了一些非常精巧的特定微调技术,它们各有侧重。
SFT 监督微调
SFT(Supervised Fine-Tuning),监督微调,是被广泛使用的一种技术。它建立在预训练模型的基础上,利用带有标签的特定任务数据对模型进行进一步训练,让模型更精准地适应新的任务或数据分布。值得一提的是,SFT有时候也指代另一项技术(Selfie to Fine-tune),用来增强计算机视觉模型的性能。但在大语言模型领域,我们通常指的是第一种解释。
LoRA 微调
LoRA(Low-Rank Adaptation)是一种非常受欢迎的微调技术,主要为了解决传统微调中的过拟合和灵活性不足问题。它的核心思想并不是去修改预训练模型原有的参数,而是在模型内部添加一些低秩矩阵作为“外设”。在微调过程中,只更新这些新增矩阵的参数,原模型参数则完全冻结。这种方式大大降低了计算成本和存储需求。比如,我们熟知的很多高效微调方案,底层逻辑都是基于LoRA。
P-tuning v2 微调
P-tuning v2 是P-tuning技术的升级版,旨在提升多语言模型的性能和泛化能力。它通过在输入序列中引入一些可学习的、连续的“虚拟Token”(Prompt),来引导模型更好地理解任务。与第一版相比,v2版本进行了优化,使模型在不同语言上的泛化能力更强。
Adapter 微调
Adapter 微调技术最早由Pfeiffer等人在2019年提出。它的思路和LoRA有些类似,也是在预训练模型的不同层之间插入一个小型的、称为“适配器”(Adapter)的模块。在微调时,只训练这些新插入的适配器模块,而冻结原始模型的所有参数。这样做的好处是,同一个基座模型可以同时服务于多个不同的任务,只需要为每个任务保存一套轻量级的适配器权重即可,极大地提升了模型的适应性和复用效率。AdapterHub框架就是基于此思想诞生的,让研究者能更轻松地应用这项技术。
-
- 关于宇宙的好的网名有哪些
- 角色扮演 | 1
- 网名