4、LLM预训练/微调原理

预训练 Pre-Training
指令监督微调 Supervised Fine-Tuning
奖励模型训练 Reward Modeling
强化学习:目前比较主流的优化方式有 3 种:BON,DPO 和 PPO。
PPO 训练 PPO Training PPO 强化学习的训练
DPO 训练 DPO Training

包括模型预训练(Pretrain)、Tokenizer 训练、指令微调(Instruction Tuning)、奖励模型(Reward Model)和强化学习(RLHF)等环节。
在这里插入图片描述

预训练 :无监督学习
指令微调:有监督学习
奖励模型:强化学习
强化学习:强化学习
当奖励模型训练好之后,我们就可以用来对SFT模型给出的回答进行评分,这个评分将作为奖励值,用于最后的强化学习中,使得模型能根据人类的偏好来调整回答的质量。

预训练+指令微调+对齐+融合多模态+链接外部系统

Stage 1: 预训练(Pretrain)
Stage 2: 监督微调(SFT)
Stage 3: 对齐(Reward Model + RLHF)
llama-factory(GitHub训练项目)

1、预训练阶段

预训练(Pretraining)阶段需要利用海量的训练数据,数据来自互联网网页、维基百科、书籍、GitHub、论文、问答网站等,构建包含数千亿甚至数万亿单词的具有多样性的内容。预训练是大语言模型构建的基础阶段,其目标是通过无监督学习从海量文本数据中提取语言知识。这一阶段通常采用Transformer架构,利用自注意力机制捕捉文本中的长距离依赖关系。预训练任务主要包括掩码语言建模(Masked Language Modeling,MLM)和下一句预测(Next Sentence — Prediction, NSP)。MLM通过随机遮盖部分输入词汇并训练模型预测这些词汇,从而学习文本的语义信息;而NSP则通过预测两个句子是否连续出现,帮助模型理解句子间的逻辑关系。

  • 语言不匹配:大多数开源基座对中文的支持都不太友好,例如:[Llama]、[mpt]、[falcon] 等,这些模型在英文上效果都很优秀,但在中文上却差强人意。
  • 专业知识不足:当我们需要一个专业领域的 LLM 时,预训练模型中的知识就尤为重要。由于大多数预训练模型都是在通用训练语料上进行学习,对于一些特殊领域(金融、法律等)中的概念和名词无法具备很好的理解。我们通常需要在训练语料中加入一些领域数据(如:[xuanyuan 2.0]),以帮助模型在指定领域内获得更好的效果。

基于上述原因,我们在进行 SFT 步骤之前,先来看看预训练任务是如何做的。在进行预训练之前,我们需要先选择一个预训练的模型基座。一个较为普遍的问题是:大部分优秀的语言模型都没有进行充分的中文预训练,因此,许多工作都尝试将在英语上表现比较优秀的模型用中文语料进行二次预训练,期望其能够将英语上的优秀能力迁移到中文任务中来。但在进行正式的训练之前,我们还有一步很重要的事情去做:词表扩充。通俗来讲,tokenizer 的目的就是将一句话进行切词,并将切好词的列表喂给模型进行训练。通常,tokenizer 有 2 种常用形式:WordPiece 和 BPE。

大语言模型的词表扩充
LLaMA词表中的中文token比较少(只有几百个)。为了解决这些问题,我们可能就需要进行中文词表扩展。比如:在中文语料库上训练一个中文tokenizer模型,然后将中文 tokenizer 与 LLaMA 原生的 tokenizer 进行合并,通过组合它们的词汇表,最终获得一个合并后的 tokenizer 模型。

2、有监督微调阶段

有监督微调(Supervised Finetuning),也称为指令微调,有监督微调阶段旨在将预训练模型适应到特定的下游任务中。在这一阶段,模型会在有标签的数据集上进行训练,通过调整模型参数来优化在特定任务上的性能。常见的下游任务包括文本分类、情感分析、问答系统等。微调过程中,可以采用不同的优化算法和学习率调整策略,以提高模型的收敛速度和泛化能力。得到有监督微调模型(SFT 模型)

  • 全微调:全微调是指训练模型中的所有参数。这不是一种有效的技术,但它会产生稍微好一点的结果。
  • LoRA:一种基于低阶适配器的参数高效技术(PEFT)。我们不训练所有参数,而是只训练这些适配器。
  • QLoRA:另一种基于 LoRA 的 PEFT,它还将模型的权重量化为 4 位,并引入分页优化器来管理内存峰值。将其与Unsloth结合使用,可以在免费的 Colab 笔记本上高效运行。
  • Axolotl:一种用户友好且功能强大的微调工具,用于许多最先进的开源模型。
  • DeepSpeed:针对多 GPU 和多节点设置的 LLM 的高效预训练和微调(在 Axolotl 中实现)。

