企业做什么需要有网站,怎么给公司网站上放视频,深圳创意网站建设,免费h5制作app平台关注微信公众号掌握更多技术动态 --------------------------------------------------------------- 一、大模型原理
1.Transformer
(1)求知之路#xff1a;LLM 学到了什么知识
LLM 从海量自由文本中学习了大量知识#xff0c;如果把这些知识做粗略分类的话#xff0c;…关注微信公众号掌握更多技术动态 --------------------------------------------------------------- 一、大模型原理
1.Transformer
(1)求知之路LLM 学到了什么知识
LLM 从海量自由文本中学习了大量知识如果把这些知识做粗略分类的话可以分为语言类知识和世界知识两大类。
语言类知识指的是词法、词性、句法、语义等有助于人类或机器理解自然语言的知识。各种研究也证明了浅层语言知识比如词法、词性、句法等知识存储在 Transformer 的低层和中层而抽象的语言知识比如语义类知识广泛分布在 Transformer 的中层和高层结构中。世界知识指的是在这个世界上发生的一些真实事件事实型知识Factual Knowledge以及一些常识性知识 (Common Sense Knowledge)。于 LLM 模型能否学习世界知识的研究也有很多结论也比较一致LLM 确实从训练数据中吸收了大量世界知识而这类知识主要分布在 Transformer 的中层和高层尤其聚集在中层。而且随着 Transformer 模型层深增加能够学习到的知识数量逐渐以指数级增加。其实你把 LLM 看作是一种以模型参数体现的隐式知识图谱如果这么理解我认为是一点问题也没有的。
从增量的训练数据中学到的更主要是世界知识。
(2)记忆之地LLM 如何存取知识
显然知识一定存储在 Transformer 的模型参数里。从 Transformer 的结构看模型参数由两部分构成多头注意力MHA部分占了大约参数总体的三分之一三分之二的参数集中在 FFN 结构中。MHA 主要用于计算单词或知识间的相关强度并对全局信息进行集成更可能是在建立知识之间的联系大概率不会存储具体知识点那么很容易推论出 LLM 模型的知识主体是存储在 Transformer 的 FFN 结构里。 但这样的定位粒度还是太粗无法很好回答具体某条知识是如何存储与提取的比如 “中国的首都是北京” 这条知识以三元组表达就是 北京is-capital-of中国 其中 “is-capital-of” 代表实体间关系。这条知识它存储在 LLM 的哪里呢 (3)知识涂改液如何修正 LLM 里存储的知识
第一类方法从训练数据的源头来修正知识。“Towards Tracing Factual Knowledge in Language Models Back to the Training Data” 这篇文章的研究目标是对于指定的某条知识我们是否可以定位到是哪些训练数据导致 LLM 学会了这条知识答案是肯定的这意味着我们可以逆向追踪到某条知识对应的训练数据源头。如果利用这项技术假设我们想要删除某条知识则可首先定位到其对应的数据源头删除数据源然后重新预训练整个 LLM 模型这样即可达成删除 LLM 中相关知识的目的。但是这里有个问题如果修正一小部分知识我们就需要重新做一次模型预训练这样做明显成本太高。所以这种方法不会太有发展前景可能比较适合那种对于某个特定类别数据的一次性大规模删除场合不适合少量多次的常规知识修正场景比如可能比较适合用来做去除偏见等去 toxic 内容的处理。第二类方法是对 LLM 模型做一次 fine-tuning 来修正知识。一个直观能想到的方法是我们可以根据要修正成的新知识来构建训练数据然后让 LLM 模型在这个训练数据上做 fine-tuning这样指导 LLM 记住新的知识遗忘旧的知识。这个方法简单直观但是也有一些问题首先它会带来灾难遗忘问题就是说除了忘掉该忘的知识还忘掉了不该忘的知识导致这么做了之后有些下游任务效果下降。另外因为目前的 LLM 模型规模非常大即使是做 fine-tuning如果次数频繁其实成本也相当高。对这种方法感兴趣的可以参考 “Modifying Memories in Transformer Models”。另外一类方法直接修改 LLM 里某些知识对应的模型参数来修正知识。假设我们想要把旧知识 英国现任首相鲍里斯 修正到 英国现任首相苏纳克 。首先我们想办法在 LLM 模型参数中定位到存储旧知识的 FFN 节点然后可以强行调整更改 FFN 中对应的模型参数将旧知识替换成新的知识。可以看出这种方法涉及到两项关键技术首先是如何在 LLM 参数空间中定位某条知识的具体存储位置其次是如何修正模型参数来实现旧知识到新知识的修正。关于这类技术的细节可以参考 “Locating and Editing Factual Associations in GPT” 和 “Mass-Editing Memory in a Transformer”。理解这个修正 LLM 知识的过程其实对于更深入理解 LLM 的内部运作机制是很有帮助的。
2.规模效应
(1)当 LLM 越来越大时会发生什么
预训练模型的应用往往是两阶段的预训练阶段及具体场景应用阶段。在预训练阶段其优化目标是交叉熵对 GPT 这种自回归语言模型来说也就是看 LLM 是否正确预测到了下一个单词而场景应用阶段一般要看具体场景的评价指标。一般我们的直觉是如果 LLM 模型在预训练阶段的指标越好自然它解决下游任务的能力就越强。然而事实并非完全如此。现有研究已证明预训练阶段的优化指标确实和下游任务表现出正相关关系但是并非完全正相关。也就是说只看预训练阶段的指标来判断一个 LLM 模型是否够好这是不够的。基于此我们分头来看在这两个不同阶段随着 LLM 模型增大有什么影响。 首先我们先看在预训练阶段随着模型规模逐步增大会发生什么。OpenAI 在 “Scaling Laws for Neural Language Models” 中专门研究了这个问题并提出 LLM 模型所遵循的 “伸缩法则”scaling law。如上图所示这个研究证明当我们独立增加训练数据量、模型参数规模或者延长模型训练时间比如从 1 个 Epoch 到 2 个 Epoch预训练模型在测试集上的 Loss 都会单调降低也就是说模型效果越来越好。
既然三个因素都重要那么我们在实际做预训练的时候就有一个算力如何分配的决策问题假设用于训练 LLM 的算力总预算比如多少 GPU 小时或者 GPU 天给定那么是应该多增加数据量、减少模型参数呢还是说数据量和模型规模同时增加减少训练步数呢此消彼长某个要素规模增长就要降低其它因素的规模以维持总算力不变所以这里有各种可能的算力分配方案。最终 OpenAI 选择了同时增加训练数据量和模型参数但是采用早停策略 (early stopping) 来减少训练步数的方案。因为它证明了对于训练数据量和模型参数这两个要素如果只单独增加其中某一个这不是最好的选择最好能按照一定比例同时增加两者它的结论是优先增加模型参数然后才是训练数据量。假设用于训练 LLM 的算力总预算增加了 10 倍那么应该增加 5.5 倍的模型参数量1.8 倍的训练数据量此时模型效果最佳。
这带给我们如下启示我们可以选择放大训练数据并同比例地减少 LLM 模型参数以达到在不降低模型效果的前提下极大缩小模型规模的目的。缩小模型规模有很多好处比如在应用的时候推理速度会快很多等无疑这是一个很有前途的 LLM 发展路线。
以上是从预训练阶段来看模型规模的影响如果从 LLM 解决下游具体任务效果的角度来看随着模型规模增大不同类型的任务有不同的表现具体而言有以下三类情况。 第一类任务完美体现了 LLM 模型的 scaling law就是说随着模型规模逐步放大任务的表现越来越好。这类任务通常符合如下共性它们往往都是知识密集型任务也就是说如果 LLM 模型包含的知识量越多这类任务表现越好。而很多研究已经证明越大的 LLM 模型学习效率越高也就是说相同训练数据量模型越大任务效果越好说明面对的即使是同样的一批训练数据更大的 LLM 模型相对规模小一些的模型从中学到了更多的知识。更何况一般情况下在增大 LLM 模型参数的时候往往会同步增加训练数据量这意味着大模型可以从更多数据中学习更多的知识点。这些研究可以很好地解释上图为何随着模型规模增大这些知识密集型的任务效果越来越好。大多数传统的自然语言理解类任务其实都属于这种知识密集型任务而很多任务在近两年获得了极大的效果提升甚至超过了人类表现。很明显这大概率是 LLM 模型的规模增长带来的而非归功于某项具体的技术改进。
第二类任务展现出 LLM 具备某种 “涌现能力Emergent Ability”如上图b所示。所谓 “涌现能力”指的是当模型参数规模未能达到某个阀值时模型基本不具备解决此类任务的任何能力体现为其性能和随机选择答案效果相当但是当模型规模跨过阀值LLM 模型对此类任务的效果就出现突然的性能增长。也就是说模型规模是解锁 (unlock) LLM 新能力的关键随着模型规模越来越大会逐渐解锁 LLM 越来越多的新能力。这是个很神奇的现象因为它意味着如下让人对未来可报乐观预期的可能或许很多任务目前 LLM 还不能很好地解决甚至站在现在这个时刻的我们看起来LLM 完全没有能力解决这类任务但因 LLM 具备 “涌现能力”所以如果我们继续推大模型也许某一天它的这项能力就被突然解锁了。LLM 模型的规模增长会给我们带来意想不到的精彩礼物。
问题是为何 LLM 会出现这种 “涌现能力” 现象呢上述文章以及 “Emergent Abilities of Large Language Models” 给出了几个可能的解释
一种可能解释是有些任务的评价指标不够平滑。比如说有些生成任务的判断标准它要求模型输出的字符串要和标准答案完全匹配才算对否则就是 0 分。所以即使随着模型增大其效果在逐步变好体现为输出了更多的正确字符片段但是因为没有完全对只要有任何小错误都给 0 分只有当模型足够大输出片段全部正确才能得分。也就是说因为指标不够平滑所以不能体现 LLM 其实正在逐步改善任务效果这一现实看起来就是 “涌现能力” 这种外在表现。
另外一种可能的解释是有些任务由若干中间步骤构成随着模型规模增大解决每个步骤的能力也在逐步增强但是只要有一个中间步骤是错的最终答案就是错的于是也会导致这种表面的 “涌现能力” 现象。
还有少部分任务随着模型规模增长任务的效果曲线展现出 U 形特性随着模型规模逐渐变大任务效果逐渐变差但是当模型规模进一步增长则效果开始越来越好呈现出 U 形增长趋势如上图所示的粉红色 PaLM 模型在两个任务上的指标走势。为何这些任务表现得如此特殊呢“Inverse scaling can become U-shaped” 这篇文章给出了一种解释这些任务内部其实隐含了两种不同类型的子任务一种是真正的任务另外一种是 “干扰任务distractor task”。当模型规模小的时候无法识别任意一种子任务所以模型的表现跟随机选择答案差不多当模型增长到中等规模的时候主要执行的是干扰任务所以对真正的任务效果有负面影响体现为真正任务效果的下降而当进一步增加模型规模则 LLM 可以忽略干扰任务执行真正的任务体现为效果开始增长。
对于那些随着模型规模增大效果一直下降的任务如果采用思维链CoTPrompting则部分任务的表现转换为遵循 Scaling law即模型规模越大效果越好而其它任务则转换为 U 性增长曲线。这其实侧面说明了此类任务应属于推理类型的任务所以加入 CoT 后任务表现会发生质的变化。
(2)模型应该多大才够
两个数字62B 和 175B。
模型至少需要 62B使思维链的效果才能大于标准的提示词方法。模型至少需要 175BGPT3 的尺寸思维链的效果才能大于精调小模型T5 11B的效果。
(3)规模是唯一的因素
规模是一个必要但不充分的因素。有些模型足够大比如 OPT 和 BLOOM都是 175B但并不能做思维链。
有两种模型可以做思维链:
GPT3 系列的模型包括 text-davinci-002 和 code-davinci-002 (Codex)。
这是仅有的两个具有强大突现能力并可公开访问的模型。 除了以上两个模型其他 GPT3 模型包括原来的 GPT3text-davinci-001以及其他更小的 GPT-3 模型都不能做思维链。当说 “能做思维链” 时我们是指使用思维链方法的效果比直接用提示词、精调 T5-11B 效果更好。另外要注意的是code-davinci-002 在
语言任务上的性能始终优于[34] text-davinci-002。这个观察非常有趣且耐人寻味。这表明基于代码数据训练的语言模型可以胜过根据语言训练的语言模型。目前为止我们还不知道是为什么。
PaLM 系列模型包括 PaLM、U-PaLM、Flan-PaLM 和 Minerva。这些模型目前还未开放访问。
3.人机接口从 In Context Learning 到 Instruct 理解
一般我们经常提到的人和 LLM 的接口技术包括zero shot prompting、few shot prompting、In Context Learning以及 Instruct。这些其实都是表达某个具体任务的描述方式。其中 Instruct 是 ChatGPT 的接口方式就是说人以自然语言给出任务的描述比如 “把这个句子从中文翻译成英文”类似这种。zero shot prompting 我理解其实就是现在的 Instruct 的早期叫法以前大家习惯叫 zero shot现在很多改成叫 Instruct。尽管是一个内涵但是具体做法是两种做法。早期大家做 zero shot prompting实际上就是不知道怎么表达一个任务才好于是就换不同的单词或者句子反复在尝试好的任务表达方式这种做法目前已经被证明是在拟合训练数据的分布其实没啥意思。目前 Instruct 的做法则是给定命令表述语句试图让 LLM 理解它。所以尽管表面都是任务的表述但是思路是不同的。
而 In Context Learning 和 few shot prompting 意思类似就是给 LLM 几个示例作为范本然后让 LLM 解决新问题。我个人认为 In Context Learning 也可以理解为某项任务的描述只是 Instruct 是一种抽象的描述方式In Context Learning 是一种例子示范的例子说明法。
(1)神秘的 In Context Learning Fine-tuning 和 In Context Learning 表面看似都提供了一些例子给 LLM但两者有质的不同参考上图示意Fine-tuning 拿这些例子当作训练数据利用反向传播去修正 LLM 的模型参数而修正模型参数这个动作确实体现了 LLM 从这些例子学习的过程。但是In Context Learning 只是拿出例子让 LLM 看了一眼并没有根据例子用反向传播去修正 LLM 模型参数的动作就要求它去预测新例子。既然没有修正模型参数这意味着貌似 LLM 并未经历一个学习过程如果没有经历学习过程那它为何能够做到仅看一眼就能预测对新例子呢这正是 In Context Learning 的神奇之处。 总之这个工作证明了 In Context Learning 并未学习映射函数但是输入和输出的分布很重要这两个不能乱改。
(2)神奇的 Instruct 理解
我们可以把 Instruct 当作一种方便人类理解的任务表述在这个前提下目前关于 Instruct 的研究可以分成两种偏学术研究的 Instruct以及关于人类真实需求描述的 Instruct。 我们先来看第一种偏学术研究的 Instruct。它的核心研究主题是多任务场景下LLM 模型对 Instruct 理解的泛化能力。如上图中 FLAN 模型所示就是说有很多 NLP 任务对于每个任务研究人员构造一个或者多个 Prompt 模版作为任务的 Instruct然后用训练例子对 LLM 模型进行微调让 LLM 以同时学习多个任务。训练好模型后给 LLM 模型一个它没见过的全新任务的 Instruct然后让 LLM 解决 zero shot 任务从任务解决得是否足够好来判断 LLM 模型是否有对 Instruct 理解的泛化能力。
如果归纳下目前的研究结论可参考 “Scaling Instruction-Fine-tuned Language Models”“Super-NaturalInstructions: Generalization via Declarative Instructions on 1600 NLP Tasks”能够有效增加 LLM 模型 Instruct 泛化能力的因素包括增加多任务的任务数量、增加 LLM 模型大小、提供 CoT Prompting 以及增加任务的多样性。如果采取任意一项措施都可以增加 LLM 模型的 Instruct 理解能力。
第二种是人类真实需求下的 Instruct这类研究以 InstructGPT 和 ChatGPT 为代表。这类工作也是基于多任务的但是和偏向学术研究类工作最大的不同在于它是面向人类用户真实需求的。为什么这么说呢因为它们用于 LLM 多任务训练的任务描述 Prompt是从大量用户提交的真实请求中抽样而来的而不是固定好研究任务的范围然后让研究人员来写任务描述 prompt。这里所谓的 “真实需求”体现在两个方面首先因为是从用户提交的任务描述里随机抽取的所以涵盖的任务类型更多样化也更符合用户的真实需求其次某个任务的 prompt 描述是用户提交的体现了一般用户在表达任务需求时会怎么说而不是你认为用户会怎么说。很明显这类工作改出来的 LLM 模型用户体验会更好。
InstructGPT 论文里也拿这种方法和 FLAN 那种 Instruct based 方法做了比较。首先在 GPT3 上用 FLAN 提到的任务、数据以及 Prompt 模版进行微调来在 GPT 3 上复现 FLAN 方法然后和 InstructGPT 进行比较因为 InstructGPT 的基础模型也是 GPT3所以只有数据和方法的差别两者可比结果发现 FLAN 方法的效果距离 InstructGPT 有很大的差距。那么背后的原因是什么呢论文分析数据后认为FLAN 方法涉及到的任务领域相对少是 InstructGPT 涉及领域的子集所以效果不好。也就是说FLAN 论文里涉及到的任务和用户真实需求是不符的而这导致在真实场景下效果不够好。而这对我们的启示是从用户数据中收集真实需求这事情是很重要的。
(3)In Context Learning 和 Instruct 的联系
如果我们假设 In Context Learning 是用一些例子来具象地表达任务命令Instruct 是一种更符合人类习惯的抽象任务描述。那么一个很自然的问题是它们之间有什么联系吗比如我们是否能够提供给 LLM 完成某个任务的若干具体示例让 LLM 找出其对应的自然语言描述的 Instruct 命令 目前有零星的工作在探索这个问题我认为这个方向是很有研究价值的。先说答案答案是YesLLM Can。“Large Language Models Are Human-Level Prompt Engineers” 是做这个方向很有趣的工作如上图所示对于某项任务给 LLM 一些示例让 LLM 自动生成能够描述这项任务的自然语言命令然后它再用 LLM 生成的任务描述去测试任务效果。它使用的基础模型是 GPT 3 和 InstructGPT经过这项技术加持后LLM 生成的 Instruct 的效果相比未采用这项技术的 GPT 3 以及 InstuctGPT 来说指标有极大地提升而且在一些任务上超过人类的表现。
二、LLM推理
1.推理
LLM在对话、问答和总结等 NLP 任务中取得了显著的成功。然而当前的LLM在复杂推理方面存在一定的局限性
它们缺乏人类通过教育和经验获得的广泛的世界知识和丰富的概念表征。法学硕士仅接受文本语料库的培训。他们的推理过程是含蓄且不透明的使得理解或批评推理背后的基本原理变得困难。这种黑匣子性质降低了信任和可靠性。他们的数学、逻辑和类比推理能力有限需要结构化的符号操作。他们表现出偏见、谬误并且在许多情况下未能运用常识。他们的推理偏离了人类的规范。他们无法推理自己的推理过程并识别潜在的缺陷。元认知是有限的。
相比之下人类推理融合了多种形式的推理——演绎、归纳、溯因、类比、反事实、常识和元推理——无缝地使用结构化知识和处理能力。
(1)结构化机器可读知识的知识图
知识图有助于克服LLM等纯神经方法的知识限制。知识图KG以网络化、基于图的数据结构的形式表示实体及其之间的关系[4]。KG 编码三个关键元素
概念本体
领域中的实体和类及其关联方式的正式概念化。例如本体可以将Animal指定为一个类并将特定实体例如Cat和Dog作为其成员。
逻辑公理和规则
编码有关该领域的事实知识的逻辑陈述例如“所有猫都是哺乳动物”。这些支持演绎推理。
事实数据
具体实体、关系和事件的实例例如“加菲猫是一只猫”。
KG 提供了一种机器可读的语义表示可以编码本体知识和实例数据。像 Wikidata 和 DBpedia 这样的大型知识图谱跨越了跨领域的知识。组织还构建适合其利基领域的企业知识图谱。
KG 中编码的丰富结构化知识可以帮助克服纯 LLM 的一些推理限制
本体论为基础语言概念提供了可扩展的语义结构。逻辑公理可以实现稳健的演绎推理。现实世界的实体和事件是明确表示的而不仅仅是从文本中统计推断出来的。事实的准确性可以通过出处和管理来确保。
然而知识图谱在灵活推理方面有其自身的局限性
他们缺乏面对不确定性进行概率推理的能力。他们的推理很大程度上是演绎性的无法概括模式或进行直觉跳跃。他们理解自然语言中上下文的细微差别和歧义的能力有限。他们注重事实知识但缺乏常识和社会知识。
因此知识图谱和LLM具有互补的优势和局限性。将它们结合起来可能会导致人工智能系统具有更像人类的推理能力。这种神经符号整合是一个活跃的研究前沿。
(2)增强推理的神经符号整合
神经符号人工智能旨在将LLM等神经学习方法与符号知识图谱和逻辑相结合。这提供了多种好处
结构化知识注入知识图提供了本体论和数据库可以向LLM“教授”背景知识以增强他们的推理能力。可解释性与LLM的黑匣子性质不同符号表示使逻辑推理变得可解释。泛化本体提供了一个抽象层有利于迁移学习和泛化。准确性事实知识图通过基础和出处减少错误的推论。可扩展性知识图谱中的知识分解有助于大规模推理的计算易处理性。
2.不同推理模式
(1)演绎推理
演绎推理涉及使用有效的推理规则从公认的前提和公理中得出逻辑结论。
主要挑战
处理前提中的不确定性和矛盾。LLM可以帮助产生概率并解决矛盾。KG 可以对确定性因素和来源进行编码。大型推理树的计算复杂性。具有本体推理 API 的 KG 提供高效的优化实现。LLM可以帮助选择有用的推理路径。当前提有缺陷时就会变得脆弱。知识图谱有助于根据精选知识验证前提。LLM可以通过语义检测不一致之处。推理链的不透明性。KG 的符号表示可以实现可解释的推论。LLM可以生成自然语言解释。
(2)归纳推理
归纳推理涉及从个体实例和观察中推断一般原则和模式。
主要挑战
从有限的例子中过度概括。KG 提供多样化的样本以确保稳健的概括。LLM可以根据 KG 统计数据微调推论。有噪音、错误或不具代表性的数据。知识图谱中的本体约束减少了噪声数据的影响。LLM可以利用语义选择代表性样本。大数据的计算复杂性。KG分区和分布式推理提高了可扩展性。LLM选择重点样本进行易于处理的推理。诱导图案的不透明度。LLM生成自然语言假设。KG 能够导出假设的解释子图。
(3)归纳推理
溯因推理涉及推断能够解释观察到的事实的最可能的假设。
主要挑战
大的假设搜索空间。KG 通过本体约束来限制空间。LLM使用语义一致性来修剪假设。评估假设的合理性。KG 提供上下文数据来评估合理性。LLM评估假设的语义。选择最佳假设。知识图谱有典型性等指标来对假设进行排名。LLM生成带有概率的排名假设。具有复杂观察的组合爆炸。LLM分解问题并提出更简单的假设。KG 组成并评估模块化假设。
(4)常识推理
常识推理应用日常事实和直觉来理解情况。
主要挑战
常识的范围和主观性。KG 整理了共识的常识事实。LLM使用文化/情感语义进行情境化推理。将抽象概念融入现实。KG 将符号链接到真实实体。LLM通过语义推断有根据的含义。检测异常和直觉失败。KG 提供了识别异常的期望。LLM通过语义不一致来感知异常。不透明且无法解释的结论。LLM会产生理由。KG 通过形式语义审核常识推论。
(5)类比推理
类比推理涉及根据感知到的相似性将知识从一个领域转移到另一个领域。
主要挑战
确定类比映射的显着特征。知识图谱具有加权本体来捕获特征显着性。LLM检测语义相似性。在大型知识领域中寻找类比的可扩展性问题。KG 将知识划分为模块化本体。LLM专注于相关的语义空间。在适当的层次上抽象关系以进行有用的类比。知识图谱具有分层本体来概括概念。LLM推断概念抽象。验证类比并适当地调整知识。KG 表示验证属性以限定类比推论。LLM对转移的知识进行微调。类比的识别和调整方式不透明。知识图谱跟踪源类似物和推理链的出处。LLM生成自然语言解释。
(6)元推理
元推理涉及对自己的推理过程进行反思和推理。
主要挑战
精确捕捉完整的推理链。KG 使用推理追踪来解释推理轨迹。LLM用语言表达隐含的推理步骤。存储完整多步骤推理轨迹的可扩展性。KG 将推理路径分解为模块化链。LLM在多个层面上总结推理。如何得出结论的不透明性。KG 审核推理轨迹以解释结论。LLM生成推理的自然语言解释。识别推理中的缺陷和偏见。KG 检测无效的推理模式。LLM标记语义不一致和异常。逐步改进推理过程。KG 更新推理规则来解决问题。LLM微调知识表示和策略。
3.如何增强 LLM 的推理能力
当模型规模足够大的时候LLM 本身是具备推理能力的在简单推理问题上LLM 已经达到了很好的能力但是复杂推理问题上还需要更多深入的研究。
如果梳理现有 LLM 推理相关工作的话我把它们归到两大类体现出挖掘或促进 LLM 推理能力不同的技术思路第一类研究比较多可以统称为基于 Prompt 的方法核心思想是通过合适的提示语或提示样本更好地激发出 LLM 本身就具备的推理能力Google 在这个方向做了大量很有成效的工作。第二类做法是在预训练过程中引入程序代码和文本一起参与预训练以此进一步增强 LLM 的推理能力这应该是 OpenAI 实践出的思路。比如 ChatGPT 肯定具备很强的推理能力但它并不要求用户必须提供一些推理示例所以 ChatGPT 强大的推理能力大概率来源于使用代码参与 GPT 3.5 的预训练。
这两种思路其实大方向是迥异的利用代码增强 LLM 推理能力这体现出一种通过增加多样性的训练数据来直接增强 LLM 推理能力的思路而基于 Prompt 的方法它并不会促进 LLM 本身的推理能力只是让 LLM 在解决问题过程中更好地展示出这种能力的技术方法。可以看出前者代码方法治本后者治标。当然两者其实也是互补的但从长远看治本的方法更重要。
(1)基于 Prompt 的方法 第一种思路是直接在问题上追加辅助推理 Prompt。这种方法简单直接但在众多领域都很有效。这个做法是由 “Large language models are zero-shot reasoners” 提出的也被称为 zero-shot CoT。具体而言分为两个阶段如上图所示第一阶段在提问的问题上追加 “Let’s think step by step” 这句提示语LLM 会输出具体的推理过程第二阶段在第一阶段的问题后拼接 LLM 输出的具体推理过程并再追加 Prompt“Therefore, the answer (arabic numerals) is”此时 LLM 会给出答案。如此简单的操作却可以大幅增加 LLM 在各项推理任务中的效果比如在数学推理测试集 GSM8K 上加上提示语后推理准确率直接从原先的 10.4% 提升到了 40.4%可谓神奇。
为什么 LLM 会具备给一句 “Let’s think step by step” 提示语就能列出详细的推理步骤并算出答案呢其原因目前尚无定论我的猜测是很可能因为预训练数据里面存在大量的此种数据就是以 “Let’s think step by step” 开头然后后面是详细的推理步骤最后给出答案而 LLM 在预训练的时候记住了这些模式。而当我们输入这个提示语的时候激发 LLM 模糊得 “回忆” 起某些例子的推导步骤于是即可模仿这些例子进行步骤推理并给出答案。这侧面说明了一个道理就是 LLM 本身是具备推理能力的只是我们没有办法把它的这种能力激发出来而已通过合适的提示语来进行两步提示就在一定程度上可以释放出它的这种潜力。另外对于中文很可能存在另外一个黄金提示语比如 “详细解题思路如下”类似这种因为中文语料在讲解推理步骤的时候经常用的引导句和 “让我们一步一步来思考” 应该是不同的这是明显的西方说法而探索出这个中文黄金提示语其实也是很有必要的。
第二种思路一般被称为基于示例的思维链few-shot CoT,Chain of ThoughtPrompting。这个方向目前是 LLM 推理研究的主方向很多工作都是在这个思路上做的我们简单介绍几个效果显著的代表性工作基本能代表 CoT 的技术发展方向。 CoT 的主体思想其实很直白为了教会 LLM 模型学会推理给出一些人工写好的推理示例示例里把得到最终答案前一步步的具体推理步骤说清楚而这些人工写的详细推理过程就是思维链 Prompting具体例子可参照上图中蓝色文字部分。CoT 的意思是让 LLM 模型明白一个道理就是在推理过程中步子不要迈得太大否则很容易出错改变思维模式化大问题为小问题步步为营积小胜为大胜。最早明确提出 CoT 这个概念的文章是 “Chain of thought prompting elicits reasoning in large language models”论文发布于 22 年 1 月份虽然做法很简单但是应用 CoT 后 LLM 模型的推理能力得到了巨大提升GSM8K 数学推理测试集准确率提高到 60.1% 左右。
CoT 的主体思想其实很直白为了教会 LLM 模型学会推理给出一些人工写好的推理示例示例里把得到最终答案前一步步的具体推理步骤说清楚而这些人工写的详细推理过程就是思维链 Prompting具体例子可参照上图中蓝色文字部分。CoT 的意思是让 LLM 模型明白一个道理就是在推理过程中步子不要迈得太大否则很容易出错改变思维模式化大问题为小问题步步为营积小胜为大胜。最早明确提出 CoT 这个概念的文章是 “Chain of thought prompting elicits reasoning in large language models”论文发布于 22 年 1 月份虽然做法很简单但是应用 CoT 后 LLM 模型的推理能力得到了巨大提升GSM8K 数学推理测试集准确率提高到 60.1% 左右。 CoT 提出不久很快在 22 年 3 月份一项被称为 “Self-Consistency” 的改进技术就将 GSM8K 测试集准确率提高到 74.4%提出这项改进的论文是 “Self-Consistency Improves Chain of Thought Reasoning in Language Models”。“Self-Consistency” 的思路也很直观参考上图首先可以利用 CoT 给出几个写了推理过程的示例然后要求 LLM 对给定的问题进行推理如果是 CoT直接输出一个推理过程和答案整个过程就结束了。“Self-Consistency” 则不然它要求 LLM 输出多个不同的推理过程和答案然后采用投票的方式选出最佳答案思路非常简单直接但是效果也确实好。“Self-Consistency” 其实是教导 LLM 学会这么一个道理孔乙己说过茴香豆的 “茴” 字有四种写法类似的一个数学题的正确解法也可以有很多种每个不同的推导过程都指向最终的答案。条条大路通罗马虽说也有个别迷路走到北京的但是迷路的毕竟是少数看看大多数人走到哪里哪里就是正确答案。简单的方法往往蕴含着深刻的哲学含义是不是这道理
再往后“On the Advance of Making Language Models Better Reasoners” 这个工作在 “Self-Consistency” 基础上进一步集成了 “从一个 Prompt 问题拓展到多个 Prompt 问题、检查推理中间步骤的正确性以及对多个输出的回答加权投票” 这三个改进点将 GSM8K 测试集准确率提高到 83% 左右。 第三种思路体现了一种分治算法的思想。当然这个所谓 “分治” 是我归纳的别人没这么说。这种思路的核心思想是对于一个复杂的推理问题我们把它分解成若干容易解决的子问题一一解决掉子问题后我们再从子问题的答案推导复杂问题的答案。这种思路可能才是揭示问题本质、最终解决 LLM 复杂推理问题正宗的道路。我们以 “Least-to-most prompting” 技术为例来说明这种思路的一种具体实现方式如上图所示它分为两个阶段第一个阶段从原始问题我们可以得知最终要问的问题是什么我们假设最终问题是 Final Q然后从原始问题填充 Prompt 模版“如果要解决 Final Q 问题那么我需要先解决”然后把原始问题和这个 Prompt 交给 LLM让 LLM 模型给出答案等于让 LLM 给出最终问题的前置子问题 Sub Q接下来我们进入第二个阶段让 LLM 先回答刚才拿到的子问题 Sub Q并拿到对应的答案然后原始问题拼接子问题 Sub Q 及对应答案再去问 LLM 最终那个问题 Final Q此时 LLM 会给出最后的答案。如此这般体现出拆解子问题并从子问题的答案逐步找出最终答案的思路。
(2)代码预训练增强 LLM 推理能力
除了文本外如果能够加入程序代码一起参与模型预训练则能大幅提升 LLM 模型的推理能力。
4.关于 LLM 推理能力的思考
虽然最近一年来关于激发 LLM 的推理能力这方面的技术进展很快也取得了很大的技术进步但是总体感觉是我们可能走在正确的方向上但是距离接触到真正的问题本质还有一段距离对此要有更深入的思考和探索。
首先我比较赞同上述分治算法的主体思路对于复杂的推理问题我们应该把它拆解成若干简单的子问题因为子问题对于 LLM 来说回答正确的概率就大很多让 LLM 一一回答子问题后再逐步推导出最终答案。受到 “Least-to-most prompting” 技术的启发如果进一步思考我觉得 LLM 推理本质上很可能会是如下两种可能的其中之一不断和 LLM 进行交互的图上推理问题抑或是不断和 LLM 进行交互的程序流程图执行问题。 先说图上推理问题如上图所示假设我们有办法能够把复杂问题拆解成由子问题或者子步骤构成的图结构图中的节点是子问题或者子步骤图中的边代表了子问题之间的依赖关系就是说只有回答好子问题 A才能回答子问题 B而且图中大概率存在循环结构就是反复做某几个子步骤。假设我们能够得到上述的子问题拆解图那么可以根据依赖关系引导 LLM 一步一步按照图结构回答必须首先回答的子问题直到推导出最终答案。 再说程序流程图问题参考上图假设我们有办法把复杂问题拆解成子问题或子步骤并产生一个由子步骤构成的类似程序流程图的结构在这个结构里有些步骤会反复执行多次循环结构有些步骤的执行需要进行条件判断条件分支。总而言之在执行每个子步骤的时候和 LLM 进行交互得到子步骤的答案然后按照流程不断执行直到输出最终答案。类似这种模式。假设这个思路大致正确的话也许可以从这个角度来解释为何加入代码会增强预训练模型的推理能力大概率因为 文本代码 的多模态预训练模型在模型内部是通过类似这种隐含的程序流程图作为两个模态的桥梁将两者联系起来的即由文本描述到隐含的流程图再映射到由流程图产生具体的代码。也就是说这种多模态预训练可以增强 LLM 模型从文本构建出隐含的流程图并按照流程图执行的能力也就是加强了它的推理能力。
当然上述思路最大的问题是我们如何根据文本描述的问题能够靠 LLM 模型或者其它模型得到图结构或者流程图结构这个可能是其中的难点。一种可能的思路就类似继续增强文本和更高质量的代码预训练走隐式学习内部隐含结构的方法。而目前的 CoT 技术如果套到上述思路来思考的话可以这么理解标准 CoT其实就是靠自然语言文本来描述图结构或者程序流程图的而 “Least-to-most prompting” 技术则是试图根据最后一个图节点靠倒推来试图推导出其中的图结构但是很明显目前的方法限制了它倒推的深度也就是说它只能推导出非常简单的图结构这正是限制它能力的所在。
三、大模型能力与技术
1.模型的演变 指令微调。不会为模型注入新的能力 —— 所有的能力都已经存在了。指令微调的作用是解锁 / 激发这些能力。这主要是因为指令微调的数据量比预训练数据量少几个数量级基础的能力是通过预训练注入的。指令微调将 GPT-3.5 的分化到不同的技能树。有些更擅长上下文学习如text-davinci-003有些更擅长对话如ChatGPT。指令微调通过牺牲性能换取与人类的对齐alignment。OpenAI 的作者在他们的指令微调论文[12] 中称其为 “对齐税” (alignment tax)。许多论文[13] 都报道了code-davinci-002在基准测试中实现了最佳性能但模型不一定符合人类期望。在code-davinci-002上进行指令微调后模型可以生成更加符合人类期待的反馈或者说模型与人类对齐例如零样本问答、生成安全和公正的对话回复、拒绝超出模型它知识范围的问题。
(1)code-davinci-002和text-davinci-002的进步
我们关注code-davinci-002和text-davinci-002这两兄弟是第一版的 GPT3.5 模型一个用于代码另一个用于文本( Code-davinci-002 更擅长上下文学习当没有上下文示例 / 零样本的时候 text-davinci-002 在零样本任务完成方面表现更好)。它们表现出了三种重要能力与初代 GPT-3 不同的能力
响应人类指令以前GPT-3 的输出主要训练集中常见的句子。现在的模型会针对指令 / 提示词生成更合理的答案而不是相关但无用的句子。泛化到没有见过的任务当用于调整模型的指令数量超过一定的规模时模型就可以自动在从没见过的新指令上也能生成有效的回答。 这种能力对于上线部署至关重要因为用户总会提新的问题模型得答得出来才行。代码生成和代码理解这个能力很显然因为模型用代码训练过。利用思维链 (chain-of-thought) 进行复杂推理初代 GPT3 的模型思维链推理的能力很弱甚至没有。 code-davinci-002 和 text-davinci-002 是两个拥有足够强的思维链推理能力的模型。思维链推理之所以重要是因为思维链可能是解锁突现能力和超越缩放法则 (scaling laws) 的关键。
这些能力从何而来与之前的模型相比两个主要区别是指令微调和代码训练。具体来说
能够响应人类指令的能力是指令微调的直接产物。对没有见过的指令做出反馈的泛化能力是在指令数量超过一定程度之后自动出现的T0[16] 、Flan[17] 和 FlanPaLM[18] 论文进一步证明了这一点使用思维链进行复杂推理的能力很可能是代码训练的一个神奇的副产物。对此我们有以下的事实作为一些支持 最初的 GPT-3 没有接受过代码训练它不能做思维链。text-davinci-001 模型虽然经过了指令微调但第一版思维链论文 报告说它的它思维链推理的能力非常弱 —— 所以指令微调可能不是思维链存在的原因代码训练才是模型能做思维链推理的最可能原因。PaLM有 5% 的代码训练数据可以做思维链。直觉来说面向过程的编程 (procedure-oriented programming) 跟人类逐步解决任务的过程很类似面向对象编程 (object-oriented programming) 跟人类将复杂任务分解为多个简单任务的过程很类似。以上所有观察结果都是代码与推理能力 / 思维链 之间的相关性但不一定是因果性。这种相关性很有趣但现在还是一个待研究的开放性问题。目前看来我们没有非常确凿的证据证明代码就是思维链和复杂推理的原因。此外 代码训练另一个可能的副产品是长距离依赖正如Peter Liu[25] 所指出“语言中的下个词语预测通常是非常局部的而代码通常需要更长的依赖关系来做一些事情比如前后括号的匹配或引用远处的函数定义”。这里我想进一步补充的是由于面向对象编程中的类继承代码也可能有助于模型建立编码层次结构的能力。我们将对这一假设的检验留给未来的工作。
(2)这些能力是在预训练之后已经存在还是在之后通过微调注入
无论基础模型是初代的 GPT-3 还是后来训练的模型 遵循指令和零样本泛化的能力都可能已经存在于基础模型中后来才通过指令微调来解锁 而不是注入 这主要是因为 OpenAI 的论文[28] 报告的指令数据量大小只有 77K比预训练数据少了几个数量级。其他指令微调论文进一步证明了数据集大小对模型性能的对比例如 Chung et al. (2022) 的工作中 Flan-PaLM 的指令微调仅为预训练计算的 0.4%。一般来说指令数据会显著少于预训练数据。
然而 模型的复杂推理能力可能是在预训练阶段通过代码数据注入 代码数据集的规模与上述指令微调的情况不同。这里的代码数据量足够大可以占据训练数据的重要部分例如PaLM 有 8% 的代码训练数据如上所述在 code-davinci-002 之前的模型 text-davinci-001 大概没有在代码数据上面微调过所以它的推理 / 思维链能力是非常差的正如第一版思维链论文中所报告的那样有时甚至比参数量更小的 code-cushman-001 还差。
(3)能力总结
语言生成能力 基础世界知识 上下文学习都是来自于预训练davinci存储大量知识的能力来自 1750 亿的参数量。遵循指令和泛化到新任务的能力来自于扩大指令学习中指令的数量Davinci-instruct-beta)执行复杂推理的能力很可能来自于代码训练code-davinci-002生成中立、客观的能力、安全和翔实的答案来自与人类的对齐。具体来说 如果是监督学习版得到的模型是text-davinci-002如果是强化学习版 (RLHF) 得到的模型是text-davinci-003无论是有监督还是 RLHF 模型在很多任务的性能都无法超过 code-davinci-002 这种因为对齐而造成性能衰退的现象叫做对齐税。对话能力也来自于 RLHFChatGPT具体来说它牺牲了上下文学习的能力来换取 建模对话历史增加对话信息量拒绝模型知识范围之外的问题
2.关于ChatGPT技术问题的猜想
答案不可靠无法进行实时学习(虽然本次对话可以让模型学习但是不会真正延申到模型上因为需要避免人为训练假的数据)
(1) 为什么面向对话的微调没有遭遇灾难性遗忘问题
灾难性遗忘问题一直是深度学习中的一个挑战经常因为在某个任务上训练后就丧失了在其他任务上的性能。例如一个 30 亿参数的基础模型先在自动问答数据上进行微调然后在多轮对话数据上进行微调结果会发现模型的问答能力大幅度下降。ChatGPT 似乎不存在这个问题其在基础模型 GPT-3.5 上进行了两次微调第一次依据人工标注的对话数据进行微调第二次根据人类反馈的强化学习进行微调微调使用的数据很少尤其是人类反馈的打分排序数据更少微调后竟然仍然表现出强大的通用能力而并没有完全过拟合到对话任务。
这是个非常有趣的现象也是我们没有条件验证的现象。猜测可能有两方面的原因一方面是 ChatGPT 使用的对话微调数据实际可能包含了非常全面的 NLP 各种任务正如 InstructGPT 中对用户使用 API 的问题分类可以发现很多都不是简单的对话还有分类、问答、摘要、翻译、代码生成等等因此ChatGPT 实际是对若干任务同时进行了微调另一方面可能当基础模型足够大之后在较小数据上的微调不会对模型产生很大影响可能仅在基础模型参数空间非常小的邻域中优化所以不会显著影响基础模型的通用能力。
(2)ChatGPT 的大范围上下文连续对话能力是如何做到的
首先高质量的多轮对话数据是基础和关键正如 Google 的 LaMDAOpenAI 也采用人工标注的方式构造了大量高质量多轮对话数据在此之上进行的微调将会激发模型的多轮对话能力。
其次基于人类反馈的强化学习因为提升了模型回复的拟人性也会间接增强模型多轮对话的一致性能力。最后模型对 8192 个语言单元Token的显式建模能力使其几乎可以记忆普通人一整天的对话数据在一次对话交流中很难超出这个长度因此所有对话历史都已经被有效记忆从而可以显著提升连续多轮对话的能力。
(3)ChatGPT 的交互修正能力是如何炼成的
OpenAI 人工构建的对话数据中包含一些交互修正的案例微调后拥有了这样的能力人工反馈的强化学习使得模型输出更加符合人类偏好从而在信息修正这类对话中表现得更加遵循人类的修正意图可能大模型达到一定规模e.g. 60B之后原始训练数据中的交互修正案例就被学到了模型交互修正的能力自然就涌现出来了。
(4)ChatGPT 的逻辑推理能力是如何学到的
当我们询问 ChatGPT 一些逻辑推理相关的问题时它并不是直接给出答案而是展示出详细的逻辑推理步骤最后给出推理结果。虽然鸡兔同笼等很多案例表明 ChatGPT 并没有学会推理本质而仅仅学会了推理的表面逻辑但是展示的推理步骤和框架基本是正确的。
一个语言模型能够学习到基本的逻辑推理模式已经极大超越了预期其推理能力溯源是非常有趣的一个问题。相关对比研究发现当模型足够大并且程序代码与文本数据混合训练时程序代码的完整逻辑链就会迁移泛化到语言大模型从而大模型就拥有了一定的推理能力。
这种推理能力的习得有点神奇但是也能理解可能代码注释是从逻辑代码到语言大模型推理能力迁移泛化的桥梁。多语言能力应该也是类似的道理。ChatGPT 的训练数据绝大部分是英文中文数据占比极少然而我们发现 ChatGPT 的中文能力虽然比不上英文但是也非常强大。训练数据中的一些中英对照的平行数据可能就是英文能力迁移到中文能力的桥梁。
(5) ChatGPT 是否针对不同下游任务采用不同的解码策略
ChatGPT 有许多惊艳的表现其中一个是它可以针对同一个问题生成多种不同的回复显得很睿智。比如我们不满意 ChatGPT 的回答可以点击 “重新生成” 按钮它立刻会生成另一种回复若还是不满意可以继续让其重新生成。这一点在 NLP 领域并不神秘对于语言模型来说是它的一个基本能力也就是采样解码。
一个文本片段的后面可能接不同的词语语言模型会计算每个词语出现的概率如果解码策略选择概率最大的词语输出那么每次结果都是确定的就无法生成多样性回复。如果按照词汇输出的概率分布进行采样例如“策略” 的概率是 0.5“算法” 的概率是 0.3然后采样解码输出 “策略” 的可能性就是 50%输出 “算法” 的可能性就是 30%从而保证了输出的多样性。因为采样过程是按照概率分布进行的即使输出结果多样但是每一次都是选择概率较大的结果所以多种结果看起来都相对比较合理。对比不同类型的任务时我们会发现 ChatGPT 的回复多样性针对不同下游任务差别比较大。
针对 “如何”、“为什么” 等 “How”、“Why” 型任务时重新生成的回复与之前的回复无论是表达方式还是具体内容具有较大差异针对机器翻译、数学应用题等 “What” 型任务时不同回复之间的差异非常细微有时几乎没有变化。如果都是依据概率分布的采样解码为何不同回复之间的差异如此之小。
猜测一种理想情况可能是 “What” 型任务基础大模型学习到的概率分布非常尖锐Sharp例如学到的 “策略” 概率为 0.8“算法” 概率为 0.1所以大多数时候采样到相同的结果也就是前面例子中 80% 的可能性都会采样到 “策略”“How”、“Why” 型任务基础大模型学习到的概率分布比较平滑Smooth例如 “策略” 概率为 0.4“算法” 概率为 0.3所以不同时候可以采样到差异性较大的结果。
如果 ChatGPT 能够学习到任务相关的非常理想的概率分布那确实非常厉害基于采样的解码策略就可以适用于所有任务。通常关于机器翻译、数学计算、事实性问答等答案比较确定或者 100% 确定的任务一般采用基于贪婪解码也就是每次输出概率最高的词语。如果希望输出相同语义的多样性输出大多采用基于柱搜索的解码方法但较少采用基于采样的解码策略。
3.关键技术
缩放。缩放是增加 LLMs 模型容量的关键因素最开始 GPT-3 将模型参数增至 1750 亿随后 PaLM 进一步将模型参数增至 5400 亿。大规模参数对于涌现能力至关重要。缩放不仅针对模型大小还与数据大小和总计算量有关。训练。由于规模巨大成功训练一个具备强大能力的 LLMs 非常具有挑战性。因此需要分布式训练算法来学习 LLMs 的网络参数经常联合使用各种并行策略。为了支持分布式训练DeepSpeed 和 Megatron-LM 等优化框架被用来促进并行算法的实现和部署。此外优化技巧对训练稳定性和模型性能也很重要例如重新启动训练损失尖峰和混合精度训练。最近的 GPT-4 开发了特殊的基础设施和优化方法从而利用小得多的模型来预测大模型的性能。能力激发。在大规模语料库上经过预训练后LLMs 被赋予了解决一般任务的潜在能力。然而当 LLMs 执行某个特定任务时这些能力可能不会显式地表现出来。因此设计适合的任务指令或特定的上下文策略来激发这些能力非常有用比如思维链 prompt 有助于通过中间推理步骤等解决复杂推理任务。此外还可以进一步对具有自然语言任务描述的 LLMs 进行指令调优以提高对未见过任务的泛化能力。对齐调优。由于 LLMs 被训练用来捕获预训练语料库的数据特征包括高质量和低质量的数据它们很可能生成对有毒、有偏见和有害的文本内容。为了使 LLMs 与人类价值观保持一致InstructGPT 设计了一种利用强化学习和人类反馈的高效调优方法使得 LLMs 能够遵循预期指令。ChatGPT 是在类似 InstructGPT 的技术上开发的在产生高质量、无害的响应方面表现出了强大的对齐能力。工具利用。LLMs 本质上是基于大规模纯文本语料库训练的文本生成器因此在数值计算等文本表达不佳的任务上表现没那么好。此外 LLMs 的能力受限于预训练数据无法捕获最新信息。针对这些问题人们提出使用外部工具来弥补 LLMs 的不足比如可以利用计算器进行精确计算使用搜索引擎检索未知信息。ChatGPT 更是利用外部插件来联网学习新知识这种机制可以广泛扩展 LLMs 的能力范围。
(1)预训练
预训练建立了 LLMs 的能力基础。通过对大规模语料库的预训练LLMs 可以获得基本的语言理解和生成技能。在这个过程中预训练语料库的规模和质量是 LLMs 获得强大能力的关键。此外为了有效地预训练 LLMs模型架构、加速方法和优化技术都需要精心设计。
①数据收集
要开发一个强大的 LLM从各种数据源中收集大量的自然语言语料至关重要。现有 LLMs 主要利用各种公共文本数据集作为预训练语料库。收集大量文本数据后必须对它们进行预训练以构建预训练语料库包括去噪、去冗余、去除不相关和潜在有毒的数据。 ②模型训练
随着模型和数据规模的增加在有限的计算资源下有效地训练 LLMs 模型已经变得困难。特别是需要解决两个主要技术问题例如通过输入增加训练和将更大的模型加载到 GPU 内存中。
(2)LLMs 的适应性调优
经过预训练LLMs 可以获得解决各种任务的通用能力。然而越来越多的研究表明LLMs 的能力可以根据具体目标进一步调整。
①指令调优——提高或解锁 LLMs 的能力
本质上指令调优是在自然语言形式的格式化实例集合上微调预训练 LLMs 的方法这与监督微调和多任务提示训练高度相关。为了执行指令调优我们首先需要收集或构建指令格式的实例。然后我们通常使用这些格式化实例以监督学习方式微调 LLMs例如使用序列到序列损失进行训练。在指令调整后LLMs 可以展示出卓越的能力泛化出能解决未见任务的能力即使在多语言环境中也是如此。
格式化实例构建通常指令格式的实例由任务描述称为指令、输入输出对和少量演示可选组成。指令调优策略与预训练不同指令调优通常更有效因为只有适度数量的实例用于训练。虽然指令调优可以被认为是一个有监督的训练过程但它的优化在几个方面与预训练不同例如训练目标即序列到序列损失和优化配置例如更小的批次 大小和学习率这在实践中需要特别注意。除了这些优化配置之外指令调优还需要考虑两个重要方面 平衡数据分布。结合指令调优和预训练。 ②对齐调优——使 LLMs 的行为与人类的价值观或偏好一致 ③上下文学习
在预训练或适应性调整之后使用 LLMs 的一个主要方法是为解决各种任务设计合适的 prompt 策略。一个典型的 prompt 方法是上下文学习in-context learning它以自然语言文本的形式制定了任务描述或演示。此外思维链 prompting 方法可以通过将一系列中间推理步骤纳入 prompt 中来加强上下文学习
④思维链 prompt
思维链CoT是一种改进的 prompt 策略可以提高 LLM 在复杂推理任务中的表现如算术推理、常识推理和符号推理。CoT 不是像 ICL 那样简单地用输入 - 输出对来构建 prompt而是将能够导致最终输出的中间推理步骤纳入 prompt。
四、如何训练GPT
GPT 的训练流程可粗略分为四个阶段预训练、监督式微调、奖励建模、强化学习。这四个阶段按顺序进行。每个阶段都有各自的数据集每个阶段也有各自用于训练神经网络的算法。第三行是所得到的模型。最后底部有一些备注信息。
在所有阶段中预训练阶段所需的计算量是最大的可以说 99% 的训练计算时间和浮点运算量都集中在这个阶段。因为这一阶段需要处理超大规模的互联网数据集可能需要数千 GPU 构成的超级计算机工作几个月时间。其它三个阶段都算是微调fine tuning阶段所需的 GPU 数量和训练时间都少得多。
1.预训练阶段_得到一个基础模型
预训练通常需要使用一个超大型的文本语料库其中包含数十亿乃至数万亿 token。预训练阶段的训练任务很简单直接就是根据前文预测下一个词。
(1)数据收集
下面给出了一个例子这是来自 Meta 的 LLaMA 模型的数据混合data mixture方法可以看到LLaMA 的预训练数据按不同比例混用了多个不同类型的数据集其中比例最大的是爬取自互联网的 CommonCrawl 以及基于 CommonCrawl 构建的 C4此外还有 GitHub、维基百科等数据集。 (2)预处理
①Tokenizer Training
这一步也被称为「token 化」。简单来说这就是一个转译过程即把原始文本转译成某种整数序列因为这种整数序列就是 GPT 实际工作时所操作的本地表征。 这种从文本到 token 和整数的转译过程是无损的而具体执行这一过程的算法有好几种。举个例子如上图所示我们可以使用一种名为字节对编码byte pair encoding的技术其工作方式是迭代式地合并短文本块并将它们分组成 token。最后实际输入 Transformer 的就是那些整数序列。
下面来看两个示例模型 GPT-3 和 LLaMA 在预训练阶段需要考虑的一些主要的超参数。Karpathy 表示由于他们还没有发布有关 GPT-4 的相关信息因此在演讲中使用了 GPT-3 的数据。 可以看到词汇库的大小通常是 10000 数量级的上下文长度通常为 2000 或 4000 左右而现在更是有长达 10 万的。上下文长度决定着 GPT 在预测序列的下一个整数时所查看的最大整数数量。
对于参数数量可以看到 GPT-3 的为 1750 亿而 LLaMA 的为 650 亿但实际上 LLaMA 的性能表现远胜于 GPT-3。原因何在因为 LLaMA 训练的 token 要长得多达到了 1.4 万亿而 GPT-3 仅有大约 3000 亿。因此评价一个模型时光看参数数量是不够的。
上图中部的表格中给出了 Transformer 神经网络中一些需要设定的超参数比如头的数量、维度大小、学习率、层数等等。
下方则是一些训练超参数比如为了训练 650 亿参数的 LLaMA 模型Meta 使用 2000 个 GPU 训练了大约 21 天资金成本大约为 500 万美元。这大概能体现出预训练阶段各项成本的数量级。 ②词表扩充
为了降低模型的训练难度人们通常会考虑在原来的词表上进行「词表扩充」也就是将一些常见的汉字 token 手动添加到原来的 tokenizer 中从而降低模型的训练难度。
(3)实际处理
接下来看实际的预训练过程究竟会发生什么。大致来说首先会把 token 分批组成 data batch。这些分配数据构成数组再被输入到 Transformer 中。这些数组的大小为 B×T其中 B 是分批大小即堆叠的独立样本的行数T 是最大上下文长度。下图给出了一个示例。 在图中示例中上下文长度 T 仅为 10但实际模型的 T 可达到 2000 或 4000 乃至更长。也就是说实际模型的一行数据可以非常长比如一整个文档。我们可以将许多文档打包到各行中并用这些特殊的文本结束 token 来分隔它们。简单来说这些 token 是告诉 Transformer 新文档开始的位置。比如图中的 4 行文档就转换成了底部的 4×10 的数组。
现在需要将这些数字输入到 Transformer。这里我们仅看其中一个单元格绿色而实际上每个单元格都会经历同样的处理流程。 这个绿色单元格会查看其之前的所有 token即所有黄色单元格的 token。我们要将这里的全部上文输入到 Transformer 神经网络Transformer 则需要预测出该序列的下一个 token即图中的红色 token。
为了给出准确的预测神经网络需要调整其上百亿个参数。每次调整后神经网络对每个单元格 token 的预测分布就会不同。举个例子如果词汇库的大小为 50257 个 token那么我们就需要同样多的数字以便得到下一个 token 的概率分布其预测了下一个 token 的可能值及相应概率。
在图中的示例中下一个单元格应该是 513因此就可以将其用作监督源来更新 Transformer 的权重。我们可以并行地对每个单元格采取同样的操作。我们不断更换数据批努力让 Transformer 有能力正确地预测序列的下一个 token。
(4)微调
预训练其实就是一个语言建模过程这个过程的训练时间可长达一个月。之后GPT 学到了一个非常强大的通用型语言表征。然后我们可以针对具体的下游任务高效地对其进行微调。 举个例子如果下游任务是情绪分类。过去你采用的方法可能是收集大量标注好「正面」或「负面」情绪的样本然后训练一个 NLP 模型。但现在的新方法不需要预先做情绪分类了你只需要拿一个预训练过的大型语言模型然后只需要少量示例样本就能非常高效地针对你的具体任务对模型进行微调。
这对实际应用来说非常有用。那么为什么预训练后的大型语言模型LLM只需要简单微调就能用呢这是因为语言建模过程本身就已经涵盖了大量任务 —— 模型为了预测下一个 token必须理解文本的结构以及其中内含的各种不同概念。
这就是 GPT-1。
现在来看 GPT-2。人们注意到 GPT-2 甚至可以不用微调就能非常有效地让这些模型执行 prompt。这些语言模型的训练目标是完成文档因此用户实际上只需通过编排适当的虚假文档就可以诱导模型执行具体任务。下面给出了一个例子。 其中给出了一篇文章用户想完成的任务是做相关的问答。因此只需要在文章后面加几个有答案的问答这被称为 few-shot prompt然后再提问那么由于 Transformer 的目标是完成这个文档也就相当于回答了问题。这个例子是用 prompt 来调教基础模型使其相信它在模仿一个文档结果却完成了问答任务。
Karpathy 认为以提供 prompt 替代微调的方式昭示着大型语言模型的新时代。这让基础模型本身就足以应对许多不同类型的任务。
2.监督式微调阶段
(1)为什么要进行监督式微调
上一阶段只会产生一个基础模型基础模型不等于助理模型。基础模型不会回答用户提问它们只会完成文档。所以如果你对基础模型说「写一首关于面包和奶酪的诗」你可能不会如愿 —— 它只会把你的要求看成一个文档然后试图完成它。 但是你可以通过适当的 prompt 诱导基础模型写诗如上图右侧所示。
当然你也可以诱导模型变成助理。为此你需要创建一些特定的少样本 prompt使其看起来像是人类与助理交换信息的交互过程的文档。如下图所示然后你只需要在文档结尾处附上你的提问基础模型就能在一定程度上化身为一个有用的助理给出某个答案。但这个过程并不非常可靠实践效果也不好。 (2)监督式微调
在监督式微调阶段需要收集少量但高质量的数据集。OpenAI 的方法是以人工方式收集由 prompt 和理想响应构成的数据。这些数据需要不少一般需要几万个。
然后继续在这些数据上执行语言建模。算法不变只是换了训练数据集从大量低质量的互联网文档换成了少量高质量的问答式「prompt - 响应」数据。
这个训练过程完成后就得到了一个 SFT 模型。部署这些模型就能得到助理它们已经能完成一定程度的工作。 监督式微调阶段涉及到另一轮对下一 token 的预测。但是不同于之前的预训练阶段模型现在处理的是成对的「指令 - 输出」如上图所示。在这里指令是指提供给模型的输入根据任务的不同指令中有时候会带有可选的输入文本。输出则是模型给出的接近我们期望的响应。这里给出一个具体示例对于下面这一对「指令 - 输出」
指令Write a limerick about a pelican.输出There once was a pelican so fine...
模型将指令文本Write a limerick about a pelican作为输入执行下一 token 预测获得输出文本There once was a pelican so fine...。
尽管预测下一 token 这个训练目标是相似的但监督式微调使用的数据集通常比预训练所用的小得多。这是因为它需要的是指令 - 输出对而不只是原始文本。为了构建这样一个数据集必需有一个人类或另一个高质量 LLM来根据给定指令写出所需输出 —— 创建这样一个数据集非常费力。
3.RLHF 奖励建模阶段
在这一阶段需要将数据收集转变成比较的形式。这里给出了一个示例。对于同样的 prompt即要求助理写一个能检查给定字符串是否为回文的程序或函数。再使用已经训练好的 SFT 模型生成多个结果这里给出了三个。然后再让人类给这些结果排名。 这件事做起来可并不简单毕竟要是让人类来完成一个 prompt可能需要耗费几个小时时间。现在假设排名完成了然后就需要在这些结果的所有可能配对上执行类似二元分类的操作。
如下图所示具体的做法是这样的将 prompt 按行排列这里的三行 prompt 是一样的但完成的结果不同即图中黄色 token来自 SFT 模型。然后在其后添加一个特殊的奖励读出 token。这样只需要在绿色 token 位置对 Transformer 执行监督就能使 Transformer 预测出某个奖励从而判断 prompt 的完成结果是否优良。 这基本上就是让 Transformer 猜测每个完成结果的质量。当其猜测完每个不同结果的质量后开发者就可以动用已有的基本真值ground truth强行让某些结果的质量分数高于其它结果从而使模型的奖励预测结果与人工给出的基本真值保持一致。这个过程可以通过一个损失函数完成。
有了奖励模型之后GPT 依然还不能成为一个有用的助理但奖励模型却对后面的强化学习阶段很有用因为奖励模型可以评估任意给定 prompt 的任意完成结果的质量。
在 OpenAI 的 [Summarization] 和 [InstructGPT] 的论文中都使用了「偏序对」来训练模型。
偏序对是指不直接为每一个样本直接打分而是标注这些样本的好坏顺序。
直接打分A句子5分B句子3分偏序对标注A B
模型通过尝试最大化「好句子得分和坏句子得分之间的分差」从而学会自动给每一个句子判分。
(1)执行步骤
①创建一个奖励模型 如上图所示用上一步中创建的已微调 LLM 为每个 prompt 生成 4-9 个响应。然后再让人基于自己的偏好对这些响应进行排名。尽管这个排名过程非常耗时但相比于创建用于监督式微调的数据集其劳动力密集程度可能要低一些。这是因为对响应进行排名多半比编写响应更简单。
然后基于使用这些排名构建的数据集我们可以设计一个奖励模型其输出的是用于 RLHF 第 3 步后续优化阶段的奖励分数。这个奖励模型通常源自之前的监督式微调步骤创建的 LLM。下面将奖励模型简称为 RM将经过监督式微调后的 LLM 简称为 SFT。为了将 RLHF 第 1 步的模型变成奖励模型需要将其输出层下一 token 分类层替换成一个回归层其具有单个输出节点。
②使用奖励模型RM来微调监督式微调的模型 根据 RLHF 创建的 RM 的奖励分数使用近端策略优化PPO来更新 SFT 模型。
3.复刻 ChatGPT 时要注意些什么
如果希望能复刻类似 ChatGPT 这种效果令人惊艳的 LLM 模型综合目前的各种研究结论在做技术选型时需要重点权衡如下问题
首先在预训练模式上我们有三种选择GPT 这种自回归语言模型Bert 这种双向语言模型以及 T5 这种混合模式 (Encoder-Decoder 架构在 Encoder 采取双向语言模型Decoder 采取自回归语言模型所以是一种混合结构但其本质仍属于 Bert 模式)。我们应选择 GPT 这种自回归语言模型其原因在本文范式转换部分有做分析。目前看国内 LLM 在做这方面技术选型的时候貌似很多都走了 Bert 双向语言模型或 T5 混合语言模型的技术路线很可能方向走偏了。 第二强大的推理能力是让用户认可 LLM 的重要心理基础而如果希望 LLM 能够具备强大的推理能力根据目前经验最好在做预训练的时候要引入大量代码和文本一起进行 LLM 训练。至于其中的道理在本文前面相关部分有对应分析。
第三如果希望模型参数规模不要那么巨大但又希望效果仍然足够好此时有两个技术选项可做配置要么增强高质量数据收集、挖掘、清理等方面的工作意思是我模型参数可以是 ChatGPT/GPT 4 的一半但是要想达到类似的效果那么高质量训练数据的数量就需要是 ChatGPT/GPT 4 模型的一倍Chinchilla 的路子另外一个可以有效减小模型规模的路线是采取文本检索Retrieval based模型 LLM 的路线这样也可以在效果相当的前提下极大减少 LLM 模型的参数规模。这两个技术选型不互斥反而是互补的也即是说可以同时采取这两个技术在模型规模相对比较小的前提下达到超级大模型类似的效果。
第四超级大模型因为模型规模大所以训练成本过高导致很少有机构有能力去做这件事。而且由上文分析可见继续不断推大 LLM 模型规模是肯定会发生、也应该去做的事情。于是如何通过技术手段降低 LLM 的训练成本就很重要。LLM 的特征抽取器 Sparse 化是有效降低模型训练及推理成本的技术选择。由此可见随着模型越来越大LLM 模型 Sparse 化是一个应该考虑的选项。
第五ChatGPT 是目前最接近理想 LLM 的技术方案而理想中的 LLM 应该是以一个几乎无所不能的基础通用大模型作为依托来支持各种各样的上层任务类型。目前看支持越来越多的任务类型主要是通过增加 LLM 预训练数据的多样性来达成的数据多样性越好LLM 能够支持的任务类型就越丰富。所以应该重视通过增加数据多样性来增加 LLM 新能力的思路。
第六易用的人机操作接口。人类用他们自己习惯的表达方式来描述任务而 LLM 要能够理解这些 Instruct 的真实含义。另外也要注意这些 Instruct 是符合人类真实需求的就是说要从最终用户那里收集任务表述方式而不能靠研发人员自己的臆想或猜测。ChatGPT 给我最大的启发其实是这一点至于是否用增强学习我倒觉得不重要其它替代技术应该也能做类似的事情。