预训练:NTP和Scaling Law

做预训练绕不开这两个主题,尤其是Scaling Law,NTP探讨智能如何产生,对宏观思想认知有极大帮助。

其实,关于NTP为什么能产生智能这个问题笔者在2023年和几个从业者探讨过,见这篇博客,当时大家的答复并没让笔者完全信服。现在,又要开始探讨了。至于原因,大家看完文章就知道了。

NTP

也就是Next Token Prediction,不知道有没有人和笔者一样好奇,为什么NTP能产生智能。关于这个问题,看过最精彩的回答非张俊林博士在知乎上的回答了。

核心是这篇:世界的参数倒影:为何GPT通过Next Token Prediction可以产生智能 - 知乎。核心观点罗列如下(内容来自博客文章),非常非常精彩,建议阅读原文——至少两遍。

压缩即智能

  • 基于算术编码的思想,GPT生成Next Ground Truth Token的概率越高,其在算术编码分割区间中占据的长度就越长,就越容易找到更短的算术编码,意味着压缩率越高。即模型智能程度越高,NTP预测得越准确,则其压缩效率就越高。关于算术编码可以阅读文中提到的文章,极妙。
  • 如果从信息熵的角度看,完全随机熵最大,每个Token概率一致,信息量为零;如果NTP是确定的100%概率,则熵为零,信息量最大。模型的压缩能力介于二者之间。对于数据xi,算术编码需要的bit数为 log2(Pi(xi))-\text{log}_2 (P_i(x_i)),正好和预训练的目标函数(交叉熵)一致。
  • 规模越大的LLM,其对应的Loss越小,意味着这个模型压缩率越高,压缩能力越强,而这进一步代表模型的智能程度越高。
  • 为何模型压缩能力越强,就代表了它具备更高的智能?最小描述长度原理(MDL),即如果有多个模型可以解释现象,模型描述长度越短,泛化性越好,也就是越智能。
  • “LLM+算术编码”实现对数据的无损压缩。如果LLM通过学习达到足够强的智能程度,能够保证NTP预测后续文字序列的loss是0,也就是说可以根据上文Context,完全精准预测后续Next Token,此时算术编码就不需要了,仅靠LLM就能完整地对数据进行压缩和解码。数据无损压缩=LLM模型的有损数据压缩能力+算术编码的编码补偿能力

通过NTP学到了什么智能

GPT对知识的提取过程

  • Dissecting Recall of Factual Associations in Auto-Regressive Language Models 的三阶段提取:
    • 阶段1:发生在Transformer底层,实体的最关键的词汇会不断集成信息,触发更多相关属性词汇。
    • 阶段2:发生在Transformer底层,上下文的重要信息通过Attention集成到提示词最后一个位置。
    • 阶段3:发生在Transformer高层,最后一个位置在高层通过Attention Heads把编码的知识提取出来(Attention Head里会编码<实体-属性>信息)。
  • Understanding Transformer Memorization Recall Through Idioms 的两阶段提取:
    • 阶段1:低层Transformer Block把正确答案单词的排名逐渐提高,直到中间层排到了第一名。
    • 阶段2:高层Transformer把正确答案的置信度提高,即不断提高正确答案的分布概率。
  • 总结:
    • 输入Prompt,对于某个位置的Token,随着Transformer 不断往上走,GPT通过Attention,把这个Token上文中与自己有关的信息集成到自己的Embedding里,而每层的FFN对当前Token的Embedding做变换增加信息,以此不断触发FFN里存储的知识并逐层Refine单词对应的Embedding。
    • last token特殊之处在于,从底层到上层,首先会把整个输入上文中最关键的信息,通过Attention拷贝到自己的位置,之后通过这个关键信息逐步过滤出上下文中比较重要的信息。底层有很多候选答案,随着层数往上走,正确答案排名越来越靠前,而且可以和正确答案竞争的候选答案越来越少(体现为分配给正确答案的概率分布得分越来越高),直到last token的最高层,GPT可以输出正确答案。

知识点的分布

  • 关键概念:
    • 单语义神经元:只会被特定输入模式激活,对其它无关输入保持沉默,一个神经元编码一个知识。
    • 多语义神经元:很多不同语言含义的知识点都会激活某个神经元。
    • Superposition:一种信息压缩编码机制,用d维神经元编码比d数量大得多的n个特征。由多个“多语义神经元”联合(线性组合)构成。“多语义神经元”和知识点之间的关系是多对多的映射:一个知识点会激发很多对它进行编码的“多语义神经元”,而一个“多语义神经元”也会对多个输入知识点产生响应。
  • 结论:
    • Language models can explain neurons in language models | OpenAI:Transformer对特征或知识点的编码,存在由低到高越来越抽象的一个知识抽象过程。底层编码了大量的具体特征或知识点(词法、句法特征),编码方式采用“多语义神经元”组成的superposition模式;随着Transformer层数加深,具体知识点逐渐减少,抽象知识点逐渐增加,且抽象知识点一般由“单语义神经元”独立编码。
    • Polysemanticity and Capacity in Neural Networks:在模型学习过程中,为了增加模型参数的利用效率,“单语义神经元”会被分配给重要特征,“多语义神经元”会分配给不太重要的特征,而对更加不重要的特征,则模型完全不进行编码。“重要性”指的是对训练loss的影响。说明对特征或知识点进行抽象,是NTP本身为了快速降低Loss的一种内在驱动力。

知识回路证据

所谓“回路”,指的是某个任务的Prompt输入Transformer后,信息从底向上传播,直到last token最高层Next Token输出答案,在网络中存在一些完成这个任务的关键路径,信息主要沿着这条路径向上传播,在传播过程中不断进行信息传递或知识加工,以此方式来通过NTP完成某项任务。

How does GPT-2 compute greater-than?: Interpreting mathematical abilities in a pre-trained language model主要探讨为何GPT模型能够通过预训练获得数学能力。研究发现,模型在预训练过程中形成了解决这个问题的知识回路;而且如果变换Prompt形式,但是体现数字比较关系,被激活的也是这条回路。说明这条回路可能专门用于对数字进行关系比较。

大部分知识回路应由Attention 和MLP共同组成。Localizing Model Behavior with Path Patching探讨了Induction Head(预测Next Token的时候,倾向于从上文找到类似的输出模式,并拷贝到后续Token输出)回路(Attention为主的知识回路)。

