A Survey of Large Language Models论文笔记

整篇综述的结构如下:

  1. Introduction(2页)
  2. Overview(1.5页)
  3. Resources of LLMs(4页)
    • Publicly available model checkpoints or APIs
    • Commonly used corpora
    • Library resource
  4. Pre-training(7.5页)
    • Data collection
    • Architecture
    • Model Training
  5. Adaptation tuning of LLMs(5页)
    • Instruction tuning
    • Alignment tuning
  6. Utilization(3.5页)
    • In-context learning
    • Chain-of-thought prompting
  7. Capacity evaluation(7.5页)
    • Basic evaluation tasks
    • Advanced ability evaluation
    • Public benchmarks and empirical analysis
  8. Conclusion and future directions(2页)

这篇博客主要关注论文的第五、六部分。

Adaptation Tuning Of LLMs

以往的诸多工作已经证明了,经过预训练的LLMs已经学习到了足够多的相关知识,拥有足够的潜力去完成few-shot甚至是zero-shot任务,但是根据不同的任务目标进行适应性的调整可以更大程度地发掘LLMs的潜力。在这一部分中,作者总结了两种方法来让预训练模型和下游任务相适应,这两种方法分别是instruction tuning和alignment tuning,前者的目标是增强或者说是解锁LLMs的潜能(充分利用LLMs学习到的知识),后者的目标是让LLMs的行为朝人类的价值观靠拢(避免各种歧视或者其他错误)。

Instruction Tuning

作者首先列举了几个用于instruction tuning的数据集:Natural Instructions v2、The Flan Collection、CrossFit、P3、ExMix等。

Instruction tuning本质上是一种在一个以自然语言形式格式化的集合上微调预训练LLMs的方法。它与supervised fine-tuning和multi-task prompted training高度相关。使用Instruction tuning的步骤分为两步:首先筹集或者构造instruction格式的实例,然后用这些格式化的实例来有监督地微调预训练LLMs。通过Instruction tuning,模型可以获得很强的,对于其他任务的泛化能力。下图就是对于instance formatting的说明以及构造这样实例的两种方法。

instance_formatting

Formatted Instance Construction

一个指令格式化的实例由一个任务描述(也就是instruction),一个输入输出对,以及一些示范(可选)组成。下面介绍了两种构造实例的方法。

  1. Formatting Existing Datasets. 这种方法需要使用人手写的任务描述来增强有标签数据集,具体来说是通过解释任务目标来指示LLMs理解任务,就如同上图中所示,为每一个Q&A任务中的实例添加任务描述:please answer this question。现有工作证明了,经过instruction tuning之后,LLMs可以在其他任务上根据他们的任务描述表现得很好,而且去掉任务描述会导致模型性能急剧下降。在这里,作者提供了一个很好的平台PromptSource,通过这个平台可以高效的创建、分享、验证不同数据集的任务描述。
  2. Formatting Human Needs. 根据公共数据集构造的指令缺乏多样性,且很多跟人类的真实需求不匹配,因此有了这种方法,将用户提交给OpenAI API的查询作为任务描述,此外还要求标注人员为现实生活中的例子构造指令,接着由另一组标注人员人工回答这些问题作为输出。这样就得到了一个实例:instruction是用户的问题,output是人工的回答。

下面是一些构造实例的关键因素:

  1. Scaling the instructions. 以往工作表明增大任务的数量可以增强LLMs的泛化能力,模型的性能表现随着任务数量的增加而先增加后不变。一个合理的推测是,一定数量的代表性任务就可以提供相对足够的知识了。此外还可以通过增加任务描述的多样性来提升模型的性能表现。但是需要注意的是,每个任务的实例数不能太多(例如数十万),否则会导致过拟合,损害模型性能。
  2. Formatting design. 指令的格式也会影响模型的泛化性能,必选的任务描述是模型理解任务的关键点,可选的示例可以促进模型对任务的理解,并降低其对指令的敏感性。但是如果将其他的东西,比如原因,建议等加入指令可能甚至会产生不利影响。此外,最近爆火的CoT可以被用于一些推理任务中,以激发模型的逐步推理能力。

