在当今人工智能领域,AI 模型凭借卓越的语言理解和生成能力,正在重塑我们对智能交互的认知。不过,在其光鲜亮丽的表现背后,藏着不少尚未被充分挖掘的关键因素。今天,我们就来聊聊大语言模型训练过程中产生的几种独特现象,以及如何在这些现象指导下,在二阶段预训练时巧妙平衡数据量与背景知识的注入——从理论和实践两面揭开其内在运作机制,深挖语言核心区与维度依赖理论的作用及其带来的深远影响。
先说一个非常有趣的现象:在多语言模型中,不同的语言之间似乎存在着一种隐含的对齐关系。复旦 NLP 团队早在 2022 年就发布了一篇关于 Multilingual BERT 的分析文章,之后团队持续深入研究了语言对齐机制以及语言与知识结构之间的内在联系,并在 AAAI 2024 提交了一份研究报告,提出了关于大语言模型中语言对齐部分的若干猜想。基于这些工作,我们来一起看看大语言模型中语言和知识分离的几种表现。
现象 1:mBERT 模型的跨语言迁移
2022 年的时候,我们发现 Multilingual BERT 是一个经过大规模跨语言训练验证的模型实例,展示出了非常优异的跨语言迁移能力。具体来说——模型在单一语言环境下训练完成某个部分后,可以很轻松地迁移到其他语言环境中执行任务。这就让人不禁想问:模型里是不是存在某种特定的部分,专门负责这件事?为了搞清楚这种多语言对齐的机制,研究团队使用了 Prompt 搜索方法对模型进行了逐层分析(见图 1),针对每一种语言的每一层网络以及每一个 head 单元,仔细考察了它们对语法分类任务的执行能力。

图 1 mBERT 不同层恢复各类语言语法关系的准确性
在多语言样本的测试中,我们挑选了每种语言不同层次的 head 进行了测试,评估它们在语法关系预测任务上的表现。结果相当明显:在大规模预训练过程中,即使没有注入任何显式的语法先验知识,模型依然能在语法结构层面展现出良好的对齐特性,并且在不同的层次间保持一定的精度一致性。这一趋势在大多数主流语言中都相当突出,只不过在那些比较特殊或较少使用的语言中表现得不那么明显。
通过对多种不同语法现象的预测进行比较,研究重点对比了英语与西班牙语、英语与日语之间的差异。在第 7 层网络的语法关系可视化图中,数据显示那些亲缘性较高的语言,其预测位置更为接近,而且分布也比较均匀。而像英语和日语这种差异比较大的语言,部分语法成分的预测位置就相对集中(见图 2),没办法有效地区分开。

图 2 mBERT 第 7 层的不同语法关系表示的可视化
接下来,我们发现了更不寻常的现象:当针对特定任务对模型进行微调时——比如用 Multilingual BERT 来做任务倾向性分析或命名实体识别等任务——模型在处理语法成分的对齐关系以及区分边界时的表现,都会有显著的提升(见图 3)。

图 3 在进行任务 Fine-Tune 之后,聚合对齐更加明显
在未经微调的原始模型里,内部蕴含了大量的语法预测信息,这些预测主要聚集在模型的中间层级,混合度比较高。但一旦执行了相应的任务预测微调,这些预测的分布就变得清晰了很多,独立性也更强了。根据这个现象,我们可以合理推测 Multilingual BERT 模型上用单一语言微调特定任务后,所学习到的能力能够快速迁移到其他语言的根本原因。
现象 2:大语言模型同样存在显著的语言对齐
我们已经通过 2022 年的工作揭示了 Multilingual BERT 中的语言对齐现象,那么在大语言模型上——除了 decoder-only 结构的设计改进之外,无非就是模型宽度和深度的拓展。这个现象在 Multilingual BERT 里存在,自然就引出了我们对大语言模型内部语言对齐和语法-语义对齐特性的探究兴趣。
为了把这个问题讲得更透,我们在 2023 年 EMNLP 上发表了一篇论文,不仅在原始的 Multilingual BERT 上做了相应的分析,还在 LLaMa 模型上复现了这一现象。研究采用了一系列额外的语言评价指标,比如 RSA 等等,以期望得到更全面和准确的结论。结果表明,在大语言模型上,这个现象跟 Multilingual BERT 非常类似(见图 4)。如果按照之前提出的分层逻辑去理解,模型在语法层面表现出了明显的对齐性,这跟我们早期的研究结果高度一致。