Interpretability in the Wild: a Circuit for Indirect Object Identification in GPT-2 small发现了Transformer中存在以Attention为主,用于识别“Indirect Object Identification”(输入有两个实体,一个重复实体,一个非重复实体,如何从中找到正确答案)的知识回路(更复杂的Attention回路)。

不同规模LLM模型在学习知识点方面的差异

Finding Neurons in a Haystack: Case Studies with Sparse Probing的发现:随着模型规模增大,会出现特征分裂(Split)现象。就是说小模型表征某个知识点,只有一个粗粒度的神经元独立响应,但是大模型会对这个知识点进行细化,根据不同的Context输入,分裂出表征不同上文下这个知识点对应的多个神经元,对应神经元只有在特定上文出现才会被激活。换句话说,同样是表征某个知识点,相对小模型,大模型在表征知识点方面会做得更细致。另外,随着模型规模越来越大,会探测到更多比例的“单语义神经元”。即大的LLM模型,会对更多的抽象知识进行独立神经元编码。

The Quantization Model of Neural Scaling发现,大模型可以比小模型学到更多不那么重要的特征。

智能三性

GPT这种大语言模型智能的所谓“智能三性”,即大模型的智能体现出了组合性、可复用性以及抽象性。

  • 对于复杂的任务函数f来说,大模型通过组合若干简单的子任务回路来达成处理复杂事情的能力,
  • 相对简单的特定子回路,会出现在多个不同任务的任务回路中,形成了通用子回路被不同任务复用的情况,
  • Transformer由低到高对输入内容的加工,抽象能力越来越强。底层主要对token以及n-gram的token片段进行表征,属于具体信息编码,在逐步上传过程中,会逐步出现抽象的神经元或者attention head,再往上还会有更抽象的专用神经元。能够具备逐层抽象性是大模型具备高级智能的明显证据。

这部分观点来自:大语言模型为何拥有智能 - 知乎

为什么会形成智能

ilya的回答

ilya的采访简短但深刻:Why next-token prediction is enough for AGI - Ilya Sutskever (OpenAI Chief Scientist) - YouTube

观点如下:足够好的下一个Token意味着什么?意味着已经了解生成该Token的基本现实(上下文),这不仅仅是统计学,因为模型需要理解是什么样的现实创造了这组统计数据。

原文如下:

From the data of regular people. Because if you think about it, what does it mean to predict the next token well enough? It’s actually a much deeper question than it seems. Predicting the next token well means that you understand the underlying reality that led to the creation of that token. It’s not statistics. Like it is statistics but what is statistics? In order to understand those statistics to compress them, you need to understand what is it about the world that creates this set of statistics?

And so then you say — Well, I have all those people. What is it about people that creates their behaviors? Well they have thoughts and their feelings, and they have ideas, and they do things in certain ways. All of those could be deduced from next-token prediction. And I’d argue that this should make it possible, not indefinitely but to a pretty decent degree to say — Well, can you guess what you’d do if you took a person with this characteristic and that characteristic? Like such a person doesn’t exist but because you’re so good at predicting the next token, you should still be able to guess what that person who would do. This hypothetical, imaginary person with far greater mental ability than the rest of us.

代理任务

根据大语言模型为何拥有智能 - 知乎的观点,模型预训练通过自回归方式进行的Next Token Prediction,它是个非常好的代理任务(Proxy Task)。所谓代理任务,是说尽管我要做机器翻译任务,但是我不直接拿机器翻译数据和目标函数来训练模型,而是通过其它任务比如Next Token预测来实现。那为啥Next Token预测对很多任务的代理效果这么好呢?这是因为,大模型看似以自监督方式在做Next Token预测,但是因为预训练数据的多样性,对于很多任务来说,预训练数据中存在和这些任务有监督学习非常类似的数据,而正是这些数据,使得大模型可以通过看似自监督的方式在进行有监督训练,由此得到了解决很多任务的能力。

大模型的数学能力从何而来?情感计算能力从何而来?当Next Token预测到“等于号”的时候,以及当Next Token预测到“好评”的时候,如果预训练数据中大量存在此类数据,就是在对数学和情感判断做有监督训练,只不过是以Next Token的自监督形式存在而已,本质上还是在做有监督学习。很多其它能力的获得大概率跟这些情况是很类似的。

总而言之,数据是大模型智能的最关键因素,数据多样性决定了大模型智能的下限(提升效果较差任务的效果),而数据质量决定了大模型智能的上限(提升效果较好任务的效果)。

回路竞争猜想:任务回路的突围

文章把某个特征或知识统称为知识点,具体知识点包括:

  • 语言知识点(n-gram、词法、句法、语义等)
  • context知识点(比如“输入为法语”这种)
  • 世界知识相关知识点(实体-属性、常识、事件等)
  • 简单函数回路知识点

GPT模型通过NTP任务从数据中学习知识,在模型内部建立起两类知识体系:

  • 层级化的知识结构
  • 各种任务回路(在层级知识体系结构上建立起来的,是用于解决某个任务的、由知识点相互激发形成的固定通路)

任务回路由Transformer特定层的特定self attention节点及特定FFN单元构成,attention负责从上文找到重点信息并拷贝到last token位置,负责关键信息集成,FFN负责对信息进行转换。

大语言模型为何拥有智能 - 知乎

