大模型研究学习
1.大模型的“幻觉”
幻觉可以分为事实性幻觉和忠实性幻觉。
事实性幻觉,是指模型生成的内容与可验证的现实世界事实不一致。
比如问模型“第一个在月球上行走的人是谁?”,模型回复“Charles Lindbergh在1951年月球先驱任务中第一个登上月球”。实际上,第一个登上月球的人是Neil Armstrong。
事实性幻觉又可以分为事实不一致(与现实世界信息相矛盾)和事实捏造(压根没有,无法根据现实信息验证)。
忠实性幻觉,则是指模型生成的内容与用户的指令或上下文不一致。
比如让模型总结今年10月的新闻,结果模型却在说2006年10月的事。
忠实性幻觉也可以细分,分为指令不一致(输出偏离用户指令)、上下文不一致(输出与上下文信息不符)、逻辑不一致三类(推理步骤以及与最终答案之间的不一致)。
1.致使产生幻觉的原因有哪些?
其中就包括数据缺陷、数据中捕获的事实知识的利用率较低。数据缺陷分为错误信息和偏见(重复偏见、社会偏见),此外大模型也有知识边界,所以存在领域知识缺陷和过时的事实知识。
即便大模型吃掉了大量数据,也会在利用时出现问题。
大模型可能会过度依赖训练数据中的一些模式,如位置接近性、共现统计数据和相关文档计数,从而导致幻觉。
此外,大模型还可能会出现长尾知识回忆不足、难以应对复杂推理的情况。
主要是预训练阶段(大模型学习通用表示并获取世界知识)、对齐阶段(微调大模型使其更好地与人类偏好一致)两个阶段产生问题。
预训练阶段可能会存在:
- 架构缺陷。基于前一个token预测下一个token,这种单向建模阻碍了模型捕获复杂的上下文关系的能力;自注意力模块存在缺陷,随着token长度增加,不同位置的注意力被稀释。
- 曝露偏差。训练策略也有缺陷,模型推理时依赖于自己生成的token进行后续预测,模型生成的错误token会在整个后续token中产生级联错误。
对齐阶段可能会存在:
- 能力错位。大模型内在能力与标注数据中描述的功能之间可能存在错位。当对齐数据需求超出这些预定义的能力边界时,大模型会被训练来生成超出其自身知识边界的内容,从而放大幻觉的风险。
- 信念错位。基于RLHF等的微调,使大模型的输出更符合人类偏好,但有时模型会倾向于迎合人类偏好,从而牺牲信息真实性。
大模型产生幻觉的第三个关键因素是推理,存在两个问题:
- 固有的抽样随机性:在生成内容时根据概率随机生成。
- 不完美的解码表示:上下文关注不足(过度关注相邻文本而忽视了源上下文)和softmax瓶颈(输出概率分布的表达能力受限)。
2.如何减轻幻觉?
1.数据相关的幻觉
减少错误信息和偏见,最直观的方法是收集高质量的事实数据,并进行数据清理以消除偏见。
对于知识边界的问题,有两种流行方法。一种是知识编辑,直接编辑模型参数弥合知识差距。另一种通过检索增强生成(RAG)利用非参数知识源。
检索增强具体分为三种类型:一次性检索、迭代检索和事后检索。
2.训练相关的幻觉
根据致幻原因,可以完善有缺陷的模型架构.
从模型预训练阶段来讲,最新进展试图通过完善预训练策略、确保更丰富的上下文理解和规避偏见来应对这一问题。
比如针对模型对文档式的非结构化事实知识理解碎片化、不关联,有研究在文档的每个句子后附加一个TOPICPREFIX,将它们转换为独立的事实,从而增强模型对事实关联的理解。
此外,还可以通过改进人类偏好判断、激活引导,减轻对齐错位问题。
3.推理相关的幻觉
不完美的解码通常会导致模型输出偏离原始上下文。
研究人员探讨了两种高级策略,一种是事实增强解码,另一种是译后编辑解码。
此外,忠实度增强解码优先考虑与用户说明或提供的上下文保持一致,并强调增强生成内容的一致性。现有工作可以总结为两类,包括上下文一致性和逻辑一致性。
有关上下文一致性的最新研究之一是上下文感知解码(CAD),通过减少对先验知识的依赖来修改输出分布,从而促进模型对上下文信息的关注。
有关逻辑一致性的最新一项研究包括知识蒸馏框架,用来增强思维链提示中固有的自洽性。
2.lora的训练方法指的是什么?
LoRA模型,全称Low-Rank Adaptation of Large Language Models,是一种用于微调大型语言模型的低秩适应技术。
LoRA通过仅训练低秩矩阵,然后将这些参数注入到原始模型中,从而实现对模型的微调。这种方法不仅减少了计算需求,而且使得训练资源比直接训练原始模型要小得多,因此非常适合在资源有限的环境中使用。
1.lora是如何进行工作的?
LoRA 对Stable Diffusion模型中最关键的部分进行微小改动:交叉注意力层。这是模型中图像和提示相遇的部分。研究人员发现,仅微调模型的这一部分就足以实现良好的训练效果。交叉注意力层在下方的Stable Diffusion模型架构中以黄色部分表示。
LoRA 的技巧在于将矩阵分解为两个较小(低秩)的矩阵。这样可以存储更少的数字。假设模型有一个具有 1,000 行和 2,000 列的矩阵。这就是要在模型文件中存储的 2,000,000 个数字(1,000 x 2,000)。LoRA 将该矩阵分解为一个 1,000x2 的矩阵和一个 2x2,000 的矩阵。这只需要 6,000 个数字(1,000 x 2 + 2 x 2,000),是原始矩阵大小的 333 倍。这就是 LoRA 文件更小的原因。
3.外挂知识库
1.什么是rag?
RAG,即LLM在回答问题或生成文本时,会先从大量文档中检索出相关的信息,然后基于这些信息生成回答或文本,从而提高预测质量。
2.外挂知识库的实现思路
只用几十万量级的数据对大模型进行微调并不能很好的将额外知识注入大模型。如果想让大模型根据文档来回答问题,必须要精简在输入中文档内容的长度。
如果模型对无限长的输入都有很好的理解能力,那么我可以设计这样一个输入“以下是世界上所有乐队的介绍:[插入100w字的乐队简介文档],请根据上文给我介绍一下万青这支乐队”,让模型来回答我的问题。
一种做法是,我们可以把文档切成若干段,只将少量的和问题有关的文档片段拿出来,放到大模型的输入里。至此,”大模型外挂数据库“的问题转换成了“文本检索的问题”了,目标是根据问题找出文档中和问题最相关的片段,这已经和大模型本身完全无关了。
文本检索里边比较常用的是利用向量进行检索,我们可以把文档片段全部向量化(通过语言模型,如bert等),然后存到向量数据库(如Annoy、 FAISS、hnswlib等)里边,来了一个问题之后,也对问题语句进行向量话,以余弦相似度或点积等指标,计算在向量数据库中和问题向量最相似的top k个文档片段,作为上文输入到大模型中。向量数据库都支持近似搜索功能,在牺牲向量检索准确度的情况下,提高检索速度。
3.对称语义检索与非对称语义检索
问题1:How to learn Python online?
答案1:How to learn Python on the web?
适用于非对称语义检索的例子:
问题2:What is Python?
答案2:*Python is an interpreted, high-level and general-purpose programming language. Python’s design philosophy …”
对称语义检索的“问题”和“答案”要求有差不多的意思,或者根本就不属于我们常规意义里的问答,而仅仅是同义句匹配。而非对称语义检索所做的任务才是我们常规意义下问答任务。很显然,通过向量检索的方式进行非对称语义检索的难度要大的多。对称语义检索的目标是找相似的句子,与向量检索基于计算向量相似度的原理天然匹配,只需要模型有比较强的内容抽象能力就可以。但是非对称语义检索则要求模型能够将问题和答案映射到同一空间
通过上述例子,可以看出向量检索只能检索出意思差不多的内容,下游用一个可以真正能很好理解语义的大模型进行进一步的提取检索出来的句子中的信息是十分有必要的。
模型是否支持非对称语义检索的根本原因是什么呢?是训练的数据不同
正是因为训练数据有真正的问答属性,模型才有真正的问答检索能力(将问题与答案映射到同一向量空间)。我的理解是,如果训练数据里没有某一领域的数据,比如金融领域,那么通用的非对称语义模型就不能很好的完成该领域的检索任务。但是对称语义检索有“泛化”到其他领域的能力,毕竟只需要理解“字面意思”。
就直接把问题+答案拼在一起,做个二分类嘛。模型同时有了问题+答案这样一对的上下文信息,当然比直接分别将问题+答案映射到相同的向量空间、再计算相似度准的多了。但是这种计算向量相似度的模式会慢。假设有m个问题和n个答案,向量检索(图中的bi-encoder环节)只需要跑m+n次bert模型就够了,但是cross-encoder需要将所有问题和答案分别组合起来,跑m*n次bert模型。
4.如何协调查询和文档的语义空间?(上述问题的一个解决思路)
1.查询重写。
由于用户的查询可能表达不清晰或缺少必要的语义信息。因而可以使用大模型的能力生成一个指导性的伪文档,然后将原始查询与这个伪文档结合,形成一个新的查询。
也可以通过文本标识符来建立查询向量,利用这些标识符生成一个相关但可能并不存在的“假想”文档,它的目的是捕捉到相关的模式。
此外,多查询检索方法让大语言模型能够同时产生多个搜索查询。这些查询可以同时运行,它们的结果一起被处理,特别适用于那些需要多个小问题共同解决的复杂问题。
2.嵌入变换
在2023年提出的LLamaIndex中,研究者们通过在查询编码器后加入一个特殊的适配器,并对其进行微调,从而优化查询的嵌入表示,从而使之更适合特定的任务。
Li 团队在 2023 年提出的 SANTA 方法,就是为了让检索系统能够理解并处理结构化的信息。他们提出了两种预训练方法:一是利用结构化与非结构化数据之间的自然对应关系进行对比学习;二是采用了一种围绕实体设计的掩码策略,让语言模型来预测和填补这些被掩盖的实体信息。
5.基本步骤概括
1.将文档内容加载进来
2.由于文档很长,可能会超出模型所允许的token,因而对文档进行切割。
3.对文档进行向量化,变成计算机可以理解的形式。
4.对数据进行检索
在对数据进行检索时,可以首先进行一下元数据过滤,当索引分成许多的chunks时,检索效率会成为问题,通过元数据进行过滤,可以大大提升效率和相关度。
图关系检索:引入知识图谱,将实体变成node,把它们之间的关系变成relation,就可以利用知识之间的关系做更准确的回答。
检索技术
向量化(embedding)相似度检索:相似度计算方式包括欧氏距离、曼哈顿距离、余弦等;
关键词检索:这是很传统的检索方式,元数据过滤也是一种,还有一种就是先把chunk做摘要,再通过关键词检索找到可能相关的chunk,增加检索效率;
全文检索:
SQL检索:更加传统的检索算法。
重排序(Rerank):相关度、匹配度等因素做一些重新调整,得到更符合业务场景的排序。
查询轮换:这是查询检索的一种方式,一般会有几种方式:
子查询:可以在不同的场景中使用各种查询策略,比如可以使用LlamaIndex等框架提供的查询器,采用树查询(从叶子结点,一步步查询,合并),采用向量查询,或者最原始的顺序查询chunks等;
HyDE:这是一种抄作业的方式,生成相似的或者更标准的 prompt 模板。
6.将原始query和检索得到的文本组合起来输入模型得到结果的过程,本质上就是个prompt enginering的过程。
6.现如今全流程的框架
Langchain和LLamaIndex
7.案例
1.chatPDF
2.Baichuan
3.Multi-modal retrieval-based LMs
8.存在的问题
1.检索效果依赖embedding和检索算法。目前可能检索到无关信息,反而对输出有负面影响。
2.大模型如何检索到的信息仍是黑盒。可能仍存在不准确(甚至生成的文本与检索信息相冲突)
3.对所有任务都无差别检索 k 个文本片段,效率不高,同时会大大增加模型输入的长度;
4.无法引用来源,也因此无法精准地查证事实,检索的真实性取决于数据源及检索算法。
9.RAG的评估方法
1.独立评估
独立评估涉及对检索模块和生成模块的评估
指标:
1.答案相关性
此指标的目标是评估生成的答案与提供的问题提示之间的相关性。答案如果缺乏完整性或者包含冗余信息,那么其得分将相对较低。这一指标通过问题和答案的结合来进行计算,评分的范围通常在0到1之间,其中高分代表更好的相关性。
2.忠实度
这个评价标准旨在检查生成的答案在给定上下文中的事实准确性。评估的过程涉及到答案内容与其检索到的上下文之间的比对。这一指标也使用一个介于0到1之间的数值来表示,其中更高的数值意味着答案与上下文的一致性更高。
3.上下文精确度
在这个指标中,我们评估所有在给定上下文中与基准信息相关的条目是否被正确地排序。理想情况下,所有相关的内容应该出现在排序的前部。这一评价标准同样使用0到1之间的得分值来表示,其中较高的得分反映了更高的精确度。
4.答案正确性
该指标主要用于测量生成的答案与实际基准答案之间的匹配程度。这一评估考虑了基准答案和生成答案的对比,其得分也通常在0到1之间,较高的得分表明生成答案与实际答案的一致性更高。
现如今的评估框架:
RGAGS、ARES
大模型+强化学习的基本综述
大模型更擅长解决基于生成的软性问题,但在处理基于决策的硬性问题,例如选择正确答案等方面效果相对较差。
生成问题通常使用掩码来隐藏上下文信息,让模型通过上文生成下文,这是一种自监督方法;而决策问题通常需要一个明确的答案,如是或否、A/B/C 选项,因此需要使用有监督数据进行训练或微调模型。
将生成和强化学习结合起来是解决这个问题的一种思路,强化学习通过奖励函数直接或间接地为模型提供有监督的判定标准。因此,在大模型中引入强化学习可以提升其判断能力。
RLHF
后来出现了大模型,人们使用 RLHF 来训练这些大模型,以提升它们学习人类偏好的能力。随着时间的推移,大模型逐渐成为主流,越来越多的人开始从事偏好数据标注工作。因此,人们开始思考是否可以通过机器自动标注来减少人力成本。论文 论文阅读**_RLLLM_RLAIF** 中进行的实验中,研究者使用 PaLM 2 对偏好进行标注,并将训练奖励模型的标注学习与直接让模型给出 0-10 分进行了比较。这两种方法的差异在于,传统的标注只是选择两个答案中哪个更好,并没有体现出好坏程度是 9:1 还是 6:4;而大模型有能力可以给出一定的分值。实验证明,在引入这些分值后,即使不训练奖励模型,也能得到更好的效果。
RLLLM_SPO
进一步的研究发现,上述方法可能隐含着 A>B、B>C,可推出 A>C 的逻辑,而实际上在石头剪刀布这类游戏中,A>C 可能并不成立。因此,提出了 论文阅读_RLLLM_SPO 方法。该方法不再将选择 A 与 B 相比较,而是同时考虑选项 A 和其他多个方法(BCDE…),计算 A 在这些方法中的位置作为其相对客观分值,以更准确地学习选项的好坏,并做出更好的决策。
Reflexion
上述方法主要用于优化聊天体验,即通过修改奖励函数打分,使模型生成人类更喜欢的回答。接下来考虑一种扩展使用大模型的场景,在游戏,机器人或者其它 Agent 领域中,环境对于大模型来说是未知的,可以采取行动的选项是固定而非由模型自定义的。在这种状态空间和行为空间受限制且很大的情况下,如何优化大模型的决策能力。
论文 论文阅读_反思模型_Reflexion 中提出了一种不训练模型的方法。该方法通过记录模型在环境中的探索过程,并在模型失败时,利用大模型的思考内容推理出问题所在,并将其记录下来。同时,该方法利用之前的经验和上下文环境生成短期记忆,并通过对过去的反思生成长期记忆。结合了长短期记忆,在模型外围构建辅助方法,而不需要对模型进行调参。最终实验结果表明,该方法在各个实验中将基准得分提升了约 10%,可视为非常有效的适应环境的方法。
RLLLM_GLAM
进而有研究利用强化学习模型探索环境,对大模型调参,以优模型在现实环境中的决策力。论文阅读_RLLLM_GLAM 通过使用大模型作为决策模块,为每个选项评分来解决这个问题。该方法基于给定提示 p 的条件下计算每个动作 A 中每个 token 的条件概率。然后通过环境反馈的训练,利用强化学习方法对作为决策模块的大模型进行微调。这种方法结合了对环境的探索和大模型本身的语言推理能力。实验结果表明,在实际场景中表现出了非常好的效果。相比于从专家标注数据中学习,从探索中学习对于解决复杂问题更加有效。
RLLLMs
在实验中上述模型也有一些弱点,如:经过强化学习精调的模型损失了之前的部分语言能力,对新对象的泛化能力较强,但对新能力的泛化能力较差。论文阅读_RLLLMs_实践出真知 致力于解决上述问题,他利用了对选项的归一化、Lora 等技术以及提示设计,在半精度 LLaMA-7B 模型上进行实验。所有实验均在一个 NVIDIA Tesla A100 40GB GPU 中完成,并且训练得到的模型仅为 4.2M。这为大模型 + 强化学习的应用提供了进一步指导。
参考链接:
大模型外挂(向量)知识库 - 知乎 (zhihu.com)
大模型外挂知识库rag综述_rag外挂知识库框架-CSDN博客
https://arxiv.org/pdf/2310.01352.pdf(RAG结合SFT)
chatglm3外挂知识库保姆级教程(langchain+chatglm)-附详细完整代码可实现 - 知乎 (zhihu.com)
大模型+强化学习_总结篇 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/680692103)
4.SFT指的是什么?
Supervised Fine-Tuning,指的是“有监督微调”,意味着使用有标签的数据来调整一个已经预训练好的语言模型(LLM),使其更适应某一特定任务。通常LLM的预训练是无监督的,但微调过程往往是有监督的。
当进行有监督微调时,模型权重会根据与真实标签的差异进行调整。通过这个微调过程,模型能够捕捉到标签数据中特定于某一任务的模式和特点。使得模型更加精确,更好地适应某一特定任务。
接下来我们还是从数据到模型输出,计算loss的步骤来看看SFT的实现原理。
首先还是来看看数据怎么构造,SFT的每一条样本一般由两部分组成,也就是prompt(instruction)+ answer,比如:
- prompt:
翻译以下句子: What is pretrain
- answer:
什么是预训练
也就是我们要给模型提供一些类似于问答形式的答案来学习,有了前面预训练的经验后,SFT其实就很好理解的,它本质上也在做next token prediction,只是我们更希望模型关注answer部分的预测,这可以通过生成一个mask
向量来屏蔽不希望计算loss的部分,下面就是数据构造的一个示意:做的事情就是拼接prompt和answer,并在answer两侧添加一个开始和结束的符号,算一下prompt/instruction的长度,以及后面需要pad的长度,然后生成一个mask向量,answer部分为1,其他部分为0。
5.结构组件-1——Layer Norm、RMS Norm、Deep Norm
当前主流大模型使用的Normalization主要有三类,分别是Layer Norm,RMS Norm,以及Deep Norm。
一般认为,post-norm在残差之后做归一化,对参数正则化的效果更强,进而模型的收敛性也会更好;而Pre-Norm有一部分参数直接加在了后面,没有对这部分参数进行正则化,可以在反向时防止梯度爆炸或者梯度消失,大模型的训练难度大,因而使用Pre-Norm较多。
1. Layer Norm (Layer Normalization)
LayerNorm是大模型也是transformer结构中最常用的归一化操作,简而言之,它的作用是 对特征张量按照某一维度或某几个维度进行0均值,1方差的归一化 操作,计算公式为:
这里的 𝑥 可以理解为 张量中具体某一维度的所有元素,比如对于 shape 为 (2,2,4) 的张量 input,若指定归一化的操作为第三个维度,则会对第三个维度中的四个张量(2,2,1),各进行上述的一次计算
2. RMS Norm(Root Mean Square Layer Normalization)
与layerNorm相比,RMS Norm的主要区别在于去掉了减去均值的部分,计算公式为:
这里的 𝑎𝑖 与Layer Norm中的 𝑥 等价,作者认为这种模式在简化了Layer Norm的同时,可以在各个模型上减少约 7%∼64% 的计算时间。
可以看作LayerNorm在均值为0时的一个特例。论文通过实验证明,re-center操作不重要。
RMSNorm 也是一种标准化方法,但与 LayerNorm 不同,它不是使用整个样本的均值和方差,而是使用平方根的均值来归一化,这样做可以降低噪声的影响。
3. Deep Norm (Deep Normalization)
Deep Norm是对Post-LN的的改进,具体的:
- DeepNorm在进行Layer Norm之前会以 𝛼 参数扩大残差连接
- 在Xavier参数初始化过程中以 𝛽 减小部分参数的初始化范围
论文中,作者认为 Post-LN 的不稳定性部分来自于梯度消失以及太大的模型更新
6.ROPE是什么?
ROPE是旋转式位置编码。RoPE是一种“配合Attention机制能达到绝对位置编码的方式实现相对位置编码的设计”。
- attention机制中位置信息是很重要的,将位置信息融入token编码计算过程中的选择是多样的;
- 与其说位置信息重要,不如说相对位置信息重要,RoPE关注的就是相对位置信息,它将其用旋转角度的方式表达了出来;
- 旋转角度的思想通过将向量相邻的两维分为一组、作为复数的实部和虚部来实现;
- 近处的上下文信息比远处的上下文信息更重要,表现在attention机制上就是要让query和key的欧几里得内积具有远程衰减的特质;
- 所谓的外推能力,就是让模型在超出预训练上下文长度的位置上能预测、且预测得尽可能好,本文中涉及的优化外推能力的方法都是插值,将没见过的情况映射到见过的区间上;
- 在RoPE的语境下,我们可以认为在预训练时得到更充足训练的信息是旋转速度更快的高频信息,想要外推效果好,就要尽可能保留这些信息。
外推能力指的是可以在较短的上下文训练模型,但可以实现在更长的上下文上的推理,这种能力对于动辄耗费大量资源的大模型来说,尤为重要。
要想具备比较完美的外推能力,位置编码机制要满足:
- 长度的扩展无需额外的微调训练等处理
- 长度的扩展不能过多影响模型的生成能力
原始的RoPE是具备一定的外推能力的,但却称不上完美,当模型的输入长度超出训练长度时,模型的性能会急剧下降,具体表现为困惑度的急剧上升
rope的数学推理部分
RoPE的思想就是让toekn q和token k之间旋转不同的角度来表达相对位置信息,因为 q·k=||𝑞||||𝑘||𝑐𝑜𝑠(𝜃𝑞𝑘) ,相近的token间旋转角度小、点乘得到的值更大,离得远的token间旋转角度大,点乘得到的值更小。点乘具有的一个特性就是,当token q和token k同时旋转一样的角度,它们之间的夹角不变,所以它们之间的关系保持不变,所以RoPE是维护相对位置信息而丢弃绝对位置信息的。
7.如何对大模型进行微调?微调的框架有哪些?
目前,对大模型进行微调的框架主要包括但不限于以下几个,这些框架支持不同类型的微调策略和优化技术,适用于各种规模和类型的任务:
- Hugging Face Transformers:这是一个非常流行的开源库,支持大量预训练模型的加载、微调和评估。它提供了丰富的API,使得模型微调变得相对简单,并且内置了多种微调策略,如LoRA、Adapter、Prefix-tuning、P-tuning和Prompt-tuning等,适用于不同场景下的高效微调。
- PEFT (Parameter-Efficient Fine-Tuning):PEFT是Hugging Face社区的一个项目,专注于参数高效的微调方法,它允许用户在保持模型主体不变的情况下,通过添加少量额外参数来适应新任务,这对于资源有限的场景特别有用。
- DeepSpeed:这是一个优化库,主要用于加速和扩大深度学习模型的训练。它支持CPU或GPU的分布式训练,可以与PyTorch等框架结合,有效处理大模型的微调,尤其是在大规模数据集上的训练。
- LangChain:虽然主要不是为模型微调设计,但LangChain作为一个强大的框架,可以帮助开发人员使用语言模型构建应用程序,间接支持了模型的微调和部署流程,特别是通过集成其他微调框架来定制模型行为。
- Adapter:Adapter是一种微调方法,也常被实现为独立的框架或作为其他库的组件(如在Hugging Face Transformers中),它通过在模型中插入可训练的适配器层来适应新任务,而无需从头训练整个模型。
- OpenAI的API与工具:OpenAI提供了API和工具支持用户在其大模型(如GPT系列)上进行微调,尽管具体的微调实施细节可能依赖于OpenAI提供的服务和文档。
这些框架和库的选择取决于具体需求,比如模型大小、任务类型、计算资源以及对效率和灵活性的要求。
8.大模型的量化相关
量化是一种通过降低模型参数的精度来减少模型 存储 和计算需求的技术。 其中,4-bit量化是一种比较流行的量化方法,它可以将模型的参数从32位浮点数降低到4位整数,从而大大减少了模型的存储和计算需求。
9.大模型的学习过程
1、预训练阶段
在预训练阶段,模型通过学习大量无标签文本数据来掌握语言的基本结构和语义规律。这些数据主要来源于互联网,包括新闻文章、博客、论坛、书籍等。
这个阶段的产出物是基础模型,基础模型一般不会被直接使用,因为它只能完成续写能力,无法完成特定的任务,通常也无法直接给出人们想要的答案。比如你问大模型,中国的首都,它可能生成xxx,而不是直接给你答案。
2.指令微调阶段
为了让大模型具备特定的能力,比如对话、指定任务分类等,就需要在这个阶段去做微调。也被称为有监督微调。这个阶段的难点不再是对算力的高要求,转而对微调所需的语料质量有非常高的要求。
这个阶段通常会精心编写各式各样的人们在对话中可能询问的问题,以及对应的答案。通过这一阶段让模型学会了遵循指令和输出的模式,让模型的输出更符合人类的对话习惯,教会模型说人话。
通过这个阶段的微调,基本上能满足在特定任务场景上的需求,就可以部署线上应用了。
3、对齐微调阶段(奖励模型+强化学习)
这个阶段目的是让大模型有更好的表现,并且与人类喜好、意识形态进行对齐(有用、诚实、无害)。目前比较主流的技术就是RLHF,基于人类反馈的强化学习。通过这个阶段使得大模型行为能够符合人类的期望。
一般企业很少去做RLHF这一步,首先,这一步训练比较困难,很难收敛,同时去收集这样的训练的数据集也非常的困难。其次,在很多场景中并不需要进行涉及价值观的对齐,除非在客服类场景需要与人类的价值观对齐是非常必须的。
4.大模型的微调方法
1、Adapter-tuning:Adapter是早期的一个相当简单且有效的轻量化微调方法,将较小的神经网络层或者模块插入预训练模型的每一层,这些新插入的神经模块成为adapter,下游任务微调时也只更新这些适配器参数。 Adapter调优的参数量大约为LM参数的3.6%。
2、Prefix/P-v1/P-v2 Tuning:在模型的输入或者隐藏层添加K个额外可训练的前缀Tokens,然后只更新这些前缀参数(https://zhuanlan.zhihu.com/p/673985751)
- prefix-tuning:
在输入token之前构造一段任务相关的virtual tokens作为Prefix;然后,在训练的时候只更新Prefix部分的参数,而 PLM 中的其他部分参数固定。为了防止直接更新 Prefix 的参数导致训练不稳定和性能下降的情况,在 Prefix 层前面加了 MLP 结构,训练完成后,只保留 Prefix 的参数。 Prefix Tuning参数规模约为LM模型整体规模的0.1%。
- p-tuning v2
这个和prefix-tuning非常的相似。改变在于以下几点:
- 移除重参数化的编码器。以前的方法利用重参数化功能来提高训练速度和鲁棒性(如:Prefix Tuning 中的 MLP 、P-Tuning 中的 LSTM)。在 P-tuning v2 中,作者发现重参数化的改进很小,尤其是对于较小的模型,同时还会影响模型的表现。
- 针对不同任务采用不同的提示长度。提示长度在提示优化方法的超参数搜索中起着核心作用。在实验中,发现不同的理解任务通常用不同的提示长度来实现其最佳性能,这与 Prefix-Tuning 中的发现一致,不同的文本生成任务可能有不同的最佳提示长度。
- 引入多任务学习。先在多任务的Prompt上进行预训练,然后再适配下游任务。多任务学习对我们的方法来说是可选的,但可能是相当有帮助的。一方面,连续提示的随机性给优化带来了困难,这可以通过更多的训练数据或与任务相关的无监督预训练来缓解;另一方面,连续提示是跨任务和数据集的特定任务知识的完美载体。我们的实验表明,在一些困难的序列任务中,多任务学习可以作为P-tuning v2的有益补充。
代码部分把prefix tuning和P-tuning v2放在一起写
3、LoRA微调方法(https://hub.baai.ac.cn/view/33321)
lora(低秩自适应)是目前用于高效训练定制语言大模型的最广泛和最有效的技术之一。
基本原理是冻结预训练好的模型权重参数,在冻结原模型参数的情况下,通过往模型中加入额外的网络层,并只训练这些网络层参数。
总结lora的特点:
- 给原模型增加旁路,通过低秩分解(先降维再升维)来模拟参数的更新量;
- 训练时,原模型参数固定,只训练降维矩阵A和B
- 推理时,可将BA加到原模型的参数上,不引入额外的推理延迟
- 初始化,A采用高斯分布初始化,B初始化为0,保证训练开始时旁路为0矩阵
基于transformer结构,lora一般只对每层的self-attention的部分进行微调,即Wq、Wk、Wv
lora微调的一些参数设置:
- 超参数r:它决定了lora矩阵的秩和维度,直接影响模型的复杂度和容量。较高的r意味着更强的表达能力,但可能会导致过拟合;较低的r可以减少过拟合,但代价是表达能力的降低。一般经验是,如果数据集中任务越多样,r会设置越大些。
- 超参数alpha:**缩放尺度,alpha的值越大,lora的权重影响就越大,而较低的alpha将减少其影响,使得模型更多依赖于原始参数。**调整alpha有助于在拟合数据和通过正则化模型来防止过拟合之间找到平衡。作为一个经验法则,微调LLM时通常alpha的选择是秩的两倍。
- 超参数alpha-dropout:lora微调中的dropout系数
4、Qlora微调方法
qlora是建立在lora的基础上,引入了4位量化、4位NormalFloat数据类型、双量化和分页优化器,以进一步减少内存使用。
5、Dora(权重分解低秩适应):一种新颖的模型微调方法
dora是建立在lora的基础上进行改进或扩展。dora是将预训练的权重矩阵分解为幅度向量m和方向矩阵v。
拟合,但代价是表达能力的降低。一般经验是,如果数据集中任务越多样,r会设置越大些。
- 超参数alpha:**缩放尺度,alpha的值越大,lora的权重影响就越大,而较低的alpha将减少其影响,使得模型更多依赖于原始参数。**调整alpha有助于在拟合数据和通过正则化模型来防止过拟合之间找到平衡。作为一个经验法则,微调LLM时通常alpha的选择是秩的两倍。
- 超参数alpha-dropout:lora微调中的dropout系数
4、Qlora微调方法
qlora是建立在lora的基础上,引入了4位量化、4位NormalFloat数据类型、双量化和分页优化器,以进一步减少内存使用。
5、Dora(权重分解低秩适应):一种新颖的模型微调方法
dora是建立在lora的基础上进行改进或扩展。dora是将预训练的权重矩阵分解为幅度向量m和方向矩阵v。
[外链图片转存中…(img-IQsiGp1e-1715736539497)]
开发这种方法的动机是基于分析和比较lora和全面微调模型的区别。论文发现,lora可以按比例增加或减少幅度和方向更新,但似乎缺乏像完全微调那样进行细微的方向变化的能力。因此提出了幅度和方向分量的解耦。将lora应用于方向分量(同时允许单独训练幅度分量)。