图 4 语言直接在句法关系上具有很强的对齐性
其次,我们探索了将 Multilingual BERT 上的迁移工作应用到更大规模语言模型上的可能性。具体来说,我们针对词性标注任务设计了一种特殊方法(见图 5)。当面临单个语言的小规模数据集时,我们选取了若干位置,完全不需要任何标注数据,直接使用 Multilingual BERT 的迁移方式,就在多语言环境中取得了优秀的标注效果。举个例子,就算没有阿拉伯语的标注数据集,仅仅依靠英语和法语的数据集,也能成功地迁移到其他语言环境中。

图 5 词性标注任务,可以通过跨语言训练得到非常高的结果
所以,在大语言模型当中,这种语言对齐现象依然存在。模型成功实现了词形(单词形式)与中间层语义表示、语法表示之间的转换,脱离了原有的词形,使得模型能够去处理别的任务。
通过前面的分析和工作,我们可以得出结论:大语言模型在多语言预训练阶段确实有效地实现了不同语言之间在语义层面上的对齐。相比可能没那么重要的形式层面,语义层面的一致性才是关键所在。一旦语义层面实现了统一,理论上就可以直接应对多种相关的下游任务。为了验证这个猜想,我们进一步开展了一系列的研究工作。
现象 3:知识与语言分离
以下是我们投稿至 AAAI 2024 的论文中的内容。假设语义层面已经实现了很好的对齐,那么词汇形式的具体表达的重要性就会大幅削弱。为此,我们深入探究了如何从 LLaMa 模型出发,把它的语言能力迁移到其他小型语种上——在这个过程中,即便面对词形的变化,模型内部其实已经具备了一层进行语义转换的能力。
从以英语为主的训练语言转向中文或任何其他语言时,实际上的转换需求仅仅局限在形式上的改变。通常,将 LLaMA 扩展为小语言需要经历三步(见图 6):第一步是词表扩展;第二步是继续预训练;第三步是任务添加,所以需要使用 SFT 数据。

图 6 将英文 LLaMA 扩展为其他语言
为了方便观察,我们把这个过程拆解成了三种形式。第一种形式是完全不改动词表,直接进行继续预训练和指令微调。第二种形式只做词表扩展,不做其他操作。第三种形式就是完全跳过前两步,直接拿大量的 SFT 数据来训练。
基于这些设定,我们开展了对比实验。首先,直接使用 LLaMA 或 LLaMA 2 进行 SFT 训练,观察经过词料扩展和大量负责培训之后的效果,比如 Chinese LLaMA、Chinese LLaMA 2 和我们实验室开源的 Open Chinese LLaMA(经过 200b 数据训练)。此外,我们还测试了不进行词表扩展,直接用 100k 和 1m 中文语料进行 SFT 训练的情况。
由于评测目标是模型的生成能力,我们使用了能提供生成式问答题目的 LLMEVAL 评测方式,基于模型生成数据的正确性、信息量、流畅性、逻辑性等维度,分别用 GPT-4 进行打分,结果如下(见图 7)。

图 7 Token 扩展会导致原始信息丢失,需要大量训练才能恢复
所以,以 Chinese LLaMA 为例,想恢复信息就需要达到 200 倍以上的二次预训练数据,这就会大幅增加训练成本。如果你的需求是让 token 的生成速度更快,那仍旧可以扩展词表。反过来,如果对生成速度没有特别大的需求——比如 LLaMA 根据 UTF-8 编码生成可能需要 2 到 3 个 token 才能产生一个汉字——只追求生成质量的话,直接进行大量中文的 SFT 数据训练,就已经能实现非常好的处理效果了。换句话说,词形和语义在语言层面已经实现了分离,想提供中文能力并不需要特别大量的数据训练。在 SFT 数据量非常小的时候,大规模的二次预训练可以加快模型学习指令响应的过程;但是当 SFT 数据量扩展到 950k 之后,继续增加中文的二次预训练数据其实意义不大——比如在 950k SFT 的情况下,LLaMA 跟经过 1M 中文二次预训练的 LLaMA 模型比起来,效果并没有大幅度改变。
这也是我们后续语言解释工作的基础:语言的词形消失了,知识和语言分离开来,加入少量的中文数据根本无法在知识层面提升模型能力。基于这种思考,我们开始进行新的评测(见图 8)。其中蓝色部分是 LLaMA-7b 模型,粉红色部分是 LLaMA-2-7B 模型,绿色部分是 LLaMA-13B 模型。我们希望看看,在经过大量训练之后,模型的知识层面会发生哪些变化。