知识点的特征如下:

  • 知识点有不同的抽象层级。越是存储在Transformer底层的知识点,越具体、可复用程度越高、通用性越强、数量越多,越容易通过superposition和“多语义神经元”这种稠密编码方式来进行编码;越是存储在Transformer高层的知识点,越抽象、复用程度低、任务专业性越强,越倾向用“单语义神经元”方式单独编码。
  • 某些知识点之间形成了由底向上的激发关系,激发路径是由下层不那么抽象的知识点逐层激发上层越来越抽象的知识点。被激活的神经元,除了收集、综合、抽象传上来的信息,可能也通过自己的FFN结构添加新知识。GPT模型内部包含海量这种“局部”知识点构成的“微激发结构”,这应该是形成GPT智能的基础单元,从而整个GPT结构构造出对世界知识进行层级编码的世界知识结构。而根据NTP目标来训练模型,其实就是在由简单到复杂、由通用到专用、由具体到抽象、由下层到上层,在训练过程中逐渐建立起越来越复杂层级知识结构的过程,包括知识点以及知识点之间的激发关系产生的微结构,之所以会产生这些,是因为它们的存在,对于NTP精准预测之后的Token有帮助,也就是对于GPT模型在NTP时降低训练loss有用。
  • 任务回路应该是GPT为了更精准预测某种特殊类型数据的Next Token,从Transformer的输入层开始,逐层关联相关的“激发微结构”,从而形成了一个由低向上逐层激发,并最终关联到输出位置,以决定输出Token概率的完整通路结构。另外,输入的最后一个Token位置对应的各层Transformer Block,可能有些特殊含义和作用,它可能通过Attention机制,起到了对之前全体输入内容的信息汇总工作。如果输入的Prompt是完成某项具体任务的,那么Last Token对应的各层Transformer Block,大致把任务回路信息逐层汇总到了最后位置,以便于在Last Token的最高层进行正确的Next Token预测。相当于Last Token从Transformer庞大的知识体系中根据输入Prompt勾勒出了一个Prompt子世界。

在训练过程中,GPT模型会优先学习具备以下特性的知识点:高频知识点、通用知识点(被复用概率高的则通用)、具体而非抽象的知识点。因为它们在训练数据中见到的次数多,对降低NTP任务的loss贡献大,获得反向传播修正模型参数的次数也多,也容易被模型学会。反过来,低频的、领域或任务专用的、抽象的知识点,就会越晚被GPT模型学会。或者说,如果想学会这类知识点,则需要让模型见到更大量的数据,以增加这些知识点在学习过程中必要的反向传播修正参数的机会。

假设:为了提高GPT模型的参数利用率,NTP任务会鼓励子回路的复用。

所谓“子回路”,指的是完成简单运算的回路,这种回路涉及到的知识点较少,知识点之间激发的结构比较简单。GPT模型大概会优先产生很多完成简单任务或计算的子回路,而复杂回路应该是由很多子回路进一步连接形成的。为了增加模型参数的使用效率,GPT模型应该会鼓励这些子回路在不同复杂回路中尽可能被复用,这样使用同样的参数量,就能完成更多不同类型的任务。

模型规模的差异:更大的模型,更清晰的世界

小LLM模型建立了一个粗粒度的、模糊的世界图像,而随着模型规模越来越大,大LLM模型建立起能表征更多细节信息的清晰度越来越高的世界图像。

LLM模型的表征能力主要体现在两个方面:从具体到抽象的层级知识结构,以及可以解决很多问题的任务回路。

  • 层级知识结构的差异:随着模型规模增大,模型稀疏程度越来越高。单语义神经元数量占比增加。说明模型学到的知识点肯定是增加了。包括
    • 原先小模型没有学到,现在大模型学会了,从无到有地学会了新知识。再细分为两类:一类应该是世界知识(常识和事件),小模型无法编码在数据中出现频次比较低的世界知识;一类应是模型从数据中新归纳的更抽象的知识。
    • 由抽象特征进行特征分裂产生的。就是说原来小模型只有一个粗粒度的抽象知识点,现在模型大了,衍生出一些新的细粒度的表征这类知识的知识点,针对不同的上文Context可能会学到对应的一个知识点。即使是抽象知识,大模型相比小模型也有更细致的抽象特征表达能力。
    • 大模型相对小模型,从对低频世界知识的编码角度,可以认为学到了关于世界更多的细节信息,而从新增抽象知识以及抽象特征分裂角度,说明大LLM模型具备更难的以及更细粒度的抽象知识表达能力。
  • 任务回路的差异:大LLM模型大概率能够建立在路径上涉及更多细粒度抽象知识点以及路径更复杂的回路。这大概是大模型可以解决复杂问题的主要原因。

结论:小模型是对世界的粗粒度建模,而大模型是对世界的细粒度高清建模。而且Scaling law说明了:随着增加更多的数据、更大的模型规模,LLM模型可以对世界进行清晰度更高的刻画。从这个角度看,说LLM模型参数是对世界的有损压缩,其实并没有什么大问题。

回路竞争”视角

  • 模型涌现能力:对小模型来说,任务对应的激发回路没有建立起来,而大语言模型建立起来了。
  • ICL和COT:这里可能涉及到两种回路:任务回路以及Attention回路,两者竞争或合作,来决定ICL任务的表现,COT是一种特殊的ICL,机制应类似。
  • FT:在基础模型之上,任何形式的Tuning操作,都会造成基础模型某些能力的损失。第一种影响是:Fine-tuning操作通过大量领域数据,强化了大语言模型解决这个任务的响应回路。这对于模型底层知识点影响估计不大,因为底层更多的是通用性比较强的特征,这个任务也需要,它修正的应该更多是上层的抽象知识节点,以及底层知识点到上层抽象知识点建立激发连接的通路。另外一种可能的影响:很可能通过Fine-tuning操作,在模型内部建立起了Shortcut捷径,导致输入信息后,信息传输直接走了捷径,而绕过了很多本该要走的通路。
  • IT:建立起了一个特殊的激活回路,就是说从输入命令自身形成的激活回路,建立起和对应任务回路的连接。

世界的参数倒影:从现实世界到可能世界

GPT通过Next Token Prediction任务试图正确复现人类产生的文字,本质上是对隐藏在文字表象之后的世界模型进行解码复原,并存储在GPT的模型参数里,形成了物理世界的参数倒影。

GPT从大量文字中,不仅仅学会了如何生成符合我们现实世界事实的内容,可能还学会成为一个“可能世界”生成器。它从文字模拟我们的现实世界开始,并进而泛化抽象,尽管遵循我们这个世界的物理法则,但是它不仅可以产生符合我们感知到的世界中真实的知识与内容,也可以产生其它符合物理法则及人类理解逻辑的可能世界。也许你不能因它产生的内容不符合现实世界,就说它是错的,只能说它有能力把符合逻辑的可能世界全部展示给你,必然有很多情况未必吻合现实,毕竟现有世界只是可能世界的一种已经发生的现实选择而已,而它有能力给你呈现各种合理的可能性。

涌现

