大模型微调技术

如图是大模型微调技术的发展路线在这里插入图片描述
从参数规模的角度,大模型的微调分成两条技术路线:

  • 一条是对全量的参数,进行全量的训练,这条路径叫全量微调FFT(Full Fine Tuning)。

  • 一条是只对部分的参数进行训练,这条路径叫PEFT(Parameter-Efficient Fine Tuning)。

FFT的原理,就是用特定的数据,对大模型进行训练,将W变成W,W相比W ,最大的优点就是上述特定数据领域的表现会好很多。但FFT也会带来一些问题,影响比较大的问题,主要有以下两个:

一个是训练的成本会比较高,因为微调的参数量跟预训练的是一样的多的;

一个是叫灾难性遗忘(Catastrophic Forgetting),用特定训练数据去微调可能会把这个领域的表现变好,但也可能会把原来表现好的别的领域的能力变差。

PEFT主要想解决的问题,就是FFT存在的上述两个问题,PEFT也是目前比较主流的微调方案。

从训练数据的来源、以及训练的方法的角度,大模型的微调有以下几条技术路线:

一个是监督式微调SFT(Supervised Fine Tuning) ,这个方案主要是用人工标注的数据,用传统机器学习中监督学习的方法,对大模型进行微调;

一个是基于人类反馈的强化学习微调RLHF(Reinforcement Learning with Human Feedback) ,这个方案的主要特点是把人类的反馈,通过强化学习的方式,引入到对大模型的微调中去,让大模型生成的结果,更加符合人类的一些期望;

还有一个是基于AI反馈的强化学习微调RLAIF(Reinforcement Learning with AI Feedback) ,这个原理大致跟RLHF类似,但是反馈的来源是AI。这里是想解决反馈系统的效率问题,因为收集人类反馈,相对来说成本会比较高、效率比较低。

不同的分类角度,只是侧重点不一样,对同一个大模型的微调,也不局限于某一个方案,可以多个方案一起。

微调的最终目的,是能够在可控成本的前提下,尽可能地提升大模型在特定领域的能力。

从成本和效果的角度综合考虑,PEFT是目前业界比较流行的微调方案。接下来介绍几种比较流行的PEFT微调方案。

Adapter方法

Adapter方法的设计思路是在Transformer层之间串行插入一个低秩的前馈神经网络(FFN)模块。这个低秩FFN模块就是adapter,其结构包含一层降维FFN、一层非线性变换、一层升维FFN,并且降维之后的维度被压缩得非常小,使得引入的“插件参数”量也非常少。
在这里插入图片描述

Prompt-Tuning

在这里插入图片描述
什么是Prompt Tuning
提示学习(Prompt Learning)是一个NLP界最近兴起的学科,能够通过在输入中添加一个提示词(Prompt),使得预训练模型的性能大幅提高。Prompt Tuning和Fine Tuning都是对预训练模型进行微调的方法。
提示学习(Prompt Learning)是一个NLP界最近兴起的学科,能够通过在输入中添加一个提示词(Prompt),使得预训练模型的性能大幅提高。Prompt Tuning和Fine Tuning都是对预训练模型进行微调的方法。Fine-tuning的本质是改变预训练模型的weights。
在这里插入图片描述

Prompt 实现形式

Prompt根本不对预训练模型进行任何改动,是直接拿过来用的。也就是说,只改变输入到预训练模型里面的Prompt,通过改变这个Prompt来把域从原域(广域)切换到任务域上。(通过对输入的调整使得模型能迁移到下游任务上)。如下就是prompt的形式:

Translate English to French: /* task description /
cheese => ___ /
prompt */

总结一下,使用Prompt的根本方法是:
自然语言指令(task description) + 任务demo(example) + 带"__"的任务。
Prompt Tuning的基本原理是在输入序列X之前,增加一些特定长度的特殊Token,以增大生成期望序列的概率。