数据集:
1.人工标注:人工标注是一件成本巨大的事情。
2.Self Instruction 的思路,ChatGPT标注,即通过 ChatGPT 的输入输出来蒸馏自己的模型。
3.开源数据集整理

3、Lora系列

https://blog.csdn.net/deephub/article/details/136735670

Lora

https://zhuanlan.zhihu.com/p/618073170
https://zhuanlan.zhihu.com/p/646791309
微调的含义,就是把已经训练好的模型(pretrained model)拿来,给它吃特定的下游任务数据,使得模型在预训练权重上继续训练,直至满足下游任务性能标准。预训练模型就像一个特征提取器,能够基于先前训练数据中学到的经验,为我们提取有效的特征,大大提升下游任务的训练效果和收敛速度。Lora作用于W权重,改变W所在的层的权重值。

1.全参数微调
在这里插入图片描述
全参数微调指的是,在下游任务的训练中,对预训练模型的每一个参数都做更新。例如图中,给出了Transformer的Q/K/V矩阵的全量微调示例,对每个矩阵来说,在微调时,其d*d个参数,都必须参与更新。

2.局部微调办法
.局部微调办法:Adapter Tuning与Prefix Tuning。
我们来看在LoRA出现前,两种主流的局部微调办法:Adapter Tuning与Prefix Tuning。这也是LoRA的原始论文中,重点比对的两种微调方式。
Adapter Tuning:
在这里插入图片描述
在微调时,除了Adapter的部分,其余的参数都是被冻住的(freeze),这样我们就能有效降低训练的代价。Adapter的内部架构不是本文所述的重点,这里我们就不再介绍了。但这样的设计架构存在一个显著劣势:添加了Adapter后,模型整体的层数变深,会增加训练速度和推理速度,原因是:
需要耗费额外的运算量在Adapter上。
当我们采用并行训练时(例如Transformer架构常用的张量模型并行),Adapter层会产生额外的通讯量,增加通讯时间。

Prefix Tuning:
对于GPT这样的生成式模型,在输入序列的最前面加入prefix token,图例中加入2个prefix token,在实际应用中,prefix token的个数是个超参,可以根据模型实际微调效果进行调整。对于BART这样的Encoder-Decoder架构模型,则在x和y的前面同时添加prefix token。在后续微调中,我们只需要冻住模型其余部分,单独训练prefix token相关的参数即可,每个下游任务都可以单独训练一套prefix token。Prefix Tuning虽然看起来方便,但也存在以下两个显著劣势;
较难训练,且模型的效果并不严格随prefix参数量的增加而上升。
会使得输入层有效信息长度减少。为了节省计算量和显存,我们一般会固定输入数据长度。增加了prefix之后,留给原始文字数据的空间就少了,因此可能会降低原始文字中prompt的表达能力。

3、Lora原理
https://blog.csdn.net/deephub/article/details/136735670
Lora作用于W权重矩阵,改变W所在的层的权重值,主要通过低秩分解(不是奇异值分解)用AB矩阵代替ow,是一种PEFT(参数高效性微调方法)。LoRA引入了两个矩阵A和B,如果参数W的原始矩阵的大小为d × d,则矩阵A和B的大小分别为d × r和r × d,其中r要小得多(通常小于100)。参数r称为秩。如果使用秩为r=16的LoRA,则这些矩阵的形状为16 x d,这样就大大减少了需要训练的参数数量。LoRA的最大的优点是,与微调相比,训练的参数更少,但是却能获得与微调基本相当的性能。LoRA的一个技术细节是:在开始时,矩阵A被初始化为均值为零的随机值,但在均值周围有一些方差。矩阵B初始化为完全零矩阵。
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