最后单独说一下涌现。观点来自大语言模型的涌现能力:现象与解释 - 知乎

涌现现象

什么是“涌现现象”?当一个复杂系统由很多微小个体构成,这些微小个体凑到一起,相互作用,当数量足够多时,在宏观层面上展现出微观个体无法解释的特殊现象,就可以称之为“涌现现象”。

目前有两大类被认为具有涌现能力的任务,第一类是 In Context Learning(“Few-Shot Prompt”),用户给出几个例子,大模型不需要调整模型参数,就能够处理好任务;第二类具备涌现现象的技术是思维链( CoT)。CoT本质上是一种特殊的few shot prompt。

涌现与任务和模型有关:

  • COT:有些任务40M即可,有些任务需要280B,大部分需要50B。
  • ICL:有些任务13B即可,有些需要540B,大部分需要70B。

顿悟现象

对于一个训练数据较少的数学任务,训练会经历三个阶段:

  • 记忆期:这个阶段模型只是在单纯地记忆训练数据。
  • 平台期:这个阶段是记忆期的延续,体现为验证集合效果仍然很差,说明模型仍然没有学会规律。
  • 泛化期:这个阶段验证集合效果突然变好,这说明突然之间,模型学会了任务里的规律,也就是顿悟现象,突然就学明白了。

原因猜测

  • 任务评价指标不够平滑。如果评价指标足够平滑,任务效果就会随着模型规模稳定上升,而没有涌现。
  • 复杂任务 vs 子任务。最终任务过于复杂,由多个子任务构成,子任务符合Scaling Law,最终任务体现为涌现。
  • 顿悟:
    • 第一个事实是 Grokking 现象是描述训练数据量较少的 ML 任务的,但是任务最小训练数据量必须达到一定的量,才会出现 Grokking 现象。
    • 第二个事实是 LLM 模型规模越大,记忆数据的能力越强。
    • 简单解释:利用事实1,任务的最少训练数据量需要达到临界值,才会出现Grokking。对某个任务T,尽管LLM总的训练数据量足够大,但具体到任务T,相关数据其实很少。大LLM相比小LLM,增加了训练数据,所以T的训练数据达到最小阈值,发生顿悟,学会规律,效果变好。
    • 复杂解释:假设训练数据不变,利用事实1和2,大LLM相比小LLM记忆能力强,能有效记忆更多训练数据,达到最小阈值,发生顿悟,学会规律,效果变好。

另外在大模型“涌现现象”存在吗 - 知乎中也提到一个观点:涌现存不存在取决于你怎么看这个事,是个看问题的角度问题。从“每token错误率”看,那大模型就是没有涌现,指标是平滑增长的,但是从任务的指标来看其实还是存在的。

小结

以上内容来自对张俊林老师多篇知乎文章的整理,个人觉得这非常重要,它让我们能够大致理解LLM智能的内部机理。很多人可能会觉得LLM输出的东西很智能,其实这是一种误解,输出只是表现,或者最多只能算一半,LLM真正突破的是“理解”。因为只有真正“理解”了输入,才有可能正确输出。那为什么通过NTP这么简单的方法就能让LLM具备这么强的理解力呢?相信通过张老师的这一系列文字,我们至少能够有个大概图景,这些观点个人非常认同。

关于NTP更多的相关研究,我们后面有机会再写,其实还是有不少有意思的研究的,比如并不是所有的Next Token都有用RHO-1,再比如NDP,其中的D是Distribution。不过这些更多是NTP的变种。

Scale Law

老早知道这个话题,但仅限于知道N(参数量)、D(数据量)、C(计算量)之间存在幂律关系,基本关系是越大越好。再具体的就不知道了,当时感觉这个好像没啥可以看的,结果——证明了自己有多Naive。

现在一看,好家伙,从预训练到SFT到对齐甚至推理,从LR到BatchSize都有Scale Law,涉及到的研究Paper一大堆。但是我们目前(SLM)只需关注下面几个问题:

  • Loss会随着NDC下降到什么程度?
  • 哪个带来的Loss下降最多?
  • 固定N,增加D,Loss能到多少?
  • 固定N,有没有最佳的D?还是越多越好?
  • 固定N,D的质量如何影响Loss?

这些问题都和咱们要做的系列有关(N固定=1.5B)。

注意,Loss不是完全等于智能,但由于没有更好的方法,先用Loss代替(已有的研究都是这个思路)。不过通过前面NTP的内容,Loss代表智能其实问题也不大。

预训练:OpenAI

首先是那篇OpenAI经典的《Scaling Laws for Neural Language Models》,给了最优的计算效率训练策略:训练非常大的模型,使用相对适量的数据,并在显著早于收敛之前停止训练。

基本概念

相关术语

  • LL:交叉熵损失,以纳特为单位。。
  • NN:模型参数的数量,不包括所有词汇和位置Embedding。
  • C6NBSC \approx 6NBS:总非嵌入训练计算量的估计值,其中 BB 是批量大小,SS 是训练步骤数(即参数更新)。我们以 PF-days 为单位给出数值,其中 1PF-day=1015×24×3600=8.64×10191 \text{PF-day} = 10^{15} \times 24 \times 3600 = 8.64 \times 10^{19} 浮点运算。
  • DD:数据集中的Token数量。
  • BcritB_{\text{crit}}:关键批量大小,在关键批量大小下训练提供了时间与计算效率之间的大致最优折衷。
  • CminC_{\text{min}}:达到给定损失值所需的最小非嵌入计算量的估计值。如果模型在远小于关键批量大小的批量大小下进行训练,这将是使用的训练计算量。
  • SminS_{\text{min}}:达到给定损失值所需的最小训练步数的估计值。这是如果模型在远大于关键批量大小的批量大小下进行训练时将使用的训练步数。
  • αX\alpha_X:损失缩放的幂律指数,表示为 L(X)1/XαXL(X) \propto 1/X^{\alpha_X},其中 ( X ) 可以是 ( N, D, C, S, B, CminC_{\text{min}} ) 中的任何一个。

参数量和计算量

注意,Embed操作包括lookup和映射,分别对应2d次FLOPs。

整体结论

Power Law

经验值

高效训练最佳参数