总的来说,指令的多样性比实例的数量更加重要,InstructGPT和Alpaca就是例子,它们的指令实例数量不多但足够多样化,因此都有着不错的表现。此外,由标注人员根据人类真实需求构建的数据集比使用特定任务数据集效果更好,因此可以通过重用已有的格式化数据集以及使用现有LLMs自动构建指令来构造数据集(类似借助ChatGPT)。

Instruction Tuning Strategies

指令微调策略比预训练更高效,因为这种方法只会使用中等数量的实例(而非全部)进行有监督训练。且前者与后者相比有许多方面不同:比如训练目标,优化时的配置(小的bs,小的学习率)等,除了这些小的方面外还有两个重要的方面:

  1. Balancing the Data Distribution. 指令微调中会包含多种任务的数据,因此需要平衡这些任务的比例,最普遍的方法是实例-比例混合策略,做法就是混合所有数据,然后均匀采样。高质量的数据占比越高那么模型的性能通常会越好,但是往往会设置一个上限来防止某个数据集占据绝对的主导地位。
  2. Combining Instruction Tuning and Pre-Training. 有两种方法组合这两个过程,第一种方法就是两阶段过程,先预训练,然后指令微调,在这种方法里,可以在指令微调时加入预训练数据,使微调过程更有效稳定;第二种方法是采用一阶段过程,使用多任务学习方法,同时在纯文本的预训练数据和指令格式化微调数据集上进行训练。

The Effect of Instruction Tuning

  1. Performance Improvement. 简而言之,指令微调是有效且高效的方法。
  2. Task Generalization. 简而言之,指令微调可以让模型具有更好地泛化能力(甚至在跨语言相关任务上也会有提升)。

Alignment Tuning

在这一部分中,作者介绍了alignment tuning的相关知识,人类反馈数据的收集,以及根据人类反馈进行强化学习的技术。

Background and Criteria for Alignment

  1. Background. LLMs的能力十分强大,但是有可能会输出虚假信息,或者有害的、有误导性的、有偏见的回答,这说明LLMs缺乏对人类价值观和偏好的考虑。为了应用于实际生活场景,需要让模型的输出同我们人类的普遍期望具有一致性,即使有研究证明这种alignment会损害模型的能力。
  2. Alignment Criteria. 人们设定了各种标准来调节LLMs的行为.
    • helpful标准.
    • honestly标准.
    • harmless标准.

Collecting Human Feedback

这一部分讨论了如何选择一个人类标注团队来进行人类反馈数据的收集。

  1. Human Labeler Selection. 当前获得人类反馈数据的最主要的方法就是人类标注,这要求标注人员至少在受教育程度和语言表达上应该令人满意。即使是这样,还存在研究人员期望和标注人员行为不一致的问题,为了解决这个问题InstructGPT专门设计了一个筛选的过程。具体来说,研究人员要首先标记少量的数据,然后评估他们自己的标注和标注人员的标注之间的一致性,一致性最高的标注人员将被选中来进行后续的标注工作。
  2. Human Feedback Collection. 当前主要有三种收集反馈和偏好数据的方法。
    • Ranking-based collection. 早期的工作中,标注人员往往只选择模型最好的输出,但是不同标注人员对“最佳”的选择是有偏差的;此外这样粗粒度的处理方式忽略了其他的输出样本,这是不合适的。因此有了这种方法,对输出的结果进行排序,然后以此排序结果作为指导,引导模型学习应当偏向输出哪些结果而非另一些。
    • Question-based collection. 标注人员通过回答研究人员设计的某些问题来提供更详细的反馈。
    • Rule-based collection. 这种方法是设计一系列规则来测试模型生成的结果是否符合之前提到的诸如有用、诚实、无害等对齐标准。

Reinforcement Learning from Human Feedback