主要参数:

  • 1.^W=AB:用奇异值分解矩阵AB代替oW
  • 2.参数r:代表秩,rank是一个超参数,用于控制矩阵A和B rank的内部维度。换句话说,该参数控制着LoRA引入的额外参数的数量,是决定模型适应性和参数效率之间平衡的关键因素。
  • 3.参数a:alpha控制svd奇异值分解对角线元素的值大小,第二个超参数alpha是应用于低秩自适应输出的缩放超参数。它本质上控制了适应层的输出允许影响正在适应的层的原始输出的程度。这可以被视为调节低秩适应对层输出的影响的一种方法。
  • 4.秩(Rank):矩阵的秩度量的就是矩阵的行列之间的相关性。为了求矩阵A的秩,我们是通过矩阵初等变换把A化为阶梯型矩阵,若该阶梯型矩阵有r个非零行,那A的秩rank(A)就等于r。 如果矩阵的各行或列是线性无关的,矩阵就是满秩的,也就是秩等于行数。矩阵的秩度量的就是矩阵的行列之间的相关性。如果矩阵的各行或列是线性无关的,矩阵就是满秩的,也就是秩等于行数。
  • 5.SVD:(Singular value decomposition,奇异值分解)是一种矩阵分解的方法,任何矩阵,都可以通过SVD的方法分解成几个矩阵相乘的形式。其中和是正交矩阵,是特征值矩阵。(用的是低秩分解)

通过数学方法直接做SVD行不通,那就让模型自己去学怎么做SVD吧!因此LoRA最终的低秩适配策略是:我把秩当成一个超参,再让模型自己去学低秩矩阵,这不就简单又省事吗!在我们采用Adam做优化器时,调整a的作用就相当于调整learning rate。
在这里插入图片描述

QLORA

https://zhuanlan.zhihu.com/p/681519805
https://zhuanlan.zhihu.com/p/647378373
https://zhuanlan.zhihu.com/p/648239462
QLORA是一种基于LoRA(Low-rank Adapter)的微调方法,其中适配器位于每个网络层。通过一系列创新工作,如引入4位NormalFloat、双量化和Paged Optimizers等方法,QLORA对LoRA方法进行了更好的调优,降低内存使用同时保持性能。通过在每个网络层添加适配器,QLORA避免了以前工作中观察到的几乎所有的准确性折衷。这种方法将65B参数模型的内存需求从>780GB降低到<48GB,使得在单个GPU上微调最大的公开可用模型成为可能。
在这里插入图片描述
QLORA引入了几项创新来节省内存而不牺牲性能,包括

  • 一种新的数据类型4位NormalFloat(NF4);
  • 双重量化以减少平均内存占用;
  • 分页优化器来管理内存峰值。

4位正态浮点量化
量化基础 - 正态浮点(NF)数据类型: 正态浮点(NormalFloat, NF)数据类型是建立在分位数量化的基础上。分位数量化是一种信息论上的最优数据类型,它确保每个量化区间有相同数量的输入张量值。通过经验累积分布函数估算输入张量的分位数来实现。
在这里插入图片描述

在这里插入图片描述

AdaLORA

https://zhuanlan.zhihu.com/p/649756885
在这里插入图片描述
在这里插入图片描述
AdaLORA解决方案
AdaLORA主要包含两个模块:(i) SVD形式参数更新(SVD-based adaptation):直接将增量矩阵
参数化为SVD的形式,避免了在训练过程中进行SVD计算带来的资源消耗;(ii) 基于重要程度的参数分配(Importance-aware rank allocation): 裁剪一些冗余的奇异值。
SVD和LoRA对是对原来复杂度较高的矩阵进行了低秩分解。但是如果我们直接对LoRA进行秩的调整的话将会带来很多问题,首先对 AB直接减小秩的话相当于将 AB的某些列以及的某些行置0,这样丢失的信息难免有些多,也造成了特征恢复几乎不太可能实现。另外 A 和 B 并不是正交矩阵,也就意味着它们的行之间或者列之间的特征有很大的相关性,直接将特征置0的话将会破坏这种相关性。为了解决LoRA不适合直接调整秩的问题,AdaLoRA将LoRA的两项式替换为SVD的三项式。
AdaLoRA通过将所有添加了适配器的模块的秩的值看做了一组超参,然后通过模型剪枝的思想对LoRA的秩进行了自适应的计算。同时为了剪枝后模型效果的稳定,AdaLoRA使用SVD的三元组替代了LoRA的二元组,充分利用了SVD奇异矩阵的正交性和奇异向量的绝对值和特征重要性的相关性设计剪枝策略,非常精彩。

在这里插入图片描述

三种Lora对比