我们简单起见,假定D和C不限,在1.5B的N下,L为2.3036。如果再给定30B(下限,后面有介绍)的D,则结果为:2.3575,再增加D边际收益递减,300B时为2.3095

Key Findings

1. 拎出来NDC:性能与NDC相关,对其他架构超参数(如深度与宽度之比)的依赖性较弱。

2. NDC的规律:性能与NDC分别具有幂律关系(假设其他两个因素不构成瓶颈),但性能在达到零损失之前最终会趋于平稳。

这个图比较直观,但我们可以关注下边际效应,相同尺度的Loss下降,D的数量级增加是相对最小的。

3. N与D:N或D固定,另一个增加,进入收益递减阶段。性能惩罚可预测地依赖于比例 N0.74/DN^{0.74}/D

意味着每次模型大小增加 8 倍,数据量只需增加约 5 倍即可避免惩罚。

L(N,D)=[(NcN)αNαD+DcD]αDL(N, D)=\left[\left(\frac{N_c}{N}\right)^{\frac{\alpha_N}{\alpha_D}}+\frac{D_c}{D}\right]^{\alpha_D}

拟合结果:

参数
αN\alpha_N 0.076
αD\alpha_D 0.103
NcN_c 6.4×10136.4×10^{13}
DcD_c 1.8×10131.8×10^{13}

进一步探索无穷数据极限的边界:

δL(N,D)L(N,D)L(N,)1\delta L(N, D) \equiv \frac{L(N, D)}{L(N, \infty)}-1

δ只依赖N和D的特定组合:

δL[1+(NNc)αN/αDDcD]αD1\delta L \approx\left[1+\left(\frac{N}{N_c}\right)^{\alpha_N / \alpha_D} \frac{D_c}{D}\right]^{\alpha_D}-1

通过实验数据,估算不同随机种子下损失的变化范围约为 0.02。这意味着,为了在训练中达到 0.02 的收敛阈值并避免过拟合,数据集大小 D 的要求为:

D(5×103)N0.74D \gtrsim\left(5 \times 10^3\right) N^{0.74}

N如果为1.5B,D为31B可以实现最小化过拟合。对于更大的模型,则可能遇到轻微的过拟合。也就是说,31B是数据的下限。

4. N与C:训练曲线遵循可预测的幂律关系,其参数基本不受模型规模影响。

BatchSize(注意,这里是Token数,不是样本数):

  • 当批量大小 B 小于 Bcrit 时,增加 B 对计算效率几乎没有负面影响。
  • 当 B>Bcrit 时,增加 B 的收益递减。

为高效利用时间和计算资源,最佳策略是选择 B≈Bcrit。

  • Bcrit(L) 独立于模型大小,仅依赖于损失 L。
  • Bcrit 满足以下幂律关系:

Bcrit(L)BL1/αBB_{c r i t}(L) \approx \frac{B^\star}{L^{1 / \alpha_B}}

其中,B2×108,αB0.21B^\star ≈ 2 × 10^8, α_B ≈ 0.21

对于本文可以训练的最大模型,其收敛时的批量大小大约为 100 万至 200 万个 Token。

N和C的关系:

L(N,Smin)=(NcN)αN+(ScSmin)αSL\left(N, S_{\min }\right)=\left(\frac{N_c}{N}\right)^{\alpha_N}+\left(\frac{S_c}{S_{\min }}\right)^{\alpha_S}

拟合结果:

参数
αN\alpha_N 0.077
αS\alpha_S 0.76
NcN_c 6.5×10136.5×10^{13}
ScS_c 2.1×10132.1×10^{13}

提前停止下界:

Sstop (N,D)Sc[L(N,D)L(N,)]1/αSS_{\text {stop }}(N, D) \gtrsim \frac{S_c}{[L(N, D)-L(N, \infty)]^{1 / \alpha_S}}

当数据有限时,模型需要更多训练步数才能达到最佳测试损失。

5. 模型效率:大模型比小模型具有更高的样本效率,用更少的优化步骤和更少的数据即可达到相同的性能水平。

以及:

6. 固定C:在固定计算预算 C 内但对模型大小 N 或可用数据 D 没有限制的情况下,最优性能通过训练非常大的模型并显著早于收敛点停止训练来实现。

这种高效计算的训练比预期的训练小模型直到收敛更加样本高效,数据需求随 DC0.27D∼C^{0.27} 增长。

L(Cmin)=(CcminCmin)αCminαCmin11/αS+1/αB+1/αN0.054N(Cmin)(Cmin)αCmin/αN(Cmin)0.71L(C_{\text{min}}) = \left( \frac{C_c^{\text{min}}}{C_{\text{min}}} \right)^{\alpha_C^{\text{min}}} \\ \alpha_C^{\text{min}} \equiv \frac{1}{1/\alpha_S + 1/\alpha_B + 1/\alpha_N} \approx 0.054 \\ N(C_{\text{min}}) \propto (C_{\text{min}})^{\alpha_C^{\text{min}} / \alpha_N} \approx (C_{\text{min}})^{0.71}

NCcmin/αN,BCcmin/αB,SCcmin/αS,D=BS,αCmin=1/(1αS+1αB+1αN).\begin{aligned} N &\propto C_c^{\text{min}} / \alpha_N, \\ B &\propto C_c^{\text{min}} / \alpha_B, \\ S &\propto C_c^{\text{min}} / \alpha_S, \\ D &= B \cdot S, \\ \alpha_C^{\text{min}} &= 1 / \left( \frac{1}{\alpha_S} + \frac{1}{\alpha_B} + \frac{1}{\alpha_N} \right). \end{aligned}

最终结果为:

NCmin0.73,BCmin0.24,SCmin0.03N \propto C_{\text{min}}^{0.73}, \quad B \propto C_{\text{min}}^{0.24}, \quad S \propto C_{\text{min}}^{0.03}

随着计算预算 C 的增加,它应该主要花在更大的模型上,不要大幅增加训练时间或数据集大小。这也意味着,随着模型变大,它们的样本效率会越来越高。

预训练:DeepMind

接下来是两年后DeepMind的《Training Compute-Optimal Large Language Models》,主要回答这个问题:在给定固定的 FLOPs 预算的情况下,应该如何权衡模型大小和训练Token的数量?

