目录
- 简介
- 现象
- 涌现能力
- 关键技术
- 相关资源
- 开源模型或API
- 数据集
- 开源库
- 预训练
- 数据选择
- 数据预处理
- 模型架构
- 模型训练
- 模型微调
- 指令微调 Instruction Tuning
- 人机对齐 Alignment Tuning
- 下游任务
- 上下文学习(In-Context Learning,ICL)
- 思维链提示(Chain-of-Thought Prompting)
- 效果评估
- 未来
- 研究方向
- 几个有趣的东西
- AutoGPT
- 生成式智能体
最近大语言模型就像雨后春笋一样涌现出来,让人有点应接不暇,这里就写篇博客汇总一下近期发展情况,主要参考若干survey以及相关技术论文,截至2023.4
简介
语言是人类表达和通信的一种突出能力,它在儿童早期发展,并在一生中进化。而对于机器,它们不能自然地掌握以人类语言形式理解和交流的能力,除非配备强大的人工智能 (AI) 算法。为了实现这一目标,一直是一个长期的研究挑战,它使机器能够像人类一样阅读、写作和交流。从技术上讲,语言建模 (LM) 是推进机器语言智能的主要方法之一。一般来说,LM 旨在对单词序列的生成似然进行建模,以预测未来(或缺失)标记的概率。LM的研究在文献中受到了广泛的研究关注,大致可分为四大发展阶段:
- 统计语言模型 (SLM),通过统计来预测上下文( n-gram 语言模型)
- 神经语言模型 (NLM),通过浅层神经网络预测(word2vec)
- 预训练语言模型(PLM),设置了“预训练和微调”学习范式(LSTM ,BERT,GPT-2)
- 大型语言模型 (LLM),在前者基础上缩放模型参数并对模型输出进行人机对齐,涌现出意想不到的能力(GPT-3,ChatGPT,GPT-4)
看似LLM和PLM训练方式大同小异,但呈现出来的效果却天差地别,这对我们的研究有以下几点改变:
1、LLM显示出一些令人惊讶的涌现能力,这在以前的较小PLM中可能没有观察到。这些能力是语言模型在复杂任务中表现的关键,使人工智能算法变得前所未有的强大和有效。
2、LLM彻底改变了人类开发和使用人工智能算法的方式。与小型PLM不同,访问LLM的主要方法是通过提示接口(例如GPT-4API)。人类必须了解LLM是如何工作的,并以LLM可以遵循的方式格式化他们的任务,输入和输出都变为了自然语言,有任务大一统的趋势,在自然语言处理领域,LLM可以作为通用的语言任务求解器。
3、LLM的发展不再明确区分研究和工程。LLM的训练需要在大规模数据处理和分布式并行训练方面有丰富的实践经验。为了开发有能力的LLM,研究人员必须解决复杂的工程问题,与工程师合作或成为工程师。
transformers家族如日中天:下图是transformer的大模型发展图,左边NLP,中间多模态,右边CV,最近还有个Segment Anything Model (SAM)分割一切的CV模型,让CV领域也迎来了ChatGPT时刻
大型语言模型效果这么好,但是为什么好,原理研究不是很清楚,现在只能从现象尝试去一窥大模型神奇的一角,下图是截至现在出现的LLM,有底色的是开源模型,真的像雨后春笋一样。
现象
涌现能力
LLM的涌现能力被正式定义为“不存在于小模型中但出现于大模型中的能力”,这是LLM与以前的PLM区别开来的最显著特征之一。当涌现能力出现时,它还引入了一个显著的特征:当规模达到一定水平时,表现显著高于随机。通俗来说就是参数量超过某个阈值,有些神奇的东西就会出现,拿FLAN的论文里的图来简单表示为:
涌现的主要有以下能力:
- 上下文学习 In-context learning(ICL)在不调整模型参数的情况下,根据用户输入的上下文结合模型输出更加符合上下文的答案,严格定义如下
其中C为上下文,为当前输入,通过模型f、上下文参数C和输入x共同预测下一句话,而不是只通过输入和模型进行预测,对话连贯度大幅增加
- 指令跟随 Instruction following(IF)理解问题能力明显增强,指令调优使LLM能够通过理解任务指令来执行新任务,而无需使用明确的示例,这可以在很大程度上提高泛化能力
- 思维链 chain of throught (COT) 对于小型语言模型,通常很难解决涉及多个推理步骤的复杂任务,例如数学单词问题。而通过思维链推理策略,LLM可以通过利用提示机制来解决这些任务,该机制涉及推导最终答案的中间推理步骤。据推测,这种能力可能是通过对代码进行训练而获得的
关键技术
这里简要列出了(可能)导致LLM成功的几个重要技术
- 模型缩放:缩放是提高LLM模型容量的关键因素。作为最初的尝试,GPT-3首先将模型大小增加到175B参数的超大规模。稍后,PaLM进一步将参数刻度提高到540B的新记录,如前所述,大的模型尺寸对于涌现能力至关重要。
- 训练和优化:分布式训练算法来学习LLM的网络参数,其中经常联合使用各种并行策略。优化技巧对训练稳定性和模型性能也很重要,出现了很多PLM时代不具有的新方法
- 能力启发。经过大规模语料库的预训练,LLM有了解决通用任务的潜在能力。然而,当LLM执行某些特定任务时,这些能力可能不会明确表现出来。合适的任务指令或特定的上下文策略来激发这种能力是有用的。例如,思维链提示已被证明通过包括中间推理步骤来解决复杂的推理任务是有用的。然而,这些技术主要对应于LLM的涌现能力,这可能在小型语言模型上没有表现出相同的效果。
- 人机对齐:使 LLM 能够遵循预期的指令,该方法利用具有人类反馈的强化学习技术,避免低质量数据导致的可能产生对人类生成有毒、有偏见的甚至有害的内容
- 外部规则:ChatGPT 启用了使用外部插件(现有或新创建的应用程序)的机制,这些插件类似于 LLM 的“眼睛和耳朵”。这种机制可以广泛扩大 LLM 的容量范围,例如调用计算器进行数值计算,调用搜索引擎检索未知信息
相关资源
开源模型或API
大型语言模型(超过10B)的统计数据,包括容量评估、预训练数据规模(token或数据大小)和硬件资源成本。“adaptation”表示模型是否经过后续微调:IT 表示指令调整,RLHF 表示具有人类反馈的强化学习。"Evaluation" 表示模型是否已在原始论文中使用相应的能力进行评估:ICL 表示上下文学习,CoT 表示思维链。“*”表示最大的公开可用版本。
数据集
分别是书籍(Books),网页(CommonCrawl),网络帖子(Reddit links),百科,代码(Codes),论文(Pile),多语言(ROOT)等多方位数据,并且有一定过滤,例如贴文选择点赞量较高的,代码stars较多的等,需要尽量保证质量
开源库
- Transformers 是一个开源 Python 库,用于使用 Transformer 架构构建模型,该架构由 Hugging Face 开发和维护
- DeepSpeed 是由 Microsoft 开发的基于 PyTorch 的深度学习优化库,已用于训练许多 LLM
- Megatron-LM 是一个由 NVIDIA 开发的基于 PyTorch 的深度学习库,用于训练大规模语言模型。它还为分布式训练提供了丰富的优化技术,这些优化技术可以显着提高训练效率和速度,从而实现跨 GPU 和机器的高效分布式训练
- JAX 是一个 Python 库,用于 Google Brain 开发的高性能机器学习,允许用户轻松地在具有硬件加速 (GPU 或 TPU) 支持的数组上执行计算。它支持即时编译加速和自动批处理
- Colossal-AI是由EleutherAI开发的用于训练大规模语言模型的深度学习库。它是在JAX的基础上构建的,支持优化策略训练,ColossalChat(使用基于LLAMA的Colossal-AI)
- BMTrain 是一个由 OpenBMB 开发的高效库,用于以分布式方式训练具有大规模参数的模型,强调代码简单性、低资源和高可用性(T5,GLM)
预训练
预训练建立了 LLM 能力的基础。通过对大规模语料库进行预训练,LLM 可以获得基本的语言理解和生成技能 。在这个过程中,预训练语料库的规模和质量对于 LLM 获得强大功能至关重要。此外,为了有效地预训练 LLM、模型架构、加速方法和优化技术需要很好地设计。
数据选择
预训练通常采用上述数据集,根据目的不同,不同数据集占比不同,使用的总量也不尽相同,具体占比如下
数据预处理
一般使用上图流程,分为以下几步
- 语言过滤,度量过滤(困惑度等),静态过滤以及关键词过滤
- 重复数据删除。语料库中的重复数据会减少语言模型的多样性,这可能会导致训练过程不稳定,从而影响模型性能,进行不同级别的重复数据删除(句子级,文档级以及数据集级)。
- 脱敏,大多数预训练文本数据是从网络资源中获得的,包括涉及敏感或个人信息的用户生成内容,这可能会增加隐私泄露的风险。因此,有必要从预训练语料库中删除个人身份信息。一种直接有效的方法是使用基于规则的方法,例如关键字发现,检测和删除名称、地址和电话号码等
- tokenization,是数据预处理的关键步骤,有些用的原来的技术,有些利用字节级字节对编码 (BPE) 算法等等
最终数据影响模型性能有三方面:数据来源,数据数量,数据质量,都很好理解产生影响的原因
模型架构
主流的LLM架构分为以下三种
- Encoder-Decoder 很少有模型采用这个(Flan-T5 ),可能是现在大部分都是生成式模型
- Casual Decoder 主流架构(GPT系列)
- Prefix Decoder 前缀解码器,Casual Decoder的改进版,可以双向编码,加速收敛
上述三种方式可以混合以达到性能改进
下图是各个主流模型的架构
其中PE 表示位置嵌入,#L 表示层数,#H 表示注意力头的数量,dmodel 表示隐藏状态的大小,MCL 表示最大上下文长度
- 规范化:几种先进的技术作为 LN 的替代方案。RMS Norm 因其在训练速度和性能方面的优越性而使用。与 LN 相比,DeepNorm显示出更好的能力来确保训练的稳定性,GLM-130B 采用后归一化。此外,在嵌入层之后添加额外的LN也可以稳定llm的训练,但是消耗巨大
- 激活函数。为了获得良好的性能,激活函数也需要在前馈网络中正确设置。在现有的llm中,GeLU激活被广泛使用。此外,在最新的LLM(如PaLM和LaMDA)中,还使用了GLU激活的变体。特别是SwiGLU和GeGLU,在实践中通常取得了更好的性能。然而,与 GeLU 相比,它们在前馈网络中需要额外的参数
- 位置嵌入。相比于学习,ALiBi和RoPE是相对位置嵌入,对于模型的泛化性能提升更明显
- 偏差,最新的研究表明,去除偏差可以提升训练的稳定性
综上所述。为了更强的泛化和训练稳定性,建议选择Pre RMS Norm进行层归一化,将SwiGLU或GeGLU作为激活函数。对于位置嵌入,RoPE 或 ALiBi 是一个更好的选择,因为它在长序列上表现更好。
预训练任务主要是语言建模和去噪自动编码,如下公式也是语言建模的自回归解码器的通用目标
去噪自动编码任务(DAE)也被广泛用于预训练语言模型,DAE任务的输入x是带有随机替换跨度的损坏文本。然后,对语言模型进行训练,以恢复被替换的token x,其任务目标如下图所示
总的来说,Casual Decoder 的zero-shot和few-shot的性能更强,而缩放定律在Casual Decoder中也得到了很好的印证,通过缩放模型大小、数据集大小和总计算量,可以显著提高随机解码器的性能,相比之下,对于encoder-decoder的上述研究却很缺乏。
模型训练
训练有以下要素
- 批量训练 Batch Training:对于语言模型预训练,现有工作通常将批量大小设置为大量(8,196 tokens或 1.6M tokens),以提高训练稳定性和吞吐量。对于 GPT-3 和 PaLM 等 LLM,他们引入了一种新的策略,在训练期间动态增加批量大小,最终达到一百万个规模。具体来说,GPT-3 的批量大小从 32K 逐渐增加到 3.2M tokens。实证结果表明,批大小的动态调度可以有效地稳定llm的训练过程
- 学习率 Learning Rate:现有的llm在训练前通常采用类似的学习率计划和热身(warm-up)和衰减策略,和PLM差不多
- 优化器 Optimizer:Adam 优化器 和 AdamW 优化器,或者是前者的变体Adafactor 优化器,节省GPU内存
- 稳定训练 Stabilizing the Training:梯度截断以及权重衰减等防止不稳定的事情出现的技术
下面是主流模型训练参数,中间一列为权重衰减方式,最后三个为衰减率,梯度截断和丢弃率
接下来是加速方法用于提高训练吞吐量和大型模型加载,主要有:
- 3D Parallelism(3D并行)
数据并行、张量并行、管道并行
- 混合精度训练
- ZeRO技术:优化计算消耗(Pytorch的FSDP)
- INT8量化和INT4量化:降低精度换取推理速度
GPT-4 最近引入了一种新的机制,称为基于深度学习堆栈的可预测缩放,从而能够使用更小的模型预测大型模型,对开发LLM应该有一定的借鉴作用
模型微调
主要分为指令微调和人机对齐两部分,前一种方法主要旨在增强或解锁llm的能力,而后一种方法旨在将llm的行为与人类值或偏好对齐
指令微调 Instruction Tuning
指令微调是在自然语言形式的格式化实例集合上微调预先训练的llm的方法,和监督微调与多任务提示训练高度相关,其实就是通过自然语言描述任务使模型提高理解输入的能力,从而增加模型的泛化性能,在上一篇chatgpt的调研博客中FLAN论文部分也写了这方面的内容,本质上是一个理解能力和生成能力同时提高的过程。
指令格式的实例由任务描述(称为指令)、输入输出对和少量演示(可选)组成,这里的来源主要分为两方面:
- 格式化现有数据集:通过编写模板描述不同任务的现有数据集,编写为指令的输入和输出
- 格式化人类需求:为避免前面一种缺乏指令多样性,或者与真实人类需求不匹配,还需要通过API收集真实用户的提问或者人工标注者进行头脑风暴,并要求另一组标注员对上述指令进行回答,由此生成指令微调训练对。还有一些半监督方式:通过将现有实例输入 LLM 以生成不同的任务描述和实例来构建实例。
影响指令微调质量的关键因素:
- 指令的数量和多样性:扩展任务的数量可以在很大程度上提高 LLM 的泛化能力,但是某一类任务过多会导致过拟合,需要平衡数据分布,通常同一任务最大上限通常设置为几千或数万个,任务的长度,结构或者创造性均会影响模型性能,模型性能总体随着指令数量增长而增长,最终会达到收敛。
- 指令的模板设计:可选指令示例加入,思维链(CoT)等同样可以提高微调质量
总而言之,指令的多样性比实例的数量更重要,因为性能良好的 InstructGPT 使用比 Flan 系列 LLM 更少但更多样化的指令(或实例)。此外,邀请标签者组成人类需求任务比使用数据集特定任务更有用。为了减少人力,可以重用现有的格式化数据集或使用现有的llm自动构建指令。
可用指令微调数据集如下:
当然,中文数据质量不敢恭维,现在国内更多人使用GPT-4去生成指令答案微调自己的模型(哈哈)
最终指令微调的效果有如下几个:
- 性能提升:在没有微调的情况下,具有指令微调的较小模型甚至可以比更大的模型表现更好,其提供了一种提高现有语言模型能力的通用方法。此外,它也比预训练成本低得多,因为 LLM 所需的指令数据量明显小于预训练数据
- 泛化性能提升。指令调整训练模型理解任务的自然语言指令。使其能够遵循人类的指令执行特定的任务,而不需要一些示例,即使是不可见任务同样表现优秀
BLOOMZ-P3基于Bloom[68]使用纯英语任务集合P3进行微调。有趣的是,与Bloom相比,BLOOMZ-P3在多语言句子补全任务上可以提高50%以上,这表明指令调整可以帮助LLMS从只有英语的数据集中获得一般任务技能,并将这些技能迁移到其他语言
人机对齐 Alignment Tuning
LLM在几乎所有的NLP任务中表现出了超强的能力。然而,这些模型有时可能会表现出意想不到的行为,例如,捏造虚假信息,追求不准确的目标,并产生有害、误导和有偏见的表达,因为其采用词预测的方法对模型参数进行预训练。为了避免这些意想不到的行为,人机对齐被提出使LLM的行为符合人类的期望。
人机对齐有自己的一套标准,其实就是对人类价值观的定量描述,其实是比较主观的,现有的工作主要是通过对抗和学习的方式防止这类输出,现行主流的方法是人类反馈强化学习(Reinforcement Learning from Human Feedback,RLHF)这种行为学习的方法
RLHF系统主要包括三个关键部分:待对齐的预训练LM、从人的反馈中学习的奖励模型和训练LM的RL算法。具体地,预训练的LM通常是用现有的预训练的LM参数初始化的生成性模型,奖励模型可以采取两种形式:微调的LM或使用人类偏好数据训练的LM从头开始训。现有的工作通常使用具有不同于对齐的LM的参数尺度的奖励模型。例如,OpenAI使用6B GPT-3,DeepMind使用7B Gopher作为奖励模型。最后,为了利用来自奖励模型的信号来优化预先训练算法,近邻策略优化(PPO)是现有工作中广泛使用的用于比对的RL算法。
上述过程有三步:
- 第一步就是上一部分的指令微调
- 通过人类的偏好训练一个奖励模型,常用的是标注者由好到坏进行排序,减小不同人之间的主观不一致
- 强化学习微调,对齐(即微调)LM被形式化为RL问题。在此设置中,预先训练的LM充当将提示作为输入并返回输出文本的策略,其动作空间是词汇,状态是当前生成的文本序列,奖励由RM提供。(PPO)
这个RHLF是行为模拟,所以极其考验标注者的水平,高质量的标注也是OPENAI成功的原因之一,也不怪百度比不过,数据是一方面,标注也是一方面。
下游任务
使用LLM做下游任务的时候主要通过上下文学习(In-Context Learning,ICL),利用思维链提示(chain-of-thought prompting CoT)来增强前者的效果,以达到下游任务的目的。
上下文学习(In-Context Learning,ICL)
其过程如上图所示:首先,从任务描述开始,从任务数据集中选择了一些示例作为演示。然后,它们以特定顺序组合,以使用专门设计的模板形成自然语言提示。最后,将测试实例附加到演示中作为 LLM 的输入以生成输出。基于任务演示,LLM 可以识别并执行新任务,而无需显式梯度更新。,执行过程如下:
当在 GPT-3 的论文中引入 ICL 时,它最初被定义为任务描述和演示示例的组合,其中任一组件是可有可无的。按照这个定义,当 LLM 只需要仅使用任务描述来解决不可见的任务时,也可以考虑执行 ICL 来解决任务解决,而 ICL 能力可以通过指令调整来增强。
影响ICL性能的主要有以下两个方面(每个方面都有很多人研究):
- 演示设计:包括演示选择、格式和顺序。
- 演示选择可使用KNN,RL等方式,主打一个自动找出与提问最相关的示例(信息量最大)
- 演示的格式可使用预定义模板,也可使用添加任务描述和使用思维链提示等一大堆方法
- 演示顺序可采用熵度量排序,与查询语句相似性等一大堆信息论方法,主打一个提示最有效。
- 底层机制:经过预训练后,llm可以在不更新的情况下表现出有趣的ICL能力
- 预训练如何影响ICL:研究表明,ICL 的性能在很大程度上取决于预训练语料库的来源,而不是比例 。另一项研究对训练数据分布的影响进行了深入分析。他们发现当训练数据可以聚集成许多不常见的类时,就会出现 ICL,而不是均匀分布的
- LLM怎么执行ICL:在推理阶段,研究人员专注于分析 ICL 能力如何根据给定的示例运行,因为不涉及显式学习或更新。他们通常从梯度下降的角度进行分析,并将ICL视为隐式微调,通过前向计算,LLM 生成关于演示的元梯度,并通过注意力机制隐式执行梯度下降。
思维链提示(Chain-of-Thought Prompting)
CoT 不是简单地用 ICL 中的输入输出对构建提示,而是将中间推理步骤合并到提示中,从而导致最终输出。
CoT性能影响因素以及相关研究:
- CoT复杂度:越复杂越详细越能激发模型能力
- 多路径CoT:为相同问题设计多条CoT路径也可以提高能力,不同推理路径集成学习,提高准确率
- 零样本CoT:Let’s think step by step,自动生成思维链,取得了较好的效果
现象:CoT 只对足够大的模型产生了积极影响(例如,通常包含 10B 或更多参数 [33]),但对小型模型没有影响,其通过中间推理步骤增强了提示,因此改进需要逐步推理的任务(例如算术推理、常识推理和符号推理)主要是有效的。然而,对于不依赖复杂推理的其他任务,它可能显示出比标准提示更差的性能。
原因:关于 CoT 能力的来源,人们普遍认为它归因于代码的训练,因为在其上训练的模型显示出强大的推理能力。直观地说,代码数据通过算法逻辑和编程流程组织得很好,这对于提高 LLM 的推理性能可能很有用,这个观点缺乏验证,能力还跟给的模式,即推理路径和提示文本组织方式有关。
效果评估
GLUE数据集,结论如下:
- ChatGPT 在自然语言推理任务(即 MNLI 和 RTE)上超越了所有 BERT 风格的模型,表明它在推理/推理方面具有优势
- ChatGPT 在释义和相似性任务上的表现很差,即 MRPC 和 STS-B,性能下降高达 24% 分
- ChatGPT 在单个句子分类任务上与 BERT-base 相当,即情感分析 (SST-2) 和语言可接受性 (CoLA) 和 QA 相关任务,即 QNLI
算数推理(下图)强于普通大模型,理解问题能力更强
ChatGPT 在七个常识、符号和逻辑推理数据集上与流行的 LLM 相比的准确性(下图):
- 常识和符号推理差
- 逻辑推理基本持平
后面是GPT-4的评估效果,可以看到大幅提升:(基本上秒杀)
上图是ChatGPT和GPT-4在逻辑多项选择机器阅读理解任务上的表现(准确率%)
上图是ChatGPT和GPT-4在自然语言推理任务上的表现(准确性%)
上图是GPT-4的性能,在有/没有上下文的情况下
GPT-4在所有任务上基本达到了SOTA,评估部分就不多赘述,一大堆评估的论文
未来
研究方向
- 大模型原理,涌现能力的原因和缩放定律的原理
- 模型架构,堆叠的多头自注意力层组成的 Transformer,稀疏注意力,上下文窗口等
- 模型训练与微调,更高效,加速机制,减小资源占用等(Lora加速)
- 模型利用,ICL,CoT等
- 人机对齐,RLHF或其它方式
- 下游应用,生成式智能体和医疗法律等领域专用模型
几个有趣的东西
AutoGPT
AutoGPT最大的特点是突破了现有的GPT只能做文本方面的任务的限制,可以利用各种工具来完成目标
AutoGPT原名是EntreprenurGPT,Significant Gravitas在2023年3月16日表达了他想创造一个实验项目,看看GPT-4能否在人类商业世界中生存,简单来说就是是否可以挣钱。其核心思想就是不停的向GPT-4发送请求,让其做商业决策,最后根据这个决策执行,看GPT-4给的策略能挣多少钱。Significant Gravitas发现,为了挣钱AutoGPT甚至抛弃了一些所谓的“道德”标准,在寻找新的挣钱机会的时候,AutoGPT敏锐地发现了加州洪水淹没农田,造成食物价格上涨,可以从这个背景寻找投资机会!
AutoGPT主要特性如下:
- 获取搜索和信息的互联网接入
- 长期和短期内存管理
- 使用 GPT-4 实例进行文本生成
- 访问流行的网站和平台
- 使用 GPT-3.5 进行文件存储和摘要
与hugging GPT的区别
HuggingGPT的目的是使用所有的AI模型接口完成一个复杂的特定的任务,更像解决一个技术问题的方案。而AutoGPT则更像一个决策机器人,它可以执行的动作范围比AI模型要更多样,因为它集成了谷歌搜索、浏览网页、执行代码等能力。从这个角度说,AutoGPT可以完成的任务或者决策比HuggingGPT更强,但是AI的能力却主要依赖GPT系列
生成式智能体
Generative Agents: Interactive Simulacra of Human Behavior
论文中提出的生成式智能体,可以以复杂且引人入胜的方式互动,形成观点,发起对话,甚至自主计划和参加活动。这项工作进一步支持了智能体机制在AI发展中具有前景的论点。
在一次评估中,这些生成代理产生了可信的个人和突发的社会行为:例如,从只有一个用户指定的概念开始,即一个代理想举办一个情人节聚会,这些代理在接下来的两天里自主地传播聚会的邀请,结识新朋友,互相约会参加聚会,并协调在正确的时间一起出现在聚会上。
amazing,未来已来