读《通向AGI之路:大型语言模型(LLM)技术精要》笔记整理

type
Post
status
Published
summary
ChatGPT出现后惊喜或惊醒了很多人。惊喜是因为没想到大型语言模型(LLM,Large Language Model)效果能好成这样;惊醒是顿悟到我们对LLM的认知及发展理念,距离世界最先进的想法,差得有点远。本文试图回答下面一些问题:ChatGPT是否带来了NLP乃至AI领域的研究范式转换?如果是,那会带来怎样的影响?LLM从海量数据中学到了什么知识?LLM又是如何存取这些知识的?随着LLM规模逐步增大,会带来什么影响?什么是In Context Learning?为什么它是一项很神秘的技术?它和Instruct又是什么关系?LLM具备推理能力吗?思维链CoT又是怎么做的?等等,相信看完,能让您对这些问题有一个答案。
slug
llm-technical-essentials
date
Jan 29, 2024
tags
LLM
技术精要
张俊林
category
大语言模型
password
icon
URL
Property
Feb 29, 2024 08:21 AM
概要导图
notion imagenotion image
 

范式转换

在最近10年来(2013~2023)NLP领域的技术发展过程中,可能存在两次大的研究范型转换。

范式转换1.0:从深度学习到两阶段预训练模型

Bert/GPT出现之前:

  1. 关键技术:
      • 以大量的改进LSTM模型及少量的改进CNN模型作为典型的特征抽取器
      • 以Sequence to Sequence(或叫encoder-decoder亦可)+ Attention作为各种具体任务典型的总体技术框架
  1. 研究方向:怎么才能往encoder和decoder里不断叠加更深的LSTM或CNN层,来达成增加层深和模型容量的目标
  1. 范式效果:和非深度学习方法相对,带来的优势不算大
  1. 效果不好的原因:
      • 一方面是某个具体任务有限的训练数据总量。
      • 另外一个方面是LSTM/CNN特征抽取器,表达能力不够强。

Bert/GPT出现之后:

  1. 部分NLP研究子领域(中间任务)的衰退乃至逐步消亡
    1. 💡
      中间任务和最终任务
      典型的中间任务包括:中文分词、词性标注、NER、句法分析、指代消解、语义Parser等,这类任务一般并不解决应用中的实际需求,大多数是作为那些解决实际需求任务的中间阶段或者辅助阶段存在的。中间任务的出现是NLP技术发展水平不够高的一种体现。
      最终任务包括比如:文本分类、文本相似性计算、机器翻译、文本摘要等等,有很多。这类任务的特点是每个子领域都解决某个实际需求,任务结果基本能直接呈现给用户,比如用户确实存在给你一句英文,告诉他中文是什么的需求。
      Bert/GPT已经把这些中间任务作为语言学特征,吸收到了Transformer的参数里,此时我们完全可以端到端地直接解决那些最终任务,而无须对这种中间过程专门建模
  1. NLP不同子领域的技术方法和技术框架日趋统一,技术栈基本收敛到两种技术模式中
    1. 💡
      最终任务又可以分为:
      • 自然语言理解类任务(本质上都是分类任务)
        • 文本分类、句子关系判断、情感倾向判断等
      • 自然语言生成类任务
        • 聊天机器人、机器翻译、文本摘要、问答系统等
      • 特征抽取器都逐渐从LSTM/CNN统一到Transformer上
      • 对于自然语言理解类任务,其技术体系统一到了以Bert为代表的“双向语言模型预训练+应用Fine-tuning”模式;
      • 而对于自然语言生成类任务,其技术体系则统一到了以GPT 2.0为代表的“自回归语言模型(即从左到右单向语言模型)+Zero /Few Shot Prompt”模式。

范式转换2.0:从预训练模型走向通用人工智能