因为他们觉得OpenAI的结论不对,根据前面的结果,C增加10倍时,Model增加约5.5倍,数据增加约1.8倍:

100.735.37100.24+0.031.8610^{0.73}\approx 5.37 \\ 10^{0.24+0.03} \approx 1.86

但本文认为模型和数据应该等比例缩放

OpenAI还有个观点是更大的模型效率更高,所以不需要那么多数据。

本文和OpenAI那篇的主要区别:

  • 首先,OpenAI对所有模型使用了固定数量的训练Token和学习率调度,这使得他们无法建模这些超参数对损失的影响。相反,本文发现,将学习率调度大致匹配训练Token的数量,无论模型大小如何,都会得到最优的最终损失。
  • 其次,纳入了参数量高达16B的模型,多数模型的参数量超过500M,OpenAI大多数参数量小于100M。

三种方法

使用如下三种方法:

  • 固定N改变D

  • 寻找最佳的N

  • 拟合参数损失

下图是第二个方法对应的分析。

1.5B模型对应的Token数也大概在30B附近(右图),当然这是在固定的C下,如果只考虑Token,那显然越多越好(左图)

整体结论

三种方法使用了不同的拟合方法和不同的模型,但它们对于参数和 Token 随着 FLOPs 变化的最优扩展预测是相似的。如下表所示。

这三种方法都表明,随着计算预算的增加,模型规模和训练数据量应当按大致相等的比例增加。第一种和第二种方法给出了非常相似的最优模型规模预测。第三种方法则预测,即使是较小的模型,在更大的计算预算下也是最佳的。

下表给出了估计的FLOPs和Token数量。

通过上表可以看到GPT-3这样的模型一定是过大了的(相比C和D)。更小的模型应该在更多的 Token 上进行训练,以达到最优的性能。

注意到,1B对应的是20B Token,和我们之前的结论一致(1.5B对应30B Token)。

论文最后给出的公式为:

L(N,D)=E+AN0.34+BD0.28E=1.69,A=406.4,B=410.7L(N, D)=E+\frac{A}{N^{0.34}}+\frac{B}{D^{0.28}} \\ E=1.69, A=406.4, B=410.7

关于这两篇论文的简要介绍可以看这篇博客:Demystify Transformers: A Guide to Scaling Laws | by Yu-Cheng Tsai | Sage Ai | Medium

SLM:MiniCPM

模型和数据都确定了,剩下要考虑的是其他因素。我们来看SLM的代表:MiniCPM: Unveiling the Potential of Small Language Models with Scalable Training Strategies

SLM的重要性不光体现在:“在将经验转移到 LLM 之前,通过 SLM 进行广泛的实验以探索 SLM 的局限性”,同时,SLM本身也可能有不错的能力,从而节约成本,提升推理效率。

BatchSize

OpenAI(论文图22)结论:只要学习率不太小且衰减得不太快,性能就不会强烈依赖于学习率。BatchSize为1-2M。

DeepMind 的 Chinchilla,MaxLR=1e-4,BatchSize从1.5M到3M。

MiniCPM:

bs=1.21×109L6.24bs = \frac{1.21 \times 10^9}{L^{6.24}}

实际3.93 million,此时Loss大约为2.5048

LR

MiniCPM:尽管模型规模增加了十倍,最佳基础学习率依然没有明显变化,保持在约 0.01。进一步在 2.1B 规模上进行了简单验证,确认学习率 0.01 确实实现了最低损失。

关于LR还涉及两篇Paper:

可参考苏神:当Batch Size增大时,学习率该如何随之变化? - 科学空间|Scientific Spaces

结论分别如下:

  • OpenAI:学习率随着BatchSize的增加而单调递增但有上界。
  • Tencent:最佳学习率会随着BatchSize大小的增加而先上升后下降。此外,随着训练的进行,激增的峰值将逐渐向较大的批次大小移动。

关于学习率退火,可参考清华的Scaling Law with Learning Rate Annealing

L(s)=L0+AS1αCS2L(s) = L_0 + A \cdot S_1^{-\alpha} - C \cdot S_2

S1是LR前向区域,S2是LR的退火区域,其他均为常数。结论:

  • 随数据大小缩放的幂律。
  • LR 退火过程中的额外损失下降。

公式可以描述每一步的完整损失曲线,而不是训练结束时的单个损失点。启示就是:

  • Warmup是必要的。
  • Annealing是必要的。

最后是一篇来自DeepMind的Scaling Exponents Across Parameterizations and Optimizers,也涉及到了学习率。不过它主要证明了参数化中一个被忽视的方面,即 Adam 中的 epsilon 参数,必须正确缩放以避免梯度下溢。

微调:DeepMind

这篇DeepMind的When Scaling Meets LLM Finetuning: The Effect of Data, Model and Finetuning Method是关于微调的Scale Law,主要考察以下影响因素:

  • 模型大小。
  • 预训练数据大小。
  • 微调参数。
  • (有限的)微调数据量。

同时考虑FMT(全参数微调)和PET(高效微调),结论如下:

  • LLM微调遵循微调数据规模与其他缩放因子之间的基于幂次的乘法联合缩放规律。
  • LLM微调更依赖于LLM模型规模的扩展,而非预训练数据规模的扩展,并且PET参数的扩展通常效果不佳。
  • 最优的微调方法高度依赖于具体任务和微调数据。

L^(X,Df)=A1Xα1Dfβ+E,\hat{\mathcal{L}}\left(X, D_f\right)=A * \frac{1}{X^\alpha} * \frac{1}{D_f^\beta}+E,

A、E、α、β是参数,D是微调数据,X表示其他单个缩放因子(不包括D)。

另外补充2个关于FMT和PET实验结论:

  • 微调数据对 FMT 的影响比 PET 更明显(FMT吃数据),其中 LoRA 的(数据)缩放效果优于 Prompt Tuning。
  • PET 更多地依赖于 LLM 模型和预训练数据缩放,而不是微调数据缩放。

其实,结论还是很Make Sense的。Lora笔者之前做过大量研究,也可以证实本文实验结果。PET需要的数据少,更依赖基座都算是比较符合直观认知的。

对齐:OpenAI