图 8 使用中文进行二次预训练并不能在知识层面提升模型能力
在经过 C-Eval、GAOKAO-Bench、MMLU 和 AGIEval 等基准评测之后,我们观察到:大量未经针对性优化的预训练模型并没有显著提升其内在的知识掌握程度,反而在某些情况下比原始 LLaMA 模型还有所下滑。这主要是由于目前普遍采用的中文语料库训练数据规模有限,从而制约了模型在语言理解和生成方面的表现,导致了这样的评测结果。因此,如何有效地开展针对中文环境的第二阶段预训练,确实需要更多思考。单纯依靠现有方法,很难充分反映出模型在特定中文领域知识上的进步。值得注意的是,仅仅在现有通用模型中融入少量涵盖世界知识或物理、化学、数学等专业知识的中文数据,意义并不大。
在其他语言中,我们也做了类似的工作(见图 9)。研究选了十几种语言,每种语言都用相应的 SFT 数据进行训练和测试。观察发现,数据达到一定量级,比如 65k SFT 之后,模型基本都处于一个相对可用的版本。当然,因为这些 SFT 数据有一部分是机器翻译的,效果不如直接使用中文数据来得理想。

图 9 在其他低资源语言中表现类似
现象 4:语义和词形对齐
训练过程中,另一个有趣的现象也值得关注,它可以从一定层面上说明这种语义和词形对齐的关系。例如,我们用 95k 的 SFT 对某些模型进行训练,将早期的一些 checkpoint 打印出来,然后询问以下问题(见图 10):

图 10 训练过程中非常明显的 Coding-Switch(语码转换)现象
模型在响应查询时,输出的部分内容分别用红色和蓝色标示了出来。我们可以观察到,模型能够在保持语义连贯正确的前提下,自动插入其他语言的词汇,而且这些词汇与前面的内容衔接得非常自然,就好像原本就应该属于同一句话一样。这从某种程度上表明,模型在内部实现了语义与词形的解耦——也就是模型有能力在维持语义完整性的同时,灵活地处理不同语言的词形表达,印证了我们前面的一些猜想。我们测试了十几种语言,每一种语言都出现了比例不一的 Coding-Switch 现象,所以这并不只是中文特有的个例。
现象 5:少量的数据就能影响整个大模型
基于以上发现,我们开始更深入地思考。除了这些现象之外,在大语言模型的训练过程中还有很多别的现象,比如“毛刺”(见图 11),也就是“噪音”。在进行大规模预训练时,我们自己也进行了 30b 和 50b 参数级别的模型预训练,同样发现了类似情况。每次遇到这些噪音数据,我们的解决办法就是回溯——回滚到出问题的预训练阶段,去检查那一阶段的数据。大多数情况下,我们发现是由预训练数据引起的,这部分有问题的数据会导致模型的 PPL 值急剧升高。