过渡期:以GPT 3.0为代表的“自回归语言模型+Prompting”模式占据统治地位

  1. GPT”系胜利的原因:
      • 自然语言生成任务,在表现形式上可以兼容自然语言理解任务,若反过来,则很难做到这一点。同一个LLM生成模型,可以解决几乎所有NLP问题。而如果仍然采取Bert模式,则这个LLM模型无法很好处理生成任务。
      • 如果想要以零示例提示语(zero shot prompting)或少数示例提示语(few shot prompting)的方式做好任务,则必须要采取GPT模式。
      💡
      已有研究(参考:On the Role of Bidirectionality in Language Model Pre-Training)证明:如果是以fine-tuning方式解决下游任务,Bert模式的效果优于GPT模式;若是以zero shot/few shot prompting这种模式解决下游任务,则GPT模式效果要优于Bert模式。
  1. 一个理想的LLM该有的样子:
      • 首先,LLM应该具备强大的自主学习能力。因为数据是海量的,要吸收所有知识,就要非常多的模型参数来存储知识,所以这个模型必然会是一个巨无霸模型。
      • 其次,LLM应该能解决NLP任何子领域的问题,而不仅支持有限领域,甚至它应该可以响应NLP之外其它领域的问题,最好是任意领域的问题都能得到很好地回答。
      • 再者,当我们使用LLM解决某个具体领域问题的时候,应该用我们人类习惯的表达方式,就是说LLM应该理解人类的命令。这体现出让LLM适配人,而不是反过来,让人去适配LLM模型。人适配LLM的典型例子,比如绞尽脑汁去尝试各种不同的prompt,以试图找到好的提示语,才能很好地解决手头问题。(说的是 GPT3.0 时代,通过调整提示的方式来控制生成的文本的方向和风格。)
  1. 为什么我们要追求zero shot/few shot prompting这种方式来做任务呢?
      • 模型规模巨大,很少有机构或个人有能力去部署,所用微调参数的方式来做任务基本行不通;而模型支持方,考虑到用户千变万化的需求要追求让LLM能完成尽可能多类型的任务
      • 研究发现:对于某项任务,如果给LLM几个示例,用这些示例来代表任务描述,效果会比zero shot prompting;可以理解为,本来我们希望LLM能够用人类常用的命令方式来执行某个任务,但是目前技术还做不到,所以退而求其次,用这些替代技术来表达人类的任务需求。

新的技术范式转换:ChatGPT的出现,用Instruct取代了Prompting

影响一:让LLM适配人的新型交互接口
适配人的交互接口的实现:注入“人类偏好知识”
  • 首先,是人类表达一个任务的习惯说法。人类习惯用特定语言表达任务需求,但是人工智能需要通过标注数据来理解这些命令的含义并正确执行。ChatGPT通过人工标注数据(量级只有数万)向GPT 3.5注入这类知识,使其能够“善解人意”。
  • 其次,人类对回答的好坏有自己的标准。ChatGPT通过Reward Model将人类偏好知识注入GPT 3.5,从而获得一个听得懂人话、比较礼貌的LLM。
💡
ChatGPT的最大贡献在于:基本实现了理想LLM的接口层,让LLM适配人的习惯命令表达方式,而不是反过来让人去适配LLM,这增加了LLM的易用性和用户体验。
影响二:很多NLP子领域不再具备独立研究价值
经过第一次范式转换,尽管NLP中很多“中间任务”,继续作为独立研究领域存在不再必要,但是大多数“最终任务”,仍然是以独立研究领域存在的,只是切换成在“预训练+fine-tuning”框架下,面对领域独有问题,陆续提出新的改进方案。
目前研究表明,很多NLP任务,随着LLM模型规模增长,效果会大幅提升。据此,大多数某领域所谓“独有”的问题,大概率只是缺乏领域知识导致的一种外在表象,只要领域知识足够多,这个所谓领域独有的问题,就可以被很好地解决掉,其实并不需要专门针对某个具体领域问题,冥思苦想去提出专用解决方案。
影响三:更多NLP之外的研究领域将被纳入LLM技术体系
  • 图像处理任务
  • 多模态任务
  • 其他任务

GPT 3.0之后LLM模型的主流技术进展

相关的技术其实可以分为两大类

  • 第一类是关于LLM模型如何从数据中吸收知识,也包括模型规模增长对LLM吸收知识能力带来的影响;
  • 第二类是关于人如何使用LLM内在能力来解决任务的人机接口,包括In Context Learning和Instruct两种模式。思维链(CoT)prompting本质上也属于In Context Learning

