文章目录
参考的文章与地址
参考《大语言模型概述》一书,书的地址:
http://aibox.ruc.edu.cn/docs//2024-04/da308db79a5d4c5697da99e012d46c76.pdf
https://github.com/RUCAIBox/LLMSurvey
本文出现图片大多数来源于《大语言模型概述》一书,学习完内容后,为了方便回顾,特结合书中内容与自身理解做一个记录,做一个融合自身见解的一个精简整合,就不用每次都看几百页的书了。
内容主要包含大语言模型发展历程,基本结构,不同模型区别,如何自己架构一个大语言模型,一些在线工具网址等等,并且后续会根据情况不断补充与修改新的内容。
没用把书上内容全部写,原书将近400页,太多了,只将一些自己觉得相对好理解的,比较重要的,接触比较多的一部分内容写在了上面,做了精简,不过大概也包含了原书的主要内容吧(有些公式太过复杂,也比较难懂,就都没放上面,一般不深度开发相关项目的话,那些可有可无。如果只是单纯搭建个大语言模型玩一玩啥的(没特别高的要求的话,这些基础知识基本都是够用的,搭建嘛,照葫芦画瓢),没有上传搭建步骤,毕竟网上都有教程,有机会再考虑上传)
一、大语言模型背景知识
1.发展历程
语言模型旨在对于人类语言的内在规律进行建模,从而准确预测词序列中未来(或缺失)词或词元(Token)的概率 (即通过对已有数据的训练,然后预测其他数据的值,根据概率大小一般优先选择概率大的词作为填入,包括机器翻译,分词等任务)。
根据所采用技术方法的不同,目前主要可以分为以下四个主要发展阶段(感觉也可以分成两个,因为第三第四感觉基本路线差不多,只不过规模上不一样):
统计语言模型(Statistical Language Model, SLM) 从概率统计的角度出发,通过计算文本中各个词或词序列出现的概率,来解决自然语言上下文相关的特性.
神经语言模型(Neural Language Model, NLM) 通过神经网络角度出发,通过神经网络来进行自然语言处理任务,如常见的RNN(循环神经网络)
预训练语言模型(Pre-trained Language Model, PLM) 在通过在大规模文本数据上预先训练模型,以捕获语言的普遍特征和规律,然后将这些知识和能力迁移到下游的NLP任务中,如ChatGPT1,ChatGPT2等等,基于谷歌提出了基于自注意力机制(Self-Attention)的 Transformer 模型.
大语言模型(Large Language Model, LLM) 可以理解为数据规模更大的预训练语言模型,经过实践表明,当预训练语言模型存在 “扩展发展” ,即随着数据量的越大,模型会出现一些涌现性的能力,可以显著提升模型的效果 (例如本来是一个处理专门领域的模型,但是随着数据量的不断变大,发现其对其他领域也有着强大的通用能力,具备了本来不拥有的能力,哲学上是否可以理解为“量变引起质变”)。
如ChatGPT-2不具备以少样本处理下游任务和非常优秀的人机对话能力,但是随着模型参数规模的辩护,GPT-3 可以拥有令人震撼的人机对话能力(这也是GPT-3.5一经发布引起震撼的一部分原因,其实相关的邻域之前也一直在推进,主要三个方向(GPT是只基于解码器的Transformer 架构,这也成了目前的主流,毕竟效果在这呢,其他两个方向一个是基于编码器,一个是两种结合的,每个架构理论上优势不同,目前基于解码器的Transformer 架构是主流,包括LLAMA等等),具体后面会介绍).
一般认为编码器架构被认为更适合去解决自然语言理解任务(如完形填空等),而解码器架构更适合解决自然语言生成任务(如文本摘要等),即编码器架构更倾向于对文本内容进行理解,解码器架构更倾向于文本生成
发展历程图片参考:
总结
早期的统计语言模型主要被用于(或辅助用于)解决一些特定任务,主要以信息检索、文本分类、语音识别等传统任务为主。随后,神经语言模型专注于学习任务无关的语义表征,旨在减少人类特征工程的工作量,可以大范围扩展语言模型可应用的任务。进一步,预训练语言模型加强了语义表征的上下文感知能力,并且可以通过下游任务进行微调,能够有效提升下游任务(主要局限于自然语言处理任务)的性能。随着模型参数、训练数据、计算算力的大规模扩展,最新一代大语言模型的任务求解能力有了显著提升,能够不再依靠下游任务数据的微调进行通用任务的求解。
70B,1B=1亿,70B=700亿
2.一些免费工具与个人见解
目前相关的工具比较多,有些是开源大模型预训练微调后的(也有直接拿来用,不微调的),这个其实还好;有些则是直接调用别人API接口,然后包个外壳(功能上其实不差,毕竟能被调用的基本都是大公司的),也有的是从头到尾自己训练的(这种一般都是大公司才有这种财力,毕竟几万片的A100,A800,价值不菲)
因此随便推荐几个免费的用户比较多或者比较经典的大语言模型工具,有些支持文生图等多种功能,openai的那个官网就不写了,当时用的贼麻烦,节点要求比New Bing 限制还多,而且能力方面其实和其他的差距不是很大,chatgpt-4,目前还有chatgpt-4o等等,与其麻烦的调用,不如用其他平替工具外加人工识别,基本都可以得到需要的答案,如果需要调用openai的API接口,那可以去用:
1.微软的基于大语言模型增强的搜索引擎 New Bing(当时自称是配备chatgpt-4的,可以理解为ChatGPT-4的在线版(联网版),现在似乎改名成Copilot了),优势是可以联网并且免费,当时用了一段时间,感觉还可以。地址(https://www.bing.com/chat),需要魔法上网,且对节点有要求。
2.据说是字节跳动的一个大语言工具模型,功能比较多,之所以拿出来是因为他支持自定义配置:(https://www.coze.cn/),需要魔法上网
3 月之暗面推出的一个大语言模型(实时联网的),KimiAI助手,有网页版也有手机app版 https://kimi.moonshot.cn/
4 谷歌的Gemini大语言模型 https://gemini.google.com/
5 百度的文心一言 https://yiyan.baidu.com/
6 360的AI助手(整合了国内比较出名的一些大语言模型,用的时候莫名奇妙自动打开了360浏览器(理论上好像没安装),哈哈,可以适当注意一下) https://bot.360.com/
还有一些专业领域的大语言模型,如商汤的医疗,通义千问的法律等方向,不再具体介绍,那个AI助手里都整合了,感兴趣可以去试试
个人觉得,几个比较出名的大语言模型没有绝对的说哪个好哪个坏(只以上面6个为例),只能说相对上可能倾向方向不同,chatgpt4是强,不过在中文等方面可能不如国内的中文大语言模型,毕竟大语言模型的强弱一个看训练数据,一个看参数,还有就是模型架构以及后续的一系列模型微调与人类对齐等等步骤。
理论上讲,其实相互差距可能不是很大(类似于什么呢,比如一个湖泊是1000吨的容量一个是950吨的容量,虽然有区别,但是肉眼也就是日常使用中很难去区别)。因此我觉得最好的使用方法还是可以多个模型一起使用,然后从中选一个自己觉得最好的答案,在较为粗粒度的人机对话中基本都没啥差别。
大模型也有自己的评价指标,虽然前文说差距不大(建立在评价指标差距不大的基础上,如果评价指标差距很大,那就不用说更细粒度的模型好坏了),一般网上开源的大模型会比那些闭源的大模型差一些,毕竟肯定要保留一点,chatgpt4和3.5也没开源。
不过对开源大模型进行合适的微调与后期的人类对齐等等步骤,不一定达不到更好的效果
3.大语言模型构建流程简介
1.大规模预训练: 准备大规模的文本数据,并且进行严格的清洗,去除掉可能包含有毒有害的内容,最后将清洗后的数据进行词元化流,并且切分成批次(Batch),用于大语言模型的预训练
2.指令微调与人类对齐:
指令微调,基础的预训练模型一开始并不一定能像现在一样可以人机问答处理/任务求解非常流畅,需要使用任务输入与输出的等配对数据进行模型训练(需要指令微调),使得模型有着更好的通用任务解决能力,通过指令微调,可以让模型朝需要的方向去发展,并且指令微调所需要的算力相比于预训练低很多。
人类对齐,主要由于预训练模型对于一些暴力等不符合人类价值的负面信息,或者一些隐私信息是不敏感的(除非实现进行标注),比如之前比较出名的,可以通过绕口令的方式从chatgpt那套出不正规网站等等。这就需要人工或者机器进行人类对齐,使得大语言模型更合规的展现能力。
3.拓展系数
拓展发展(通过语言建模损失)主要是用来判断优先提升数据规模(预训练的数据集大小) 还是 模型规模(模型参数大小) ,这里只放了一个相关公式(Chinchilla 扩展法则还有KM扩展法则等等)如下:
模型规模(𝑁)、数据规模(𝐷)和计算算力(𝐶),当 𝑎 > 𝑏 时,应该用更多的算力去提高参数规模;当 𝑏 > 𝑎 时,应该用更多的算力去提高数据规模,不过不同的扩展法则有一些差异,KM 扩展
法则(𝑎 ≈ 0.73, 𝑏 ≈ 0.27)倾向于将更大的预算分配给模型规模的增加,而不是分配给数据规模的增加;而 Chinchilla 扩展法则主张两种规模参数应该以等比例关系增加(𝑎 ≈ 0.46, 𝑏 ≈ 0.54)。
虽然拓展发展如此,但也不一定按这个来,这个也只是提供一个参考,具体比例如何,没有一个具体值,因为随着训练数据集规模的不断变大,小模型使用超大规模的预训练数据量也可以得到很高的模型提升,目前为止,还没有实验能够有效验证特定参数规模语言模型的饱和数据规模(即随着数据规模的扩展,模型性能不再提升)(类似于数据集多多益善,不过一般认为:数据量的质量优先度大于数据集的数量)
涌现能力 很难统一界定大语言模型出现这些上述能力的临界规模(即具备某种能力的最小规模),因为能力涌现会受到多种因素或者任务设置的影响。最近的研究表明,经过了高质量的预训练与指令微调后,即使较小的语言模型(如LLaMA-2 (7B))也能够一定程度上展现出目前认为的的三种涌现能力(上下文学习(现学现用能力),指令遵循(不会答非所问的能力)),逐步推理(利用思维链来解决复杂问题能力))
4.发展路线
通过一些目前比较通用的图片来快速了解,有的是开源的有的是闭源的(如下图)。
下图按照transform的不同类型分成三个分支,最左边的是只基于编码器的transform架构构建的大语言模型,中间是基于编码器-解码器的transform架构构建的大语言模型,最右边为只基于解码器的transform架构构建的大语言模型。
可以看出,目前最广泛的是只基于解码器的架构(主要是由于chatgpt3的优异性能),只基于编码器的目前基本不怎么发展了,基于编码器-解码器的transform架构构建的大语言模型目前主要是清华的和谷歌的。
下图为chatgpt的发展路径,蓝色部分为每一阶段的步骤,一般可以认为 模型+指令微调+人类对齐+长文本+多模态(如和搜索引擎结合就是newbing,和图片生成软件结合就是文生图功能,也可以和一些其他工具结合,使得其具备视图功能(chatgpt4刚发布时拥有的能力))
下文只是一个参考发展流程不一定对,如InstructGPT与GPT3.5其实没有严格意义上的迭代,只不过面向的方向有一些不同。
GPT-1(基础预训练,单向transform,100M) →GPT-2(更深的 Transformer 架构,拓展模型参数与数据集,1.5B)→GPT-3(更大的参数与数据集规模,拓展与涌现能力,175B)→InstructGPT(指示和提示学习 + 人类对齐)→GPT3.5(思维链CoT等等)→GPT4(长文本,识别图片等等)
5.公开数据简介
再介绍一些数据集,只介绍名称,不详细给出地址,知道名称后一般就可以找到地址,
如Hugging Face,DeepSpeed,Megatron-LM等等
下图为一些可公开获取的大语言模型基础信息:
下图为一些为开源的大语言模型基础信息:
开源模型LLaMA的一些变体,主要是通过继续预训练与指令微调方式进行调整,具体分支图如下:
一些常见的预训练数据库信息:
一些常用的指令微调数据集:
一些用于人类对齐的数据集信息:
下面按照大模型搭建步骤详细介绍
二、预训练
1.预训练基本流程
下图为当前一些主要大模型的预训练数据来源分布比例图,不同来源的数据比例训练出的模型能力倾向程度也不一样,如AlphaCode全是使用代码数据,就更倾向于代码解决,不然一般认为还是需要掺杂一些其他类别的数据,如通用文本数据以增强其语言建模能力,这样交互能力才更强一些(混合比例,然后不同比例有倾向程度,也可以先用通用大模型,然后用专用数据继续预训练,以得到专用领域大模型):
预训练的流程一般如下图所示,先收集原始语料库(确定来源与不同来源比例),然后对质量进行过滤,比如网页内容中的广告等等,对敏感内容过滤,对重复数据删除,然后对数据词元化,最后准备训练
质量过滤 一般有两种方法
1、基于启发式规则:通过精心设计的规则来针对地识别和剔除低质量的文本数据:
基于语种的过滤
(如训练中文数据,就要需要保留中文数据,不过也不能全是中文,根据实践(以LLaMA为例),中英文混合往往能达到更好的效果而不是全中文,因为目前英文的高质量数据集更多,并且由于其扩展和涌现能力,即便英文比例较高,也能理解中文文本)
基于简单统计指标的过滤 使用语料中标点符号分布、符号与单词比率、句子长度等特征来衡量文本质量,并过滤低质量数据,或者使用困惑度指标,具体如下:
1.针对网页数据,过滤任何具有超过 100 个重复单词或句子的文档
2. 针对网页数据,过滤符号和词元比大于 0.1 的文档
3. 针对论坛数据,过滤掉任何点赞数少于 3 的用户评论
4. 利用已有的语言模型计算文档困惑度,并以此作为文档过滤的依据
5. 训练 FastText 分类器来检测和删除有毒或仇恨言论的内容
基于关键词的过滤针对不同的语料来源以及应用场景,我们可以制定精准的清洗规则,结合相应的关键词集合,对文本进行扫描过滤,从而有效地识别和删除其中的噪声或无用元素,具体如下:
1.针对维基百科数据,过滤掉任何拥有少于 25 个 UTF-8 单词的页面;
2.针对网页数据,过滤掉 HTML 标签;
3.针对网页数据,过滤掉任何不含有 the, be, to, of, and, that, have, with 词汇的文档;
4.针对所有数据,过滤掉如电话号码,邮箱地址,以及 IP 地址等隐私信息
2、基于分类器的方法: 训练一个精准的文本质量分类器。将高质量数据作为正样本,将不良内容或低质量数据的样本作为负样本,然后用分类器进行过滤
分类器有更高的精确度,不过需要消耗更多的计算资源。一般可以采用两种方式相结合的方法,先对大的数据用效率高的方式粗略筛选明显的不合规数据,然后对筛选后的数据用精度更高的方法精细筛选。
如首先利用启发式规则进行初步筛选,以快速排除不符合要求的文档,随后再采用分类器方法进一步精细过滤,确保最终筛选出的语料具有较好的文本质量。或者可以先使用轻量级分类器进行数据过滤,进而使用更为有效但是资源消耗更高的分类器在粗滤后的数据上再次进行选择。
数据去重
首先用粗粒度去重,然后用细粒度去重,如:首先针对数据集和文档级别进行去重 (速度更快),旨在去除那些具有高度相似甚至完全一致内容的文档,例如多个 URL 可能具有相同的网页内容,或者网页数据集和新闻数据集中包含相同的新闻文档。随后,可以进一步在句子级别实现更为精细的去重**(更精准,速度较慢)**。
如在文档层面采用了开销较小的近似匹配技术(最小哈希(MinHash)算法)来实现去重,而在句子层面则采用了精确匹配算法来确保去重的准确性
数据数量: Chinchilla 扩展法则中给出的数据量与参数量的比例(20:1),近期发布的大语言模型表明,并不一定按照这个比例,数量多多益善。
数据质量: 高质量数据优先度在一定程度上大于数据数量,过多的重复数据对效果有下降作用
数据集污染: 随着参与训练的数据不断变多,用于验证的数据可能也在预训练的数据里面(某些评估基准所包含的数据,实际上已出现在预训练数据或者微调数据中,这中情况称为数据污染).相关研究表明在测试集合完全泄露的极端情况下,1.3B 的模型甚至在大部分任务超过了正常测评的 65B 的大语言模型。
质量过滤和包括过滤与清洗(以YuLan-GARDEN为例): 在过滤阶段,被判断为低质量的数据会被直接丢弃;而在清洗阶段,经过清洗后的高质量文本会替换原始文本;去重集成了句子级和文档级去重方法,可分别基于句子间 𝑛 元组的相似性与 MinHashLSH 算法实现;隐私过滤去除了个人身份信息,包括邮件名、身份证号、电话号码、网址与 IP 地址等。
词元化: 是数据预处理中的一个关键步骤,旨在将原始文本分割成模型可识别和建模的词元序列,作为大语言模型的输入数据.
分词算法如:
BPE 分词 从一组基本符号(例如字母和边界字符)开始,迭代地寻找语料库中的两个相邻词元,并将它们替换为新的词元,这一过程被称为合并.合并的选择标准是计算两个连续词元的共现频率,也就是每次迭代中,最频繁出现的一对词元会被选择与合并。合并过程将一直持续达到预定义的词表大小
WordPiece 分词 WordPiece 分词和 BPE 分词的想法非常相似,都是通过迭代合并连续的词元,但是合并的选择标准略有不同.在合并前,WordPiece分词算法会首先训练一个语言模型,并用这个语言模型对所有可能的词元对进行评分。然后,在每次合并时,它都会选择使得训练数据的似然性增加最多的词元对
Unigram 分词 从语料库的一组足够大的字符串或词元初始集合开始,迭代地删除其中的词元,直到达到预期的词表大小
词元化可以直接选用已有的分词器,也可以自己训练分词器:
分词器必须具备无损重构的特性,即其分词结果能够准确无误地还原为原始输入文本。其次,分词器应具有高压缩率,即在给定文本数据的情况下,经过分词处理后的词元数量应尽可能少,从而实现更为高效的文本编码和存储。
压缩率公式如下:
针对不同的数据,不同的任务,需要使用的分词器也不同,如英语文本的预训练语料训练了 BPE 分词器。因此,当处理中文等非英语数据时,该分词器可能表现不佳,甚至可能导致推理延迟的增加。数学能力需要针对性地设计分词器。例如BPE 分词器可能将整数 7,481 分词为“7 481”,而将整数 74,815 分词为“748 15”,这导致相同的数字被分割成不同的子串,降低了解决相关数学问题的能力。
对于这些,在设计和训练分词器时,需要综合考虑多种因素,以确保其在实际应用中能够发挥最佳效果
数据调度 主要包括数据的混合比例以及数据训练的顺序,如下图
举几个书中的例子:
代码能力方面: CodeLLaMA 还提供了一个面向 Python 语言的特定代码大模型,即 CodeLLaMA-Python,采用了如下的数据训练课程:2T 通用词元 → 500B 代码相关的词元 → 100B Python 代码相关的词元
数学能力方面: Llemma 是一个具有代表性的数学大语言模型,有效提升了通用大语言模型的数学能力。它选择 CodeLLaMA 作为基座模型,进一步在包含科学论文、数学和代码的混合数据集合上进行继续预训练。虽然 CodeLLaMA主要关注编程能力,但是实验表明它在数学基准测试上的表现优于其基础模型LLaMA-2。数据训练课程:2T 通用词元 → 500B 代码相关的词元 →50∼200B 数学相关的词元
长文本能力方面: CodeLLaMA数据训练课程:2.5T 词元,4K 上下文窗口 → 20B 词元
数据清洗后步骤(以之前提到的YuLan 模型为例) 在 LLaMA 的词表基础上加入了在中文预训练数据上得到的 BPE词元,用于对预训练数据进行词元化。
在预训练确定数据比例过程中,预训练一个1.3B 的小模型,首先对语言配比进行确定,然后确定不同数据类型配比。具体来说,每次训练时,从各个数据集按照不同配比采样得到 50B 数据,然后从头开始对 1.3B 模型进行预训练,并根据在诸多下游任务的测试效果最终确定中英文语料比例为 1:8。然后,维持该比例不变,并选择 LLaMA 的数据比例作为基础,在其基础上使用控制变量法,每次仅调整某一类型数据的比例进行实验,依旧通过下游任务效果来决定是否采用该新数据比例,进而获得整体的数据混合配比。(过程仅做参考,具体如何可手动配比,不同参数架构与数据集针对不同任务可能最适合的比例也不同)
部分大模型架构配置表如下(L 表示层数,N 表示注意力头数,H 表示隐藏状态的大小):
transform架构模型:
不同状态空间复杂度也不同,具体如下所示 (T 表示序列长度,H 表示输入表示的维度,N 表示状态
空间模型压缩后的维度,M 表示 Hyena 每个模块的层数):
较小的批次对应反向传播的频率更高,训练早期可以使用少量的数据让模型的损失尽快下降;而较大的批次可以在后期让模型的损失下降地更加稳定,使模型更好地收敛。
现有的大语言模型在预训练阶段通常采用相似的学习率调整策略,包括预热阶段和衰减阶段。预热阶段一般占整个训练步骤的 0.1% 至 0.5%,然后学习率便开始进行衰减 (包括学习率线性衰减、余弦衰减和平方根倒数衰减,具体如下图所示:)
现有大语言模型的详细优化配置
还有一些其他优化方式:如3D并行训练(增加GPU数量并行训练,提高效率);0冗余优化器(解决并行中的模型冗余问题);激活重计算(节约显存,计算量开销变大);混合精度计算(将单精度浮点数变成使用半精度浮点数(2 个字节)和单精度浮点数(4 个字节)进行运算或者半精度浮点数表示 BF16,由原来32位变成16位,显著提升了模型的训练效率)
2.模型的运算量计算
运算量≈6CP
如果采用激活重计算技术,则运算总量约为 8 𝐶𝑃
以 LLaMA (7B) 的训练为例介绍运算总量的计算方法。其参数量 𝑃 ≈ 6.74×10^9。
这里假设训练数据的词元总数均为 𝐶 = 1×10^9,那么 LLaMA (7B) 的训练过程中浮点运算总量为 6 × 6.74 × 10^9× 10^9 ≈ 4.04 × 10^19
3.模型的运行时间计算
训练时间公式如下:
GPU 每秒浮点运算数通常是 GPU 理论浮点运算能力的 30% 到70%,而这一比例通常会受到多种实际因素的影响。
以 LLaMA (65B) 的预训练为例,其参数量 𝑃 = 6.5 × 10^10词元数 𝐶 = 1.4 × 10^12,由于采用了激活重计算技术,其运算量大致为 8𝐶𝑃 = 7.28 × 10^23。它在预训练过程中使用了 2,048 张 A100 GPU,而每张 A100 GPU 每秒最多能进行 3.12 × 10^14 次 BF16 浮点数运算。
我们假设在训练过程中,每张 GPU 能达到每秒 2 × 10^14 次 BF16 浮点数运算的实际性能。根据上述公式,可以计算出 LLaMA (65B) 使用 2,048 张 A100 GPU 在 1.4T 个词元上的训练时间大致为 1.78 × 10^6 秒,即大约为 20.6 天。这个估算结果与论文中公布的 21 天基本一致。
4.模型需要的显存计算
以半精度16为浮点数为例,假设训练中使用了数据并行(数量为 𝑁𝐷)、FlashAttention、激活重计算和 ZeRO-3 技术进行效率优化,并采用了 Transformers 代码库所提供的代码实现,则每张 GPU 的显存开销为:(如果嫌计算麻烦,总显存可以简单的用16倍的P,即参数量的16倍来简略计算,例如,13B 的模型至少需要 13 × 16 = 208GB的显存,因此至少需要 3 张 A800 (80G) 的 GPU,每张 GPU 剩余约 10GB 显存)
LLaMA (7B) 训练的显存占用. 在 LLaMA (7B) 模型中,𝐿 = 32,𝐻 = 4096。进一步,假设使用了 2 张 A800 (80G),批次大小 𝐵 = 8,那么每张 GPU 中的模型参数与优化器的显存占用为 16𝑃/𝑁𝐷 ≈ 5.39 × 10^10 字节,约为 50.20 GB。在Transformers 库的实现中,模型训练激活值的显存占用为 (4 + 2𝐿) · 𝐵𝑇𝐻 + 4 𝐵𝑇𝑉 =(4+2×32) ×8×2048×4096+4×8×2048×32000 ≈ 6.66×10^9 字节,约为 6.20 GB;中间结果的显存占用为 8 𝐵𝑇𝑉 = 8 × 8 × 2048 × 32000 ≈ 4.19 × 10^9 字节,约为 3.91 GB;再加上每张显卡的其他显存占用部分约 6 GB,两张 A800 (80G) 训练 LLaMA (7B)时每张 GPU 大约会占用 50.20 + 6.20 + 3.91 + 6 ≈ 66𝐺𝐵
三、指令微调与人类对齐
1.指令微调
指令微调是指使用自然语言形式的数据对预训练后的大语言模型进行参数微调(以便于更符合处理对话任务或者其他复杂认为,类似于对璞玉进行雕琢),指令微调过程需要首先收集或构建指令化的实例,然后通过有监督的方式对大语言模型的参数进行微调(在使用人工构建的指令数据对大语言模型进行进一步训练)。经过指令微调后,大语言模型能够展现出较强的指令遵循能力,可以通过零样本学习的方式解决多种下游任务。
指令数据的构建(指令的质量比指令的数量更重要)
1.可以使用传统的NIP开源指令数据集
2.人工构造
3.基于chatgpt等方法回复构成问答构成多轮对话数据(合成数据)
指令微调的作用
1.可以用更少的成本得到整体任务性能的提升,经过指令微调的小模型甚至可以比没有经过微调的
大模型表现得更出色。且适用范围广(包括不同的大语言模型,不同的模型架构,预训练目标,模型微调方法)都可以从中受益。与预训练相比,指令微调的成本显著降低,大模型所需的指令数据量仅为预训练阶段的约万分之一甚至更少。
2.通过指令微调,大模型能够获得较好的指令遵循与任务求解能力,无需下游任务的训练样本或者示例就可以解决训练中未见过的任务。一些实验结果表明:指令微调能够帮助大模型从纯英文数据中获得较为通用的任务解决能力,并将这些能力迁移到其他语言
3.可以用来训练专业领域的大语言模型,指令微调为大模型提供了一种通用的领域适配方法,拓宽了它们在实际场景中的应用范围。
指令微调的训练策略
在预训练好的大模型上进一步训练,基本流程预训练步骤基本差不多,很多设置包括数据组织形式都可以预训练阶段所采用的技术,不同的可能就是需要优化器设置,目标函数,学习率设定批次等等,还有就是可能需要多阶段的指令数据微调 (如首先使用大规模 NLP 任务指令数据对模型进行微调,然后再使用相对多样的日常对话指令和合成指令进一步微调,且对于不同的微调阶段,训练中可以逐渐增加指令的难度和复杂性,从而逐渐提高大模型遵循复杂指令的能力)
还有其他微调方法,如轻量化微调(参数高效微调),例如LoRA 微调方法(低秩适配微调技术) 。在预训练模型的参数矩阵上添加低秩分解矩阵来近似每层的参数更新,从而减少适配下游任务所需要训练的参数。
轻量化微调效率优势: 轻量化微调需要的显存可以近似的从全量化微调的16P(前文提到的)降至 2P,为原来的1/8。还有一些其他的LoRA变种,如QLoRA进一步将2P 进一步下降为 0.5P,为原来的1/32
这只是一种轻量化微调的方向(低秩化参数矩阵)还有其他方式,如适配器微调、前缀微调、提示微调等等,不过这三种在在预训练语言模型中被广泛使用,但是在大语言模型中的应用相对较少,故不再详细介绍
全参数指令微调( 使用的是52K 条指令的 Alpaca数据集)所需的 A800 GPU 数量、批次大小和微调时间如下表所示,可以看出相比于原始模型预训练时间,速度和显存占用得到明显提高.
如果为轻量化微调,如LoRA,根据之前分析,显存为1/8,则GPU数量相较于全量微调场景,7B、13B、30B 和 65B 模型需要的显卡数从2、4、8 和 16 分别降至 1、1、1 和 2,极大降低了成本.如果是QLoRA,则成本更低
通过三类指令微调数据集(FLAN v2、ShareGPT 和 Alpaca)和两个拓展的指令集(Alpaca+ 复杂化、Alpaca+ 多样化)来微调 LLaMA-2 模型,通过特定的任务评测来对比不同指令数据集合对于模型性能的影响.
日常对话评测是基于 AlpacaFarm 的评估数据集开展,对于 NLP 任务,我们选择了两个常用评测基准:MMLU 和 BBH,均使用准确率来衡量模型表现。数值越大,效果越好
如下图所示,可以说明三点:
1.使用与下游任务格式更接近的指令能够带来更大提升
2.提高指令复杂性和多样性能够促进模型性能的提升
3.更大的参数规模有助于提升模型的指令遵循能力
指令微调步骤
1.收集或构建指令化实例: 需要首先收集或构建一系列指令化的实例,这些实例包括输入指令和期望的输出,进行必要的数据清洗和预处理。
2.选择预训练模型/基础模型: 选择适合的预训练模型。
3.设定微调策略: 根据任务需求和可用资源,选择适当的微调策略。考虑是进行全微调还是 轻量化微调,以及微调的层级和范围。
4.设置超参数: 确定微调过程中的超参数,如学习率、批量大小、训练轮数等。这些超参数的选择对微调的性能和收敛速度有重要影响。
5.初始化模型参数: 根据预训练模型的权重,初始化微调模型的参数。对于全微调,所有模型参数都会被随机初始化;对于轻量化微调,只有顶层或少数层的参数会被随机初始化。
6.进行微调训练: 使用准备好的数据集和微调策略,对模型进行训练。在训练过程中,根据设定的超参数和优化算法,逐渐调整模型参数以最小化损失函数。
7.模型评估和调优: 在训练过程中,使用验证集对模型进行定期评估,并根据评估结果调整超参数或微调策略。这有助于提高模型的性能和泛化能力。
8.测试模型性能: 在微调完成后,使用测试集对最终的微调模型进行评估,以获得最终的性能指标。这有助于评估模型在实际应用中的表现。
9.模型部署和应用: 将微调完成的模型部署到实际应用中,并进行进一步的优化和调整,以满足实际需求。
2.人类对齐
基础概念
与其他步骤不同,人类对齐主要是是大语言模型产生的回答满足有用性、诚实性和无害性的特征。
例如,之前的Chatgpt在回答问题时会编造答案,比如让其列举一些参考文献,很有可能会列举一些不存在的参考文献,也就不满足诚实性,也可以称为产生了幻想,chatgpt本身一般不会自主辨别。
还有就是之前有些人弄了一些所谓的破解版chatgpt,那个还会骂人,这个就不满足无害性,也有的会泄露个人隐私数据。这些都需要进行人类对齐。
书中的例子可能更为详细一些(用户输入:农村的土地价格要更便宜一些,所以更适合发展有污染的产业吗?):
输入的问题刻意包含了具有误导性的逻辑关系,即“土地价格”和“有污染的产业”是有直接关系的。因此,在经过人类价值观对齐之前的大语言模型会被输入中的错误逻辑所引导,产生了带有偏见的建议“农村地区更适合发展污染较严重的产业”。在经济生产中,发展有污染的产业需要综合考虑多方面的因素,不能仅仅因为土地价格更为便宜就认为适合发展相关产业。对齐前的大语言模型给出了一个错误的观点,不符合人类价值观,违背了无害性的原则。而经过与人类价值观对齐之后的大语言模型,先指出了输入问题中包含的错误逻辑(“我们不能简单地认为农村土地价格便宜就适合发展污染产业。”),并且给出了正确且合理的做法。对齐后的大语言模型的回复符合有用性和无害性,与人类价值观和偏好相符.
有用性: 在实际应用中,大语言模型需要提供有用的信息,能够准确完成任务,正确理解上下文,并展现出一定的创造性与多样性
诚实性: 模型的输出应具备真实性和客观性,不应夸大或歪曲事实,避免产生误导性陈述,并能够应对输入的多样性和复杂性
无害性: 大语言模型应避免生成可能引发潜在负面影响或危害的内容
人类对齐方式:
基于人类反馈的强化学习方法,具体如下图所示
即先根据人类反馈的数据训练(人类对模型的不同输出做偏好设置,比如基于打分式(遵守某规则加分,违反减分)对比式(正负例)或者排序式(如EIo评分系统,通过不断的两两比较进行排序)(假如产生了多个候选项))与人类价值观对齐的模型建立基于人类反馈数据学习的奖励模型(满足人类偏好的模型),然后通过奖励模型对输出进行判断,使用强化学习算法训练出对齐的语言模型 (可以使用KL散度作为惩罚项,KL 散度越大,意味着当前语言模型越偏离初始语言模型)
InstructGPT介绍
InstructGPT为使用 RLHF 方法对齐后的大语言模型,主要包括三个步骤:
首先,需要收集指令数据并使用有监督微调进行训练。OpenAI 的研究团队雇佣了 40 名标注人员,针对给定任务提示编写对应的输出示例。这些数据将用于经过预训练后的GPT-3 模型的监督微调。
然后,收集人类反馈数据训练奖励模型。标注人员对于模型生成的输出进行对比与排序,然后训练奖励模型来拟合标注人员的偏好。
最后,使用 PPO 算法和奖励模型进行大语言模型的强化学习训练。在这个步骤中,使用第二步训练得到的奖励模型,对于第一步监督训练得到的语言模型进行微调,从而实现人类价值观的对齐。后两个步骤可以迭代多次,基于当前最佳的语言模型持续收集数据,进一步训练奖励模型和优化模型的生成策略。
实验结果表明,即使参数量仅为 1.3B 的 InstructGPT 模型,在相关评测任务上性能也超过了高达 175B 参数的 GPT-3 模型。
InstructGPT 在生成内容的诚实性、减少有害输出方面表现更优,同时在公开的自然语言处理数据集上的表现没有明显下降,所带来的“对齐税”并不是很高。
“对齐税”的意思,类似于为了与人类的价值观和需求保持一致,大语言模型需要抛弃一些原有的东西,而抛弃的内容中很有可能存在影响模型性能的因素。一方面由于神经网络训练中的灾难性遗忘问题,使用特定领域数据对于大语言模型进行训练,可能会造成在其他领域中的性能大幅下降,即模型在学习新知识时可能会干扰或覆盖先前学习的知识,包括人类对齐也是如此.
RLHF 和 SFT
RLHF 和 SFT 可以被视为两种优化大语言模型决策过程的训练方法
在 RLHF 中,我们首先学习一个奖励模型,然后利用该奖励模型通过强化学习算法(如 PPO)来改进大语言模型。而在 SFT 中,我们则采用了 Teacher-Forcing (核心思想是在训练过程中,不将模型自身在前一时间步生成的输出作为下一个时间步的输入,而是直接使用真实的目标序列中的元素作为输入) 的方法,直接优化模型对实例输出的预测概率。
从本质上说,SFT 所采用的这种词元级别的训练方式是一种“行为克隆”(模仿学习的一种特殊算法)。它利用教师的行为数据(即每个步骤的目标词元)作为监督标签,来直接训练大语言模型模仿教师的行为。在实现上,SFT 主要依赖于序列到序列的监督损失来优化模型,而 RLHF 则主要通过强化学习方法来实现大模型与人类价值观的对齐。
本质上来说,为了学习教师的生成策略,SFT 采用了基于示例数据的“局部”优化方式,即词元级别的损失函数。作为对比,RLHF 则采用了涉及人类偏好的“全局”优化方式,即文本级别的损失函数。
下图为SFT与RLHF两个方法的优缺点:
四、使用与评测
1.大模型使用相关
贪心搜索
大语言模型的生成方式本质上是一个概率采样过程,需要合适的解码策略来生成合适的输出内容
如下图所示,通过之前的词元预测后一个词元,每次选概率最大的那个(贪心搜索),不过此方法存在一些问题,在开放式生成任务(如故事生成和对话系统)中,贪心搜索有时会因为过于关注局部最优,而生成不自然、重复的句子。(类似于健壮性容错率不大,不够多样化)
贪心搜索的改进(束搜索)
束搜索会保留前 𝑛 个具有最高概率的句子,并最终选取整体概率最高的生成回复。这里的 𝑛 被称为束大小,当 𝑛 = 1,束搜索就退化为贪心搜索(也就是扩大了待选项,原来是只用到一条分支,现在是n个分支)。具体如下图所示
长度惩罚:如果没有长度惩罚,传统的束搜索会倾向于生成较短的句子,因为每生成一个单词,都会乘以一个小于 1的概率,使得句子的生成概率逐渐变小。因此,可以在生成概率的计算中引入长度惩罚,通过将句子概率除以其长度的指数幂 𝛼,对于句子概率进行归一化处理,从而鼓励模型生成更长的句子。在实践中,𝛼 通常设置为 0.6 到 0.7 之间的数值。
重复惩罚:为了缓解贪心搜索重复生成的问题,可以使用 𝑛-元惩罚来强制避免生成重复的连续 𝑛 个词元,实践中 𝑛 通常设置为 3 到 5 之间的整数。具体也会有一些其他调整,比如设立一些温和惩罚机制,避免一刀切。如出现惩罚和频率惩罚等等
出现惩罚在生成过程中会将已经生成词元的 logits (概率化的一个中间值) 减去惩罚项 𝛼 来降低该词元之后生成的概率。
频率惩罚相较于出现惩罚,会记录每个词元生成的数目,然后减去出现次数乘以惩罚项 𝛼,因此如果一个词元生成得越多,惩罚也就越大。在实践中,𝛼 的取值范围通常在 0.1 到 1 之间。
概率采样
除了贪心搜索外,另一种可选的解码策略是概率采样。概率采样方法根据模型建模的概率分布采样得到下一个词元,旨在增强生成过程中的随机性和结果的多样性
随机采样的改进策略
基于概率采样的方法会在整个词表中选择词元,这可能会导致生成不相干的词元(即概率分布特别低的词元,因为概率特别低,可以认为没有意义,所以不用都展示在词表中)。因此需要进一步使用一些改进的采样策略,减少具有极低概率词汇对于生成结果的影响
温度采样,如下图所示
降低温度系数 T 会使得概率分布更加集中,从而增加了高概率词元的采样可能性,同时降低了低概率词元的采样可能;当温度系数 T 设置为 1 时,该公式退化为标准的随机采样方法;而当 T 趋近于 0 时,实际上等同于贪心搜索,即总是选择概率最高的词。此外,当 T 趋近于无穷大时,温度采样会退化为均匀采样
top-k采样与top-p采样(具体如下图所示):
与温度采样不同,top-𝑘 采样策略是直接剔除概率较低的词元,限制模型从概率最高的前 𝑘 个词元中进行采样
top-𝑝 采样首先会按照生成概率从高到低的顺序对词元进行排序,然后不断将词元添加到一个临时的集合中,直到集合的累积概率首次超过阈值 p
由于不同的采样解码策略,所生成的结果也不同,举一些大语言模型所用的参数:
T5: T5 默认采用贪心搜索策略。在翻译和摘要任务中,它使用束搜索(束大小为 4)并结合长度惩罚(惩罚因子为 0.6)来优化生成结果。
GPT-3: GPT-3 在所有生成任务中都使用束搜索(束大小为 4)和长度惩罚(惩罚因子为 0.6)
Alpaca: Alpaca 主要面向开放式生成任务,因此使用了基于采样的策略,包括 top-𝑘 采样(𝑘 = 50)和 top-𝑝 采样(𝑝 = 0.9),并将温度参数设置为 0.7,在保证结果可靠的同时促进生成结果的多样性
LLaMA: LLaMA 根据具体任务的不同采用了多样化的解码策略。例如,在问答任务中使用了贪心搜索策略;而在代码生成任务中,分别采用了温度设置为 0.1(针对 pass@1)和 0.8(针对 pass@100)的采样策略
OpenAI API: OpenAI 支持多种基本的解码策略,包括贪心搜索、束搜索、温度采样以及 Top-𝑝 采样.此外,它也支持基于出现惩罚和频率惩罚的重复惩罚机制
下图是以YuLan 模型的回复为例,在不同解码策略时YuLan 模型的回复,可以看出解码策略不同,回复的内容也会有很大的不同
现有的一些研究结论(与模型量化相关)
1.在相同显存开销的情况下,建议优先使用参数规模较大的语言模型,而不是表示精度较高的语言模型。 给定同一个系列的模型(如 LLaMA 系列),量化精度为 4 比特的 60GB 的语言模型在性能上往往会优于量化精度 8 比特的 30GB 的语言模型。此外,相关研究还表明,经过 4 比特权重量化后,大语言模型的上下文学习能力、复杂推理能力和指令跟随能力受到的影响都很少。
2.当 Transformer 语言模型的参数规模超过一个阈值后,激活值开始出现较大的异常值 。数值较大的异常值对大语言模型激活量化带来了重要的挑战。需要采用特定的处理方法,例如混合精度分解 细粒度量化 和困难值迁移来减轻异常值的影响由于小型语言模型中激活值的范围通常相对标准,激活值量化对于小模型的模型效果影响较小。
3.轻量化微调方法可以用于补偿量化大语言模型的性能损失 大语言模型在超低比特权重量化时(如 2 比特量化),可能会出现预测精度的大幅下降,这种精度下降问题可以通过轻量化微调(如 LoRA)的方式来进行性能补偿经过微调后,可以将 65B 参数模型在 2 比特权重量化的效果提升到接近 13B 模型的 16 比特精度。
此外,QLoRA 更为针对性地设计了面向量化模型的性能补偿方法,在轻量化微调的同时还考虑了显存优化,主要提出了三种改进方法,包括引入新的数据类型 NF4(4-bit NormalFloat)来缓解量化误差、提出双重量化技术以减少平均显存占用,以及分页优化器来管理显存峰值。实验表明,QLoRA 在基于 4 比特量化模型的微调后,能够获得与 16 比特模型全参数微调以及 LoRA 微调相似的效果。总结来说,通过轻量化微调来补偿量化大语言模型的精度损失,可以在模型效果和训练成本之间取得较好平衡,具有良好的应用前景。
4.下表展现了 LLaMA 模型在三种不同量化精度下的模型性能。 可以看到,使用 8 比特和 4 比特权重量化所获得的结果接近于原始 16 比特精度的模型性能。同时,由于使用了量化压缩,能够显著减少语言模型的显存开销。在实际应用中,如果显存资源比较受限,优先推荐尝试使用经过 4 比特权重量化的大语言模型。
其他模型压缩方法(模型蒸馏与模型剪枝)
模型蒸馏与模型剪枝,一个是知识转移,一个是精简自身结构
与模型量化不同,模型蒸馏和模型剪枝则通过精简模型的结构,进而减少参数的数量
模型蒸馏将复杂模型(称为教师模型)包含的知识迁移到简单模型(称为学生模型)中,从而实现复杂模型的压缩(如下图)。
这种技术通过训练学生模型以模仿教师模型的输出,使得学生模型能够在保持与教师模型相近甚至更好性能的同时,以较小的规模进行推理,从而提高推理效率。模型蒸馏的基本思想是利用教师模型的输出概率分布作为目标,让学生模型学习如何近似教师模型的预测结果
模型剪枝的目标是,在尽可能不损失模型性能的情况下,努力消减模型的参数数量,最终有效降低模型的显存需求以及算力开销。如下图
模型剪枝的基本思想是去除模型中不必要的神经元、连接、层等,从而减小模型的复杂度和参数数量。剪枝可以通过多种方式实现,包括非结构化剪枝(即按权重值的绝对值大小进行剪枝,导致权重矩阵变得稀疏)和结构化剪枝(即剪除整个神经元、滤波器或层,以更有效地利用现有硬件加速器)。剪枝后,通常需要对模型进行微调以恢复其性能。
提示学习
这个没啥说的,主要就是在输入时对任务描述、输入数据、上下文信息(ICL)和提示策略做调整,使得模型能更好的理解意思,比如可以举一些示例,还有就是思维链提示(CoT)等等,或者一步步引导答案,而不是一步的直接说一个复杂任务(复杂任务分解成一步步简单任务)等等
上下文学习底层机制
1.元训练任务越多且越多样,模型的上下文学习能力就越强,这也证明了预训练任务对于大语言模型上下文学习能力具有很大的影响
2.通过混合不同领域的预训练数据,增强预训练语料的多样性可以提高大语言模型的上下文学习能力。此外,预训练数据的长程依赖关系也是改善模型上下文学习能力的重要因素。通过将前后相关的文本直接拼接进行训练,模型能够更好地理解文本之间的关联性,从而提升上下文学习的能力
3.当使用颠倒或语义不相关的符号作为标签时,规模较大的模型的性能下降更小。说明大模型能够更好地分析和学习给定的示例信息,从示例中学习出标签信息的对应关系,进而采用学习到的策略完成任务
大语言模型智能体的典型应用
智能体(Agent)技术可以理解为将大语言模型与其他工具结合,而不是仅局限于回答问题,如,当你需要爬取某个网站的数据时,大语言模型可能会给你一个相关的python爬虫代码,但是具体爬取数据,需要你自己去运行。而智能体则是先给出代码,然后自己运行,自己去爬取数据,然后给出这个网站你需要的数据,不需要人工去干预。即自己制定任务规划,自己去完成,而大语言模型则只是提供一个任务规划,具体实施需要人工去完成。
目前的相关典型应用如下
WebGPT: WebGPT是由 OpenAI 开发的一款具有信息检索能力的大语言模型,WebGPT 具备自主搜索、自然语言交互以及信息整合分析等特点,能够理解用户的自然语言查询,自动在互联网上搜索相关网页。根据搜索结果,WebGPT 能够点击、浏览、收藏相关网页信息,对搜索结果进行分析和整合,最终以自然语言的形式提供准确全面的回答,并提供参考文献. 这个基本目前很多都可以实现,如newbing,文心一言,kimi等等
MetaGPT 旨在模仿人类组织的运作方式,模拟软件开发过程中的不同角色和协作。相关角色包括产品经理、架构师、项目经理、软件工程师及测试工程师等,并遵循标准化的软件工程运作流程对不同角色进行协调,覆盖了需求分析、需求文档撰写、系统设计、工作分配、代码实现、系统测试等软件开发全生命周期,最终满足特定软件开发项目的需求。不过这个其实还不完善,给出的代码实现和测试往往不能保证成功运行
2.大模型评测相关
测评这边不再详细介绍,只给出一个相关公式与指标,基本一看就懂
我们可以通过计算一段参考文本 𝒖 = [𝑢1, . . . , 𝑢𝑇] 的建模概率 𝑃(𝒖) 来度量语言模型的能力。文本的建模概率可以表示为(𝑢𝑡 代表文本中的第 𝑡 个词元,𝑃(𝑢𝑡|𝒖<𝑡) 则表示在给定前 𝑡 − 1 个词元的条件
下第 𝑡 个词元出现的概率):
由于文本长度等因素会对建模概率有一定的影响,参考文本概率通常不适合用来直接评估语言建模任务。因此,困惑度(Perplexity, PPL)成为语言建模任务中常用的评测指标,困惑度定义如下(𝒖 代表参考文本,𝑇 是文本 𝒖 中词元的总数):
精确率公式,精确率表示模型预测为正例的样本中真正为正例的比例(正例预测对的能力),其定义为:
召回率公式,召回率表示所有真正为正例的样本中被模型正确预测出来的比例(发现正例的能力),其定义为:
F1分数公式,F1 分数是精确率和召回率的调和平均数,用于衡量模型在分类任务上的综合性能,其定义为:
不同任务的常见测评指标分类表如下图所示,可结合之前公式(只介绍了一部分比较好理解的,不深入研究的话不用都深入了解,知道有这么个概念和评测指标就行)
不同能力评测对应的数据集:
幻像问题(前文已经大概介绍过):
幻象现象表现为模型生成的信息要么与输入信息存在冲突(即内在幻象),要么无法通过输入信息直接进行验证(即外在幻象)。大概如下图
主流大语言模型常见评测维度及其对应评测体系或数据集
五、应用
大语言模型应用于传统自然语言处理任务,如下图所示
各专业领域代表性的大语言模型与数据资源,如下图
总结
主要介绍了大语言模型的基础知识,包括预训练,指令微调,人类对齐,模型缩放,多模态以及一些大语言模型的特点与实例。(前面部分还是比较有耐心,到后面就没什么耐心过多语言文字描述了,写累了,比如第五部分,不过主要信息还是记录了)
如果想要深入研究还是建议看那本书,仔细推敲里面的所有公式,篇幅有限,没法一一介绍,只能尽量涵盖主要部分内容,一方面记录一下加深记忆,一方面也是方便以后回顾就不需要重新翻书,也是对书上知识做一个推广
后期有时间会继续更新相关内容或者做一些补充