近日现Meta的AI科学家,原微软研究院首席研究员的朱泽园 Allen-Zhu在ICML会议上关于Physics of Language Models的Tutorial获得了一众好评,引起了广泛的关注。我们认为该报告内容十分重要,能够帮助学界产业界的各位对于大模型有更清晰的理解,因此翻译梳理成了中文,供大家阅读。
现如今的大模型的参数量动辄成百上千亿,可谓是十分庞大的多体系统,很难以从底层的数学,统计学原理去理解清楚其内部的演化。然而在这场目标奔赴通用人工智能的史诗的征程中,我们需要建立对于大模型的一些底层认知来作为灯塔指引前进的方向。
Scaling Law让我们认识到扩大模型,数据规模的重要性,但在如今AI头部公司们纷纷开始有能力创造出接近或达到GPT4能力的大模型的时候,我们也清楚地感受到为了更进一步,还需要更多的探索。基于一些合理的假设,以及实际观察到的现象,我们可以像研究自然的物理学一般去试图探索大模型的现象学理论。这种视角的研究被称为Physics of LLMs,或许会给我们建立许多重要的关于大模型的底层认知。
Speech Topic演讲主题
(一)演讲主题
这次演讲的主题是关于语言模型的理论,但“理论”这个词在不同人的心中可能意味着很多不同的东西。
在我所研究的计算理论(TCS)领域,我们所理解的“理论”实际上是指在定义概念层级时证明数学定理,做出关于数据和模型的假设,去尝试证明相关其他定理。
但“理论”这个词实际上涵盖了很多东西,它甚至也可以指像行为学或动物行为科学这样的领域。
比如,当你订阅OpenAI的API时,你可以玩转GPT-4或GPT-4 Mini,并尝试获取一些非常有趣的结果。
因此,这种广为人知的思想链就是这样形成的。
这也是语言模型理论。
1、语言模型理论的优劣
在这两个极端之间,肯定各有优劣之处。
(1)先从优点开始谈起:
-
- 数学方面,我们喜欢语言模型,因为我们可以用它证明许多东西,例如严谨的定理;
- 行为学方面,人人都可以做理论研究,谁都可以玩转超大型语言模型,这样的结果可能会非常有启发意义。
不仅仅是‘链式思维’,还有许多有趣的概念都可以从这种理论中衍生出来。
(2)但也存在一些缺点:
-
- 数学方面,大语言模型做出的假设通常过于理想化,而且能够证明的逻辑链通常非常简略,也许只是一个单层的Transformer。只有在极少数情况下,LLMs证明的定理才会真正与实践相关。
- 长度问题,即使与实践相关,人们可能也不会阅读你的论文,因为它太长了。
最终促使我离开计算理论的真正原因是,作出让计算发展的进展非常缓慢。
2、理论&定理的进展
现在在学术界,我们有一些可能持续三到五年的ASF(科学基金)资助项目。但是在我目前在的业界里,比如在Meta或者Fair Labs中,我们只能制定六个月左右的计划。
这其实是有道理的,想想看,两年前我们甚至还没有ChatGPT,而一年前我们还没有达到今天的智能水平。但如果通过证明数学定理的方式,发展进程会非常缓慢,同时也就是说如何确保正在证明的定理在一年后仍然适用?
让我提醒大家,人类过去非常有耐心。很久以前,艾萨克·牛顿(Isaac Newton)推动发展了运动定律和引力定律,同时也创造了微积分,那是在1687年。
- 牛顿是如何做到这一点的呢?
那就不得不提到苹果树的故事,但那只是开始。那这只是驱使牛顿进入这个领域的原因。
事实上,艾萨克·牛顿的强大理论是建立在约翰内斯·开普勒(Johannes Kepler)的行星运动三定律之上的,即椭圆轨道和四个关键定律。
- 猜猜这又是什么时候的事?
那是在牛顿之前70到80年之间。
所以你们大多数人可能都听说过这个故事,但有一个很少人知道的趣闻是,年轻一代大多数人不知道的是,约翰内斯·开普勒实际上是丹麦天文学家提可·布拉赫(Tycho Brahe)的助手。而提可·布拉赫是天文台的负责人,他实际上花了整整20年的时间来收集天文观测数据。这比开普勒还要早30年左右。开普勒是这个天文台的助手,在提可·布拉赫去世后,开普勒继承了所有这些实验数据。而这正是开普勒建立行星运动三定律的基础,也是牛顿运动定律和引力定律的整个起点。
所以如果你把所有这些都加在一起,那已经是一个多世纪以前的事了;
改变现在这个世界的变量,可能在50年前已经存在了,在引发改变之前已经随处可见,只是人们没有意识到他们的价值。
所以,人类曾经是非常有耐心的,但现在已经不是了。
(二)关注方向、问题以及领域
我并不是在做这样的类比——即牛顿定律更像是关于语言模型的数学定理的证明;而提可·布拉赫的观测数据更像是行为学,更像是在玩转GPT-4。
但实际上,我认为行为学和物理学之间仍然存在差距。也就是说,如果只希望通过大型语言模型来做出一些有建设性猜测,那么这里面有很多值得关注的问题,以下将会逐一分析:
1、关注的四大问题
1. 问题一是,使用互联网数据训练的模型进行研究可能是不够科学的。
例如,现在很容易在 GPT-4、GPT-3 以及 Llama 3.1等模型中看到Bug。现在很多人在讨论模型回答对比9.9与9.11大小的问题,但我最喜欢的Bug实际上是我们去年年底发现的,你可以让GPT-4做奇偶性检查,比如问:“乔·拜登(Joe Biden)出生在奇数年还是偶数年?”或者你可以让GPT-4比较两位名人的生日,比如唐纳德·特朗普(Donald Trump)与南希·佩洛西(Nancy Pelosi),它几乎总是会出错。
换句话说,它给出正确答案的概率就像是掷硬币一样。所以,要真正科学地研究背后发生的事情,我相信这需要进行非常仔细进行控制研究,去弄清楚发生这种情况的原因。这可能是因为知识没有正确地存储在模型中或者因为奇偶性测试难度过大?又或许模型根本不知道‘奇数’或‘偶数’是什么意思?再或者可能是其他原因?
因此,我们需要对数据有比较全面控制。如果只是吃透一个预训练模型,那是很难对正在发生的事情做出科学预测和观察的。
2. 问题二是,仅仅研究单个模型可能也不够科学。
例如,我们知道GPT-4存在一些Bug,但这些Bug仅仅存在于今年7月的版本吗?它是否会同样出现在8月的版本,或者明年的版本呢?
理想状态下,我们希望找到大语言模型的共性本质问题,而不仅仅是针对某个特定版本语言模型的问题。我们希望能够发现通用的、普遍适用的原则,这些原则可以适用于所有语言模型;同时这些结论对于所有的环节(无论是预训练或微调)都能适用。
- 问题三是,数据污染的问题。
如今我们也许无法再完全依赖 Benchmark,即便是那些非常著名的 Benchmark。
例如,GSM8K数据集,它只有8000个数学问题。如果一个模型非常擅长解决这8000个问题,这一能力很可能是因为数据污染。我可以肯定,没有人会故意将这些数据放入预训练数据中;但如果你想象一下,明天我把所有这些问题翻译成法语、德语或者中文,并将其放在我的MIT网站上(因为MIT的网站很可能会被语言模型抓取),那么从明天开始,所有的模型会不会因为这一行为而变得作弊?虽然我还没有这样做,但如果我真的这样做了,想象一下,那这个 Benchmark 就不再值得信任了。
4. 问题四(最大的担忧)是,仅仅通过吃透这些 “Monkeys”—语言模型,你实际上看不到这些语言模型内部是如何工作的。
如果模型有效完成任务,它们到底是如何完成的?如果某些任务失败了,为什么又会失败呢?我们希望能够更科学地研究这一点。
因此,在这个程度上,我认为行为学或仅仅研究 GPT-4 的想法,更像是公元前400到200年的地心说。那时人们仅仅通过观察太阳和月亮每天的升起和落下就形成了一些理论,但这些理论可能并不是最全面、最真实的理论。
仅仅通过观察的结论,也许是不科学的,根本上要找到模型决策时最本质的规律。
2、语言模型物理学的关注领域
因此,我们提出了一个我们称之为‘语言模型物理学’的倡议。我们强调四个不同方面:
分解“智能”:首先,我们非常希望将‘智能’这个概念分解成若干构建模块,然后逐个研究。
比如语言结构、知识、推理等等,我们需要逐一研究它们,而不是把所有东西混在一起,那样会过于复杂。
合成数据:我们需要构建合成数据,在受控的环境中研究一切。
在理想环境中,这样你可以调整数据的难度、类型、数量或格式,看看这些单个因素如何影响模型的表现。通过这种方式,可以获取到非常高质量的数据,从而在训练下一代语言模型时,知道该做些什么。
高度可重复实验:我们倡导的第三点是要使实验具有高度的可重复性。
如果预训练一个模型的成本高达1000万美元,那么进行重复实验成本会非昂贵。
如果有七个不同的因素想要测试,将每一个因素上下调节进行受控实验,从而找到导致最终结果的原因,这样下来成本会非常高昂。
因此,我们建议研究较小的模型,比如仅有1亿参数的模型。在今天的演讲中,我们会讲到仅仅通过研究这些较小的模型,也可以得出语言模型中非常普遍的规律。这是因为我们并不是在关注智能的整体概念,而是专注于单个的构建模块,同时我们构建的是合成数据。因此,在一个非常理想化的环境中,不需要模型的规模非常庞大。
- 运作探测:最后,我们倡导进行利用探测(probing),来了解语言模型的内部工作原理。
Content of Speech
演讲内容
*结构概要
以下是今天演讲的结构。
我将涵盖三个主要部分,分别涉及语言模型如何学习语言结构、推理以及知识。
我将会倒序进行讲解,也就是说,我会从第三部分开始,那就是关于知识的部分。
第三部分:语言模型如何学习知识
这部分是 Allen Zhu 与来自穆罕默德·本·扎耶德人工智能大学的 Andrew Li 教授的联合研究。
我接下来会从前几张幻灯片中提到的反例开始。
大型语言模型在执行部分任务时通常会失败,如判断人出生年份的奇偶性或比较两位名人的生日;此类反例实际上可以很容易被找到。
那么,如何研究这类反例呢?
相比于在一个模型上进行测试,看看它的表现有多准确,我更加主张,先研究一系列前提——模型的失败,是否可能是因为模型无法提取名人的出生年份?或者是否是因为模型在预训练数据中没有看过 Joe Biden 的传记?再或,即使模型学习过这样的传记,是否是因为模型无法提取名人的生日信息?或者可能是模型能够提取某些名人的生日信息,但无法提取其他另外名人的生日信息。
我们花了整整一篇论文来研究在什么条件下语言模型能够提取它在预训练数据中学过的知识。
因此,我们会发现这本身就是一个值得进行受控实验的领域点。一旦我们确定模型能够提取每个维基百科上名人的生日信息,那我们就可以开始测试模型在处理这些知识时的表现,例如执行知识分类任务,如奇偶性测试,即判断是奇数年还是偶数年。
即使在这里,仍然存在很多微妙之处。如果模型成功回答了乔·拜登是否出生在偶数年,是否可能是因为数据污染?
例如,我们去年年底发现一个反例。如果今天模型在这个特定问题上成功了,是否可能是因为我们已经将论文发布在arXiv上,因此这个问题被提供给了新一代的语言模型?
我们需要排除这种可能性,才能正确研究这个问题;同样地,如果模型回答错误,是否可能是因为模型根本不知道‘奇数’或‘偶数’是什么意思,或者没有经过足够的微调,才导致无法正确地进行奇偶性测试。
因此,为了研究语言模型在操控知识方面的真正能力,必须排除以上这两种情况;同时必须进行非常仔细的受控实验,这是我将在第3.2部分中讨论的内容。现在,将从第3.1部分开始,即在什么条件下语言模型可以提取知识。
3.1 提取知识的条件
我将把它分成几个子结果来进行适当的研究。
- 我需要设计知识数据集,也需要设计一些合成数据集。
3.1.1 那么首先想到的最自然的知识是什么呢?
对我来说,传记是最自然的。
人们的传记是一种知识。此前,我们构建了随机虚拟人物的合成传记数据。我们要么使用一组句子模板来生成这些传记,要么使用一些大语言模型来帮助我们生成这些传记。
- 合成数据:假设我们有10个个体,并为每个人生成一个传记条目。这就是我们创建的传记数据,作为合成数据。
- 问答数据:同时,我们还准备了问答数据集,类似于指令微调数据集。即每个人有六个属性,包括出生日期、出生城市、大学、专业、雇主和工作城市。因此,我们为每个人的六个属性分别准备了六个问题。这些就是问答数据。
3.1.2 实验设置—定义知识提取的方式:
- 我们只将一半的问答数据用于训练,然后在另外一半数据上进行分布外测试。通过这种方式,我们可以通过将训练集与测试集真正分离开来进行受控实验。如果模型能够在测试集上获得高准确率,那么我们称之为知识提取技能。
- 记忆能力:如果模型能够提取训练集中这一半人的知识,那不算是知识提取,这只是记忆。
- 提取能力:如果能够基于传记数据,将问答技能推广到另一半数据上,那么我们称之为知识提取。
3.1.3 首次实验结果:
假设进行混合训练——将传记数据和问答数据都放入训练和预训练过程中,在分布外的另一半数据上进行测试,准确率会很高。简而言之,如果你进行混合训练,可以达到在知识提取上非常高的准确率。
但在实际训练中,人们并不这样做。
通常做法是,首先在像维基百科等数据上进行预训练,然后指令微调,最后将模型交给用户进行分布外测试。
如果按照这个程序进行,即使你完美地进行了预训练与指令微调,那么会发现模型在知识提取方面的表现会非常糟糕。
这是一个普遍结论,无论你使用哪种架构,都与模型规模无关,无论在GPT、GPT-2或者Llama、Mistral等模型上都无关。也可以使用不同等级的LoRA,都会发现这样的结果与训练参数或微调参数也无关。
在我们尝试的所有情况下(实际上我们已经尝试了超过500种可能性),结果都接近0%的准确率。
3.1.4 关键点——知识扩增
当我第一次做这个实验时,这个结果确实令人震惊,直到我意识到一个关键点——我们这里只有一个人物的传记数据。
如果你有更多的传记数据呢?—— 这就是我们所说的“知识扩增”(knowledge augmentation)。
假设扩增预训练数据—— 确保知识不仅仅被描述一次,而是使用不同的写作风格被多次描述,也许句子被重新排列,或者你将传记从英文翻译成法文,或者你用一些小模型重新编写每个人的传记,那么准确率会突然增加。
例如,如果你为每个人提供五个不同写作风格的传记条目,测试的准确率会达到96%。
3.1.5 受控实验结果
总结来说,在不进行混合训练的情况下,知识扩增预训练数据对于知识可提取能力是绝对必要的。
在这个受控环境下,我们实际上发现了这一现象。
为什么会这样呢?
本次分享的重点在于讨论为什么会出现这些现象。
由此我们使用了探测(probing)—— 使用探测技术来精确研究知识在语言模型中的存储位置和方式。
例如,如果用传记数据来预训练一个像GPT-2这样的语言模型,我们尝试通过将传记条目作为 input 提供给 Transformer 来进行探测。基于现在的模型已经被预训练过的状态,我们再次将探测的条目提供给模型,并观察最后一层的隐藏状态。
然后我们就可以通过位置来查看这个人的传记知识在这些探测位置中究竟存储了多少。
举个例子,假设我们关心的是这个人雇主在Meta平台的名字。,因为训练任务是自回归的,那么如果你从位置4进行探测,这个位置的隐藏状态应该编码这个人的雇主名字。这与预测下一个token有关。
因此,这个位置的隐藏状态至少应该编码Meta这个token,因此很可能还会编码Meta平台这个信息。
所以我们更感兴趣的是,在之前的token位置中,这些隐藏状态是否也编码了这个人的知识?
答案非常令人震惊
如果不进行知识扩增,那么从所有之前的token位置进行探测,准确率都接近于零;但如果进行了知识扩增(有多种不同的写作风格时),模型以非常不同的方式存储知识。如果在确保人名正确下进行探测,会发现这个隐藏状态中已经存储了关于这个人雇主名字的知识。
3.1.6 背后机制——详细解释
如果不对预训练数据进行知识扩增,模型往往会学到错误的逻辑。
它可能不会学到“是Anya在Meta平台工作”,而是学到错误的逻辑,比如“某个1996年10月2日出生在新泽西普林斯顿,曾在MIT学习通信学的人在Meta工作”或者用数学形式表达:值5的知识是通过由 key 和所有之前的值定义的元组共同存储的。
但如果进行了知识扩增,由于这些值可能被重新排列,因此它们可能并不总是以相同的顺序出现。
通过这种方式,模型往往会以正确的格式存储知识,也就是说,‘是Anya在Meta工作’,或者用数学形式表达:值5将直接存储在 key 上,在这种情况下,也就是这个人的名字。
总结来说,我们发现如果在预训练语言模型时进行了知识扩增,这将改变知识在语言模型中存储的方式,反过来也会影响知识是否能够通过指令微调进一步提取出来。
现在我们知道知识扩增是重要的,但到底需要多少扩增?是否需要为每个人都进行知识扩增?
结果表明并不需要。
让我们考虑以下受控实验——目前有一些名人和一些少数群体。
- 对于名人,他们的传记非常丰富。
例如,在互联网上,你可以看到至少五篇用不同写作风格撰写的关于同一个人的传记。
- 对于少数群体,你可能每个人只有一个传记条目。
在这种情况下,假设你将这两种数据一起进行预训练,并且也针对名人的问答数据对模型进行微调。
那么首先,我们肯定知道模型可以对剩下的名人进行分布外的泛化。但更有趣的是,这如何影响对少数群体的知识提取?结果显示准确率相当高。
这之所以很重要,是因为对于少数群体,他们的传记没有进行知识扩增,此外,这些少数群体甚至没有出现在指令微调数据中。
“名人帮助少数群体”的现象
仅仅在预训练中包含名人的数据实际上提高了模型对少数群体的知识提取能力。背后的原因是,通过探测,我们发现仅仅包含名人的数据实际上教会了模型以正确的格式存储知识,这使得模型在处理少数群体时也表现得很好。
例如,唐纳德·特朗普的传记在互联网上出现过很多次,仅仅因为这些传记数据的存在,实际上提高了语言模型对少数群体传记知识的提取能力。
因此,从这个意义上来说,唐纳德·特朗普实际上帮助了少数群体,尽管他可能并非有意这样做。我有一个数学证明来说明这一点。所以,结果表明你只需对部分人群进行知识扩增,就可以获得对所有人群的知识提取能力。
3.1.7 总结
总结第3.1部分:
- 展示了知识存储(记忆)与知识提取之间的区别。
即使模型可以100%逐字逐句地记忆知识(如传记),也并不意味着这些知识总是可以被提取出来。要确保知识是可提取的,你要么进行混合训练,要么如果不这样做,最好确保知识已经被扩增。
- 如果使用双向模型(如BERT或DeBERTa),它们的结果都会失败。(没有展示出的)
即使进行了混合训练和知识扩增,双向模型也不能实现知识提取。
- 对于像GPT这样的语言模型,如果你做了其中一个步骤,就可以实现知识提取;
- 对于双向模型,即使你做了这两件事,依然无法实现知识提取。(解释在论文中可以看到)
3.2 知识操作
背景:在这一部分,我将假设知识已经完全可以提取出来,想进一步研究语言模型在操作知识方面的能力。
我能想到的最简单的任务是知识分类(其实有很多不同的方式可以操作知识)
比如假设你有一个模型,当再次在传记上进行预训练,你微调它,确保每个人的出生日期都可以被提取出来。假设你已经通过混合训练或知识扩增完成了这一步。
现在让我们尝试研究知识分类的任务。可能最简单就是将12个月分类为奇数或偶数两类。
3.2.1 CoT 链式思维
我们不仅考虑了没有链式思维(Chain of Thought,CoT)的知识分类任务,还考虑了使用CoT的版本。
即模型首先明确地列出此人的第一个月份,然后回答‘是’或‘否’。我们考虑了这两种类型的数据。现在假设你进行足够的微调以达到完美的准确率,然后我们再次评估模型在剩余一半数据上的分类准确率。
我们发现一个非常惊人的结果,如果你按照这个过程进行微调并且不使用CoT,对于分布外数据,剩余一半人的分类准确率非常低。
我们发现如果不使用CoT,即使进行最简单的知识操作任务(例如分类/排序/比较等等),模型的表现就像是随机猜测。
更糟糕的是,在训练中包含CoT并不能提高不使用CoT进行评估时的准确率。这意味着不仅需要在训练数据中包含CoT,还需要在部署模型时鼓励模型使用CoT,即明确地列出知识,然后才能操作知识。
这种CoT与推理中的CoT非常不同,我将在演讲后面部分讨论推理中的CoT。
你可以想象,GPT-4非常擅长回答两个数字的和是奇数还是偶数的问题,而无需明确写下和 a+b,例如在a和b在1到12之间的情况下,它可以很容易地跳过这些步骤。但对于知识任务,特别是知识操作任务,它不能跳过。它必须明确列出知识,然后才能对这些知识进行任何简单的操作。
这是一个只有通过受控实验才能得出的结论。
因此,这就是关于知识操作任务的发现,例如分类、比较和排序等。
3.2.2 逆向搜索
我们研究的另一个操作任务是逆向搜索 —— 尝试微调模型来回答“谁在这个城市的某个日期出生,并且在某个地方工作”的问题,答案可能是‘Anya’。然后我们再次在剩余一半的数据上进行分布外测试。
结果发现准确率为零。我们的结论是,知识逆向搜索几乎是不可能的。
这再次是一条普遍规律。无论模型的规模、数据的大小或你使用的训练方法如何,都不重要。你可以使用混合训练或微调,或者完全通过让GPT多次重写你的数据来扩充数据。你也可以改变微调方法等,但在所有情况下,结果都是一样的。
我写下了一个零,但实际上在这背后隐藏着我们尝试的数百种不同类型的预训练,而在所有这些尝试中,结果都是失败的。除非预训练数据本身已经包含了逆向知识,只有在这种情况下才能进行逆向知识搜索。
例如,如果你在每个传记的最后都放上这个人的名字,只有在这种情况下,你才能进行逆向知识搜索。
3.2.2.1 测试任务一
实际上,我和Meta的同事们撰写了一篇单独的论文,讨论了如何在实践中非常容易地逆向知识。但关键是,你必须在预训练阶段进行知识逆向,因为如果你在微调阶段进行逆向知识,已经为时过晚。
此外,不能指望通过从单向模型(如GPT)转变为双向模型(如BERT)来解决这个问题。如果你这样做,也无法解决这个问题。这是关于语言模型知识操作能力的一些负面例子。
让我们把这一点与实践联系起来。我们也在GPT-4或Llama上测试了同样的情况,并发现,例如,如果你尝试问GPT-4或Llama “乔·拜登是在偶数年还是奇数年出生的?”然后你可以尝试对维基百科上的所有名人进行测试,结果与随机猜测相似。
所以大型语言模型在这方面也会失败。你还可以尝试排序,例如比较两位名人。如果你比较出生在相隔10年内的名人,准确率也与随机猜测相似(如果不使用CoT的情况下)。但如果你使用CoT,准确率将大大提高。
因此,我们在较小模型上通过受控实验发现的结果实际上也适用于非常大的模型。
3.2.2.2 测试任务二
我们测试的另一个逆向搜索任务是中文成语任务。
你可以设计不同类型的逆向搜索,但对我来说,我最喜欢的任务其实是这个中文成语任务。在中文中,我们有这些四字成语,它们在日常对话中经常使用。你可以把一个成语中的第一个字遮盖住,然后让GPT-4来回答缺失的字。
GPT-4 不能准确回答缺失的成语问题。
- 因此,这表明当前的大型语言模型无法进行逆向知识搜索。这再次证明这是行为学研究,而不是我真正想做的事情。要想提出有力的论点,必须进行受控实验,
例如,许多实验可以发现某些 Bug 无法轻易修复。
比如我们在去年9月发现了这些 Bug,但直到今天,你仍然可以在每一个大型语言模型中看到这些 Bug 的存在。
- 另一方面,这也为你提供了一个图灵测试,能够将所有现代AI模型与人类区分开来。
例如,如果你问“谁出生得更早,妈妈还是爸爸?” 你不需要明确地说出他们的生日,但你可以直接回答“是”或“不是”。你可以直接进行比较,或者询问某个人的出生年份是偶数还是奇数,你不需要大声说出年份,我们都可以通过心算来得出答案,但大型语言模型不能。
3.2.3 总结
这基本上总结了第3.2部分。
- 我实际上跳过了一个结果,那就是知识部分搜索
我们发现,虽然语言模型可以完全提取知识,比如某个人的生日,但它可能无法提取这个知识的最后一个字,比如出生年份。因此,这两个的准确率可能会非常不同。
这实际上与我 Meta 同事提出的一个概念有关,他们提出了多token预测的想法 —— 如果让模型预测多个未来的token,而不是只预测下一个token,这将改变知识在语言模型中的存储方式,并可能提高其能力。
我所讲的结果是,语言模型无法在不明确说出年份的情况下判断某个年份是偶数还是奇数年。这确实是需要做到的,而且这与推理中的链式思维(CoT)无关,这将在后面讲到。
2. 知识逆向搜索几乎是不可能的,除非你已经在预训练数据中反转了知识的顺序。
3. 与我们同时进行的一项研究实际上为这种现象起了个名字,他们称之为‘逆转诅咒’(reversal curse),可能你们中的很多人已经听说过。他们在论文标题中已经总结了这一点,即如果你在“A是B”的基础上训练模型,那么模型无法学习“B是A”,这与我们在这里发现的现象相同。
4. 这一部分最后还展示了一些与实际应用的联系。
3.3 知识容量的扩展定律
如果数据经过充分的再训练,那么无论模型架构如何,几乎都可以达到每个参数 2 比特(信息论)的知识容量。
3.3.1 如何用合成数据测量这一点呢?
- 随机生成合成知识数据,测量其中的信息比特。例如,Anya的生日从12个月、28天、200年中随机生成,相当于60.21比特的知识;Eugeos的出生城市从300个城市中随机生成,相当于8.23比特的知识。设计一个包含n个人、6个属性的传记数据集,可以准确计算其代表的信息量。写作风格不影响知识量,重写相同传记捕捉的知识不变。因此,从信息论比特的角度看,知识的数量并没有改变。
- 另一种方法是增加更多参数。例如泛化到词汇量大小t和多样性d的知识。对于任何合成知识类型,都可以公式化计算数据集中的知识比特量。如果在此类合成数据上预训练语言模型,可计算模型中存储的知识量。如果模型在数据集上实现零损失,说明完全捕捉了知识;如果部分正确,需要小心计算实际学习的知识量,以绘制扩展定律。
LLMs如果有充足数据训练,可以在知识存储方面达到每个参数2比特的水平。
3.3.2 什么是充分训练?
- 普遍性:只要研究的是两层Transformer,模型的大小就是唯一重要的因素,无论规模、深度或数据类型如何。任何形式的数据,结果都是每个参数存储2比特的信息。这条定律对广泛的参数范围始终成立。
- 知识总量的估算:我们估算了人类知识的总量,如英文维基百科和教科书,预测一个拥有70亿参数的语言模型应该足以存储所有这些知识。虽然还未达到目标,但这是我们的方向。
3.3.2.1 含义
- 充分训练:在预训练期间所有知识都被暴露过,每部分知识被暴露1,000次,能达到每个参数存储2比特的信息容量。
- 暴露:暴露不是指训练数据经过1,000次遍历,而是指每部分知识被看到1,000次。知识的多次暴露,可以通过不同写作风格实现。
让我们做一个受控实验:如果每部分知识被均匀暴露1,000次,则每个参数2比特的扩展定律成立。如果知识被少量暴露(如100次),知识容量会下降到每个参数1比特。对于稀有知识,不同模型架构的性能会出现差异,如GPT-2比Llama或Mistral表现更好。
这就是我们如何推导出这个定律的。
顺便说一下,这张图目前是针对GPT-2的旋转版本制作的。实际上,无论你如何改变架构,只要你使用的是主流架构(如Llama或Mistral),甚至如果你移除所有的MLP层,只保留注意力层,你仍然会达到每个参数2比特的定律。
相比之下,如果训练不足,也就是说,假设知识没有被多次暴露,比如每部分知识仅被暴露了100次,或者换句话说,这些是稀有知识,它们在互联网上的出现次数不够多。对于这些知识,知识容量实际上会减少,差不多减少到每个参数1比特。
3.3.3 更有趣的是,如果你现在专注于这些稀有知识,或者说训练不足的知识,那么模型架构之间就开始出现差异。
- 如果你使用GPT-2,那还好,但如果你使用Llama或Mistral,性能就会变差。实际上,使用GPT-2与使用Llama之间的性能差距大约有1.3倍。
- 如果你使用Llama或Mistral,性能实际上会变得更差。我会解释为什么会这样发生。但在此之前,我还要告诉你,即使你将GPT-2的MLP层的大小缩小四倍,使其实际上变得更小,注意力层仍然不会有容量损失。
- 但如果你完全移除MLP层,那么在这种情况下,你将会有容量损失。
3.3.4 两个免责声明。
- 第一,这种比较仅限于知识容量,它不涉及其他方面,如推理等。
- 第二,这种比较仅限于稀有知识。
3.3.5 受控实验好处
- 如果你考虑的是那些在互联网上频繁出现的知识,例如暴露了1,000次的知识,我之前告诉过你,模型架构之间没有差异,但在这里,对于稀有知识,确实存在差异。你可以准确地找出对于哪种类型的数据、哪种任务,某种模型可能比另一种模型更好。因此,你可以做更多的受控实验来比较模型架构。在这里,我们准确地指出了导致Llama或Mistral表现不佳的原因,那就是门控MLP。如果你比较GPT-2(旋转版本)与Llama之间的差异,实际上有七个总的差异,比如不同的架构、不同的激活函数(如Celu与Gelu),或者不同的层归一化方式。
- 最终你可以尝试逐一打开或关闭这些差异,你会发现问题出在MLP层。如果你将Llama的门控MLP替换为标准的Vanilla MLP,那么知识容量就会恢复到原来的每个参数1比特,提升了30%。
3.3.6 关于混合质量数据的受控实验
3.3.6.1 实验比较
最后,我想展示的是第3部分的最后一个内容,一个关于混合质量数据的受控实验。
假设我们有富含知识的数据,比如维基百科,还有不那么富含知识的数据,比如Common Crawl或互联网的垃圾数据。
现在让我们比较两种情境。
- 情境1,你的模型只针对好的数据进行训练,也就是那些富含知识的数据,假设你确保每部分好的数据在预训练过程中恰好暴露100次。
- 情境2,你既用好的数据也用差的数据进行训练,但你仍然确保每部分好的数据暴露100次。
你确保这是一个公平的比较。现在你可以开始量化模型中存储的良好知识的数量。你会看到一个巨大的跳跃,两种情境之间的差异达到了20倍。这不是20%,而是20倍。
所以,如果在第一个情境可以记住大约2000万比特的知识信息,那么右侧情境只能记住100万比特。类似地,即使你增加训练时间,比如确保好的数据被暴露了300次,比之前多了三倍,但仍然会有3倍的损失。
垃圾数据的存在实际上显著降低了大型语言模型在良好数据上的知识容量,有时损失是非常大的。
3.3.6.2 解决办法
在每条预训练数据前添加一个领域标记(domain token)。在过去,预训练数据可能是将所有互联网页面连接在一起,但现在我们可以在每条互联网数据前面加上领域名称或网页的URL。一旦你这样做,问题就大大改善了。例如,这里原本是20倍的差距,但如果你添加了领域标记,差距就缩小到10倍。在另一种情况下,原本表现差了3倍,但现在可以恢复到完整的性能。受控实验发现,只要你在数据前添加这样的领域标记,LLMs就能够自动检测哪些领域包含高质量的知识,并优先从中学习。
3.3.7 总结
- 知识容量的预测:如果数据被充分训练,你基本可以达到每个参数2比特的知识容量,无论模型架构如何。这帮助我们预测未来语言模型的规模,以捕获所有人类知识。
- 扩展定律与架构差异:研究了训练不足模型的扩展定律,发现当数据或知识稀少时,不同架构表现出差异,原始MLP比门控MLP更好。我们还发现,模型量化为8比特参数(如INT8)后,仍可达到每个参数2比特的知识容量,实现4:1的知识压缩比。
- 混合质量数据的处理:处理混合质量数据的关键在于添加领域标记,这有效提升了模型处理不同数据质量的能力。
3.4 回顾四大问题
回顾演讲开头提出的四个要点。(The Theory of Language Models by Zeyuan Zhu)
在第3部分中,我们专注于知识,通过设计合成数据来验证扩展定律。这些实验可以通过1亿参数的模型复制,结果也适用于更大模型。使用H100 GPU或8个V100 GPU可在一天内完成所有预训练,即使数据量缩小五倍,实验结果依然有效。
这可能是我们应该走的路,因为一旦模型变得如此小,你就可以进行大量的受控实验。可以在训练过程调整数据类型,添加或不添加CoT,还可以调整架构,尝试添加不同的东西,看看它们如何影响模型的性能。
今天我所做的所有陈述,都是通过探测技术支持的,即我们实际观察了语言模型的内部真正发现发生了什么。
第二部分:语言模型的推理能力
我不会讨论所有层次的推理,只会讨论小学数学层面的推理。这部分是我与我的实习生田野(CMU的学生)、我的同事许子成(Meta)以及袁竹共同完成的。这部分内容尚未上线,但将在本周末上线至arXiv。
2.1 LLMs的隐藏推理过程
- 研究目标:为了理解大型语言模型的隐藏推理过程,我们创建了一个模拟GSM8K的合成数学数据集。目标是探究LLM的思维过程、推理技能,以及错误原因。所有观点均由探测技术支持。
2.1.1 数学问题的解决
我们研究LLM如何解决小学数学问题,但GSM8K数据集太小,且不能通过GPT-4扩展。虽然可以让GPT-4生成类似问题,但其生成的问题可能过于单一,缺乏挑战性。为了克服这一问题,我们开发了自己的合成数据集,并去除GSM8K中的常识部分,如蜡烛燃烧后变短的常识,而专注于保留参数状态及其依赖关系,如数学推理关系和隐含依赖关系。
2.1.1.1 数据集的构建
数据集的构建基于两个图:
- 结构图:定义可能的参数及其依赖关系,如参数之间的和或乘法关系。每个句子描述一种依赖关系,最终形成一个有向无环图(DAG),以此来描述问题。
- 解法过程:使用链式思维法(Chain of Thought)进行计算。通过先计算较简单的参数,逐步得出最终解答,确保每一步都捕捉到正确的依赖关系。
每个数学问题都需要有一个解决方案,我们使用标准的链式思维法(Chain of Thought)进行计算。这里的问题是关于中央高中有多少个背包,通过计算相关参数得出最终解答。首先要计算蓝色参数,它等于其他参数的和。然后计算绿色参数,这依赖于黄色参数的计算结果。黄色参数由已知数值17和13相加得到。
2.1.1.2 可能的解决方案
解决方案通过从拓扑图的叶子节点逐步计算到最终答案。在整个过程中,我们使用模23运算,简化算术部分,专注推理。数据结构的关键有两点:1. 句子顺序被打乱,模型需进行拓扑排序;2. 参数op表示操作次数,反映问题的难度。数据集分为两类:中等难度和较高难度,分别关注不超过15次和21次操作的问题。训练结果表明,语言模型不仅能解决问题,还能在更高难度下实现泛化。
猜想论断:我们得出语言模型能学习解决数学问题的推理技能,而不仅仅是记忆解决方案模板。通过控制数据集,我们验证了模型在测试时能够应对更复杂的问题。这表明模型确实具备学习推理技能的能力。
今天的演讲中只有两件事是重要的。
- 第一,问题描述中的句子是随机打乱的。因此,模型在学习生成解决方案时,不能逐行翻译问题,而是必须弄清楚第一步是什么,第二步是什么,必须进行拓扑排序。
- 第二个,参数op表示解决方案中需要的操作次数。例如,尽管这个解决方案有六个步骤,但其中一个步骤是三个元素的和,因此总的操作次数是7。这一数量实际上反映了推理问题的难度。所以你只需要关注这两个方面。现在让我们在这个数据上重新训练一个语言模型,例如GPT-2。
原则上,这个数据集是无限大小的,但我们将其限制为两类数据。
- 第一类我们称之为中等难度的数学问题,我们只关注那些解决方案操作次数不超过15次的问题。
- 第二种情况下,难度较高的数据集,我们关注操作次数不超过21次的问题。我们在这种数据上进行预训练,以给你一个关于数据难度的概念,如果op等于21。
这是一个例子。我认为它不是特别难,但即使对于人类来说,要弄清楚第一步该计算什么也是不简单的。你需要进行一些心理计算,才能解决这个问题。我们甚至计算了每个数据集中有多少个解决方案模板。
如果你关注中等难度的问题,那么至少有大约70亿个解决方案模板。如果你看的是难度较高的问题,那么至少有大约90万亿个解决方案模板。
因此,如果语言模型能够从中学习,那就不可能是因为它在记忆某些模板,而是它真正学习了问题解决的技能。确实,我们训练了模型并对其进行了测试。有趣的是,我们不仅测试了模型在分布内对与训练集难度相同的问题的表现,还测试了模型在分布外对比训练集更难的问题的数学解决能力,我们发现语言模型确实能够实现分布外的泛化。
2.1.2 猜想论断
在我继续之前,这里我可以提出一个论断,即语言模型确实有能力学习解决数学问题的技能,而这并不只是通过记忆解决方案模板来实现的。你知道,关于GPT-4是否能够解决一些数学问题,有争议认为它可能是在记忆某些解决方案模板,但你无法证明这一点,因为你无法完全控制数据。然而在这里,我们确实完全控制了数据。我们知道在训练过程中,问题的难度只有这个级别,而在测试时,你是在测试完全不同的、更长的问题。
因此,我们可以得出结论,语言模型确实具备学习某些推理技能的能力。但它们究竟学到了什么?它们发展了什么技能?这正是我在接下来讨论中关心的内容。
2.1.3 语言模型的学习推理
首先GPT-2模型(不一定需要GPT-2,可以使用Llama或Mistral架构),如果你在这些数据上训练它,你会立即发现它发展出了我们称之为“一级推理技能”的东西。
解释一下:当遇到一个这样的数学问题时,至少有两种不同的策略可以解决。
“0级推理技能”是一种简单的策略,即通过蛮力遍历所有可能的参数,逐一尝试计算。如果一个参数不可计算,就跳到下一个,直到所有参数都被计算出来,从而解决问题并给出正确答案。
相比之下,“1级推理技能”更为智能,它会进行拓扑排序,忽略不必要的参数。我们的研究发现,语言模型确实可以学习到这种“1级推理技能”,并且能够生成最短的解决方案。这很难,因为模型在生成第一个句子之前就必须知道哪些参数是必要的。如果模型不知道这些,它可能会从不必要的参数开始计算,从而生成较长的解决方案。然而,我们的研究表明,模型在生成第一个句子之前已经完成了内部处理,这并非易事。
有人认为使用链式思维可以将数学问题分解为简单的步骤,但实际上,即使在决定计算第一步之前,仍然需要进行一些心理思考。我们将通过下一张幻灯片的探测来进一步证明,语言模型确实具备这一能力。
2.1.3.1 实现“一级推理技能”的方式
我们首先探测的是,在模型生成解决方案的第一句话之前,它是否已经知道某个参数A是否是解答问题所必需的。我们对每个可能的参数A都进行了探测。
此外,我们在生成解决方案句子的过程中,也探测了模型是否知道哪些参数可以接下来被计算。模型可能知道参数A可以计算,但是否在其内部状态中存有完整的参数列表呢?更有趣的是,即使在问题提出之前,模型是否已经知道参数A依赖于参数B?探测结果表明,模型在生成解决方案前已经预先计算了所有这些依赖关系,准确率超过99%。这表明模型已经具备了“1级推理技能”。
例如,模型如果知道哪些参数是必要的,并且知道哪些可以接下来计算,它就会通过逻辑运算得出下一个必要且可计算的参数。这意味着模型总能生成最短的解决方案。
更令人惊讶的是,探测过程还暗示了语言模型发展了“二级推理技能”。这些探测内容同样适用于所有与最终答案无关的参数。我们发现,模型在问题提出之前,已经在心里计算了所有参数之间的依赖关系图。
2.1.3.2 二级推理能力
“二级推理能力”并非解决数学问题所必需的技能,而且人类通常不会使用这种策略。对于人类而言,我们通常是从问题出发,反向识别哪些参数是必要的。然而,语言模型实际上通过预先计算所有参数之间的依赖关系,展现出了这种“二级推理能力”。
这一能力并不意味着模型比人类更聪明,但它确实计算了更多的内容。我们可以将其视为通用人工智能(AGI)中“G”这个字母的初步信号,因为这里的“G”意味着模型能够推广出在训练集中没有直接教过的技能。
在这种情况下,模型学会了在听到对象的依赖关系之前,预先计算对象集合中所有参数的依赖关系图。这种能力对于模型在以后的任务微调中非常重要。一旦模型具备了这种确定依赖关系图的能力,它就可以解决许多其他问题,例如“哪个参数依赖于哪个参数”或“事物之间的连通性”等问题。通过利用这种技能,模型可以进一步发展出其他能力。
因此,我们将其视为AGI中“G”字母来源的初步证据。这揭示了语言模型在解决数学问题时所展现的内部推理技能。
2.1.4 语言模型的实际错误
现在我们来讨论语言模型是如何犯错误的。在我们的数据集中,语言模型通常会犯两种类型的错误:
- 写下或计算不必要的参数:虽然LLMs通常不会生成不必要的参数,但在极高难度的情况下,模型可能会陷入这种错误。例如,当问题的操作数数量极大时,甚至高级模型如GPT-4也会生成不必要的参数。这是第一种类型的错误。
- 计算顺序错误:有时模型会开始计算某个参数,可能是通过定义一个参数,但随后它会卡住,因为该参数实际上还未准备好进行计算。这种错误是我们在数据集中观察到的另一种常见错误类型。
2.1.4.1 理解错误的原因
这两种错误类型揭示了模型在处理复杂任务时的局限性和潜在的弱点。理解这些错误的根本原因,有助于进一步优化模型,提升其在各种任务中的表现。通过识别和解决这些问题,未来的语言模型可能会更加接近通用人工智能的目标。
2.1.4.2 错误反思
- 第一种错误,在模型开始生成解决方案之前,它实际上已经在心里预先计算了哪些参数是必要的。
因此,我们实际上可以进行相关性测试,看看这些错误与模型是否已经错误地计算了某个必要的参数之间是否存在相关性。如果答案是错误的,但模型在生成解决方案之前已经错误地认为这个参数是必要的,那么我们可以看到两者之间的高度相关性。
这实际上意味着,即使在模型开始生成之前,有些错误已经可以被检测到。在模型开始生成之前,通过探测它的心理状态或内部状态,你已经可以发现这是一个即将发生的错误。
这意味着有些数学错误实际上是系统性的,而不仅仅是生成过程中的随机性。模型甚至在开始生成之前,在开始使用任何随机性之前,其内部状态就已经表明它将会犯错。
- 第二种错误类型也与探测结果和错误之间存在相关性。
我们发现,如果模型在心里认为某个参数已经准备好计算了,但实际上还没有,那么模型很可能会犯这个错误。因此,要提高模型的推理能力,关键在于提高它在心理计算这一方面的能力。在第2.2部分中,我将讨论如何通过改进这一部分来提高模型的推理能力。
因此,我们也做了一些探测,以将模型犯错的原因与语言模型的内部状态联系起来。
2.1.5 扩展定律
OpenAI曾提出,模型的规模(即参数数量)是性能的关键,网络的宽度和深度可能并不重要。然而,我们发现推理能力与深度密切相关。
2.1.5.1 规模与深度的影响
在知识获取方面,模型的规模确实重要,只要有至少两层的Transformer架构,深度的影响较小。但在推理任务中,深度显得尤为关键。实验表明,较深的模型在推理准确性上表现更佳,即使它的参数数量不如浅而宽的模型多。
2.1.5.2 深度与心理处理
探测实验揭示了深度的重要性,尤其在心理处理和预计算方面。当参数与问题的距离越远,探测准确率会下降。这意味着模型需要经过多步推理才能确定某个参数的必要性。这正是较深的Transformer网络在处理复杂推理任务时表现更好的原因。
2.1.5.3 深度与推理能力
随着模型层数增加,探测准确率提升至接近100%。这表明,深度对推理至关重要,因为它增强了模型的心理计算能力。这一点并不能仅通过链式思维(Chain of Thought)来解决,因为模型在决定计算顺序之前就已进行了一定的心理处理,而这需要深度的支持。
2.1.5.4 结论
总之,尽管规模在知识获取中很重要,但推理能力依赖于深度。深度使模型能够处理复杂的推理任务,通过多层心理计算得出最优解。因此,在设计推理模型时,深度结构至关重要。
2.1.6 总结
总结第2.1部分,我们创建了一个合成数学数据集来模拟GSM8K,并通过它研究语言模型的隐藏推理过程。我们发现,模型展示了一种超越人类的二级推理能力。此外,我们还利用探测技术揭示了模型的错误机制。最后,我们将语言模型的深度与数学问题的推理长度进行了关联。
这项研究无法仅通过从互联网获取预训练语言模型来完成,而是必须通过受控实验来发现这些联系。虽然在论文中已经提到,我们的实验表明,即使是GPT-4.0,在超过10步的推理任务中也可能会失败。我们系统地测试了这一点,发现其在处理非常长的推理任务时容易出错。
这表明,如果我们希望进一步提高大型语言模型的推理性能,可能需要开发合成数学数据集来增强其推理能力。这也是我将在演讲结束时回到的一个关键观点。
2.2 从错误中学习
以上是通过构建合成数据来提高语言模型推理能力的一种方法。另一种方法是让语言模型从错误中学习。这就是第2.2部分的内容。
2.2.1 现象综述
从一个有趣的发现开始,即语言模型实际上经常意识到自己犯了错误。
语言模型常见的一种错误:有时它在定义一个参数后开始尝试计算,但随后意识到该参数还没有准备好进行计算。如果从这一步开始,错误就会发生。
假设从当前位置(例如单词“s”)进行探测,以观察模型是否意识到自己犯了错误。我们发现,模型确实意识到自己犯了错误,其内部状态表现出懊悔的行为,它试图回到之前的状态,但无法实现。
现在,假设我们赋予语言模型返回之前状态的能力,观察会发生什么。可能出现两种结果。首先,如果在正确的数据上预训练一个模型,它会自动成为一个错误检测器,可以通过探测或微调轻松检测错误。假设使用此错误检测器辅助生成过程,当模型意识到错误时,返回并重新生成,准确率略有提升至2%。
然而,这种方法有两个主要缺点。一是改变了生成数据的方式,需要跟踪两个模型:生成模型和错误检测器。尽管这是一个小问题,但更重要的是,这种方法只提高了2%的准确率。本质上,这是在“作弊”,依赖于随机性来纠正错误,模型只是回到上一个句子的末尾重新生成。
事实上,这与Beam Search非常相似。然而,这些都是“作弊”的方法,并不是让模型真正从错误中学习,而是依赖随机性或重试来纠正错误。要使模型能够纠正错误,必须准备包含错误和纠正的训练数据。
2.2.2 合成操作
在合成设置中,我们进行了如下操作:保持数学问题不变,但在生成解决方案时,我们允许数据包含错误,并且以概率p在每个句子的末尾包含一个错误。我们添加了一个名为‘back’的特殊标记(这不是退格键)。这意味着在训练和推理过程中,模型依然采用自回归语言建模。例如,当模型试图学习或生成某个参数时,它可以访问之前所有的错误信息。我们正在准备这样的数据,以便模型能够学习如何自我纠正错误。
然而,重要的不仅仅在于准确率的提升,还有许多其他优点:
- 首先,我们发现错误概率p越高,改进效果越好。实际上,你可以插入大量的错误,例如让一半的句子包含错误。但这样做不仅不会影响模型,反而能进一步提高其准确性。
- 另一个优点是,即使在预训练数据中插入了大量错误,这并不意味着模型在推理时会犯错。即使在推理过程中p等于0.5,模型仍然可以使用温度为0或beam search来寻找最有可能生成的下一个句子。即使在训练期间我们插入了随机错误,但这些随机错误的生成概率仍然很小,而最可能的下一句仍然是正确的下一句。所以如果你进行数学推导,你会发现模型在生成解决方案时仍然被鼓励使用正确的句子。因此,你不需要担心模型在学习这些数据时,会突然在生成时犯大量错误。
- 我们发现的第三个特性是,无需进行标签掩蔽(label masking)。在Pytorch中,我们会将忽略的索引设为-100以进行标签掩蔽,以避免模型学习数学数据中的错误。然而,我们的研究表明,标签掩蔽并非必需,且对模型性能的影响几乎可以忽略不计。模型可以从纠正中学习,而不会受到错误数据的影响。
尽管预训练数据中解决方案的长度增加,模型在推理时仍能运用初级和次级推理技能,并提供最简短的解决方案。简而言之,这种方法非常可靠,将包含错误与纠正的元数据纳入其中是一种安全的选择。
实际上,错误越多越好,这并不会改变预训练过程和推理过程,仍然是自回归的方式。
在这里,我想提出两个评论:
- 第一,如何在实践中获取这样的数据?
- 第二,为了提升准确率,必要的训练过程是什么?
2.2.3 评价表现
在这个实验中,我们进行了预训练,即我们使用包含错误和纠正的数学数据进行预训练。如果进行微调呢?假设只在完全正确的数学数据上预训练的模型,现在使用包含错误和纠正的数学数据对其进行微调。
这个模型会表现得好吗?答案是否定的。
需要指出的是,我所提供的每个数字都是经过一系列实验得出的。我们测试了多种参数组合和微调方法,但结果显示,这些尝试对准确率的提升几乎无显著影响,并且在大多数情况下,准确率反而有所降低。
关键在于,将含有错误的数学数据纳入预训练阶段至关重要,等到微调阶段再加入则为时已晚。这是因为,不同于简单的错误检测,错误纠正是一项更为复杂的技能,它要求模型不仅要识别错误,还要知道如何改正。这种技能需要从预训练阶段就开始培养。例如,对于像Llama这样拥有700亿参数的模型,或其他未经错误及纠正数学数据训练的预训练模型,即使尝试微调,也难以获得理想效果。这一结论也得到了受控实验的验证。
2.2.4 如何准备数据
最后,我将展示如何在合成环境中准备这类数据。在合成环境中,数据生成相对简单,因为你可以完全访问数据。你了解图表和依赖关系图,可以随心所欲地进行操作。但在实践中,如何做到这一点呢?
在论文中,我们尝试了两个实际的想法,一个是较为简单的想法,另一个是更巧妙的想法。
- 首先,我介绍一个较为简单的想法。我们尝试在解决方案中人为制造一些错误。这些伪错误是通过在解决方案后随机插入句子来创造的。例如,我可以在解决方案的某个点插入一个未来句子作为错误数据。虽然某些句子并非真正的错误,因为它们可能已经在前文中被推导出来,但这种方法仍能以极低的成本准备数据。只需将数学解决方案分解成句子,并尝试将后续句子提前插入以形成伪错误。我们在合成数据上实施了这一想法,并观察到准确率有显著提升。尽管它不如包含真实错误的数学数据效果佳,但仍然实现了可观的准确率提高。
- 第二个更巧妙的想法是通过对问题陈述中的参数进行随机选择来制造错误,以此创建伪错误。然而,我必须指出,这种方法并不奏效。实际上,它不仅更难实现,而且效果也较差。因此,相比之下,采用之前的简单想法更为理想,因为它易于实施并且仍然可以提升推理能力。我们将这一策略暂名为“通过预训练伪错误,无需后悔”。
2.2.5 总结
首先,我告诉你,语言模型通常知道自己犯了错误。它们确实表现出一种后悔的行为,它们真的想纠正自己,但做不到,因为它们没有这个能力。为了让模型具备这种能力,你必须添加包含错误和纠正的预训练数据,真正教会它如何做到这一点。这种能力是无法通过束搜索或微调来实现的,必须在预训练阶段插入这种数据。
最后,实际上可以非常容易地创建这种类型的伪错误,至少在我们的合成数据上,我们预测这将带来相当可观的准确率提升。
首先,语言模型通常能意识到自己的错误,它们确实表现出一种后悔的行为,但缺乏自我修正的能力。为了让模型具备这种能力,必须在预训练阶段加入包含错误和纠正的数据。这种能力是无法通过beam search或微调来实现的。在我们的合成数据中,创建这类伪错误相对简单,并且预计会显著提高准确率。
在第二部分,我专注于语言模型的推理能力。我们构建了一个专门针对小学数学水平的合成数据集,并采用了仅有1亿参数的模型。由于我们关注的是特定技能且使用的是精确的数学数据,因此无需大型模型。在这种设置下,我们还可以通过调整数据难度、错误类型或训练过程来观察模型推理能力的变化。我们还进行了大量探测,以揭示模型的推理机制和错误模式,并探讨了不同难度参数与模型深度及推理长度的关联。
这是一段对我今天所讨论的主要主题的小反思。
第一部分:学习语言结构
在接下来的大约25分钟内,我将讨论第1部分,即关于语言模型学习语言结构的内容。
在这一部分有两个目标。
- 我们的首要目标是深入解释大型语言模型(LLMs)超越词元层面的工作机制。虽然现有的模型解释,如归纳头(induction head),在词元层面上效果显著,但它们过于简单。我们希望精确解析模型如何学习更复杂的层次化算法,尤其是那些超越拓扑排序(topological sort)的算法。因此,我们希望提供对语言模型实现非平凡算法机制的深入且精确的解释。
- 第二个目标是探究语言模型如何学习结构。在我的演讲中,我未曾明确提及语言模型如何从数学中学习。虽然我讨论了模型如何获取知识和推理,但没有涉及数学格式的学习。事实上,这有一个术语叫做“幻觉”(hallucination)。所谓的“幻觉”实际上是指模型对格式的快速学习超越了底层任务。语言模型能够轻易学习格式。因此,我们的挑战在于提升任务难度,创造更层次化、复杂的语言结构,以测试语音模型的极限并观察它如何处理这些复杂的结构。
1.1 CFGs 上下文无关文法
为了实现这两个目标,我们采取了一种同时涵盖两者的方法,即探讨语言模型如何学习上下文无关文法(CFGs)。我们设计了一系列复杂的合成CFGs,例如,我们创建了超过20个这样的文法。生成过程从根节点开始,遵循概率均等的规则逐步向下,直至到达叶子节点,这些字符构成了CFG树生成的句子。我们故意限制了叶子节点的词汇量,使得生成的句子如1,2,3,3到1等,这使得任务极具挑战性,因为仅凭局部连续词元无法真正辨别出它们的父节点、祖节点等。
1.1.1 语法区分
虽然CFG包含字母语法,但我要强调的是,我们生成的CFG比英语语法复杂得多。英语语法通常可以通过贪婪解析(greedy parsing)来处理,例如,形容词后跟名词可以直接组合。
然而,在我们的合成CFG中,由于局部连续数字或词元的复杂性,需要动态规划来进行完整的解析,以确定如何分割词元及其所属的父节点。这个CFG树能够生成的样本数量高达10的80次方,因此语言模型不可能记忆所有这些样本。接下来,我们将探讨在这些数据上预训练语言模型(如CGP)的结果。
我们通过三个方面来衡量准确性:
- 首先,我们在预训练后给模型提供一个有效前缀,鉴于训练样本的庞大数量,这个前缀是模型未曾接触的。然后观察模型是否能准确生成一个可能长达数百词元的句子,且该句子符合CFG的规则。结果表明,使用相对注意力(relative attention)或基于旋转注意力(rotary attention)的GPT,准确性非常高。而传统基于绝对位置嵌入(absolute positional embedding)的GPT模型,准确性要低得多。
- 我们还从多样性和分布差异等其他角度进行了观察,并测量了KL散度,得到了相似的结果。这些发现强调,在CFG数据上训练时,使用相对注意力或旋转注意力是绝对必要的。
1.1.2 GPT实现路径
在下一张幻灯片中,我将再次告诉你GPT是如何实现这一点的。
在此之前,我已经可以得出一个初步结论:通过比较三种不同模型的准确性,我们明显看到了旋转嵌入(rotary embedding)和相对注意力与绝对位置嵌入的紧密联系。实际上,旋转嵌入已在Llama、Mistral以及许多最先进模型中得到应用。我们使用它的原因在于,通过合成CFG数据的实验,我们发现基于相对距离的注意力对学习语言结构极为有利,这是相对注意力和旋转注意力的本质。然而,一个意外的发现是,即使采用我们称为“愚蠢的GPT”(GPT stupid)的架构,即均匀注意力(uniform attention),其性能也相当不错。
关于“愚蠢的GPT”架构,它依然采用多个注意力头,但每个头的注意力是均匀分配的。第一个头总是关注前一个词元,第二个头均匀关注前三个词元,以此类推,注意力长度呈指数增长。这种均匀注意力机制的“愚蠢的GPT”性能超越带有位置嵌入的传统GPT。
因此,这给了我们一个启示:如果将来想要摆脱注意力机制,应该考虑保留均匀注意力,因为它简单而有效,有助于学习对某些任务至关重要的语言结构。此外,虽然相对注意力在实际应用中比旋转嵌入更优,但知道的人不多,因为相对注意力仅提供约1%的准确率提升,却会显著增加运行时间。因此,尽管旋转嵌入更为流行,但相对注意力的性能实际上更佳,这是一个重要的认识。
1.2 语言模型的学习
现在让我们真正进入有趣的部分,探究语言模型是如何学习这些内容的,为什么以及如何学习这些内容。
回顾一下,我们在CFG数据上训练的语言模型只接触到了如‘1,2,3,3到1’这样的句子。这些数据看似简单,但背后是由CFG树生成的。模型并未直接看到这棵树。我们的研究发现,预训练后,模型确实隐性地学会了解析这些CFG树。具体来说,Transformer最后一层的隐藏嵌入不仅包含了序列的解析树信息,而且这些信息被准确地编码在了正确的位置。
在这个例子中,红色框内的信息,如子树节点名为11和7,是通过线性变换在隐藏状态中局部存储的。父节点、祖节点和曾祖节点的信息也是在这里局部存储。红色框中的所有信息都被局部存储在蓝色框内。由于这是语言建模,且模型是单向解码器,模型还未看到将来的输入。
因此,不应期望模型了解节点的曾祖节点或其他未来节点信息,这些信息并未存储。然而,所有理论上模型能够解析的信息,实际上已经存储在模型的隐藏状态中。
总结来说,GPT不仅能够学习由合成CFG数据生成的序列,而且能够隐性学习CFG树。例如,每个子树的根节点信息(如名为13的根节点)在子树的结束位置附近被准确地线性编码。
你可能认为这是语言模型的自然能力,但实际上并非如此。像BERT或DeBERTa这样的基于编码器的模型无法做到这一点,因为它们依赖于掩码语言模型(MLM),而MLM任务仅需要模型关注周围有限的词元来推断缺失内容。然而,语言建模需要模型深入解析到根节点以确定下一个生成的词元,这使得语言建模任务比MLM更复杂。
这或许解释了为什么在实际应用中,我们倾向于使用基于解码器的模型。虽然你可以使用编码器-解码器模型,但通常不应该只依赖编码器模型。
这与我在第三部分讨论的知识提取有关,我指出如果使用双向模型,这些模型无法提取知识。这是我之前忽略的一个方面,但背后的原因与上述观点相似。
1.2.1 CFGs学习的实现
既然我们已经了解到GPTs能够隐性学习隐藏的CFGs,那么它是如何具体实现这一点的呢?
我们的进一步研究揭示了人类解析CFGs的方法,即使用动态规划。动态规划涉及定义一个数组,例如dp[i][j],表示符号a是否可以生成从i到j的子序列。例如,为了验证节点18是否可以生成某个子序列,你需要先验证节点13和节点15是否可以生成相应的子序列。这就是动态规划的核心思想,而我在之前展示的幻灯片上,实际上揭示了这些动态规划状态被局部存储在语言模型的隐藏状态中。
此外,如果你思考一下,动态规划还涉及转换函数。为了将这些信息组合成一个更大的状态,即整个序列可以由节点18生成,你需要能够在动态规划状态之间建立一些连接,这就是所谓的动态规划转换函数。
我们发现,语言模型的注意力模式几乎完全模拟了CFG解析中的动态规划过程,用于连接动态规划状态。我们在论文中详细描述了这一点,但这只是学习CFGs问题的一半。
要让语言模型学习CFGs,它不仅需要学习如何解析,还需要学习如何从CFG生成文本。这需要另一种层次的动态规划,可能许多人并不熟悉。具体来说,模型需要能够确定给定前缀可以生成的下一个词元或多个词元的边际概率。这需要另一层次的动态规划,通常以动态规划状态的形式表示,例如,确定给定前缀可以跟随的节点编号。
为了验证给定前缀可以跟随特定节点,同样需要进行动态规划。比如,为了确定前缀可以跟随节点9,我需要首先验证较短前缀可以跟随其他节点,如节点10和节点8,以及这些节点是否可以生成相应的短序列。我需要结合这些信息来验证前缀可以跟随节点9。
因此,这里还存在另一种非常复杂的动态规划,同样涉及动态规划状态和动态规划转换函数。我们还确认,这些类型的转换函数在预训练后的Transformer的注意力机制中出现,表明Transformer确实在进行一些非常智能的处理。
1.3 总结
总结第一部分的内容,我展示了GPTs确实能够学习非常长且复杂的CFGs,这需要复杂的规划和“心智计算”,即动态规划。
这比拓扑排序要困难得多。通过实际探测,我们展示了动态规划(DP)状态是如何编码在模型的隐藏状态中,以及DP转换函数是如何编码在注意力机制中的。这为语言模型的解释提供了强有力的证据。
此外,BERT无法实现这一点,必须使用语言建模。我今天没有详细讨论的一个结果是关于GPTs如何学习隐含或损坏的CFGs,这在论文中也有一些值得关注的内容。
我想指出的是,这个两步动态规划算法非常复杂。我询问了所有软件工程师朋友,他们都不熟悉这个动态规划。在我面试或模拟面试过的所有人中,没有一个人解决了这个问题。我第一次了解到这个动态规划是在2005年国际信息学奥林匹克竞赛(IOI 2005),当时我是参赛者之一,但并未解决那个问题。
从这个角度来看,我认为即使是GPT-2,其智能也超过了17岁时的我。这让我感到惊讶,并激励我投身于研究语言模型的“物理学”。
三、演讲总结
实际上,我并不惊讶于GPT-4能够实现如此出色的事情,因为它肯定已经学习了所有关于动态规划的教科书,了解动态规划是什么。但我想强调的是GPT-2,它并没有直接学习动态规划。它所接触的仅仅是那些‘1,2,3,3到1’的模式。它实际上自动学会了解析这些数据的最好算法,以及从这些数据中生成文本的最佳算法。这正是激发我对这个研究领域产生兴趣的原因。
因此,在最后,我想强调的是,使用合成数据是一种未来趋势。在过去,如果你告诉别人你在机器学习中使用合成数据,他们可能会嘲笑你,甚至审稿人可能会拒绝你的论文。但现在,随着我们越来越耗尽了现实生活中的数据,使用合成数据已经成为一种趋势。
尽管GPT-4可能在互联网数据上进行了训练,但它仍然无法进行超过10步的推理。要突破这一障碍,我们必须考虑如何准备合成数据来进行训练,这可能适用于GPT-6或更高级别的模型。我们需要为此做好准备。
然而,如何研究出能够实现这一目标的正确数据格式呢?例如,当我们谈论知识时,我们需要提供什么样的知识格式,才能让模型获取最多的知识?或者,在训练过程中,我们需要输入什么格式的推理问题,才能使模型进行尽可能长时间的推理?这些都是我们需要解决的关键问题。
这些都是我们需要认真思考的事情,以便构建一个能够让我们更接近通用人工智能(AGI)的语言模型。
暂无评论内容