图 11 “毛刺”
为什么少量的数据会对如此大规模的模型造成这么严重的影响呢?OpenAI 和 Anthropic 在他们的论文里都对此有所涉及,他们在研究 SFT 和预训练相关课题时,大多得出了类似的结论:模型进行两三轮的微调基本就接近最优状态了,过多的训练轮次往往会导致性能下降。这一结论在我们自己的实验中也得到了印证。
在传统训练流程中,我们可能对某部分数据训练 30 轮甚至 50 轮,即使数据质量不高,也就是导致这部分训练效果不好。然而,在大语言模型上,当我们引入少量 SFT 数据并进行六轮甚至十轮微调时,整个模型的能力却可能会急剧下降,而且在 SFT 数据上的表现也并没有改善。这到底是为什么呢?这一连串的疑问驱使我们去探寻更深层次的答案,也促使我们想要打开这个黑盒,对它进行更进一步的解释和分析。
以前,想对人脑的认知功能进行深入分析是非常困难的——因为直接观测和测量人脑各区域的功能不太可行,同时现代伦理准则也严格约束了对动物进行复杂神经科学实验的可能性。但在人工智能领域,BERT 模型的出现虽然为语言处理带来了重大突破,但其智能程度相对有限,结构和动态行为也相对容易分析。随着大语言模型的发展,尤其是参数量庞大的预训练模型的出现,它们展现出了更高水平的智能表现,同时也带来了新的挑战——模型的内部工作机理变得更加复杂,也更难以直观理解。不过既然有了机会,我们当然要抓住。
大语言模型参数中记录了知识,有明显的语言核心区
经过一系列分析之后,我们想探究这些现象究竟是如何具体表现在大语言模型的参数结构中的,并且从参数当中找出一些解释。过去半年以来,我们一直在围绕这个目标进行实验。在某种程度上,这跟人脑的功能分区原理相似——人脑中有专门的语言区和核心区,而在大语言模型中,也很可能存在负责语言理解与知识表达的部分结构。现在有相当一部分共识认为,一部分知识存储和处理功能可能对应着模型中的前馈神经网络部分,尤其是其中的多层感知器组件。不过目前的研究结果还比较初步,有些实验结论不一定十分可靠。
在研究中,我们认为大模型里明显存在着承载语言能力的核心区域。为什么会这么说?这个判断基于如下实验设计:首先,我们选了六种语言,针对每种语言收集了大约十万条未曾出现在 LLaMA 原始训练集中的文本数据——这些数据源自书籍并经过转换得到,出现重叠的概率比较低。接着,我们用这些数据对 LLaMA 模型进行了二次预训练。
预训练完成后,我们对比了模型训练前后参数的变化情况,针对每种语言独立进行:先对韩语进行预训练并记录参数变化,然后依次对俄语、越南语等其他语言进行同样的操作。在实验中,我们特别关注了权重变化最大的 1% 到 5% 的参数部分——因为直觉上,人们往往会认为权重变化大的区域更重要。但经过四个月的研究,我们发现,并不是权重变化大的区域才关键,相反,那些经过大规模预训练后变化很小的参数区域,才是模型的核心稳定部分。
为了验证这一点,我们进一步做了几个实验。我们发现有非常少数的参数在所有语言的二次预训练中变化都很小(见图 12),不管在哪一层、哪个矩阵,都有一个显著的集中区域,其参数变化极其微小,在不同语言上的变化都非常有限。于是,我们将六种语言训练前后参数变化幅度累计起来,考察各个位置变化的综合程度,从中挑选出变化最小的 1% 到 5% 的参数。

图 12 有非常少数的参数在所有语言二次预训练中变化都很小
把这部分参数拿出来之后,我们对这些变化极小的参数区域进行了扰动实验。通过 7b 参数规模的模型,我们选取底层变化最小的 3% 参数进行随机化处理,然后观察模型的 PPL 指标(见图 13)。实验结果显示,当扰动这最小变化的 3% 参数时,PPL 值会显著上升;而如果从模型中随意选取 3% 的参数进行同样的扰动,PPL 虽然也会下降,但下降幅度并不明显。反过来,如果我们对权重变化最大的那部分参数(同样取 3%)进行扰动,虽然 PPL 会比随机扰动稍高一些,但只要扰动那些变化最小的核心区域,PPL 值就会剧烈上升。同样,我们还尝试了仅扰动 1% 参数的情况,虽然变化幅度略有减小,但总体影响仍然很大,表现为几千到几万的增量。

图 13 扰动核心区域在 130 种语言上 PPL 全都呈现爆炸趋势
如果用 13b 参数的模型来重复上述工作,得到的结论完全一致(见图 14)。只要变动这个区域 3% 的部分,整个模型的语言能力基本上就会完全丧失掉。

图 14 LLaMA2-7B 和 13B 现象完全一样
语言能力区域的重要性既然如此突出,我们通过冻结它又做了一个实验(见图 15)。实验中,我们先锁定了模型的语言核心区参数,然后用中文知乎数据对该模型进行再训练。另一组对照实验则是不解冻核心区参数。通过在中英文微信公众号和英文 Falcon 数据集各选取 1 万条样本计算 PPL,我们发现:如果冻结语言核心区并用 5 万条中文知乎数据进行训练,模型的中文 PPL 可以恢复到 7 左右,说明模型通过其他区域的参数补偿了语言能力;但英文能力在这种条件下无法恢复到先前的爆炸趋势中。

图 15 模型具备一定的“代偿”能力,可以使用中文数据训练以恢复中文能力
然而,如果只扰乱而不冻结语言核心区参数,仅通过中文知乎数据训练,无论是中文 PPL 还是英文 PPL 都能恢复到接近原始模型的良好状态(见图 16)。因此,语言核心区的参数至关重要,而且对模型能力的影响呈现出平滑而敏感的特点——只需要几千条数据就可以相对容易地恢复其原有功能。但是,一旦这个区域被锁定,模型能力的恢复就会变得非常困难,性能指标也会出现显著的变化。

图 16 在语言区不锁定的情况下,仅训练中文,英文也能恢复一定能力
观察打印出的区域(见图 17),可以发现 QKVO 矩阵在维度上具有明显的集中现象——主要集中在一小部分维度上。

