NLP深入学习:《A Survey of Large Language Models》详细学习(五)


1. 前言

最近正在读 LLM 论文的综述,当前采取的策略是部分内容走读+记录,论文原文见《A Survey of Large Language Models》

前情提要:
《NLP深入学习:《A Survey of Large Language Models》详细学习(一)》
《NLP深入学习:《A Survey of Large Language Models》详细学习(二)》
《NLP深入学习:《A Survey of Large Language Models》详细学习(三)》
《NLP深入学习:《A Survey of Large Language Models》详细学习(四)》

第一章介绍了论文的摘要、引言以、总述部分
第二章讲解了 LLMs 相关资源,包含公开模型、API、预训练的数据集以及微调的数据集,
第三章介绍预训练部分,这是 LLMs 的重要部分!
第四章介绍适应性训练

本文继续介绍 LLMs 的 prompts

2. Prompts

2.1 Prompting

2.1.1 Prompt 构建

在本文中,Prompt Creation(提示创建)是一个关键步骤,旨在引导大型语言模型(LLMs)生成期望的、具有目标导向性的高质量文本响应。以下分别介绍了 Prompt Creation 的核心组成部分、设计原则、实用技巧以及经验分析:

  1. Key Ingredients(关键部分):

    • Task Description:明确的任务描述是提示的关键部分,它以自然语言形式向模型传达要完成的任务目标。对于特殊格式或复杂任务,需要提供详细说明和关键词来指导模型理解并遵循要求。
    • Input Data:输入数据作为模型处理的起始点,通常表现为问题、情境或待处理的原始文本片段,必须清晰无误地嵌入到提示中以便模型正确理解和反应。
    • Contextual Information:上下文信息对于特定任务的执行至关重要,例如相关背景知识、历史对话记录或者辅助文档等,有助于模型更好地推理和生成准确答案。
    • Prompt Style:恰当的提示风格能有效激发模型的能力,如采用问题式、指令式或故事叙述式等不同风格的提示,以便于模型按照所需方式生成内容。
  2. Design Principles(设计原则):
    在大型语言模型(LLMs)的提示创建设计原则中,关键点包括:

    • Expressing the task goal clearly(明确表达任务目标)
      这一原则强调了在构造提示时明确表达任务目标的重要性。为了引导 LLM 理解并准确执行特定任务,需要使用清晰、简洁且无歧义的语言描述任务意图。例如,在文本摘要任务中,可能需要明确指示模型:“请从以下长篇文章中提取主要观点,并总结成一段不超过50字的短文。”
    • Decomposing into easy, detailed sub-tasks(分解成子任务)
      对于复杂的任务,将其拆解为一系列简单且详细的子任务可以显著提升 LLM 的表现。例如,当要求 LLM 解决一个多步骤的问题时,可以逐项列出每个中间步骤的要求,如“首先识别问题的关键信息,然后进行逻辑推理,最后整合答案”。
    • Providing few-shot demonstrations(提供少样本学习)
      少样本学习是 LLMs 的一个重要特性,通过提供少量高质量的任务示例,模型能够从中学习到如何正确处理类似任务。例如,在训练过程中向模型展示几组指令-响应对,每一对都代表了如何根据给定指令生成合适的输出。
    • Utilizing model-friendly format(采用模型易理解的格式)
      采用模型易于理解和处理的格式对于提高提示效果至关重要。这包括但不限于使用模型熟悉和适应的词汇、句式结构以及恰当的符号或特殊标记来区分指令与上下文内容。比如,在 GPT-3 等 LLMs 中,可以利用三个波浪线``````或井号#等符号将指令与输入数据分隔开,以便模型更容易地捕捉到提示的核心部分。