学习者:从无尽数据到海量知识

Transformer学到了什么?知识是如何存取的?我们又如何修正错误知识?

求知之路:LLM学到了什么知识

  • 语言类知识:指的是词法、词性、句法、语义等有助于人类或机器理解自然语言的知识。
    • 各种实验充分证明LLM可以学习各种层次类型的语言学知识,这也是为何使用预训练模型后,各种语言理解类自然语言任务获得大幅效果提升的最重要原因之一。
    • 各种研究也证明了浅层语言知识比如词法、词性、句法等知识存储在Transformer的低层和中层,而抽象的语言知识比如语义类知识,广泛分布在Transformer的中层和高层结构中。
  • 世界知识:指的是在这个世界上发生的一些真实事件(事实型知识,Factual Knowledge),以及一些常识性知识(Common Sense Knowledge)。
    • LLM确实从训练数据中吸收了大量世界知识,而这类知识主要分布在Transformer的中层和高层,尤其聚集在中层。而且,随着Transformer模型层深增加,能够学习到的知识数量逐渐以指数级增加(可参考:BERTnesia: Investigating the capture and forgetting of knowledge in BERT)
    • 💡
      “When Do You Need Billions of Words of Pre-training Data?”这篇文章研究了预训练模型学习到的知识量与训练数据量的关系,它的结论是:对于Bert类型的语言模型来说,只用1000万到1亿单词的语料,就能学好句法语义等语言学知识,但是要学习事实类知识,则要更多的训练数据。

记忆之地:LLM如何存取知识

知识存储在Transformer的模型参数里
  • 多头注意力(MHA):占了大约参数总体的三分之一的参数量,主要用于计算单词或知识间的相关强度,并对全局信息进行集成,更可能是在建立知识之间的联系,大概率不会存储具体知识点
  • 前馈神经网络(FFN):LLM模型的知识主体是存储在Transformer的FFN结构里,占了总参数的三分之二。“Transformer Feed-Forward Layers Are Key-Value Memories”给出了一个比较新颖的观察视角,它把Transformer的FFN看成存储大量具体知识的Key-Value存储器。

知识涂改液:如何修正LLM里存储的知识

目前有三类不同方法来修正LLM里蕴含的知识:
  • 从训练数据的源头来修正知识:
    • 对于模型的某个知识,能定位是哪条数据导致模型学到了这个知识(参考文章:“Towards Tracing Factual Knowledge in Language Models Back to the Training Data”)
    • 定位到知识后删除或修改知识,重新训练模型
    • 缺点:成本太高;可能比较适合那种对于某个特定类别数据的一次性大规模删除场合,不适合少量多次的常规知识修正场景,比如可能比较适合用来做去除偏见等去toxic内容的处理。
  • 对模型做Fine-tuning来修正知识:
    • 可以根据要修正成的新知识来构建训练数据,然后让LLM模型在这个训练数据上做fine-tuning,这样指导LLM记住新的知识,遗忘旧的知识。
    • 问题:
      • 可能会带来灾难遗忘问题,就是说除了忘掉该忘的知识,还忘掉了不该忘的知识,导致这么做了之后有些下游任务效果下降。
      • 因为LLM模型规模非常大,即使是做fine-tuning,如果次数频繁,其实成本也相当高。对这种方法感兴趣的可以参考“Modifying Memories in Transformer Models”。
  • 直接修改某些知识对应的参数来修正知识:
    • 首先是如何在LLM参数空间中定位某条知识的具体存储位置;
    • 其次是如何修正模型参数,来实现旧知识到新知识的修正。关于这类技术的细节,可以参考“Locating and Editing Factual Associations in GPT”和“Mass-Editing Memory in a Transformer”。

规模效应:当LLM越来越大时会发生什么

现有研究已证明,预训练阶段的优化指标确实和下游任务表现出正相关关系,但是并非完全正相关。只看预训练阶段的指标,来判断一个LLM模型是否够好,这是不够的。

预训练阶段