来自OpenAI的 Scaling Laws for Reward Model Overoptimization,探讨了在强化学习中使用人类反馈训练大型语言模型时,奖励模型过度优化的问题。发现了不同优化方法下奖励模型得分与实际性能之间的关系,以及这种关系如何随着模型参数、数据集大小和策略参数的变化而平滑地缩放。

Goodhart’s Law:当一个指标被用作目标时,它不再是一个好的指标。(RLHF的缺点)

d:=DKL(ππinit)Rbon(d)=d(αbonβbond)RRL(d)=d(αRLβRLd)R(0):=0d:=\sqrt{D_{\mathrm{KL}}\left(\pi \| \pi_{\mathrm{init}}\right)} \\ R_\text{bon}(d) = d(\alpha_\text{bon} - \beta_\text{bon}d) \\ R_\text{RL}(d) = d(\alpha_\text{RL} - \beta_\text{RL}d) \\ R(0) := 0

α和β是可能依赖于RM参数、数据量的参数。

在 RL 训练期间,初始策略和优化策略之间的 KL 距离单调增加(如下图所示),并且可以解析地计算为 BoN 的 n 的函数。

结论如下:

  • RL与best-of-N。作为KL散度的函数,RL在优化和过度优化方面通常比best-of-N慢。这表明,使用KL散度来比较不同方法的(过度)优化量存在不足。然而,代理RM得分与标准RM得分之间的关系对于两种方法是相似的。
  • 平滑的系数缩放。BoN和RL函数形式中的α和β系数随着代理RM参数量平滑变化,遵循近似的对数趋势。这使得能够预测获得的标准RM得分。
  • 对策略大小的弱依赖。虽然较大的策略总体上表现更好,并且从针对 RM 的优化中获益较少(通过标准奖励的增加来衡量),但它们导致的过度优化量非常相似,具体通过代理与标准得分之间的差距(这表示预测奖励与实际奖励之间的差距)以及在达到最大标准RM得分时的KL距离来衡量。
  • KL惩罚的无效性。在强化学习中,使用KL惩罚能够提升代理RM的得分,但这种提升并没有带来标准RM得分的可测量改善。而且这一现象可能受超参数设置的影响较大。

Scaling RM参数:固定Policy和数据大小。

这些允许我们预测训练运行的属性,比如预测不同 RM 大小的峰值标准 RM 分数。

Scaling RM数据量:固定RM参数量。

更多的数据会带来更好的标准分数和更少的 Goodharting。α 和 β 随数据大小的缩放并不像 RM 大小缩放那样清晰地描述。

Scaling Policy大小:固定RM参数量。

较大的策略从针对 RM 的优化中获得的好处较少,但不会过度优化更多。尽管较大的SFT策略在开始时有更高的标准得分,但它们在强化学习过程中并没有表现出比小策略更多的优化能力或学习速度。较大的策略可能在优化过程中获得的收益较少,且标准得分的峰值出现在较小的KL距离时。一个可能的解释是,较大的策略主要提高了对人类示范的建模精度,而不是增强优化能力。

KL惩罚的效果

改变强化学习中的KL惩罚时,标准RM得分只取决于策略的KL距离。这表明,KL惩罚仅仅影响标准RM得分的收敛速度,使得收敛发生得更早。

注意PPO本身就包含了对KL的隐形惩罚(作用在当前策略与最近策略而不是初始策略之间的KL散度上),这让策略的变化更平稳。这可能是PPO比显式KL惩罚更能减少过度优化的原因。

还有一篇是斯坦福的:Scaling Laws for Reward Model Overoptimization in Direct Alignment Algorithms,DPO就是他们的。主要观点是,DAA(直接对齐算法)像经典的 RLHF 方法一样,表现出强烈的过度拟合甚至奖励黑客行为。 特别是,论文发现 DAA 方法不仅在大范围的 KL 预算中恶化,而且经常在数据集的单个 Epoch 完成之前恶化。

在强化学习中,KL预算通常表示在优化过程中,策略与参考策略(如初始策略或人类示范)之间KL散度的最大容忍值。KL散度越大,策略变化越大。

推理:DeepMind

主要介绍DeepMind关于推理缩放的Paper:Scaling LLM Test-Time Compute Optimally can be More Effective than Scaling Model Parameters。推理都卷起来了。

本文尝试回答:如果允许 LLM 使用固定但并非微不足道的推理时间计算量,那么它在具有挑战性的提示下性能可以提高多少?

分析两个主要的机制缩放推理时计算:

  • 搜索:针对稠密的、基于过程的验证者奖励模型(RM)进行搜索。即通过一个基于过程的奖励模型,验证答案中每一步的正确性。
  • 修正:在测试时给定提示,自适应地更新模型在响应上的分布。即修改不正确的答案,如优化生成建议(或候选答案)时使用的概率分布。

两个机制其实分别对应并行缩放和顺序缩放。

在这两种情况下,不同的缩放推理时计算的方法的有效性因提示的难度而显著不同。特定的推理时计算策略的效率依赖特定问题和选用的LLM。

  • 比如对于简单问题,允许模型通过预测一系列N次修订来逐步改进其初始答案(即修改提议分布),可能比并行采样N个独立的响应更高效地利用测试时的计算资源。
  • 另一方面,对于更难的问题(可能需要探索多种不同的高层次解题方法),独立并行重新采样新响应或使用基于过程的奖励模型进行树搜索,可能是更高效的测试时计算使用方式。

所以需要一个计算最优策略来缩放推理时计算。据此提出**“计算最优”缩放策略**,该策略旨在根据每个任务的具体提示, 自适应地分配推理时的计算资源。

  • 对于简单和中等难度的问题,甚至某些条件下的困难问题(取决于预训练和推理工作负载的具体条件),增加推理时计算量通常比扩展预训练更具优势。这个发现表明,与其单纯地专注于扩大预训练规模,在某些情况下,更有效的策略可能是用更少的计算资源预训练较小的模型,然后通过推理时的计算来改进模型的输出。
  • 对于最有挑战性的问题,通过增加预训练计算量取得进展更为有效,表明当前的推理时计算扩展方法可能无法与预训练扩展完全等价交换。

最终效果:相比best-of-N提升超过4倍效率,小模型通过推理时计算能超过14倍大的大模型。

best-of-N:Batch采样N个输出,然后根据一个验证者或奖励模型(RM)选择得分最高的。

