由于对大型语言模型,人工智能从业者经常被问到这样的问题:如何训练自己的数据?回答这个问题远非易事。生成式人工智能的最新进展是由具有许多参数的大规模模型驱动的,而训练这样的模型LLM需要昂贵的硬件(即许多具有大量内存的昂贵GPU)和花哨的训练技术(例如,完全分片的数据并行训练)。
幸运的是,这些模型通常分两个阶段进行训练——预训练和微调。其中前一个阶段(要)昂贵得多。鉴于高质量的预训练LLMs很容易在网上获得,大多数人工智能从业者可以简单地下载一个预训练的模型,并专注于使这个模型(通过微调)适应他们想要的任务。
“就所需的硬件和为不同任务托管独立实例的存储/交换成本而言,微调庞大的语言模型的成本高得令人望而却步。”
模型的大小并没有在微调过程中改变。因此微调一个LLM虽然比预训练便宜,可是也不是易事,仍然需要训练技术和硬件来处理这样的模型。每次微调运行都会创建一个完全独立的“副本”。
参数高效微调(PEFT)是微调一种比较好的技术,它不是端到端地训练完整的模型,而是固定预训练的模型权重,并且在微调期间仅调整少量特定于任务的参数。这种方法大大减少了内存开销,简化了存储/部署过程,并允许使用更易于访问的硬件进行微调LLMs。
微调与转移学习
首先先来明确两个概念,微调和转移学习。转移学习是将一个通用的预训练模型应用到全新的但是相关领域的过程。而微调是将通用的预训练模型进一步的训练。一般而言,微调是包含转移学习的。
上图展示了预训练,特征提取和微调的过程,预训练就是使用训练数据直接训练基础模型,比较常见的有T5,BloombergGPT,GPT-4。特征提取一般是利用基础模型进行内容的Embedding,然后在另接其他的模型进行预测,例如Bert。微调是利用训练数据训练完基础模型,然后采用微调技术(例如更新部分参数,更新所有层或者额外添加层)进行二次训练。
微调和Prompt Engineering(通过提示词优化结果,基础模型的参数是冻结的,经常在论文中会用雪花图标标识)不同,它重新精校模型参数的数值。若是全部精校所有的参数,读者需要大量的计算资源。
上图为2018年的一篇论文的插图,有三幅图片分别代表着:a为预训练,b为全量参数微调,c为分类器微调。
Instruction-tuned就是全量微调中的一种,FLAN在基础模型上面,通过指令调整(在通过指令描述的数据集集合上微调语言模型)可以显著提高未见任务的零样本性能。它采用 137B参数预训练语言模型,并在通过自然语言指令模板表达的60多个NLP数据集上对其进行指令调整。
FLAN 显著提高了其未修改版本的性能,并在评估的25个数据集中的20个数据集上超越了零样本175B GPT-3。FLAN 甚至在 ANLI、RTE、BoolQ、AI2-ARC、OpenbookQA和StoryCloze上的表现远远优于少样本 GPT-3。消融研究表明,微调数据集的数量、模型规模和自然语言指令是指令调整成功的关键。大白话而言,它将这些数据集根据不同的模版构建不同的指令训练样本,然后再次训练模型:
全量微调是美味的,但是若没有太多的计算资源,那么存在两种方法可以在有限的资源下将模型调教得较为服帖。一 种是X-shot Prompt,这点在介绍Dspy的时候说过了。另外一种是高效参数微调(微调部分参数),简称PEFT(Parameter-efficient fine tuning)。本系列还是会将重点放在PEFT的技术上面。
PEFT概览
最后先来看看PEFT的技术分类和全景图,大致可分为四类:
-
Additive PEFT:通过注入新的可训练模块或参数来修改模型架构;Selective PEFT:使选择部分的参数子集在微调期间可训练,其余的冻结;
-
Reparameterization PEFT:将原来的参数重新结构化,比如用低轶矩阵重新表示以进行训练,然后等效地将其转换推理。
-
Hybrid PEFT,它结合了不同PEFT方法的优点,建立了一个统一的PEFT模型。
上图为各种算法,都是围绕着各种主流微调技术的微调方法,比如之前的文章已经介绍过的LoRA,后续将围绕这根主线开展学习之旅。