下面举例并列出每个提示符的相关原则(最后一列 Prin):
在这里插入图片描述

  1. Empirical Analysis(实证分析):
    在对大型语言模型(如 ChatGPT)的提示创建进行实证分析时,研究揭示了以下几个关键点:
    • 精心设计的提示能够提升零样本或少样本性能:对于 ChatGPT 这样的预训练模型,在未经过特定任务微调的情况下,如果使用精心构造的提示,可以显著提高其在新任务上的表现,即增强其零样本学习和少样本学习能力。
    • 复杂任务更受益于细致的提示工程:当面临更为复杂的推理和知识利用任务时,通过细致入微的提示设计和优化,ChatGPT 的表现能够得到更大程度的提升,甚至在某些情况下超越传统的监督式基准方法。
    • 数学推理任务应基于编程语言格式设计特定提示:对于涉及数学推理的任务,采用类似于编程语言风格的特定提示会更加有效。例如,将数学问题表述为代码形式的指令,可以让 ChatGPT 更好地理解和解决这些问题。
    • 恰当的提示使 ChatGPT 在知识运用与复杂推理任务上表现出色:若给予适当的提示,ChatGPT 能够在需要运用广泛知识和进行深度推理的任务上展现与监督训练方法相当甚至更好的性能。
    • 通过合适的提示工程技术处理非传统 NLP 任务:通过对大型语言模型(LLMs)应用适宜的提示工程技术,可以使其有能力处理超出传统自然语言处理范畴的任务,比如推荐系统、结构化数据生成等任务,从而拓宽 LLMs 的应用范围。

2.1.2 Prompt 优化

对大型语言模型(LLMs)的提示进行优化以提升其在特定任务上的性能和适应性的过程。主要包括两种优化策略:离散提示优化和连续提示优化。

  1. Discrete Prompt Optimization(离散提示优化)
    离散提示优化通常涉及搜索或学习一组自然语言词汇或短语作为输入的提示序列,这些提示能够引导模型更好地理解和执行所需任务。这一方法利用了预训练模型已有的理解能力,通过调整提示文本的内容和结构来改进模型的输出质量。例如,在离散空间中采用各种启发式算法、遗传算法或者基于梯度的方法(如近似梯度)来搜索最优的提示词序列。以下是文档中提到的不同优化方法:

    • Gradient-based approaches(基于梯度更新方法)
      这类方法基于梯度更新来优化提示序列。例如,Auto-Prompt 等技术利用了梯度信息来逐步调整每个位置上提示词的选择,以最大化生成输出与期望结果的相似度或符合人类偏好。虽然直接对离散文本进行梯度优化具有挑战性,但研究者使用了近似梯度的方法,比如通过替换候选词汇时观察 log-likelihood的变化来间接地指导搜索。
    • RL-based approaches(基于强化学习方法)
      基于强化学习(RL)的方法将离散提示优化视为一个序列决策问题,通过训练智能体(即模型本身)根据收到的奖励信号来学习如何生成有效的提示。例如,RLPrompt 使用 RL 算法来训练一个策略网络,该网络能根据不同的任务和上下文环境生成高质量的提示,从而引导模型产生更好的输出。
    • Edit-based approaches(基于编辑式方法)
      编辑式方法借鉴了遗传算法等搜索策略,通过对初始提示进行迭代编辑操作(如删除、交换和改写单词)来寻找最优提示。GPS(Genetic Prompt Search)是一个例子,它采用遗传算法的思想,通过模拟进化过程中的突变和交叉操作,在一组种子提示基础上演化出更优的提示集合。
    • LLM-based approaches(基于 LLMs 方法)
      一些方法利用现有 LLMs 的能力来生成和改进提示。例如,APE(Autoregressive Prompt Editing)首先利用预训练的 LLM 生成初始提示,并通过迭代蒙特卡洛搜索进一步优化这些提示。此外,还有一些工作探讨如何结合 LLMs 本身的反馈来指导提示的生成和选择,以提升模型在不同任务上的表现。
  2. Continuous Prompt Optimization(连续提示优化)
    连续提示优化则引入了一种可微分的参数化方式,将传统的离散提示转化为一系列可训练的连续向量,这些向量通常被称为“前缀”、“适配器”或“软提示”。以下是文档中提及的两种主要方法:

    • Prompt learning with sufficient data(足够数据)
      当有足够的训练数据时,可以使用连续提示进行参数化学习。这种方法通常将连续提示视为可训练的模型参数,与预训练语言模型一同参与微调过程。例如,在 Prefix Tuning 和 Prompt Tuning 等技术中,会在模型输入层添加一组连续向量作为“前缀”或“软提示”,这些向量通过监督学习来更新,并与下游任务的数据集一起进行梯度优化,以最小化任务相关的损失函数,从而改进模型在特定任务上的性能。
    • Prompt transferring with scarce data(有限数据)
      在数据稀缺的情况下,研究人员探索如何利用有限数据对连续提示进行有效转移学习。比如,在资源匮乏的领域或任务上,可以通过预先在一个具有足够数据的任务上学习一个通用的连续提示,然后将其初始化到目标任务的提示参数中。此外,也有研究尝试设计自适应机制,使得模型能够在少量样本指导下调整连续提示,以适应新的、数据不足的任务环境。例如,SPoT 等方法先在一个代表性的源任务集合上学习单一的连续提示,然后用该初始提示作为起点,进一步针对目标任务实例进行调整优化。