优化目标是交叉熵,对GPT这种自回归语言模型来说,也就是看LLM是否正确预测到了下一个单词;
研究来源1:Scaling Laws for Neural Language Models——OpenAI
研究表明:模型效果与训练数据量、模型参数量、模型训练时间正相关;但是如果在算力给定的情况下,应该优先调整增加数据量和参数量,并且是按比例同步增加,而这两个变量中参数量的优先级还要更高。
对模型产生影响优先级:模型参数量 > 模型数据量 > 模型训练时间
假设用于训练LLM的算力总预算增加了10倍,那么应该增加5.5倍的模型参数量,1.8倍的训练数据量,此时模型效果最佳。
研究来源 2:Training Compute-Optimal Large Language Models——DeepMind
研究表明:在 OpenAI 的研究基础上提出,训练数据量、模型参数量是同等重要的,他们的比例应该相等。
对模型产生影响优先级:模型参数量 = 模型数据量 > 模型训练时间
假设用于训练LLM的算力总预算增加了10倍,那么应该增加3.3倍的模型参数量,3.3倍的训练数据量,这样模型效果才最好。
另一种做法是调整数据量为原来的x倍,同时调整模型参数为原来的1/x倍,也能取得较好的效果,并且附带的好处是训练出来的模型规模更小,更有利于部署应用且推理速度更快。
DeepMind在设计Chinchilla模型时,选择增加4倍的训练数据,但是将模型参数降低为Gopher的四分之一。但是无论预训练指标,还是很多下游任务指标,Chinchilla效果都要优于规模更大的Gopher。

场景应用阶段

不同类型的任务有不同的表现;优化方向一般要看具体场景的评价指标;
第一类:知识密集型任务;
LLM模型包含的知识量越多,这类任务表现越好。
越大的LLM模型学习效率越高,也就是说相同训练数据量,模型越大,学到的知识更多,任务效果越好。
第二类:“涌现型任务”
  • 涌现现象:在模型参数没有达到阈值之前,模型表现和随机选择答案相当;当超过阈值时,模型效果爆炸增长。也就是说模型规模是解锁(unlock)LLM新能力的关键,随着模型规模越来越大,会逐渐解锁LLM越来越多的新能力。
  • 涌现任务特性:一般由多步骤构成,要解决这些任务,往往需要先解决多个中间步骤,而逻辑推理能力在最终解决这类任务中发挥重要作用。——Beyond the Imitation Game: Quantifying and extrapolating the capabilities of language models
  • 涌现能力出现的原因:——Emergent Abilities of Large Language Models
    • 可能性一(待证实):任务的评价指标不够平滑;
      • 比如某些任务要求生成的文本要和标准答案完全一样才算正确,即使随着模型增大,其效果在逐步变好,体现为输出了更多的正确字符片段,但是因为没有完全对,只要有任何小错误都给0分,只有当模型足够大,输出片段全部正确才能得分。因为指标不够平滑,所以不能体现LLM其实正在逐步改善任务效果这一现实,看起来就是“涌现能力”这种外在表现。
    • 可能性二(待证实):任务由若干中间步骤构成;
      • 随着模型规模增大,解决每个步骤的能力也在逐步增强,但是只要有一个中间步骤是错的,最终答案就是错的,于是也会导致这种表面的“涌现能力”现象。
第三类:U型特性任务
随着模型规模逐渐变大,任务效果逐渐变差,但是当模型规模进一步增长,则效果开始越来越好,呈现出U形增长趋势

人机接口:从In Context Learning到Instruct理解

神秘的In Context Learning

Fine-tuning和In Context Learning都能通过提供一些例子来实现对新数据的预测,那他们的区别在哪?
  • Fine-tuning:Fine-tuning拿这些例子当作训练数据,利用反向传播去修正LLM的模型参数,而修正参数的过程就是学习的过程。
  • In Context Learning并没有对例子数据进行学习,却也能做出正确的预测。但具体怎么实现的,还有研究空间。
    • Rethinking the Role of Demonstrations: What Makes In-Context Learning Work?——试图证明In Context Learning没有从例子中学习,结果还表明:真正对In Context Learning影响比较大的是输入文本的分布和候选答案有哪些,如果你改变这两个分布,则In Context Learning效果急剧下降。
    • What learning algorithm is in-context learning? Investigations with linear models——认为LLM隐式地从数据中学到了映射关系