一、LoRA(低秩分解)
LoRA是一种基于低秩分解的大模型参数高效微调技术。其核心思想是通过低秩分解来模拟参数的改变量,从而以极小的参数量来实现大模型的间接训练。在涉及到矩阵相乘的模块,LoRA在原始的PLM旁边增加一个新的通路,通过前后两个矩阵A,B相乘,第一个矩阵A负责降维,第二个矩阵B负责升维,中间层维度为r,从而来模拟所谓的本征秩(intrinsic rank)。可训练层维度和预训练模型层维度一致为d,先将维度d通过全连接层降维至r,再从r通过全连接层映射回d维度,其中,r<<d,r是矩阵的秩,这样矩阵计算就从d x d变为d x r + r x d,参数量减少很多。第一个矩阵的A的权重参数会通过高斯函数初始化,而第二个矩阵的B的权重参数则会初始化为零矩阵,这样能保证训练开始时新增的通路BA=0从而对模型结果没有影响。
二、AdaLoRA(奇异值分解)
AdaLoRA是一种自适应的低秩分解技术,它在LoRA的基础上进一步优化了参数的训练过程。与LoRA不同,AdaLoRA不再预先设定降维后的维度r,而是通过自适应的方式在训练过程中不断调整r的大小。这样可以在保证模型性能的同时进一步减少参数量。
三、QLoRA(量化)
QLoRA是一种基于量子计算的大模型参数高效微调技术。它将低秩分解与量子计算相结合,利用量子比特的量子叠加和量子纠缠等特性,对大模型的参数进行高效的微调。通过将一部分参数映射到量子比特上,QLoRA可以在量子计算机上利用量子算法进行高效的参数优化。

4、奖励模型(Reward Model)

https://zhuanlan.zhihu.com/p/636270877
SFT(微调) 的整个过程:
我们一直都在告诉模型什么是「好」的数据,却没有给出「不好」的数据。我们更倾向于 SFT 的目的只是将 Pretrained Model 中的知识给引导出来的一种手段,而在SFT 数据有限的情况下,我们对模型的「引导能力」就是有限的。这将导致预训练模型中原先「错误」或「有害」的知识没能在 SFT 数据中被纠正。我们都需要让告知模型什么是「好的数据」,什么是「不好的数据」,RL 是直接告诉模型当前样本的(好坏)得分,DPO 是同时给模型一条好的样本和一条坏的样本。
而判断样本数据的「好坏」除了昂贵的人工标注之外,那就是 Reward Model 大显身手的时候了。奖励建模(Reward Modeling)阶段的目标是构建一个文本质量对比模型,对于同一个提示词,SFT 模型给出的多个不同输出结果的质量进行排序。
偏序对是指:不直接为每一个样本直接打分,而是标注这些样本的好坏顺序。
在这里插入图片描述
奖励模型通过与人类专家进行交互,获得对于生成响应质量的反馈信号,从而进一步提升大语言模型的生成能力和自然度。与监督模型不同的是,奖励模型通过打分的形式使得生成的文本更加自然逼真,让大语言模型的生成能力更进一步。

5、 强化学习(RLHF)

https://zhuanlan.zhihu.com/p/613315873
在获得了一个 Reward Model 后,我们便可以利用这个 RM 来进化我们的模型。
目前比较主流的优化方式有 3 种:BON,DPO 和 PPO。
通过强化学习的训练方法,迭代式的更新奖励模型(RW 模型)以及策略模型(RL 模型),让奖励模型对模型输出质量的刻画愈加精确,策略模型的输出则愈能与初始模型拉开差距,使得输出文本变得越来越符合人的认知。这种训练方法也叫做 RLHF。强化学习(Reinforcement Learning)阶段根据数十万用户给出的提示词,利用前一阶段训练的RM模型,给出SFT模型对用户提示词补全结果的质量评估,并与语言模型建模目标综合得到更好的效果。使用强化学习,在SFT 模型基础上调整参数,使得最终生成的文本可以获得更高的奖励(Reward)。该阶段需要的计算量相较预训练阶段也少很多,通常仅需要数十块GPU,数天即可完成训练。通过这些算法,模型能够在与环境的交互中不断学习和改进,最终生成符合要求的高质量文本。
在这里插入图片描述

RHFL作为第二个微调步骤,旨在使模型与人类偏好保持一致,核心目标为关注乐于助人、诚实和无害。整个过程主要涉及两个子步骤,具体如下:

  • 1、 使用人类反馈训练奖励模型
    通过由人类标记者生成的多个模型输出并对其排序,创建一个奖励模型。这个模型学习人类对乐于助人、诚实和无害内容的偏好。通过将人类反馈作为标准,奖励模型能够更好地理解和模拟人类的价值观。
  • 2、 用奖励模型代替人类进行大规模训练
    在奖励模型完成训练后,可以将其用于取代人类标记数据进行大规模微调。奖励模型的反馈被用来指导模型的学习过程,进一步提高模型的性能。通过这种方式,RHFL确保模型的行为更加符合人类的期望和偏好。