2.2 上下文学习

In-Context Learning (ICL)是一种针对大型语言模型(LLMs)的训练和应用技术,它允许模型在没有进行任何额外参数更新的情况下,通过理解并学习提供的上下文样例来执行新任务或生成符合预期的响应。这种学习方式利用了预训练模型的强大表示能力和对语言模式的理解能力。

2.2.1 ICL 公式化

ICL(In-Context Learning)公式化描述了大型语言模型如何通过上下文中的任务示例来学习并解决新任务。

具体来说,ICL流程包括以下步骤:

  1. 任务描述与示例选择:首先提供一个明确的任务说明,并从任务数据集中选取若干个具有代表性的示例作为演示。
  2. 格式化构建输入:将这些示例按照特定顺序结合到一起,形成自然语言形式的提示,通常使用模板设计以确保每个示例的结构清晰、逻辑连贯。
  3. 测试实例加入:将待解决的新的测试实例添加到上下文中,紧随之前展示的示例之后。
  4. 模型输出预测:大型语言模型(LLM)接收到包含任务描述、示例及测试实例的完整上下文后,基于其内部学到的语言模式和上下文关联性生成预期的输出结果。

数学上,可以表示为给定一个包含k个示范样本的任务数据集 D k = f ( x 1 , y 1 ) , . . . , f ( x k , y k ) Dk = {f(x_1, y_1), ..., f(x_k, y_k)} Dk=f(x1,y1),...,f(xk,yk),以及一个新的输入查询 x k + 1 x_{k+1} xk+1,其中 f ( ⋅ ) f(·) f() 是将样本转换为自然语言提示的形式化函数。模型依据提供的上下文信息生成预测答案:

