目录
下图是大模型项目开发流程,本节主要介绍红框的Finetuning
常用zero-shot,one-shot,few-shot等,多增加示例会提升效果,但不能增加太多example,会带来一下几个问题:
1)input token变长,增加推理成本
2)占用输入token的长度,会导致留给实际输入的长度变少,影响输入描述。
3)泛化性可能会变弱,模型会尽可能拟合example的结果
当prompt方法无法达到预期效果时,需要使用finue-tuning方法进行微调。finue-tuning可以微调单个任务,也可以多任务同时微调,主要步骤为:
1)指令数据构建
2)训练、测试、验证
finue-tuning的一个常见问题是:微调的任务能力提升,但是原有的能力下降,泛化性变弱,也就是遗忘问题(catastrophic forgetting)
1)加入通用数据,或者训练感兴趣能力的数据,保持原有能力。
2)尽量减少模型参数修改,例如冻结大部分参数,仅训练部分层和参数;或者保持现有参数不变,增加新的参数或模块用于新任务;或者训练时候设置较低的学习率,较少的迭代步骤等。
3)使用更大、更强的模型
4)使用多任务学习,同时学习需求的任务
下面重点掉了第二种思路,即尽量减少模型参数修改,也就是高效参数微调PEFT(Parameter Efficient Fine-Tuning)
即上面说的保持现有模块不变,增加部分层进行微调,实现目标任务。如下图,左侧是原始transformer模块,中间是增加adapter模块的示例,然后微调时只调整adapter模块参数。
缺点:推理时候增加时间成本
该方法不改变模型结构,而是改变输入。如下图,上面是原始方法,需微调所有transformer参数(上图所有红色模块),Prefix Tuning如下图,它在输入前增加一些instruction token作为prefix,微调时冻结transformer模块参数,仅微调prefix(前缀)(下图红色模块),对于每个任务,仅需要存储prefix。
缺点:难优化,随着token的增加,性能不会持续提高,并且占用窗口,减少实际输入的描述。
自lora提出后,上面的两种方法已很少使用
作用:放大一些预训练模型已有的,但没有重点突出的能力,这些能力和指定的下游任务相关。