具体来说,就是将X = [x_1, x_2, …, x_m]变成, X ‘ = [ x 1 ′ , x 2 ′ , . . . , x k ′ ; x 1 , x 2 , . . . , x m ] , Y = W X ′ X` = [x'_1, x'_2, ..., x'_k; x_1, x_2, ..., x_m], Y = WX' X=[x1,x2,...,xk;x1,x2,...,xm],Y=WX

Prompt Tuning是发生在Embedding这个环节的。如果将大模型比做一个函数:Y=f(X),那么Prompt Tuning就是在保证函数本身不变的前提下,在X前面加上了一些特定的内容,而这些内容可以影响X生成期望中Y的概率。

Prompt的本质

其一,调整任务格式去迎合Very Large Scale预训练模型。其二,Prompt采取类似完形填空的策略,这要求模型具备序列语义信息。

prompt 分类

所谓Prompt Tuning,就是在Prompt中插入一段task-specific的可以tune的prompt token。由于这个token对于每个任务都是不同的,所以可以帮助机器识别任务到底是什么。又因为机器自己学习(tune)这个prompt token,所以这个token对于机器会有非常好的效果。Prompt tuning按照prompt的类型分为硬提示/离散提示(Hard Prompt/Discrete Prompt)

硬提示

硬提示就是指人为设计上面提到的Prompt。硬提示一般需要模型在这个域上有比较多的经验,并且使用前需要知道这个模型的底层是什么样的。否则,硬提示的性能一般会比Fine-tuning的SOTA差很多。

根据2021年的两份研究,硬提示有两个性质:

人类认为不错的硬提示对于LM来说不一定是一个好的硬提示,这个性质被称为硬提示的sub-optimal(次优)性。
硬提示的选择对于预训练模型的影响非常大。
这两个性质可以在如下例子中显现得淋漓尽致:
在这里插入图片描述

代码

软提示

就是因为硬提示存在这样的问题,2020年,科学家提出了软提示。软提示与硬提示恰好相反,把Prompt的生成本身作为一个任务进行学习,相当于把Prompt的生成从人类一个一个尝试(离散)变换成机器自己进行学习、尝试(连续)。
由于需要机器自己学习,软提示不可避免地往模型内引入了新的参数。这里就又出来一个问题:如何参数有效地学习软提示?目前的研究热点有:

  • P-tuning:将prompt变成token,用BiLSTM进行学习。

  • P-tuning:使用混合的prompt初始化策略(如CLInit和SelectInit)。

  • Soft Prompts:使用组合法,例如mixture-of-experts。

  • Prefix-tuning:对于不同模型,将prompt注入输入的不同位置。Prefix-tuning原理图如下:
    在这里插入图片描述
    具体形式描述如下

给定 个tokens,记作一个预训练模型对应的embedding table,通过这个table,可以将每个token表示为一个embedding(1*d),其中 d是向量的维度(其与预训练模型的配置有关,例如BERT-base是768)。连续模板中的每个伪标记 可以视为参数,也可以视为一个token,因此,可以通过一个embedding table获得每个伪标记的向量 ,然后喂入一个MLP获得新的表征。最后,对于预训练模型的输入则是同时包含prompt和之前的输入。

p-tuning v2

p-tuning v2简单来说其实是soft prompt的一种改进,soft prompt是只作用在embedding层中,实际测试下来只作用在embedding层的话交互能力会变弱,而且冻结模型所有参数去学习插入token,改变量偏小使得效果有时候不太稳定,会差于微调。p-tuning v2则不只是针对embedding层,而是将连续型token插入每一层,增大改变量和交互性。
在这里插入图片描述

Prefix Tuning

Prefix Tuning的出发点,跟Prompt Tuning的是类似的,只不过它们的具体实现上有一些差异。

Prompt Tuning是在Embedding环节,往输入序列X前面加特定的Token。

而Prefix Tuning是在Transformer的Encoder和Decoder的网络中都加了一些特定的前缀。
具体来说,就是将Y=WX中的W,变成 W ′ = [ W p ; W ] , Y = W ′ X W'= [W_p; W],Y=W'X W=[Wp;W]Y=WX

Prefix Tuning也保证了基座模型本身是没有变的,只是在推理的过程中,按需要在W前面拼接一些参数。

Instruct-Tuning

指令的形式如下:

在这里插入图片描述
假设是一个Question Generation任务,那么可以为这个任务定义一些指令,例如:

Title:任务的名称;
Definition:任务的定义,说明这个任务的本质和目的;
Things to avoid:说明这个任务的注意事项,例如需要避免什么等等;
Positive / Negative Examples:给出正确和错误的例子,作为提示;
Prompt:当前任务的提示信息;

Prompt Tuning和Instruction Tuning对比

  • Prompt tuning:针对每个任务,单独生成prompt模板(hard prompt or soft prompt),然后在每个任务上进行full-shot微调与评估,其中预训练模型参数是freeze的。是task specific的。

在此说明下prompt方法的发展思路,一开始大家通过完形填空的方式发掘语言模型的能力,在few-shot上获取比较好的效果,因为完形填空更符合预训练的形式,后面p-tuning提出连续的token,但是还是依赖hard token作为初始化,并且比较敏感,也是在full-shot上证明了prompt方法比传统的finetune好,之前大家更多关注的是few-shot上的效果,后面出了很多花式魔改相关的论文,比如给Verbalizer融合知识或者直接去掉什么的,这里就不过多介绍了。注意----在这之前预训练模型都是跟着一起训练的!

  • Instruction Tuning:针对每个任务,单独生成instruction(hard token),通过在若干个full-shot任务上进行微调,然后在具体的任务上进行评估泛化能力(zero shot),其中预训练模型参数是unfreeze的。Instruction Tuning和Prompt方法的核心一样,就是去发掘语言模型本身具备的知识。而他们的不同点就在于,Prompt是去激发语言模型的补全能力,比如给出上半句生成下半句、或者做完形填空,都还是像在做language model任务,而Instruction Tuning则是激发语言模型的理解能力,通过给出更明显的指令,让模型去理解并做出正确的反馈。

CoT

Chain-of-Thought Prompting。让大模型“涌现”。所谓“涌现”,在大模型领域指的是当模型突破某个规模时,性能显著提升,表现出让人惊艳、意想不到的能力。比如语言理解能力、生成能力、逻辑推理能力等。一般来说,模型在 100亿(10B) 到 1000亿(100B) 参数区间,可能产生能力涌现。

在这里插入图片描述

可以看到,类似的算术题,思维链提示会在给出答案之前,还会自动给出推理步骤:

“罗杰先有5个球,2盒3个网球等于6个,5 + 6 = 11”
“食堂原来有23个苹果,用了20个,23-20=3;又买了6个苹果,3+6=9”

CoT 的优势包括它把一个多步推理问题分解出多个中间步骤,并且让 LLM 更加可解释。它能解决的问题很多,除了上述的数学应用题,还有常识推理、以及 symbolic manipulation (符号操作)这类任务(就是一些手造的考验大模型的问题,比如最典型的 Last Letter Concatenation(最后一个字母串联) 和 coin flip(抛硬币)),下面补充几个例子方便理解:
在这里插入图片描述

LoRA

大模型参数很多,但并不是所有的参数都是发挥同样作用的;大模型中有其中一部分参数,是非常重要的,是影响大模型生成结果的关键参数,这部分关键参数就是上面提到的低维的本质模型。
Lora(github)主要在模型中注入可训练模块,大模型在预训练完收敛之后模型包含许多进行矩阵乘法的稠密层,这些层通常是满秩的,在微调过程中其实改变量是比较小的,在**矩阵乘法中表现为低秩的改变,**注入可训练层的目的是想下游微调的低秩改变由可训练层来学习,冻结模型其他部分,大大减少模型训练参数。

在这里插入图片描述
在这里插入图片描述

这种方法有点类似于矩阵分解,可训练层维度和预训练模型层维度一致为d,先将维度d通过全连接层降维至r,再从r通过全连接层映射回d维度,r<<d,r是矩阵的秩,这样矩阵计算就从 d × d d \times d d×d变为 d × r + r × d d \times r + r \times d d×r+r×d,参数量减少很多,上图对矩阵 A A A使用随机高斯初始化,对矩阵 B B B使用0进行初始化。LoRA是在self-attention的q,v线性变换层插入旁路模块。

LoRA的基本思路,包括以下几步:

  • 首先, 要适配特定的下游任务,要训练一个特定的模型,将Y=WX变成Y=(W+∆W)X,这里面∆W主是我们要微调得到的结果;

  • 其次,将∆W进行低维分解∆W=AB (∆W为m * n维,A为m * r维,B为r * n维,r就是上述假设中的低维);

  • 接下来,用特定的训练数据,训练出A和B即可得到∆W,在推理的过程中直接将∆W加到W上去,再没有额外的成本。

另外,如果要用LoRA适配不同的场景,切换也非常方便,做简单的矩阵加法即可:(W + ∆W) - ∆W + ∆W`。