因此,从某种意义上而言,RHFL的引进主要改进模型的行为,并使其与人类的价值观保持一致,以确保模型提供有用、真实和安全的响应。通过使用奖励模型进行微调,RHFL能够将人类的反馈和偏好融入到模型的训练中,从而使模型更好地满足用户的需求,并提供与人类价值观相一致的回答。

经过监督微调后,RLHF 是用于使 LLM 的答案与人类期望保持一致的一个步骤。这个想法是从人类(或人工)反馈中学习偏好,这可用于减少偏见、审查模型或使它们以更有用的方式行事。它比 SFT 更复杂,并且通常被视为可选的。
偏好数据集:这些数据集通常包含具有某种排名的多个答案,这使得它们比指令数据集更难生成。
近端策略优化:该算法利用奖励模型来预测给定文本是否被人类排名较高。然后使用该预测来优化 SFT 模型,并根据 KL 散度进行惩罚。
直接偏好优化:DPO 通过将其重新定义为分类问题来简化该过程。它使用参考模型而不是奖励模型(无需训练),并且只需要一个超参数,使其更加稳定和高效。

6、评价
评估LLM是管道中被低估的部分,既耗时又不可靠。您的下游任务应该决定您想要评估的内容,但始终记住古德哈特定律:“当一项措施成为目标时,它就不再是一个好的措施。”
传统指标:困惑度和 BLEU 分数等指标并不像以前那样流行,因为它们在大多数情况下都存在缺陷。了解它们以及何时应用它们仍然很重要。
通用基准:基于语言模型评估工具,开放 LLM 排行榜是通用 LLM(如 ChatGPT)的主要基准。还有其他流行的基准测试,如BigBench、MT-Bench等。
特定于任务的基准:摘要、翻译、问答等任务有专用的基准、指标,甚至子领域(医学、金融等),例如用于生物医学问答的PubMedQA 。
人工评价:最可靠的评价是用户的接受率或人工的比较。如果你想知道一个模型表现是否良好,最简单但最可靠的方法就是自己使用它。

  1. 推理优化
    人们开发了许多优化技术来减少 VRAM 使用并提高生成速度。除了量化方法之外,这些改进还经常涉及更有效的注意力机制和架构变化的实施。
    Flash Attention:优化注意力机制,将其复杂度从二次型转变为线性型,加快训练和推理速度。
    键值缓存:了解键值缓存以及多查询注意(MQA)和分组查询注意(GQA)中引入的改进。
    推测性解码:使用小型模型生成草稿,然后由较大模型进行审查以加快文本生成速度。
    位置编码:了解 Transformer 中的位置编码,特别是RoPE、ALiBi和YaRN等相关方案。(与推理优化没有直接关系,而是与更长的上下文窗口相关。)

6、LLM知识缺乏的问题

https://www.talkwithtrend.com/Article/269489
预训练的大型语言模型(LLM)虽然具备丰富的知识和多任务执行能力,但也存在一些局限性,这主要体现在以下几个方面:
1、输出结构限制:LLM的主要训练目标是预测文本中的后续标记,因此在生成其他结构化输出(如分类标签或答案)方面可能存在一定的限制。这意味着在某些任务上,LLM可能无法直接生成所需的输出结构,需要采取其他方法来适应不同的任务需求。
2、知识缺乏:LLM的知识是通过训练数据获得的,如果训练数据未包含特定领域的信息,那么LLM在该领域的表现可能会受到限制。这意味着LLM在陌生领域的知识和理解可能相对不足,需要进一步调整或微调以提升在特定领域的性能。
为了应对LLM输出结构的限制问题,通常,在实际的业务场景中,我们可以通过如下两种主要解决方案进行选择:

  • 1、Prompting (提示工程 ) :通过设计巧妙的提示信息,利用LLM内部的能力来引导生成符合特定任务要求的输出。这种方法通过巧妙地设置输入和提示信息,使LLM能够生成期望的输出,从而适应不同结构的任务需求。

  • 2、 Fin e-Tuning (微调):通过修改LLM的最后一层输出结构,使其能够适应特定任务的需求。例如,对于分类任务,可以修改LLM的输出层为包含相应类别数量的神经元,并通过最高激活的神经元来推断预测的类别。这种微调的方法可以在特定任务上获得更好的性能和适应性。

针对LLM知识缺乏的问题,可以通过微调来提升LLM在特定领域的知识和表现。通过使用特定领域的数据对LLM进行微调训练,可以使其更好地理解和处理该领域的语言和知识,从而提高在该领域任务上的性能和准确性。

参考:
https://cloud.tencent.com/developer/news/1291851
https://zhuanlan.zhihu.com/p/636270877
https://zhuanlan.zhihu.com/p/676432440

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值