LLM ( I , f ( x 1 , y 1 ) , . . . , f ( x k , y k ) , f ( x k + 1 , ) → y ^ k + 1 \text{LLM}(\text{I}, f(x_1, y_1), ..., f(x_k, y_k), f(x_{k+1},) \rightarrow \hat{y}_{k+1} LLM(I,f(x1,y1),...,f(xk,yk),f(xk+1,)y^k+1

这里,“I” 代表任务描述,而 y ^ k + 1 \hat{y}_{k+1} y^k+1 则表示模型对输入 x k + 1 x_{k+1} xk+1 所生成的预测输出。由于 ICL 方法性能高度依赖于提供的示例选择及其排列顺序,因此精心设计和筛选高质量的示例对于提升 ICL 效果至关重要。此外,研究还发现,通过指令调整等技术可以进一步增强 LLMs 的 ICL 能力,在仅提供任务描述的零样本设置下也能取得良好的表现。

2.3 演示设计

在 LLMs 的上下文学习中,演示设计是至关重要的组成部分。以下分别介绍了演示选择、演示格式和演示顺序:

  1. Demonstration Selection(演示选择)
    演示选择是指从可用的任务实例集中挑选出最具代表性、最能有效指导模型执行任务的样例。不同的演示选择策略可能包括基于相似度的选择(如k-近邻方法)、基于密度检索的方法(通过对比学习强化与目标任务相关的示例权重),以及利用LLM自身作为演示生成器来创建新的高质量示例等。正确且有效的演示选择能够显著影响模型对新任务的理解和学习效果。

  2. Demonstration Format(演示格式化)
    演示格式指的是如何将选定的实例转化为适合模型理解和处理的形式。通常需要将每个实例包装成一个自然语言提示,并包含清晰的任务指令、输入数据以及对应的期望输出。为了更好地引导模型,还可以采用结构化提示、分组上下文编码、重新缩放注意力机制等方式对演示进行格式化处理,以突出关键信息并简化模型的学习过程。

  3. Demonstration Order(演示排序)
    演示顺序关系到展示给模型的示例的排列次序,这一因素也会影响模型的性能表现。研究发现合理的顺序安排可以帮助模型捕捉到序列中的模式和趋势,从而提高其解决问题的能力。例如,可以依据熵指标来确定演示的排列,或根据特定算法生成探查集,让模型逐步学习从简单到复杂的任务。此外,还有研究提出根据多样性和复杂性排序演示,确保模型能够经历逐渐递增的难度水平,进而促进其泛化能力的发展。

2.3 思维链 Prompt

Chain-of-Thought(CoT)Prompt 是一种改进的提示策略,可以提高 LLMs 在复杂推理任务上的性能。CoT 提示不是像 上下文学习(ICL) 那样的输入输出对构建提示,而是进一步整合了中间推理步骤,中间推理步骤作为输入和输出之间的桥梁。

上下文学习(ICL)和思维链(CoT)提示的比较说明:
在这里插入图片描述
CoT 提示策略演变的例证。它从基本的 CoT 方法开始,并发展到增强的CoT 生成技术,包括基于采样和验证的技术方法。最后,它扩展到链结构的变化,如树和图:
在这里插入图片描述

2.3.1 改进的 CoT Prompt 策略

在改进的链式思维(Chain-of-Thought, CoT)提示策略中,研究者关注了三个关键方向以提高大型语言模型(LLMs)的表现和推理能力:

  1. Better Prompt Design(提示设计的优化)
    提示设计的优化是提高CoT性能的重要环节。通过精心设计的任务描述、输入数据结构以及上下文信息,使模型更好地理解任务目标和期望输出。例如,采用更复杂且具有明确指示性的指令,或者利用人类注释的数据来构建高质量的演示样例。

    对于数学问题或需要逻辑推理的任务,可能涉及提供更为细致的步骤解释和格式化说明,以便模型模仿并学习正确的问题解决路径。

  2. Enhanced CoT Generation(增强模型生成)
    为了增强模型生成中间推理步骤的能力,研究人员提出了多种技术手段,如多样性和自校正机制:

    • 多样性方法:鼓励模型生成多种不同的解题路径,而不是单一答案。这可以通过采样多个候选推理序列,并使用诸如自我一致性(self-consistency)等策略,从多个推理结果中选取最一致或最优的答案。
    • 自校验与验证:使用额外的训练或反馈循环来改进模型对生成的CoT进行自我检查的能力。比如DIVERSE项目中的step-wise投票方法,模型会在生成下一个推理步骤时参考其他路径上的信息,从而提升最终答案的准确性。
  3. Reasoning Structure Extension(扩展推理结构)
    针对复杂任务,传统的线性CoT结构可能会限制模型表现。因此,有研究尝试扩展推理结构,使之能够处理更复杂的决策树或图状推理过程:

    • 树形结构:允许模型在解决问题时探索不同分支路径,每个节点代表一个推理步骤,形成一个多层级的思考框架。
    • 图状推理:在更广泛的连接中表示和处理知识,模型可以灵活地跳转到相关概念之间,形成非线性的推理网络。

2.3.2 深入讨论

在对 CoT 提示策略的进一步讨论中,研究关注了两个关键问题:

  1. 什么时候用?
    CoT 提示方法对于大型语言模型(LLMs)的有效性通常与模型规模、任务类型和数据集特性有关。研究表明,CoT 提示尤其适用于参数量较大的 LLMs,如超过10B 参数量的模型,例如 GPT-3 或其后续变体,在诸如算术推理、常识推理以及符号推理等需要分步思考的任务上表现优异。此外,CoT 提示在那些要求模型展示逻辑链路以解决复杂问题的任务上特别有效,尤其是在有结构化的数学题解或者需要推理过程的场景。

  2. 为什么 LLMs 能执行CoT推理?
    大型语言模型能够执行CoT推理的原因在于它们通过大规模预训练学习到了丰富的语言结构和内在的知识表示。具体来说,LLMs 具备以下能力:

    • 从大量的文本数据中捕获并存储广泛的知识。
    • 预训练过程中形成的模式识别能力和上下文理解能力有助于模型理解和模拟人类的思维过程。
    • 模型内部架构允许它们在生成响应时进行多路径探索,并基于前一个步骤的结果动态调整下一个推理步骤。
    • 当模型足够大时,它们展现出了一种涌现能力(emergent ability),即无需额外微调就能根据给定的示例进行合理推理。

2.4 解决复杂任务的规划方法

研究者探讨了如何利用 LLMs 的内在能力和强化学习技术来系统地处理和分解复杂的自然语言处理任务。

LLMs 基于Prompt 解决复杂任务的规划:
在这里插入图片描述

2.4.1 规划生成

在大型语言模型(LLMs)的规划生成方面,研究者探索了两种主要方法:基于文本的方法和基于代码的方法。

Text-based Approaches(基于文本)
这种策略利用大型语言模型直接生成自然语言形式的行动计划或解决方案。例如,诸如 Plan-and-Solve、Self-planning 以及 DECOMP 等研究项目中,研究人员通过精心设计的提示来引导 LLMs 理解任务目标,并生成一个以自然语言描述的行动序列。这些行动序列通常包括一系列明确的步骤,逐步解决复杂问题。为了提升模型在生成计划时的表现,一些工作还结合了示例演示、推理路径可视化以及模型自身反馈循环等技术手段,帮助模型更好地理解任务要求并生成具有逻辑连贯性的计划。

Code-based Approaches(基于代码)
另一方面,代码基方法旨在生成可执行程序代码来表达解决方案。如 Faithful CoT、PAL 等项目,它们将复杂的任务分解成可由编程语言(如Python)实现的一系列指令。首先,LLM 被提示生成相应的程序代码片段;然后,使用确定性解算器执行生成的代码以得出最终答案。这种方法的优点在于可以确保计划的执行具有可验证性和可靠性,因为代码是明确且结构化的命令集合,能够精确地指导计算机完成特定任务。此外,还有像 HuggingGPT 这样的研究,它将大型语言模型与 HuggingFace 库中的各种工具模型相结合,使得 LLMs 能够根据具体情境选择合适的外部模型,并将其调用结果整合到最终的代码计划中。

2.4.2 反馈获取

反馈获取(Feedback Acquisition)是大型语言模型(LLMs)在执行任务后改进其输出质量的关键环节。具体来说,这一过程分为内部反馈和外部反馈两个主要部分:

Internal Feedback(内部反馈)
内部反馈是指模型自身产生的评估结果,无需依赖外部人工标注或其他外部系统。例如,在某些应用中,LLMs 可以生成多个候选答案,并通过自我评估机制来确定哪个答案更有可能满足特定指令或目标。模型可以基于自身的内在知识结构和学习到的上下文信息,对生成的文本进行投票或评级,比如 “Tree of Thoughts”方法就是利用了内部比较不同思维路径的方式来提供反馈。此外,像 Reflexion 这样的研究项目让 LLMs 能够根据执行动作后的稀疏结果信号转换为具体的文本形式反馈,存储于长期记忆中供后续决策参考。

External Feedback(外部反馈)
外部反馈则来源于人类专家、用户或者专门设计的评价系统。这种反馈通常更为直接且具有明确的目标导向性。当 LLMs 生成计划或响应后,环境会依据预定的标准或实际操作结果产生反馈信号,如是否成功完成任务、生成内容的准确性、道德规范符合度等。例如,在虚拟环境中,模拟器可以根据虚拟代理执行代码基计划后的状态变化给出成功或失败的反馈;而在与真实世界的交互中,可以通过用户行为(如点击率、满意度调查)、专业人员的评估或自动化工具检测来进行反馈收集。

2.4.3 规划细化

在大型语言模型(LLMs)的计划细化过程中,研究者探讨了三种关键策略:推理、回溯和记忆化。

  1. Reasoning(推理)
    在计划生成阶段,推理过程至关重要。当从环境获取反馈数据时,模型需要通过推理来提取与当前任务相关的关键信息,并据此调整现有的行动计划。例如,React 项目通过向 LLMs 提供演示以生成推理痕迹,促使模型对反馈进行深入理解和分析,从而修订初始计划以解决问题。此外,像 ChatCoT 这样的技术将工具增强的推理过程整合进 LLMs 与工具之间的对话中,使模型能够根据反馈动态调整其推理路径,提高计划的质量。

  2. Backtracking(回溯)
    回溯是一种优化算法,用于探索不同的决策分支并回到之前的步骤重新选择行动,以期找到最优解或改进当前的解决方案。例如,在 Tree of Thoughts 方法中,采用了广度优先搜索和深度优先搜索等搜索算法实现回溯,允许模型在执行计划遇到错误或局部最优解时,退回到上一个状态并尝试未探索的其他路径。这种方法有助于模型在全球范围内优化其行为计划,避免陷入局部最佳陷阱。

  3. Memorization(记忆化)
    记忆化是针对长时序任务的一种有效策略,旨在解决长期依赖性和历史信息的重要性问题。例如,Reflexion 项目中,模型将来自自我反思的反馈存储到记忆中,使得过去的反馈信息可以被用于后续的计划修正。另外,技能库机制也被提出,用于储存成功的计划并在未来面对类似任务时复用。一些研究如 Generative Agents 还设计了内存流机制,使得模型可以在复杂环境中不断学习、更新和利用长期记忆来进行智能决策。

3. 参考

《A Survey of Large Language Models》
《NLP深入学习:《A Survey of Large Language Models》详细学习(一)》
《NLP深入学习:《A Survey of Large Language Models》详细学习(二)》
《NLP深入学习:《A Survey of Large Language Models》详细学习(三)》
《NLP深入学习:《A Survey of Large Language Models》详细学习(四)》

后续内容也在持续更新中…

欢迎关注本人,我是喜欢搞事的程序猿; 一起进步,一起学习;

也欢迎关注我的wx公众号:一个比特定乾坤

相关推荐

  1. NLP深入学习(七):词向量

    2024-02-09 03:20:01       55 阅读
  2. NLP深入学习(十三):AdaBoost 算法

    2024-02-09 03:20:01       46 阅读
  3. 深度学习】【NLP】Bert理论,代码

    2024-02-09 03:20:01       23 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-09 03:20:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-09 03:20:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-02-09 03:20:01       82 阅读
  4. Python语言-面向对象

    2024-02-09 03:20:01       91 阅读

热门阅读

  1. VSCode 文件夹增加右键打开

    2024-02-09 03:20:01       52 阅读
  2. OLAP技术的发展及趋势简述

    2024-02-09 03:20:01       51 阅读
  3. MySQL视图和索引

    2024-02-09 03:20:01       50 阅读
  4. 作业2.5

    2024-02-09 03:20:01       47 阅读
  5. Lua语法

    Lua语法

    2024-02-09 03:20:01      41 阅读
  6. 【算法题】98. 验证二叉搜索树

    2024-02-09 03:20:01       47 阅读
  7. 开源软件的影响力

    2024-02-09 03:20:01       54 阅读
  8. 开源软件对技术以及行业发展的影响

    2024-02-09 03:20:01       53 阅读