神奇的Instruct理解

第一种:偏学术研究的Instruct
能够有效增加LLM模型Instruct泛化能力的因素包括:增加多任务的任务数量、增加LLM模型大小、提供CoT Prompting, 以及增加任务的多样性。如果采取任意一项措施,都可以增加LLM模型的Instruct理解能力。—— Scaling Instruction-Fine-tuned Language Models 、 Super-NaturalInstructions: Generalization via Declarative Instructions on 1600+ NLP Tasks
第二种:真实需求下的Instruct
从用户数据中收集真实需求,这事情是很重要的。——InstructGPT论文

In Context Learning和Instruct的联系

给LLM一些示例,让LLM自动生成能够描述这项任务的自然语言命令,LLM生成的Instruct的效果有极大地提升,而且在一些任务上超过人类的表现。——Large Language Models Are Human-Level Prompt Engineers
这说明了:具象的任务示例和任务的自然语言描述之间,有种神秘的内在联系。

智慧之光:如何增强LLM的推理能力

基于Prompt的方法:通过合适的提示语或提示样本,更好地激发出LLM本身就具备的推理能力

  • 第一种思路:直接在问题上追加辅助推理Prompt——Large language models are zero-shot reasoners
    • 第一阶段:在提问的问题上追加“Let’s think step by step”这句提示语,LLM会输出具体的推理过程;
    • 第二阶段:在第一阶段的问题后,拼接LLM输出的具体推理过程,并再追加Prompt=“Therefore, the answer (arabic numerals) is”。
  • 第二种思路:基于示例的思维链(few-shot CoT,Chain of Thought)Prompting
    • Chain of Thought:给出一些人工写好的推理示例,示例里把得到最终答案前,一步步的具体推理步骤说清楚,而这些人工写的详细推理过程,就是思维链Prompting。输出一个推理过程和答案
      • ——Chain of thought prompting elicits reasoning in large language models——202201
      • ——Show Your Work: Scratchpads for Intermediate Computation with Language Models
    • Self-Consistency:利用CoT给出几个写了推理过程的示例,然后要求LLM输出多个不同的推理过程和答案,然后采用投票的方式选出最佳答案
      • ——Self-Consistency Improves Chain of Thought Reasoning in Language Models——202203
    • 继续改进:从一个Prompt问题拓展到多个Prompt问题、检查推理中间步骤的正确性以及对多个输出的回答加权投票
      • On the Advance of Making Language Models Better Reasoners
  • 第三种思路:对于一个复杂的推理问题,把它分解成若干容易解决的子问题,再从子问题的答案推导复杂问题的答案
    • 第一个阶段:假设最终问题是Final Q,先问LLM:“如果要解决Final Q问题,那么我需要先解决什么问题?”,让LLM给出最终问题的前置子问题Sub Q;
    • 第二个阶段,将LLM给出的子问题Sub Q再输入给LLM得到答案,然后原始问题拼接子问题Sub Q及对应答案,再去问LLM最终那个问题Final Q。

基于预训练的方法:在预训练过程中引入程序代码来增强模型的推理能力

如果能够加入程序代码一起参与模型预训练,则能大幅提升LLM模型的推理能力,论文支撑:
  • AUTOMATIC CHAIN OF THOUGHT PROMPTING IN LARGE LANGUAGE MODELS
  • Challenging BIG-Bench tasks and whether chain-of-thought can solve them
  • On the Advance of Making Language Models Better Reasoners
为何预训练模型可以从代码的预训练中获得额外的推理能力?有待研究……

关于LLM推理能力的思考(作者的主观判断,没有太多论文依据)

LLM推理本质上很可能会是如下两种可能的其中之一:
  • 不断和LLM进行交互的图上推理问题
    • 假设有办法能够把复杂问题拆解成由子问题或者子步骤构成的图结构,节点和边分别代表子问题(子步骤)和依赖关系,只有先回答上一级的子步骤或子问题,才能回答后一级的问题或步骤,直到推导出最终答案
  • 不断和LLM进行交互的程序流程图执行问题