图 17 QKVO 矩阵都呈现维度集中现象
虽然 MLP 层没有那么明显的集中性,但在进一步放大查看后发现,在某些列上也存在显著的现象(见图 18)。

图 18 FFN-UP & Down 某些维度上具有明显的列聚集现象
举个例子,在最后一层的 mlp.down 这个区域里面,少量维度尤其集中(见图 19)。

图 19 维度集中现象明显
基于此,我们进一步分析,这种维度集中性与 Layer Norm 中的单个维度扰动在计算上是等效的,于是我们尝试直接扰动 Layer Norm 中的单个维度。
实验结果显示,在 LLaMA 2-13B 模型中,如果仅扰动第一层的 input Layer Norm 2100 维度,将其随机化,模型的 PPL 值会从 5.877 突升到 21.42;如果把这个值乘以 10,PPL 值就更剧烈地增加到了 3 亿多(见图 20)。这说明,尽管其他 Layer Norm 参数在理论上也同样重要,但扰动它们并不会导致如此严重的性能崩溃。然而,对于这些特定维度,即便是微小的改动,也会带来显著的性能变化。

图 20 扰动实验
为了直观展示这种变化,我们用扰动后的模型进行了句子补全任务,输入为“Fudan University is located in”。在正常状态下,LLaMA2-13B 模型能输出高质量的结果,甚至能处理中英混合,直接给出复旦大学官网的链接。然而,如果把 2100 维度的 Layer Norm 随机化,模型就开始出现知识错误和语言错误,生成的文本不再正确(见图 21)。但同等程度地去扰动其他维度,模型的语言输出却不会出现太大的变化。

图 21 仅修改 130 亿参数中的 1 个就会使模型混乱
再回头看看图 20,如果我们将 2100 维度乘以 10,模型的 PPL 值急剧增大,输出变得杂乱无章。可见,在这个特定位置(2100 维度)改动参数,整个语言模型的功能就会严重受损。当然,如果我们将其他位置的参数乘以 10,也会导致一些错误——比如模型可能会错误地把济南等地识别为复旦大学的校区。通过 PPL 指标,我们可以明显看出这些扰动对模型性能的具体影响,更何况在未经扰动的 LLaMA2-13B 模型上本身也经不起多次尝试导致的错误。也就是说,130 亿参数的大模型,只改一个参数,整个模型的语言能力就能完全归零。
大模型语言核心区与维度依赖理论
这些现象和理论到底能带来什么?其实,它们能在构建大模型时提供诸多有益的解释。以往我们的一些工作采用了不少技巧性的方法,虽然效果显著,但很难阐明其内在机制。
首先,在进行二阶段预训练时,如果目标是增强模型在特定领域(比如医学或强化中文知识方面的表现),而原始训练数据对这个领域的覆盖不足,传统的经验告诉我们,必须辅以大量相关背景知识的混合数据。例如,在开发 Open Chinese LLaMA 时,我们发现仅仅添加纯中文数据会导致模型性能大幅下降——而现在我们明白了,参数各个区域负责的部分其实已经确定,如果大量增加某类在预训练时没有的知识,就会造成参数的大幅度变化,最终导致整个语言模型能力的损失。
如果想对特定分区进行调整,就必须引入与之相关的背景知识,添加 5 到 10 倍于原始预训练中的数据,打混后一起训练,这样模型才能逐步适应变化。否则,一旦触碰到核心区域,模型就会丧失几乎所有的能力。
其次,大模型语言关键区域的参数极为敏感,尤其是那些对模型性能至关重要的小区域。在 SFT 阶段,如果训练周期过长,针对少量数据进行多个 EPOCH 的训练,会造成语言关键区域发生变化,导致 PPL 飙升,甚至整个模型失效。因此,跟小模型不同,我们不能针对少量训练数据去做过度拟合。
第三,模型对于噪音数据的敏感性是众所周知的,但其中的原因值得深挖。比如,预训练数据中如果出现大量连续的噪音数据——像连续重复单词、非单词序列等等——都可能造成特定维度的调整,从而使模型的整体 PPL 出现大幅度波动。
另外,有监督微调指令中如果有大量与原有大语言模型不匹配的指令片段,也可能导致模型调整特定维度,从而使整体性能大幅度下降。通过语言核心区和维度依赖理论,我们可以解释这一现象,这也意味着在未来的训练和 SFT 阶段,我们需要采取相应的策略来进行精细化调整。