QLoRA

LoRA 效果已经非常好了,可以媲美全量微调的效果了,那为什么还要有个QLoRA呢?

这里先简单介绍一下,量化(Quantization)。

量化,是一种在保证模型效果基本不降低的前提下,通过降低参数的精度,来减少模型对于计算资源的需求的方法。

量化的核心目标是降成本,降训练成本,特别是降后期的推理成本。

QLoRA就是量化版的LoRA,它是在LoRA的基础上,进行了进一步的量化,将原本用16bit表示的参数,降为用4bit来表示,可以在保证模型效果的同时,极大地降低成本。

论文中举的例子,65B的LLaMA 的微调要780GB的GPU内存;而用了QLoRA之后,只需要48GB。效果相当惊人!

其他参考文章

大模型高效微调综述上:Adapter Tuning、AdaMix、PET、Prefix-Tuning、Prompt Tuning、P-tuning、P-tuning v2

[PEFT(Towards a Unified View of Parameter-Efficient Transfer Learning)参数高效微调技术],(https://github.com/huggingface/peft),把prompt tuning、adapter和LoRA这些Parameter-Efficient方法都统一起来了
在这里插入图片描述
通俗解读大模型微调(Fine Tuning)

大模型LLM微调技术进展与热门方法汇总【附开源代码】

总结

对于低资源微调大模型的共同点都是冻结大模型参数,通过小模块来学习微调产生的低秩改变。但目前存在的一些问题就是很容易参数灾难性遗忘,因为模型在微调的时候整个模型层参数未改变,而少参数的学习模块微调时却是改变量巨大,容易给模型在推理时产生较大偏置,使得以前的回答能力被可学习模块带偏,在微调的时候也必须注意可学习模块不能过于拟合微调数据,否则会丧失原本的预训练知识能力,产生灾难性遗忘。
最好能够在微调语料中也加入通用学习语料一起微调,避免产生对微调语料极大的偏向,在instruct gpt论文中也提到在强化学习ppo的时候模型也会很容易对于ppo数据拟合,降低模型通用自然语言任务能力,所以在ppo loss中加入了SFT梯度和预训练梯度来缓解这种遗忘问题。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值