未来之路:LLM研究趋势及值得研究的重点方向

  1. 探索LLM模型的规模天花板
      • 首先,对于知识密集型的任务,随着模型规模越大,各种任务的效果会越来越好;
      • 其次,考虑到LLM具备的神奇的“涌现能力”,如果我们继续增加模型规模,它会解锁哪些让我们意想不到的新能力呢?
  1. 增强LLM的复杂推理能力
      • 目前LLM能够解决得比较好的推理问题,往往都相对简单,LLM的复杂推理能力仍然薄弱——Limitations of Language Models in Arithmetic and Symbolic Induction/Large Language Models Still Can’t Plan
      • 加强LLM的复杂推理能力,应该是LLM未来研究中最重要的环节之一
        • 引入代码加入预训练,这是一种直接增强LLM推理能力的方向
        • 引入更多类型除代码外的新型数据来增强LLM的推理能力,这可能是更本质提升推理能力的方向。
  1. LLM纳入NLP之外更多其它研究领域
  1. 更易用的人和LLM的交互接口
  1. 建设高难度的综合任务评测数据集
  1. 高质量数据工程
  1. 超大LLM模型Transformer的稀疏化

取经之路:复刻ChatGPT时要注意些什么

第一:预训练模型的选择
  • GPT 自回归语言模型(Decoder)✅
  • Bert 双向语言模型(Encoder)
  • T5 混合模式(Encoder-Decoder)
第二:如何具备强大的推理能力?
  • 引入大量代码和文本一起进行LLM训练
第三:在控制模型参数的情况下如何把效果做到最好?
  • 走Chinchilla的路子:参数量更小,数据量更大
  • 走检索增强的路子:文本检索(Retrieval based)模型+LLM的路线
  • 以上两个技术方向不互斥,反而是互补
第四:如何通过技术手段降低LLM的训练成本?
  • LLM的特征抽取器Sparse化是有效降低模型训练及推理成本的技术选择
第五:如何增加LLM新能力
  • 支持越来越多的任务类型,主要是通过增加LLM预训练数据的多样性来达成的,数据多样性越好,LLM能够支持的任务类型就越丰富
第六:第六,易用的人机操作接口
  • 人类用他们自己习惯的表达方式来描述任务,而LLM要能够理解这些Instruct的真实含义,这些Instruct是符合人类真实需求的

ChatGPT:为什么是OpenAI

OpenAI始终始终坚定不移地走生成模式的自回归语言模型路线,即使在早期GPT的效果不如Bert也没有更换赛道

名词解释

  • AGI (Artificial General Intelligence):通用人工智能;指的是能够进行多种智能任务的人工智能技术。相比之下,狭义人工智能只能完成特定任务。
  • Instruct:一种方便人类理解的任务表述,用于接收和理解用户的指示或命令,并根据指示或命令生成相应的输出。
  • zero shot prompting:零样本提示;在没有任何示例的情况下,通过提示让模型对新类别进行生成或识别。
  • few shot prompting:少样本提示(也被称为In Context Learning);在只有少量示例的情况下(通常是几个或几十个),通过提示让模型对新类别进行生成或识别。
  • CoT(few-shot CoT,Chain of Thought, 思维链):让语言模型不断学习和模拟人类的解决问题思维过程,从而提高其推理能力和可解释性。核心思想是让语言模型不仅仅生成答案,还生成解决问题的步骤和思路。
  • Fine-tuning:微调;是指在一个预训练的神经网络模型上进行微调,以适应特定的下游任务。它可以被视为一种迁移学习技术,可以有效地利用已有的预训练模型,并在少量的数据集上进行训练,以实现高效和准确的模型训练。
  • FFN(Feed-Forward Neural Network)结构是一种前馈神经网络,它用于进行特征转换和非线性变换。在Transformer模型中,FFN结构通常被用于在Self-Attention层之后进行特征转换,以提高模型的表示能力。
对于本文内容有任何疑问, 可与我联系.