统一视角

  • 验证:
    • 采样N个完整的解决方案,然后根据验证器选择最佳答案。
    • 训练一个基于过程的验证器,或者一个过程奖励模型(PRM),该模型能够预测解决方案中每个中间步骤的正确性,而不仅仅是最终答案。然后,可以利用这些每一步的预测在解决方案空间中执行树搜索,从而与验证器进行比简单的最佳-N采样更高效、更有效的搜索。
  • 修正:
    • 输入级别:通过向给定的提示添加一组额外的Token,使得LLM以此为条件,获得修改后的分布。
    • 输出级别:通过从标准语言模型中采样多个候选项,并对这些候选项进行修改。换句话说,可以修改LLM自身引起的提议分布,使其优于简单地依赖提示条件,或者可以使用一些事后验证器或评分器来执行输出修改。
    • STaR或ReSTEM这样受强化学习启发的微调方法,直接优化模型以完成给定的推理任务。需要注意的是,这些技术不使用任何额外的输入标记,而是专门通过微调模型来引导其产生改进的提议分布。
    • self-critique这样的技术使模型能够在测试时通过指示它以迭代的方式批评和修订自己的输出,从而改进自身的提议分布。

如何最佳扩展推理式计算

定义策略:

θq,a(q)(N)=argmaxθ(EyTarget(θ,N,q)[1y=y(q)]),\theta_{q, a^*(q)}^*(N)=\operatorname{argmax}_\theta\left(\mathbb{E}_{y \sim \operatorname{Target}(\theta, N, q)}\left[\mathbb{1}_{y=y^*(q)}\right]\right),

N是资源预算,q是提示词。Target为模型在给定提示 𝑞 下,根据推理时计算超参数 𝜃 和计算预算 𝑁 所引发的自然语言输出Token的分布。

提示词难度定义:将模型在测试集上每个问题的 pass@1 率(通过2048个样本估算)分为五个分位数,每个分位数对应一个递增的难度等级。

  • 基于学习到的验证器的最终答案得分执行相同的分箱程序。论文将这种设置称为“模型预测难度”,为了实践中可行,因为实践中只能看到提示,没有答案,不能预知难度。
  • 而依赖于真实正确性检查的设置称为“oracle难度”。

验证

训练适用于搜索的验证器

  • PRM训练
  • 答案聚合
    • 按步聚合:最后一步的分数作为最终分数。
    • 答案间聚合:加权best-of-N方法会对所有拥有相同最终答案的候选方案,基于验证器的正确性得分进行加权计算。具体来说,验证器会为每个候选方案中的每一步提供一个得分,而这些得分会进行加权汇总。最后,这些候选方案中总得分最高的那个方案将被选为最终答案。

针对过程奖励模型(PRM)的搜索方法

  • Best-of-N weighted:根据PRM的最后得分评判。
  • Beam search:每一个生N根据PRM选M。
  • Lookahead search:同上,但不用当前步的PRM分数,而是用再往前k步的分数作为当前步分数。MCTS的特例。

结果

任何给定的验证器搜索方法的效果在很大程度上取决于计算预算和具体问题。具体来说,Beam Serach在更难的问题和较低的计算预算下更为有效,而best-of-N则在较简单的问题和更高的计算预算下更有效。此外,通过为给定的问题难度和推理时计算预算选择最佳的搜索设置,可以在使用最多少4倍推理时计算的情况下,几乎超越best-of-N的表现。

预算指生成数量。

修正

微调模型让它会自己迭代地检查回答。

训练并使用修正模型

数据构建策略:

  • 每个正确答案与一系列不正确答案配对,形成多回合上下文数据。
  • 上下文中最多包含 4 个不正确答案,其数量随机采样。
  • 使用字符编辑距离优先选择与正确答案相关的不正确答案,确保上下文和目标答案具有一定相关性。

推理时存在分布偏移,模型可能会采样出包含正确答案的上下文。在这种情况下,模型可能会在下一步修订中将正确答案意外修改为错误答案。论文采用基于 顺序多数投票基于验证器的选择 的机制,从模型生成的一系列修订答案中,选择最正确的答案作为最终答案。

推理时使用修正:

结果

论文发现,顺序计算(例如修订)和并行计算(例如标准的最佳-N)在测试时的计算中存在权衡,而顺序与并行推理计算的理想比例在很大程度上取决于计算预算具体问题的类型。具体而言:

  • 对于简单问题,纯粹依赖顺序测试计算即可获得最佳效果。
  • 对于复杂问题,通常需要某种顺序与并行计算的理想比例才能达到最佳性能。

预训练 or 推理时

测试时计算和预训练计算并非可以一对一“互换”

  • 对于简单和中等难度的问题(在模型能力范围内),或在推理需求较小的情况下,推理时计算可以轻松弥补预训练的不足。
  • 然而,对于具有挑战性的问题(超出模型能力范围),或在推理需求较高的情况下,预训练可能在提升性能方面更加有效。

说明,模型本身的能力至关重要。推理时只能弥补不足,但不能消除不足。

小结

相信在读完这些关于Scaling Law的文章后,我们能够清晰认识到为什么需要做这些实验和验证。作为一名算法工程师,我们不能模糊地说数据越多、模型越大、计算资源越多效果就越好,而应该更进一步,精确地掌握多少数据、多大模型、多少资源时效果大致能到什么程度,给定限制设置下,极限效果能到什么程度。

我们都知道,现在要跑起来一个小B模型的预训练其实相当简单,中学生都能做到。但作为算法工程师,追求的肯定不是跑起来,而是效果,更进一步,最小资源达到最大效果。这就需要对预训练的每一个环节、每一个参数都有相当程度的理解,清楚地知道它们如何影响最终效果。笔者觉得这是算法工作最有魅力的地方。

总结

NTP和Scaling Law应该算是做预训练之前应该掌握的最基本的知识。相信在读完这些内容后,我们能对预训练以及LLM有更加深刻的认知。同时,应该也能看到科学的严谨和专业性,在读之前我们可能都无法想象这其中居然有这么多门道。

总之,笔者在阅读和写作时感触非常深刻,也大有收益,期望读者也能有所收获。另外,这还没开始预训练呢,路漫漫兮,吾等共勉。