为了让LLMs的输出同人类的价值观对齐,研究人员采用强化学习算法,通过学习奖励模型,让LLMs偏向于生成人类需要的结果。

  1. RLHF System. RLHF系统由已训练好等待对齐的LLM、从人类反馈中学习的奖励模型、训练LLM的强化学习算法组成。详细来说,就是用预训练模型作为对齐后模型的初始化(例如使用175B的GPT-3作为InstructGPT的初始化),以奖励模型(RM 可以是另一个经过微调的 LM,也可以是根据偏好数据从头开始训练的 LM,如InstructGPT使用的奖励模型就是6B的GPT-3)生成的标量形式的人类对LLM生成文本的偏好程度作为指导,使用强化学习算法(最常用的是PPO算法)对初始化后的参数进行更新。

  2. Key Steps for RLHF. 下图展示了RLHF系统的工作流程。它分为三个步骤:

    workflow

    • Supervised fine-tuning. 这一步是用额外的文本或者条件对这个 LM 进行微调,例如 OpenAI 对 “更可取” (preferable) 的人工生成文本进行了微调,而 Anthropic 按 “有用、诚实和无害” 的标准在上下文线索上蒸馏了原始的 LM。值得注意的是,这一步是非必须的。
    • Reward model training. 这一步采样一些Instruct或者Prompt,送入上一步的LM中,生成一定量的输出文本,然后由标注人员对这些输出进行排序(直接打分的话人类的主观偏差会导致反馈数据充满噪声),RM的任务就是通过预测这个排名来学习人类的偏好。值得注意的是,目前成功的 RLHF 系统都使用了和生成模型具有 不同 大小的 LM,这或许是因为偏好模型和生成模型需要具有类似的能力来理解提供给它们的文本。
    • RL fine-tuning. 这一步的具体操作是将Instruct或者prompt输入初始模型和经过第一步微调之后的模型,分别得到输出文本,然后将微调后模型输出的文本送入RM模型,得到一个标量值作为奖励,然后计算两个模型的生成文本之间的KL散度作为惩罚(这一项被用于惩罚 RL 策略在每个训练批次中的生成大幅偏离初始模型的情况,以确保模型输出合理连贯的文本。如果去掉这一惩罚项可能导致模型在优化中生成乱码文本来愚弄奖励模型以获得高奖励值),最后结合标量奖励和KL惩罚调整模型的参数。

Utilization

在经过预训练和适应性调整之后,大家会为解决不同的任务而设计恰当的提示策略来利用这些LLMs。在这一部分中,作者分别介绍了In-context learning和Chain-of-thought prompting两种策略,前者以自然语言的形式进行任务描述或者示范,后者可以通过包含一系列中间推理步骤来增强上下文学习。

In-Context Learning

In-context learning是prompt learning的一种特殊形式。下图是GPT-3论文中的插图,介绍了多任务学习和In-context learning的结合方法。

In-context_learning

下图介绍了In-context learning和Chain-of-thought两种方法。

ICL_CoT

Prompting Formulation

标准的In-context learning是GPT-3提出的,它使用了格式化的自然语言提示,包括任务描述和几个任务示范,值得注意的是这几个任务示范只是帮助LLMs识别将要执行的任务,而不进行梯度更新。

Demonstration Design

ICL的有效性受到示范设计的高度影响,而示范设计又包含三个重要的方面:

  • Demonstration Selection. 选择方法包含启发式方法(例如用KNN选择跟查询的语义相关的示范等)和基于LLM的方法(用LLM添加不同示范之后的性能增益来衡量每个示范的信息量等)两种。
  • Demonstration Format. 格式化的结果应当如前图所示。任务描述的优化可以通过在Natural Instructions v2数据集上调优实现,这个数据集是一个由人类编写的任务描述组成的大规模数据集。
  • Demonstration Order. 有研究发现模型倾向于给出演示中靠后的例子的答案,因此演示的顺序也很重要,除了早期的启发式方法外,还可以使用全局和局部熵度量来对不同的演示顺序进行评分。

Chain-of-Thought Prompting

Chain-of-Thought是一种改进的提示策略,通过添加中间推理步骤来增强模型的推理能力。

In-context Learning with CoT

  • Few-shot CoT. 将<输入,输出>对变成了<输入,CoT,输出>三元组。以往工作证明了每个问题的多个CoT可以提高性能,以及复杂CoT更能激发LLMs的推理能力,但是它们都依赖于带注释的CoT数据集,因此Auto-CoT使用的Zero-shot-CoT应运而生,它通过提示LLMs来生成CoT。
  • Zero-shot CoT. 不包含人工注释的任务演示。相反,它直接生成推理步骤,然后使用生成的CoT来推导答案,当模型规模超过一定规模时,这种策略可以大大提高性能。

Further Discussion on CoT

  • When CoT works for LLMs? 模型参数超过100亿才有效,而且只对需要推理的任务提升最明显。
  • Why LLMs Can Perform CoT Reasoning? 人们普遍认为是通过在代码上进行预训练使得模型获得了推理的潜能。