1 为什么需要大模型微调?
通用的大模型可能在一般场景上能对问题进行很好的回答,但是对于特定领域专业知识的回答,效果可能就不是那么好了。例如,最近我一直咳嗽,有药物推荐吗?通用大模型回答:我建议您先去看医生,以便得到更准确的诊断和治疗建议。该回答类似于通用的废话,没有实际的内容。
通过微调大模型后,可以使得模型具有专业知识,回复更专业,比如回复上面的问题,根据您的描述,如果干咳,可以尝试XXX药物,如果有痰,可以XXXXXX。
微调简介
目的:使大模型具能够理解并遵循人类的指令,并具备对话的能力。
数据格式:
{
"instruction": "根据给定的描述。XXXXXXXXXXXXX",
"input": "",
"output": "xxxxxxxxxxxxxxxxxxxxxxxx",
}
input 是可选项, 因为instruction 可能就涵盖了input的内容。
2 模型微调流程
模型微调流程主要包括4步:
- 数据收集
- 模型选择
- 模型微调
- 模型评估
2.1 数据收集
通用微调数据:提供基础的问答能力。 领域微调数据:帮助模型更精确理解 特定比例下的微调效果 :
| 通用 | 领域 | 微调效果 |
|---|---|---|
| 1 | 0 | 具备通用问答能力,无法处理领域任务 |
| 1 | 1 | 模型在保持一定的通用能力的同时,能够完成领域相关任务 |
| 0 | 1 | 模型发生灾难性遗忘,仅能完成领域能力,丧失通用能力 |
PS:
- 英文数据是需要的:保持模型原始训练数据的分布
- 代码数据也是需要的:增强
通用数据的收集
主要通过开放的公共数据源获取
领域数据的收集
- 网页爬取
- 大模型蒸馏
- 基于下游任务数据集构建
微调的数据量,领域数据至少要1W个问答对 加上通用的 至少2W
2.2 模型选择
基于能力的选择
根据各榜单进行选择
基于领域选择
- 确定应用场景
- 确定备选模型
- 测试题收集
- 模型评估
2.3 模型微调
常规微调方法:全参数微调和高效参数微调
2.3.1 全参数微调
更新全部模型的参数
缺点:
- 成本较高
- 效率较低:训练时间长
- 过拟合:在数据量相对较少时容易过拟合
2.3.2 参数高效微调PEFT
PEFT是一种在保持预训练模型大部分参数不变的情况下,通过仅调整少量额外参数来适应新任务的技术。这些额外参数可以是新添加的嵌入层、低秩矩阵或其他类型的参数,它们被用来“引导”或“调整”预训练模型的输出,以使其更适合新任务。
方法分类:
- Additive:Adapter, soft prompts
- Selective: freeze
- Reparameterization: Lora
1) Additive
Adapters
在常规Transformer块中插入小型、可训练的模块(即Adapter层),而不改变原模型的大部分参数。
代表性方法:BN Adapter
- 插入位置:两个FFN后
- Adapter架构:通过down-project进行降维,应用激活函数,up-Project进行投影回原始维度,保证不改动原有的代码结构
soft prompts
在模型输入embedding中添加可训练的张量(软提示),改变输入数据的表示方式,从而实现特定任务微调
代表性方法: Prefix-Tuning
在输入embedding 的前缀加上几个特定的提示单词的embedding,如translation, summarization... 或者说在输入的一句话前加几个特殊的单词。
eg: 我 在 上海 添加 prefix --- > u1 u2 u3 我 在 上海
2) Selective
Freeze
冻结部分模型参数,冻结的参数部分不参与梯度计算,只训练模型的其他部分。
代表性方法:Freeze
- 做法:模型通常由多个Transformer层组成,冻结前几层Transformer层,仅训练最后几层
- 科学依据:实验表明,Transformer 的浅层倾向于提取出通用特征,深层倾向于提取语义特征
3) Reparameterization
低秩适配微调
对模型参数进行特定的变换或替换,将原始的模型参数以某种形式重新表示或调整,以减少训练成本、提高训练效率
代表性方法:LoRA
对指定参数增加额外的低秩矩阵,也就是在原始PLM旁边增加一个旁路,做一个降维再升维的操作
LORA训练参数优化效果
- 数学表达:
- 设置值:设原始模型参数矩阵大小d=768,降维的大小r=16
- 参数规模:全参数=dd=589824,Lora=76816(降维)+16*768(升维)=24576
- 优化效果:训练参数降低为原始的4.2%
LoRA优势:
- 更长输入:不用在输入上加额外的prompts,能支持更长的输入(vs Soft prompts)
- 无延迟:增加的参数和基座模型计算是并行的,推理时没有增加额外的延迟(vsAdapters)
- 高适用性:训练完成后,可以与模型原始参数合并,合并后模型使用代码与原始模型相同